studiograph 1.3.48-next.2 → 1.3.48-next.201
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 +574 -181
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +34 -0
- package/dist/agent/prompts/entity-types-section.js +76 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +147 -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 +664 -333
- 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.js +58 -9
- package/dist/agent/tools/web-tools.js.map +1 -1
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/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 +218 -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 +77 -0
- package/dist/core/embeds.js +147 -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/format-registry.d.ts +170 -0
- package/dist/core/format-registry.js +404 -0
- package/dist/core/format-registry.js.map +1 -0
- package/dist/core/graph.d.ts +731 -14
- package/dist/core/graph.js +2202 -315
- 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/refs.d.ts +41 -0
- package/dist/core/refs.js +80 -0
- package/dist/core/refs.js.map +1 -0
- package/dist/core/schema-registry.d.ts +82 -0
- package/dist/core/schema-registry.js +238 -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/tavily.d.ts +18 -0
- package/dist/core/secrets/probes/tavily.js +58 -0
- package/dist/core/secrets/probes/tavily.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 +616 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +80 -475
- package/dist/core/types.js +27 -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 +731 -1790
- package/dist/core/validation.js +442 -228
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +89 -12
- package/dist/core/workspace-manager.js +225 -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 +62 -0
- package/dist/mcp/state-signer.js +205 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/tools.d.ts +35 -2
- package/dist/mcp/tools.js +1361 -112
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +16 -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/asset-index-queue.d.ts +96 -0
- package/dist/server/asset-index-queue.js +191 -0
- package/dist/server/asset-index-queue.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 +22 -3
- package/dist/server/index.js +622 -198
- 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 +31 -0
- package/dist/server/routes/asset-api.js +593 -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 +573 -39
- 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-sessions-api.d.ts +9 -0
- package/dist/server/routes/chat-sessions-api.js +121 -0
- package/dist/server/routes/chat-sessions-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +12 -1
- package/dist/server/routes/chat.js +318 -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 +57 -0
- package/dist/server/routes/graph-api-access.js +112 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +1 -1
- package/dist/server/routes/graph-api.js +1529 -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/import-batch.d.ts +24 -0
- package/dist/server/routes/import-batch.js +33 -0
- package/dist/server/routes/import-batch.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +9 -2
- package/dist/server/routes/insights-api.js +384 -38
- 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/oauth-api.d.ts +67 -0
- package/dist/server/routes/oauth-api.js +421 -0
- package/dist/server/routes/oauth-api.js.map +1 -0
- 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/share-api.d.ts +32 -0
- package/dist/server/routes/share-api.js +234 -0
- package/dist/server/routes/share-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 +75 -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 +129 -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 +68 -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 +165 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/asset-caption-service.d.ts +102 -0
- package/dist/services/asset-caption-service.js +184 -0
- package/dist/services/asset-caption-service.js.map +1 -0
- package/dist/services/asset-delete-authz.d.ts +31 -0
- package/dist/services/asset-delete-authz.js +61 -0
- package/dist/services/asset-delete-authz.js.map +1 -0
- package/dist/services/asset-finalize-service.d.ts +58 -0
- package/dist/services/asset-finalize-service.js +207 -0
- package/dist/services/asset-finalize-service.js.map +1 -0
- package/dist/services/asset-import-service.d.ts +111 -0
- package/dist/services/asset-import-service.js +394 -0
- package/dist/services/asset-import-service.js.map +1 -0
- package/dist/services/asset-index-sweep.d.ts +92 -0
- package/dist/services/asset-index-sweep.js +258 -0
- package/dist/services/asset-index-sweep.js.map +1 -0
- package/dist/services/asset-lifecycle-check.d.ts +22 -0
- package/dist/services/asset-lifecycle-check.js +80 -0
- package/dist/services/asset-lifecycle-check.js.map +1 -0
- package/dist/services/asset-listing.d.ts +72 -0
- package/dist/services/asset-listing.js +321 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-presign-service.d.ts +68 -0
- package/dist/services/asset-presign-service.js +124 -0
- package/dist/services/asset-presign-service.js.map +1 -0
- package/dist/services/asset-sidecar-service.d.ts +30 -0
- package/dist/services/asset-sidecar-service.js +96 -0
- package/dist/services/asset-sidecar-service.js.map +1 -0
- package/dist/services/asset-upload-errors.d.ts +41 -0
- package/dist/services/asset-upload-errors.js +45 -0
- package/dist/services/asset-upload-errors.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +74 -0
- package/dist/services/asset-upload-service.js +244 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/asset-upload-token.d.ts +58 -0
- package/dist/services/asset-upload-token.js +75 -0
- package/dist/services/asset-upload-token.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +127 -0
- package/dist/services/assets/asset-index-service.js +227 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +118 -1
- package/dist/services/assets/base.js +77 -1
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +103 -1
- package/dist/services/assets/index.js +192 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +16 -1
- package/dist/services/assets/local.js +110 -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 +87 -1
- package/dist/services/assets/r2.js +203 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +350 -36
- package/dist/services/auth-service.js +1179 -140
- 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/chat-session-service.d.ts +96 -0
- package/dist/services/chat-session-service.js +316 -0
- package/dist/services/chat-session-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/convert-service.d.ts +64 -0
- package/dist/services/convert-service.js +68 -0
- package/dist/services/convert-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 +210 -0
- package/dist/services/entity-mutations.js +377 -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/extract/docx.d.ts +1 -0
- package/dist/services/extract/docx.js +233 -0
- package/dist/services/extract/docx.js.map +1 -0
- package/dist/services/extract/index.d.ts +9 -0
- package/dist/services/extract/index.js +10 -0
- package/dist/services/extract/index.js.map +1 -0
- package/dist/services/extract/pdf.d.ts +13 -0
- package/dist/services/extract/pdf.js +69 -0
- package/dist/services/extract/pdf.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 +58 -3
- package/dist/services/import-service.js +316 -100
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +10 -17
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +77 -9
- 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/model-capabilities.d.ts +41 -0
- package/dist/services/model-capabilities.js +107 -0
- package/dist/services/model-capabilities.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/oauth-server-store.d.ts +147 -0
- package/dist/services/oauth-server-store.js +319 -0
- package/dist/services/oauth-server-store.js.map +1 -0
- package/dist/services/orphan-service.js +2 -2
- package/dist/services/orphan-service.js.map +1 -1
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/share-link-service.d.ts +57 -0
- package/dist/services/share-link-service.js +142 -0
- package/dist/services/share-link-service.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +136 -0
- package/dist/services/user-person-bridge.js +340 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +260 -6
- package/dist/services/vector-service.js +574 -31
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +108 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/services/workspace-assets-folder.d.ts +46 -0
- package/dist/services/workspace-assets-folder.js +75 -0
- package/dist/services/workspace-assets-folder.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.BZHoBJEc.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.BwBFdc1D.css +1 -0
- package/dist/web/_app/immutable/assets/15.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/16.B0GwXar3.css +1 -0
- package/dist/web/_app/immutable/assets/2.C9Vt4JHy.css +1 -0
- package/dist/web/_app/immutable/assets/3.BFvgCYSk.css +1 -0
- package/dist/web/_app/immutable/assets/4.OmdYF47-.css +1 -0
- package/dist/web/_app/immutable/assets/5.C6MySjPq.css +1 -0
- package/dist/web/_app/immutable/assets/BulkActionsBar.Bx7nxMjH.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.lBCvS3X5.css +1 -0
- package/dist/web/_app/immutable/assets/CodeMirrorEditor.D6hf2pNJ.css +1 -0
- package/dist/web/_app/immutable/assets/CopyField.DVGZtw4U.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.DX1oBeF_.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.D2B7KrRn.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.B5KdvRYl.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.CF48FWYQ.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.BOaI5KFL.css +1 -0
- package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.BqgpZCv5.css +1 -0
- package/dist/web/_app/immutable/assets/Rail.f8lsriOT.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.DwMus2u2.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.fNlDN65D.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.DriOGAKB.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.u5VdwRR6.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/checkbox.DK0MgYgb.css +1 -0
- package/dist/web/_app/immutable/assets/dist.DDCWxn3B.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.DiLB0G5L.css +1 -0
- package/dist/web/_app/immutable/assets/select.BFL238eD.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.4rY4hpfJ.css +1 -0
- package/dist/web/_app/immutable/chunks/2oYV6q4R.js +2 -0
- package/dist/web/_app/immutable/chunks/4XSri7g0.js +1 -0
- package/dist/web/_app/immutable/chunks/4iaT0dG72.js +1 -0
- package/dist/web/_app/immutable/chunks/5_TKU9QS2.js +1 -0
- package/dist/web/_app/immutable/chunks/8Yh26Z9_2.js +1 -0
- package/dist/web/_app/immutable/chunks/Atl8xKOm.js +2 -0
- package/dist/web/_app/immutable/chunks/B-Z_xZy_.js +4 -0
- package/dist/web/_app/immutable/chunks/B0pk0Lyx.js +1 -0
- package/dist/web/_app/immutable/chunks/B1RnjnNt.js +1 -0
- package/dist/web/_app/immutable/chunks/B2n86UNJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B318GEUB2.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
- package/dist/web/_app/immutable/chunks/B8yrQWxT2.js +1 -0
- package/dist/web/_app/immutable/chunks/BADt8daH.js +2 -0
- package/dist/web/_app/immutable/chunks/BBGt-XQo.js +3 -0
- package/dist/web/_app/immutable/chunks/BDIUHcEz.js +1 -0
- package/dist/web/_app/immutable/chunks/BDSuq3KH.js +1 -0
- package/dist/web/_app/immutable/chunks/BGiLU5VN.js +1 -0
- package/dist/web/_app/immutable/chunks/BJgOZTHR.js +1 -0
- package/dist/web/_app/immutable/chunks/BOSiTh-42.js +1 -0
- package/dist/web/_app/immutable/chunks/BPxcCdjn.js +1 -0
- package/dist/web/_app/immutable/chunks/BVPNAzAK.js +1 -0
- package/dist/web/_app/immutable/chunks/BcOvJgjM.js +1 -0
- package/dist/web/_app/immutable/chunks/BdYQewoD.js +1 -0
- package/dist/web/_app/immutable/chunks/BfCWIy8t.js +8 -0
- package/dist/web/_app/immutable/chunks/BgRT-K6w.js +5 -0
- package/dist/web/_app/immutable/chunks/BibveGGd.js +1 -0
- package/dist/web/_app/immutable/chunks/BmM5VZ4W.js +1 -0
- package/dist/web/_app/immutable/chunks/BnIYzuS1.js +66 -0
- package/dist/web/_app/immutable/chunks/BoDmwOTJ.js +1 -0
- package/dist/web/_app/immutable/chunks/BoglwbZW.js +1 -0
- package/dist/web/_app/immutable/chunks/Bqm_YrIg2.js +23 -0
- package/dist/web/_app/immutable/chunks/BtMRrdc4.js +2 -0
- package/dist/web/_app/immutable/chunks/C-AnzvKr.js +7 -0
- package/dist/web/_app/immutable/chunks/C1Y3tUpz.js +1 -0
- package/dist/web/_app/immutable/chunks/C6VZhhwF.js +1 -0
- package/dist/web/_app/immutable/chunks/C8IMrD4G2.js +3 -0
- package/dist/web/_app/immutable/chunks/CAXXrbj52.js +1 -0
- package/dist/web/_app/immutable/chunks/CB-0u-Pc2.js +1 -0
- package/dist/web/_app/immutable/chunks/CEniyZ1Z2.js +6 -0
- package/dist/web/_app/immutable/chunks/CJhElIkU2.js +1 -0
- package/dist/web/_app/immutable/chunks/CK8tIaYT.js +1 -0
- package/dist/web/_app/immutable/chunks/CM8uYli8.js +1 -0
- package/dist/web/_app/immutable/chunks/CTzjJm_m2.js +1 -0
- package/dist/web/_app/immutable/chunks/CUXqa1nn2.js +1 -0
- package/dist/web/_app/immutable/chunks/CY0iY_WO.js +1 -0
- package/dist/web/_app/immutable/chunks/CbCfNNV_2.js +2692 -0
- package/dist/web/_app/immutable/chunks/CbuGIyDu2.js +22 -0
- package/dist/web/_app/immutable/chunks/CcRGXA-t.js +1 -0
- package/dist/web/_app/immutable/chunks/CcXmQaYs2.js +1 -0
- package/dist/web/_app/immutable/chunks/CcaQuaSt2.js +1 -0
- package/dist/web/_app/immutable/chunks/CoHaBDpN2.js +2 -0
- package/dist/web/_app/immutable/chunks/Cvbd3myc2.js +14 -0
- package/dist/web/_app/immutable/chunks/D20C1thX2.js +1 -0
- package/dist/web/_app/immutable/chunks/D3JoMtWC.js +7 -0
- package/dist/web/_app/immutable/chunks/D3ch71s_.js +1 -0
- package/dist/web/_app/immutable/chunks/D4xXlMEU.js +2 -0
- package/dist/web/_app/immutable/chunks/D5GipQqN2.js +1 -0
- package/dist/web/_app/immutable/chunks/D9TyJuu_.js +1 -0
- package/dist/web/_app/immutable/chunks/DBFijAmG.js +1 -0
- package/dist/web/_app/immutable/chunks/DHLjkH7T.js +1 -0
- package/dist/web/_app/immutable/chunks/DIfdPIt_2.js +1 -0
- package/dist/web/_app/immutable/chunks/DO_sw49q2.js +1 -0
- package/dist/web/_app/immutable/chunks/DP69PpIj.js +1 -0
- package/dist/web/_app/immutable/chunks/DQ3HSZMs.js +2 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
- package/dist/web/_app/immutable/chunks/DT0wzK622.js +1 -0
- package/dist/web/_app/immutable/chunks/DTnEJArL.js +1 -0
- package/dist/web/_app/immutable/chunks/DToS-G202.js +1 -0
- package/dist/web/_app/immutable/chunks/DZcU6mGe2.js +1 -0
- package/dist/web/_app/immutable/chunks/DbslMybD.js +1 -0
- package/dist/web/_app/immutable/chunks/DcGThsSF.js +1 -0
- package/dist/web/_app/immutable/chunks/DcPrzUMJ.js +1 -0
- package/dist/web/_app/immutable/chunks/De0g5qop2.js +1 -0
- package/dist/web/_app/immutable/chunks/DimS8dbZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DjuqhOjF.js +1 -0
- package/dist/web/_app/immutable/chunks/Dk6sAhpo.js +3 -0
- package/dist/web/_app/immutable/chunks/Dl6cnwyk.js +1 -0
- package/dist/web/_app/immutable/chunks/DnIQzIOz.js +1 -0
- package/dist/web/_app/immutable/chunks/DnXYAo60.js +1 -0
- package/dist/web/_app/immutable/chunks/DnrImJan.js +1 -0
- package/dist/web/_app/immutable/chunks/Dpuq25vu2.js +1 -0
- package/dist/web/_app/immutable/chunks/DrMZDWru.js +1 -0
- package/dist/web/_app/immutable/chunks/DsVOtl0N.js +1 -0
- package/dist/web/_app/immutable/chunks/DuTXsWdP.js +2 -0
- package/dist/web/_app/immutable/chunks/Dw-frCfE.js +1 -0
- package/dist/web/_app/immutable/chunks/Dz34u8Ie2.js +185 -0
- package/dist/web/_app/immutable/chunks/DzcFeQZU2.js +2 -0
- package/dist/web/_app/immutable/chunks/DzrRTvug.js +1 -0
- package/dist/web/_app/immutable/chunks/G5oUVQa92.js +1 -0
- package/dist/web/_app/immutable/chunks/HyhOhoeq2.js +2 -0
- package/dist/web/_app/immutable/chunks/J5nb9xxj.js +1 -0
- package/dist/web/_app/immutable/chunks/JCjEwqH9.js +1 -0
- package/dist/web/_app/immutable/chunks/JN_nsXUm2.js +1 -0
- package/dist/web/_app/immutable/chunks/JS2_GaB1.js +1 -0
- package/dist/web/_app/immutable/chunks/MtI6dyxu.js +1 -0
- package/dist/web/_app/immutable/chunks/N6vnY5Si2.js +1 -0
- package/dist/web/_app/immutable/chunks/PcEbaKam.js +2 -0
- package/dist/web/_app/immutable/chunks/VTYhCLh9.js +2 -0
- package/dist/web/_app/immutable/chunks/Wowi_89k.js +5 -0
- package/dist/web/_app/immutable/chunks/Y_asqJqs2.js +83 -0
- package/dist/web/_app/immutable/chunks/Yhg5Q4MT.js +1 -0
- package/dist/web/_app/immutable/chunks/f_eYccPf2.js +1 -0
- package/dist/web/_app/immutable/chunks/hm_8RsuL.js +1 -0
- package/dist/web/_app/immutable/chunks/iPCkjliu.js +3 -0
- package/dist/web/_app/immutable/chunks/j2AvgZGz.js +1 -0
- package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
- package/dist/web/_app/immutable/chunks/l1761xxj.js +1 -0
- package/dist/web/_app/immutable/chunks/liGRFQqV2.js +184 -0
- package/dist/web/_app/immutable/chunks/lq1kR86d.js +1 -0
- package/dist/web/_app/immutable/chunks/mIykYR4F2.js +1 -0
- package/dist/web/_app/immutable/chunks/rbhlO_t8.js +1 -0
- package/dist/web/_app/immutable/chunks/tJpAwaTl.js +1 -0
- package/dist/web/_app/immutable/chunks/tcegdii0.js +2 -0
- package/dist/web/_app/immutable/chunks/u8G2EUvz2.js +224 -0
- package/dist/web/_app/immutable/chunks/vgsM0KTm2.js +1 -0
- package/dist/web/_app/immutable/chunks/xcGI4fuV.js +1 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/chunks/yEYlhV9G2.js +1 -0
- package/dist/web/_app/immutable/entry/app.DSf_XGp8.js +2 -0
- package/dist/web/_app/immutable/entry/start.B7ScfxPc.js +1 -0
- package/dist/web/_app/immutable/nodes/0.BMSOOETY.js +2 -0
- package/dist/web/_app/immutable/nodes/1.B0lBUpHt.js +1 -0
- package/dist/web/_app/immutable/nodes/10.DmDbUH1j.js +1 -0
- package/dist/web/_app/immutable/nodes/11.gwY7gZdR.js +1 -0
- package/dist/web/_app/immutable/nodes/12.BpGHSr2y.js +1 -0
- package/dist/web/_app/immutable/nodes/13.Bf178QF_.js +1 -0
- package/dist/web/_app/immutable/nodes/14.D_x8-nk9.js +1 -0
- package/dist/web/_app/immutable/nodes/15.DY4XeagL.js +1 -0
- package/dist/web/_app/immutable/nodes/16.DPqftx8x.js +77 -0
- package/dist/web/_app/immutable/nodes/2.OM2LGRpi.js +109 -0
- package/dist/web/_app/immutable/nodes/3.e8ZoPCmC.js +6 -0
- package/dist/web/_app/immutable/nodes/4.BdYR1hNQ.js +11 -0
- package/dist/web/_app/immutable/nodes/5.B8sOFna9.js +5 -0
- package/dist/web/_app/immutable/nodes/6.L1BbYsmo.js +1 -0
- package/dist/web/_app/immutable/nodes/7.B7zoemJD.js +1 -0
- package/dist/web/_app/immutable/nodes/8.B1VtnfMK.js +1 -0
- package/dist/web/_app/immutable/nodes/9.BE3VCQzk.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 +58 -19
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +38 -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/-iaeBIWN.js +0 -1
- package/dist/web/_app/immutable/chunks/37NdyH6G.js +0 -32
- package/dist/web/_app/immutable/chunks/4Hhzb6pv.js +0 -1
- package/dist/web/_app/immutable/chunks/72bZS3G9.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/B340SUKR.js +0 -1
- package/dist/web/_app/immutable/chunks/B3Z4_Sps.js +0 -1
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BPWYOQXG.js +0 -1
- package/dist/web/_app/immutable/chunks/BR77jbfR.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/Bq_KShUL.js +0 -4
- package/dist/web/_app/immutable/chunks/Bsacq2UX.js +0 -1
- package/dist/web/_app/immutable/chunks/ByunV8un.js +0 -1
- package/dist/web/_app/immutable/chunks/BzPu-Eht.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/CGc1sIb_.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/CX87mIM8.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/Cpsr8-Xy.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/DTZE-yoq.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/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.BeUKh4sD.js +0 -2
- package/dist/web/_app/immutable/entry/start.CZJnFuQn.js +0 -1
- package/dist/web/_app/immutable/nodes/0.DyF_RsLg.js +0 -2
- package/dist/web/_app/immutable/nodes/1.7iDQmMPh.js +0 -1
- package/dist/web/_app/immutable/nodes/10.Btl8d8HT.js +0 -1
- package/dist/web/_app/immutable/nodes/2.LDRE62jN.js +0 -168
- package/dist/web/_app/immutable/nodes/3.BaW1XB1x.js +0 -1
- package/dist/web/_app/immutable/nodes/4.D0Q8kpkI.js +0 -12
- package/dist/web/_app/immutable/nodes/5.n7j2UG9h.js +0 -4
- package/dist/web/_app/immutable/nodes/6.DQYxR0iy.js +0 -2
- package/dist/web/_app/immutable/nodes/7.BsURvFAp.js +0 -2
- package/dist/web/_app/immutable/nodes/8.CsiErG0p.js +0 -1
- package/dist/web/_app/immutable/nodes/9.CnN6OZgC.js +0 -1
|
@@ -18,22 +18,164 @@
|
|
|
18
18
|
import { join } from 'path';
|
|
19
19
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
20
20
|
import * as lancedb from '@lancedb/lancedb';
|
|
21
|
+
import { tryResolve } from '../core/secrets/read-flip.js';
|
|
21
22
|
const VOYAGE_API_URL = 'https://api.voyageai.com/v1/embeddings';
|
|
22
23
|
const VOYAGE_MODEL = 'voyage-3';
|
|
23
24
|
const VECTOR_DIM = 1024;
|
|
24
25
|
const TABLE_NAME = 'entities';
|
|
26
|
+
/**
|
|
27
|
+
* Dedicated LanceDB table for an asset's MUTABLE index state (decision A1).
|
|
28
|
+
*
|
|
29
|
+
* Why a separate table, not columns on `entities` and not asset frontmatter:
|
|
30
|
+
* - Frontmatter is immutable + git-committed; writing `index_status` there
|
|
31
|
+
* would fire one async git commit per asset and defeat the import batching.
|
|
32
|
+
* (The immutable `indexable` flag DOES live in frontmatter — see P3a.)
|
|
33
|
+
* - New columns on the shared `entities` table force a schema migration on
|
|
34
|
+
* every existing row. A side table is additive and touches only assets.
|
|
35
|
+
*/
|
|
36
|
+
const INDEX_STATE_TABLE = 'asset_index_state';
|
|
37
|
+
/**
|
|
38
|
+
* Derivation-logic version. BUMP this when caption/extraction output changes so
|
|
39
|
+
* the boot sweep RE-derives every asset (Codex migration rule: a row at a stale
|
|
40
|
+
* version is re-derived, never treated as "done"). Legacy assets have NO row at
|
|
41
|
+
* all — also re-derived, never skipped.
|
|
42
|
+
*/
|
|
43
|
+
export const ASSET_INDEX_VERSION = 1;
|
|
25
44
|
export class VectorService {
|
|
26
45
|
dbPath;
|
|
27
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Legacy fallback key passed via constructor for tests or for early-
|
|
48
|
+
* boot code paths that run before the secrets store is initialized.
|
|
49
|
+
* Live calls prefer `tryResolve('voyage.api_key')` so values written
|
|
50
|
+
* to the store via the UI / CLI take effect without a restart.
|
|
51
|
+
*/
|
|
52
|
+
fallbackVoyageApiKey;
|
|
53
|
+
workspaceRoot;
|
|
28
54
|
db;
|
|
29
55
|
table;
|
|
56
|
+
/** Lazily-opened side table for mutable asset index state (A1). */
|
|
57
|
+
stateTable;
|
|
58
|
+
stateInitialized = false;
|
|
30
59
|
lastIndexedPath;
|
|
31
60
|
initialized = false;
|
|
32
|
-
|
|
61
|
+
// ── Single-flight guards (one in-flight init per resource) ──
|
|
62
|
+
// `init()` and `initStateTable()` both open the LanceDB connection and can be
|
|
63
|
+
// invoked concurrently (boot incremental reindex via upsert() races the
|
|
64
|
+
// fire-and-forget asset sweep via getAllIndexStates()). Without
|
|
65
|
+
// single-flighting, both would pass their boolean guard before either await
|
|
66
|
+
// resolved, double-connect, and double-`createTable` → "table already exists"
|
|
67
|
+
// / CommitConflict. Each promise is created once and awaited by all callers.
|
|
68
|
+
dbPromise;
|
|
69
|
+
initPromise;
|
|
70
|
+
stateInitPromise;
|
|
71
|
+
// ── Write serialization ──
|
|
72
|
+
// LanceDB uses optimistic concurrency: two `mergeInsert(...).execute()` (or
|
|
73
|
+
// delete) calls racing on the SAME table throw a CommitConflict and one loses.
|
|
74
|
+
// This singleton VectorService is shared by foreground entity writes
|
|
75
|
+
// (graph.ts fire-and-forget upsert/delete) AND the live asset-index drain
|
|
76
|
+
// (re-upsert after writing a caption sidecar). Without serialization those two
|
|
77
|
+
// sources can collide on the `entities` table — and the drain would record the
|
|
78
|
+
// loser as a terminal `failed` index state. `withWrite()` chains every mutating
|
|
79
|
+
// op onto a single per-instance promise so they run one at a time, in order.
|
|
80
|
+
writeChain = Promise.resolve();
|
|
81
|
+
/**
|
|
82
|
+
* Fired exactly once per asset, when `ensureInitialAssetIndexState` seeds a
|
|
83
|
+
* fresh `pending` row — i.e. an indexable image that needs captioning. This
|
|
84
|
+
* is the SINGLE chokepoint every asset-creation path funnels through (all
|
|
85
|
+
* upserts call ensureInitialAssetIndexState), so the live caption drain
|
|
86
|
+
* registers here instead of being wired at each of the ~5 upload call sites.
|
|
87
|
+
* It does NOT fire for docs (seeded `full`) or for re-derives (row already
|
|
88
|
+
* exists → early return), so it can't loop the drain.
|
|
89
|
+
*/
|
|
90
|
+
onAssetPendingCb;
|
|
91
|
+
// ── Operator-visible health (surfaced via /api/health/dirty) ──
|
|
92
|
+
// Tracked here, not at the call sites, because every fire-and-forget
|
|
93
|
+
// upsert/delete in graph.ts catches its own promise to avoid blocking
|
|
94
|
+
// writes — the operator needs a single rolled-up signal instead of
|
|
95
|
+
// grepping logs for `[vector] index failed`.
|
|
96
|
+
failureCount = 0;
|
|
97
|
+
inFlight = 0;
|
|
98
|
+
lastFailureAt = null;
|
|
99
|
+
lastFailure = null;
|
|
100
|
+
constructor(dbPath, voyageApiKey, workspaceRoot) {
|
|
33
101
|
this.dbPath = dbPath;
|
|
34
|
-
this.
|
|
102
|
+
this.fallbackVoyageApiKey = voyageApiKey;
|
|
103
|
+
this.workspaceRoot = workspaceRoot;
|
|
35
104
|
this.lastIndexedPath = join(dbPath, 'last-indexed.json');
|
|
36
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Resolve the Voyage API key fresh on each call: store > constructor
|
|
108
|
+
* fallback. Lets the operator flip the key via UI / CLI without a
|
|
109
|
+
* server restart.
|
|
110
|
+
*/
|
|
111
|
+
get voyageApiKey() {
|
|
112
|
+
const fromStore = tryResolve('voyage.api_key');
|
|
113
|
+
return fromStore ?? this.fallbackVoyageApiKey;
|
|
114
|
+
}
|
|
115
|
+
/** Begin tracking an in-flight op. Pair with `recordSuccess`/`recordFailure`. */
|
|
116
|
+
beginOp() { this.inFlight++; }
|
|
117
|
+
recordSuccess() {
|
|
118
|
+
if (this.inFlight > 0)
|
|
119
|
+
this.inFlight--;
|
|
120
|
+
}
|
|
121
|
+
recordFailure(op, entity, err) {
|
|
122
|
+
if (this.inFlight > 0)
|
|
123
|
+
this.inFlight--;
|
|
124
|
+
this.failureCount++;
|
|
125
|
+
this.lastFailureAt = new Date().toISOString();
|
|
126
|
+
this.lastFailure = {
|
|
127
|
+
op,
|
|
128
|
+
entity,
|
|
129
|
+
error: err instanceof Error ? err.message : String(err),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Snapshot for /api/health. Healthy = the last op succeeded (or none have
|
|
134
|
+
* run yet) AND there is no abnormal in-flight backlog. The failure count
|
|
135
|
+
* is informational; a single transient Voyage 503 shouldn't permanently
|
|
136
|
+
* mark the service unhealthy, but operators can see the trend.
|
|
137
|
+
*/
|
|
138
|
+
getHealth() {
|
|
139
|
+
return {
|
|
140
|
+
healthy: this.lastFailure === null,
|
|
141
|
+
failureCount: this.failureCount,
|
|
142
|
+
inFlight: this.inFlight,
|
|
143
|
+
lastFailureAt: this.lastFailureAt,
|
|
144
|
+
lastFailure: this.lastFailure,
|
|
145
|
+
embeddingsEnabled: !!this.voyageApiKey,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* For asset entities, any extracted text the upload/caption pipeline wrote
|
|
150
|
+
* lives in a sidecar at `<workspace>/.studiograph/assets-text/asset/<id>.txt`,
|
|
151
|
+
* keyed by the asset's ENTITY ID (not the storage UUID). Returns the contents
|
|
152
|
+
* so `buildEntityText` can fold it into the embedding/FTS input.
|
|
153
|
+
*
|
|
154
|
+
* Generalized from PDF-only (P3): docx/xlsx now write the same sidecar at
|
|
155
|
+
* upload, and image captions/OCR land here too — so the reader is no longer
|
|
156
|
+
* gated on `asset_kind === 'pdf'`. The markdown body of an asset entity is
|
|
157
|
+
* intentionally light; without this, document/image assets would be
|
|
158
|
+
* effectively invisible to RAG.
|
|
159
|
+
*
|
|
160
|
+
* Best-effort: missing sidecar / read errors return null. The asset stays
|
|
161
|
+
* indexed by frontmatter alone.
|
|
162
|
+
*/
|
|
163
|
+
readAssetSidecar(entity) {
|
|
164
|
+
if (!this.workspaceRoot)
|
|
165
|
+
return null;
|
|
166
|
+
if (entity.entityType !== 'asset')
|
|
167
|
+
return null;
|
|
168
|
+
const path = join(this.workspaceRoot, '.studiograph', 'assets-text', 'asset', `${entity.id}.txt`);
|
|
169
|
+
try {
|
|
170
|
+
if (!existsSync(path))
|
|
171
|
+
return null;
|
|
172
|
+
const text = readFileSync(path, 'utf-8').trim();
|
|
173
|
+
return text || null;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
37
179
|
/**
|
|
38
180
|
* Open/create the LanceDB table and ensure the FTS index exists.
|
|
39
181
|
* Call once before using the service.
|
|
@@ -41,11 +183,44 @@ export class VectorService {
|
|
|
41
183
|
async init() {
|
|
42
184
|
if (this.initialized)
|
|
43
185
|
return;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
186
|
+
// Single-flight: concurrent callers share one in-flight init.
|
|
187
|
+
if (!this.initPromise)
|
|
188
|
+
this.initPromise = this.doInit();
|
|
189
|
+
await this.initPromise;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Run a mutating LanceDB op under the per-instance write lock so concurrent
|
|
193
|
+
* writers (foreground entity writes vs. the asset-index drain) can't collide
|
|
194
|
+
* on a shared table's optimistic-concurrency commit. Ops run strictly in the
|
|
195
|
+
* order `withWrite` is called; a throwing op rejects to ITS caller without
|
|
196
|
+
* poisoning the chain for the next writer.
|
|
197
|
+
*/
|
|
198
|
+
withWrite(fn) {
|
|
199
|
+
const run = this.writeChain.then(fn, fn);
|
|
200
|
+
// Keep the chain alive regardless of this op's outcome (swallow on the
|
|
201
|
+
// chain copy only; the real result/throw still goes to the caller).
|
|
202
|
+
this.writeChain = run.then(() => undefined, () => undefined);
|
|
203
|
+
return run;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Open (once) the shared LanceDB connection. Both `init()` and
|
|
207
|
+
* `initStateTable()` go through this so they never race to assign `this.db`.
|
|
208
|
+
*/
|
|
209
|
+
async ensureDb() {
|
|
210
|
+
if (this.db)
|
|
211
|
+
return this.db;
|
|
212
|
+
if (!this.dbPromise) {
|
|
213
|
+
mkdirSync(this.dbPath, { recursive: true });
|
|
214
|
+
this.dbPromise = lancedb.connect(this.dbPath);
|
|
215
|
+
}
|
|
216
|
+
this.db = await this.dbPromise;
|
|
217
|
+
return this.db;
|
|
218
|
+
}
|
|
219
|
+
async doInit() {
|
|
220
|
+
const db = await this.ensureDb();
|
|
221
|
+
const tableNames = await db.tableNames();
|
|
47
222
|
if (tableNames.includes(TABLE_NAME)) {
|
|
48
|
-
this.table = await
|
|
223
|
+
this.table = await db.openTable(TABLE_NAME);
|
|
49
224
|
}
|
|
50
225
|
else {
|
|
51
226
|
// Create table with a seed record (LanceDB infers schema from first batch)
|
|
@@ -58,7 +233,7 @@ export class VectorService {
|
|
|
58
233
|
vector: new Array(VECTOR_DIM).fill(0),
|
|
59
234
|
updated_at: new Date().toISOString(),
|
|
60
235
|
};
|
|
61
|
-
this.table = await
|
|
236
|
+
this.table = await db.createTable(TABLE_NAME, [seed]);
|
|
62
237
|
// Create FTS index on text column
|
|
63
238
|
await this.table.createIndex('text', {
|
|
64
239
|
config: lancedb.Index.fts(),
|
|
@@ -68,6 +243,163 @@ export class VectorService {
|
|
|
68
243
|
}
|
|
69
244
|
this.initialized = true;
|
|
70
245
|
}
|
|
246
|
+
// ─── Asset index state (A1 — mutable, LanceDB-only) ──────────────────────────
|
|
247
|
+
stateRowId(repo, entityId) {
|
|
248
|
+
return `${repo}/${entityId}`;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Open/create the side table for asset index state. Independent of `init()`
|
|
252
|
+
* so state-only callers (and tests) don't pay for the entities table. Lazy
|
|
253
|
+
* because most workspaces never need it until the first asset is indexed.
|
|
254
|
+
*/
|
|
255
|
+
async initStateTable() {
|
|
256
|
+
if (this.stateInitialized)
|
|
257
|
+
return;
|
|
258
|
+
// Single-flight: concurrent state readers/writers share one in-flight init,
|
|
259
|
+
// so two callers can't both take the createTable branch (which would throw
|
|
260
|
+
// "table already exists" on the loser).
|
|
261
|
+
if (!this.stateInitPromise)
|
|
262
|
+
this.stateInitPromise = this.doInitStateTable();
|
|
263
|
+
await this.stateInitPromise;
|
|
264
|
+
}
|
|
265
|
+
async doInitStateTable() {
|
|
266
|
+
const db = await this.ensureDb();
|
|
267
|
+
const names = await db.tableNames();
|
|
268
|
+
if (names.includes(INDEX_STATE_TABLE)) {
|
|
269
|
+
this.stateTable = await db.openTable(INDEX_STATE_TABLE);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
const seed = {
|
|
273
|
+
id: '__seed__', repo: '', entity_id: '', index_status: 'pending',
|
|
274
|
+
indexed_at: '', index_version: 0, reason: '',
|
|
275
|
+
};
|
|
276
|
+
this.stateTable = await db.createTable(INDEX_STATE_TABLE, [seed]);
|
|
277
|
+
await this.stateTable.delete(`id = '__seed__'`);
|
|
278
|
+
}
|
|
279
|
+
this.stateInitialized = true;
|
|
280
|
+
}
|
|
281
|
+
toState(r) {
|
|
282
|
+
return {
|
|
283
|
+
repo: r.repo,
|
|
284
|
+
entityId: r.entity_id,
|
|
285
|
+
status: r.index_status,
|
|
286
|
+
indexedAt: r.indexed_at,
|
|
287
|
+
version: r.index_version,
|
|
288
|
+
reason: r.reason,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Read the `text` actually indexed for one entity (the value `buildEntityText`
|
|
293
|
+
* produced — markdown body plus, for assets, the extracted sidecar). Null when
|
|
294
|
+
* no row exists. This is the searchable content of record, independent of FTS
|
|
295
|
+
* index freshness, so it's the deterministic way to assert "the asset's body
|
|
296
|
+
* reached the index" (e.g. the docx stub-upsert-race regression test).
|
|
297
|
+
*/
|
|
298
|
+
async getIndexedText(repo, entityType, entityId) {
|
|
299
|
+
await this.init();
|
|
300
|
+
const id = `${repo}/${entityType}/${entityId}`.replace(/'/g, "''");
|
|
301
|
+
const rows = await this.table.query().where(`id = '${id}'`).limit(1).toArray();
|
|
302
|
+
const row = rows.find((r) => r.id !== '__seed__');
|
|
303
|
+
return row ? row.text : null;
|
|
304
|
+
}
|
|
305
|
+
/** Read one asset's index state, or null when no row exists (legacy/never-derived). */
|
|
306
|
+
async getIndexState(repo, entityId) {
|
|
307
|
+
await this.initStateTable();
|
|
308
|
+
const id = this.stateRowId(repo, entityId).replace(/'/g, "''");
|
|
309
|
+
const rows = await this.stateTable.query().where(`id = '${id}'`).limit(1).toArray();
|
|
310
|
+
const row = rows.find((r) => r.id !== '__seed__');
|
|
311
|
+
return row ? this.toState(row) : null;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Load every index-state row into a Map keyed by `${repo}/${entityId}`. The
|
|
315
|
+
* boot sweep uses this to decide, per asset, whether a row is missing
|
|
316
|
+
* (legacy), stale (old version), or unfinished (pending) — without an
|
|
317
|
+
* all-asset disk scan (PERF1).
|
|
318
|
+
*/
|
|
319
|
+
async getAllIndexStates() {
|
|
320
|
+
await this.initStateTable();
|
|
321
|
+
const rows = await this.stateTable.query().toArray();
|
|
322
|
+
const map = new Map();
|
|
323
|
+
for (const r of rows) {
|
|
324
|
+
if (r.id === '__seed__')
|
|
325
|
+
continue;
|
|
326
|
+
map.set(this.stateRowId(r.repo, r.entity_id), this.toState(r));
|
|
327
|
+
}
|
|
328
|
+
return map;
|
|
329
|
+
}
|
|
330
|
+
/** Upsert an asset's index state. Stamps `indexed_at` + current version unless overridden. */
|
|
331
|
+
async setIndexState(repo, entityId, status, opts = {}) {
|
|
332
|
+
await this.initStateTable();
|
|
333
|
+
const record = {
|
|
334
|
+
id: this.stateRowId(repo, entityId),
|
|
335
|
+
repo,
|
|
336
|
+
entity_id: entityId,
|
|
337
|
+
index_status: status,
|
|
338
|
+
indexed_at: opts.indexedAt ?? new Date().toISOString(),
|
|
339
|
+
index_version: opts.version ?? ASSET_INDEX_VERSION,
|
|
340
|
+
reason: opts.reason ?? '',
|
|
341
|
+
};
|
|
342
|
+
await this.withWrite(() => this.stateTable
|
|
343
|
+
.mergeInsert('id')
|
|
344
|
+
.whenMatchedUpdateAll()
|
|
345
|
+
.whenNotMatchedInsertAll()
|
|
346
|
+
.execute([record]));
|
|
347
|
+
}
|
|
348
|
+
/** Drop an asset's index-state row (e.g. when the asset is deleted). */
|
|
349
|
+
async deleteIndexState(repo, entityId) {
|
|
350
|
+
await this.initStateTable();
|
|
351
|
+
const id = this.stateRowId(repo, entityId).replace(/'/g, "''");
|
|
352
|
+
await this.withWrite(() => this.stateTable.delete(`id = '${id}'`));
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Seed the initial index state for a freshly (re)indexed asset, IF it has no
|
|
356
|
+
* row yet. State *transitions* are owned by the caption/sweep pass — this only
|
|
357
|
+
* establishes the starting point at import time:
|
|
358
|
+
* - `indexable !== true` (opaque, or legacy `undefined`) → no row. Opaque
|
|
359
|
+
* assets read "filename only" from frontmatter; legacy assets are
|
|
360
|
+
* re-derived by the boot sweep, not seeded here.
|
|
361
|
+
* - sidecar already on disk (doc extracted synchronously at upload, P3a) → `full`.
|
|
362
|
+
* - no sidecar (image awaiting caption) → `pending`.
|
|
363
|
+
* Best-effort: a state-write failure must not fail the text index.
|
|
364
|
+
*/
|
|
365
|
+
/**
|
|
366
|
+
* Register the single sink for "a new indexable image needs captioning."
|
|
367
|
+
* The live caption drain (AssetIndexQueue) registers here; the chokepoint
|
|
368
|
+
* fires from `ensureInitialAssetIndexState`, covering every upload path at
|
|
369
|
+
* once. Replaces the per-call-site enqueue wiring.
|
|
370
|
+
*/
|
|
371
|
+
setOnAssetPending(cb) {
|
|
372
|
+
this.onAssetPendingCb = cb;
|
|
373
|
+
}
|
|
374
|
+
async ensureInitialAssetIndexState(repo, entity) {
|
|
375
|
+
if (entity.entityType !== 'asset')
|
|
376
|
+
return;
|
|
377
|
+
if (entity.data?.indexable !== true)
|
|
378
|
+
return;
|
|
379
|
+
try {
|
|
380
|
+
const existing = await this.getIndexState(repo, entity.id);
|
|
381
|
+
if (existing)
|
|
382
|
+
return;
|
|
383
|
+
const hasSidecar = this.readAssetSidecar(entity) !== null;
|
|
384
|
+
await this.setIndexState(repo, entity.id, hasSidecar ? 'full' : 'pending');
|
|
385
|
+
// Chokepoint: a freshly-seeded `pending` image is the universal signal
|
|
386
|
+
// that an asset needs caption/extract work. Notify the live drain so it
|
|
387
|
+
// captions while the server runs — for EVERY ingress (web ×2, MCP ×2,
|
|
388
|
+
// agent import_file), with no per-call-site wiring. Docs land `full`
|
|
389
|
+
// (sidecar already on disk) and don't need the drain. Best-effort: a
|
|
390
|
+
// throwing subscriber must not fail the index write.
|
|
391
|
+
if (!hasSidecar) {
|
|
392
|
+
try {
|
|
393
|
+
this.onAssetPendingCb?.(repo, entity.id);
|
|
394
|
+
}
|
|
395
|
+
catch { /* non-fatal */ }
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
// eslint-disable-next-line no-console
|
|
400
|
+
console.warn(`[vector] asset index-state seed failed for ${repo}/${entity.id}: ${err instanceof Error ? err.message : err}`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
71
403
|
/**
|
|
72
404
|
* Index or re-index a single entity.
|
|
73
405
|
* Safe to call on create, update, or as part of bulk indexing.
|
|
@@ -75,7 +407,7 @@ export class VectorService {
|
|
|
75
407
|
async upsert(repoName, entity) {
|
|
76
408
|
await this.init();
|
|
77
409
|
const id = `${repoName}/${entity.entityType}/${entity.id}`;
|
|
78
|
-
const text = buildEntityText(entity);
|
|
410
|
+
const text = buildEntityText(entity, this.readAssetSidecar(entity) ?? undefined);
|
|
79
411
|
const vector = this.voyageApiKey
|
|
80
412
|
? await this.generateEmbedding(text)
|
|
81
413
|
: null;
|
|
@@ -89,24 +421,33 @@ export class VectorService {
|
|
|
89
421
|
vector: vector ?? new Array(VECTOR_DIM).fill(0),
|
|
90
422
|
updated_at: new Date().toISOString(),
|
|
91
423
|
};
|
|
92
|
-
await this.table
|
|
424
|
+
await this.withWrite(() => this.table
|
|
93
425
|
.mergeInsert('id')
|
|
94
426
|
.whenMatchedUpdateAll()
|
|
95
427
|
.whenNotMatchedInsertAll()
|
|
96
|
-
.execute([record]);
|
|
428
|
+
.execute([record]));
|
|
429
|
+
// Seed asset index state at import time (decision A1). New image uploads
|
|
430
|
+
// land as `pending` so the caption pass (boot sweep) picks them up; docs
|
|
431
|
+
// whose sidecar was already extracted at upload land as `full`.
|
|
432
|
+
await this.ensureInitialAssetIndexState(repoName, entity);
|
|
97
433
|
}
|
|
98
434
|
/**
|
|
99
435
|
* Bulk upsert — used by `studiograph index`. Batches Voyage API calls.
|
|
100
436
|
*/
|
|
101
|
-
async upsertMany(repoName, entities) {
|
|
437
|
+
async upsertMany(repoName, entities, opts = {}) {
|
|
102
438
|
await this.init();
|
|
103
439
|
if (entities.length === 0)
|
|
104
440
|
return;
|
|
105
|
-
const texts = entities.map(e => buildEntityText(e));
|
|
441
|
+
const texts = entities.map(e => buildEntityText(e, this.readAssetSidecar(e) ?? undefined));
|
|
106
442
|
// Batch embeddings (Voyage supports up to 128 per request)
|
|
107
443
|
let vectors = new Array(entities.length).fill(null);
|
|
108
444
|
if (this.voyageApiKey) {
|
|
109
|
-
vectors = await this.generateEmbeddingsBatch(texts);
|
|
445
|
+
vectors = await this.generateEmbeddingsBatch(texts, opts.onProgress);
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
// No embedding step — report the whole batch as "done" once so
|
|
449
|
+
// progress UIs that wait on at least one callback don't sit at 0%.
|
|
450
|
+
opts.onProgress?.(entities.length, entities.length);
|
|
110
451
|
}
|
|
111
452
|
const records = entities.map((entity, i) => ({
|
|
112
453
|
id: `${repoName}/${entity.entityType}/${entity.id}`,
|
|
@@ -117,11 +458,11 @@ export class VectorService {
|
|
|
117
458
|
vector: vectors[i] ?? new Array(VECTOR_DIM).fill(0),
|
|
118
459
|
updated_at: new Date().toISOString(),
|
|
119
460
|
}));
|
|
120
|
-
await this.table
|
|
461
|
+
await this.withWrite(() => this.table
|
|
121
462
|
.mergeInsert('id')
|
|
122
463
|
.whenMatchedUpdateAll()
|
|
123
464
|
.whenNotMatchedInsertAll()
|
|
124
|
-
.execute(records);
|
|
465
|
+
.execute(records));
|
|
125
466
|
}
|
|
126
467
|
/**
|
|
127
468
|
* Remove an entity from the index.
|
|
@@ -129,7 +470,50 @@ export class VectorService {
|
|
|
129
470
|
async delete(repoName, entityType, entityId) {
|
|
130
471
|
await this.init();
|
|
131
472
|
const id = `${repoName}/${entityType}/${entityId}`;
|
|
132
|
-
await this.table.delete(`id = '${id.replace(/'/g, "''")}'`);
|
|
473
|
+
await this.withWrite(() => this.table.delete(`id = '${id.replace(/'/g, "''")}'`));
|
|
474
|
+
// Reap any asset index-state row keyed by (repo, id). Harmless for
|
|
475
|
+
// non-asset types (no row exists). Without this the row would survive the
|
|
476
|
+
// asset's deletion and, on id reuse, make the recreated asset look
|
|
477
|
+
// already-indexed to the boot sweep (stale-state → silently unsearchable).
|
|
478
|
+
await this.deleteIndexStateSafe(repoName, entityId);
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Remove an entity by `(repo, id)` alone, without needing its type.
|
|
482
|
+
*
|
|
483
|
+
* Used by the serve-boot incremental indexer: when git diff reports a
|
|
484
|
+
* deletion, the file is gone from disk so its type can't be resolved
|
|
485
|
+
* from frontmatter. The vector store has a discrete `entity_id` column
|
|
486
|
+
* so we can match on `repo + entity_id` without falling back to a LIKE
|
|
487
|
+
* pattern on the synthetic id.
|
|
488
|
+
*
|
|
489
|
+
* Safe across type renames: a single id that legitimately had two type
|
|
490
|
+
* rows (e.g. type changed mid-edit and both old + new still exist) gets
|
|
491
|
+
* both wiped — which is the right behavior for incremental rebuild
|
|
492
|
+
* since the next upsert recreates the current type's row.
|
|
493
|
+
*/
|
|
494
|
+
async deleteByRepoAndId(repoName, entityId) {
|
|
495
|
+
await this.init();
|
|
496
|
+
const r = repoName.replace(/'/g, "''");
|
|
497
|
+
const e = entityId.replace(/'/g, "''");
|
|
498
|
+
await this.withWrite(() => this.table.delete(`repo = '${r}' AND entity_id = '${e}'`));
|
|
499
|
+
// Reap the asset index-state row too (the git-pull/incremental-delete path
|
|
500
|
+
// reaches here when a .md is removed outside the app). Same stale-state
|
|
501
|
+
// hazard as the in-app delete if left behind.
|
|
502
|
+
await this.deleteIndexStateSafe(repoName, entityId);
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Best-effort `deleteIndexState` for the delete paths: the entities-table
|
|
506
|
+
* delete is the authoritative op, so a failure to reap the (usually absent)
|
|
507
|
+
* state row must not turn a successful delete into a thrown error.
|
|
508
|
+
*/
|
|
509
|
+
async deleteIndexStateSafe(repoName, entityId) {
|
|
510
|
+
try {
|
|
511
|
+
await this.deleteIndexState(repoName, entityId);
|
|
512
|
+
}
|
|
513
|
+
catch (err) {
|
|
514
|
+
// eslint-disable-next-line no-console
|
|
515
|
+
console.warn(`[vector] index-state cleanup failed for ${repoName}/${entityId}: ${err instanceof Error ? err.message : err}`);
|
|
516
|
+
}
|
|
133
517
|
}
|
|
134
518
|
/**
|
|
135
519
|
* Search the index.
|
|
@@ -140,22 +524,35 @@ export class VectorService {
|
|
|
140
524
|
const limit = options.limit ?? 10;
|
|
141
525
|
try {
|
|
142
526
|
let rows;
|
|
527
|
+
// Repo scoping is a PRE-filter pushed into the query, not a post-filter on
|
|
528
|
+
// the result page. Filtering after `.limit()` silently drops a scoped
|
|
529
|
+
// repo's matches whenever the global top-K is dominated by other repos —
|
|
530
|
+
// e.g. a `repos:['studiograph']` search returning nothing while the same
|
|
531
|
+
// query unscoped ranks a studiograph doc #1. `where` applies BEFORE the
|
|
532
|
+
// limit so the K results are already within scope.
|
|
533
|
+
const repoWhere = options.repos && options.repos.length > 0
|
|
534
|
+
? options.repos.map(r => `repo = '${r.replace(/'/g, "''")}'`).join(' OR ')
|
|
535
|
+
: null;
|
|
143
536
|
if (this.voyageApiKey) {
|
|
144
537
|
// Tier 2: hybrid search
|
|
145
538
|
const queryVector = await this.generateEmbedding(query);
|
|
146
|
-
|
|
147
|
-
|
|
539
|
+
let q = this.table.search(queryVector);
|
|
540
|
+
if (repoWhere)
|
|
541
|
+
q = q.where(repoWhere);
|
|
542
|
+
rows = await q
|
|
148
543
|
.limit(limit * 2) // fetch extra for re-ranking
|
|
149
544
|
.toArray();
|
|
150
545
|
}
|
|
151
546
|
else {
|
|
152
547
|
// Tier 1: FTS only
|
|
153
|
-
|
|
154
|
-
|
|
548
|
+
let q = this.table.search(query, 'text');
|
|
549
|
+
if (repoWhere)
|
|
550
|
+
q = q.where(repoWhere);
|
|
551
|
+
rows = await q
|
|
155
552
|
.limit(limit)
|
|
156
553
|
.toArray();
|
|
157
554
|
}
|
|
158
|
-
|
|
555
|
+
const results = rows
|
|
159
556
|
.filter((r) => r.id !== '__seed__' && r.entity_id !== '')
|
|
160
557
|
.map((r, i) => ({
|
|
161
558
|
repoName: r.repo,
|
|
@@ -163,9 +560,6 @@ export class VectorService {
|
|
|
163
560
|
entityId: r.entity_id,
|
|
164
561
|
score: r._distance != null ? 1 / (1 + r._distance) : 1 - i * 0.01,
|
|
165
562
|
}));
|
|
166
|
-
if (options.repos && options.repos.length > 0) {
|
|
167
|
-
results = results.filter(r => options.repos.includes(r.repoName));
|
|
168
|
-
}
|
|
169
563
|
return results.slice(0, limit);
|
|
170
564
|
}
|
|
171
565
|
catch {
|
|
@@ -188,9 +582,13 @@ export class VectorService {
|
|
|
188
582
|
}
|
|
189
583
|
}
|
|
190
584
|
/**
|
|
191
|
-
* Record the
|
|
585
|
+
* Record the last index time for a repo.
|
|
586
|
+
*
|
|
587
|
+
* Production callers omit `isoTimestamp` and the current time is used.
|
|
588
|
+
* Tests pass an explicit ISO timestamp so they can rewind the clock and
|
|
589
|
+
* assert the git-log `--since` window picks up the right commits.
|
|
192
590
|
*/
|
|
193
|
-
setLastIndexedTime(repoName) {
|
|
591
|
+
setLastIndexedTime(repoName, isoTimestamp) {
|
|
194
592
|
mkdirSync(this.dbPath, { recursive: true });
|
|
195
593
|
let data = {};
|
|
196
594
|
if (existsSync(this.lastIndexedPath)) {
|
|
@@ -199,7 +597,7 @@ export class VectorService {
|
|
|
199
597
|
}
|
|
200
598
|
catch { /* ignore */ }
|
|
201
599
|
}
|
|
202
|
-
data[repoName] = new Date().toISOString();
|
|
600
|
+
data[repoName] = isoTimestamp ?? new Date().toISOString();
|
|
203
601
|
writeFileSync(this.lastIndexedPath, JSON.stringify(data, null, 2) + '\n');
|
|
204
602
|
}
|
|
205
603
|
/** Whether Voyage AI embeddings are enabled (Tier 2). */
|
|
@@ -211,10 +609,11 @@ export class VectorService {
|
|
|
211
609
|
const results = await this.generateEmbeddingsBatch([text]);
|
|
212
610
|
return results[0] ?? new Array(VECTOR_DIM).fill(0);
|
|
213
611
|
}
|
|
214
|
-
async generateEmbeddingsBatch(texts) {
|
|
612
|
+
async generateEmbeddingsBatch(texts, onProgress) {
|
|
215
613
|
// Voyage supports up to 128 inputs per request
|
|
216
614
|
const BATCH_SIZE = 128;
|
|
217
615
|
const all = [];
|
|
616
|
+
const total = texts.length;
|
|
218
617
|
for (let i = 0; i < texts.length; i += BATCH_SIZE) {
|
|
219
618
|
const batch = texts.slice(i, i + BATCH_SIZE);
|
|
220
619
|
const response = await fetch(VOYAGE_API_URL, {
|
|
@@ -231,6 +630,7 @@ export class VectorService {
|
|
|
231
630
|
}
|
|
232
631
|
const json = await response.json();
|
|
233
632
|
all.push(...json.data.map(d => d.embedding));
|
|
633
|
+
onProgress?.(all.length, total);
|
|
234
634
|
}
|
|
235
635
|
return all;
|
|
236
636
|
}
|
|
@@ -249,7 +649,7 @@ export async function reindexWorkspace(workspacePath, repos, onProgress) {
|
|
|
249
649
|
const { homedir } = await import('os');
|
|
250
650
|
const userConfig = loadUserConfig();
|
|
251
651
|
const dbPath = userConfig.vector_db_path || join(homedir(), '.studiograph', 'vector');
|
|
252
|
-
const vectorService = new VectorService(dbPath, userConfig.voyage_api_key);
|
|
652
|
+
const vectorService = new VectorService(dbPath, userConfig.voyage_api_key, workspacePath);
|
|
253
653
|
await vectorService.init();
|
|
254
654
|
const log = onProgress ?? (() => { });
|
|
255
655
|
let total = 0;
|
|
@@ -277,13 +677,151 @@ export async function reindexWorkspace(workspacePath, repos, onProgress) {
|
|
|
277
677
|
}
|
|
278
678
|
return total;
|
|
279
679
|
}
|
|
680
|
+
export async function incrementalReindexWorkspace(workspaceManager, repos, workspacePath, opts = {}) {
|
|
681
|
+
const vectorService = workspaceManager.vectorService;
|
|
682
|
+
if (!vectorService) {
|
|
683
|
+
return { total: 0, fresh: false };
|
|
684
|
+
}
|
|
685
|
+
const log = opts.log ?? (() => { });
|
|
686
|
+
const { execFileSync } = await import('child_process');
|
|
687
|
+
let total = 0;
|
|
688
|
+
let anyFreshRepo = false;
|
|
689
|
+
const staleEntities = [];
|
|
690
|
+
// Pre-pass: figure out the total first-time entity count so the
|
|
691
|
+
// progress callback has a stable denominator. Cheap — `graph.list()`
|
|
692
|
+
// doesn't re-read files, it returns the in-memory graph state the
|
|
693
|
+
// workspace manager already maintains.
|
|
694
|
+
let firstTimeTotal = 0;
|
|
695
|
+
if (opts.onFirstTimeProgress) {
|
|
696
|
+
for (const repo of repos) {
|
|
697
|
+
if (vectorService.getLastIndexedTime(repo.name))
|
|
698
|
+
continue;
|
|
699
|
+
try {
|
|
700
|
+
firstTimeTotal += workspaceManager.getGraph(repo.name).list().length;
|
|
701
|
+
}
|
|
702
|
+
catch {
|
|
703
|
+
// tolerate per-repo failure; the real loop below will log it
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
let firstTimeDone = 0;
|
|
708
|
+
for (const repo of repos) {
|
|
709
|
+
const lastIndexed = vectorService.getLastIndexedTime(repo.name);
|
|
710
|
+
// Per-repo first-time index. Catches three cases:
|
|
711
|
+
// 1. Very first `serve` boot (every repo missing a timestamp).
|
|
712
|
+
// 2. New folder added between serve boots (existing workspace +
|
|
713
|
+
// new repo with no timestamp). Pre-fix this was skipped here
|
|
714
|
+
// and never indexed unless the operator ran a full reindex.
|
|
715
|
+
// 3. Vector DB rebuilt from scratch but workspace has existing
|
|
716
|
+
// folders.
|
|
717
|
+
if (!lastIndexed) {
|
|
718
|
+
try {
|
|
719
|
+
const graph = workspaceManager.getGraph(repo.name);
|
|
720
|
+
const entities = graph.list();
|
|
721
|
+
if (entities.length > 0) {
|
|
722
|
+
await vectorService.upsertMany(repo.name, entities, {
|
|
723
|
+
onProgress: (batchDone) => {
|
|
724
|
+
opts.onFirstTimeProgress?.(firstTimeDone + batchDone, firstTimeTotal);
|
|
725
|
+
},
|
|
726
|
+
});
|
|
727
|
+
firstTimeDone += entities.length;
|
|
728
|
+
total += entities.length;
|
|
729
|
+
}
|
|
730
|
+
vectorService.setLastIndexedTime(repo.name);
|
|
731
|
+
anyFreshRepo = true;
|
|
732
|
+
}
|
|
733
|
+
catch (err) {
|
|
734
|
+
log(`failed to index ${repo.name}: ${err instanceof Error ? err.message : 'unknown'}`);
|
|
735
|
+
}
|
|
736
|
+
continue;
|
|
737
|
+
}
|
|
738
|
+
// Established repo — diff git log since the last index timestamp and
|
|
739
|
+
// collect a list of stale (repo, id) tuples to upsert / delete below.
|
|
740
|
+
const repoPath = join(workspacePath, repo.path);
|
|
741
|
+
if (!existsSync(repoPath))
|
|
742
|
+
continue;
|
|
743
|
+
try {
|
|
744
|
+
const output = execFileSync('git', ['log', `--since=${lastIndexed}`, '--name-status', '--format=', '--', '*.md'], { cwd: repoPath, encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
745
|
+
if (!output)
|
|
746
|
+
continue;
|
|
747
|
+
for (const line of output.split('\n')) {
|
|
748
|
+
// Accept any markdown path. Layouts in the wild:
|
|
749
|
+
// - flat: `entity-id.md`
|
|
750
|
+
// - typed: `<type>/entity-id.md`
|
|
751
|
+
// - nested: `folder/sub/entity-id.md`
|
|
752
|
+
// STU-131 normalized on flat for new entities; older typed layouts
|
|
753
|
+
// and arbitrary nested folders still appear in mixed repos. Entity
|
|
754
|
+
// type lives in frontmatter (resolved via graph.getById for
|
|
755
|
+
// upserts; not needed for deletes since we now match by `(repo,
|
|
756
|
+
// entity_id)` columns). Pre-fix this regex required exactly one
|
|
757
|
+
// slash with a `\w+` type segment and missed all three layouts,
|
|
758
|
+
// plus hyphenated types like `case-study`.
|
|
759
|
+
const m = line.match(/^([AMD])\s+(.+\.md)$/);
|
|
760
|
+
if (!m)
|
|
761
|
+
continue;
|
|
762
|
+
const [, status, path] = m;
|
|
763
|
+
// basename minus `.md`. Entity IDs are unique within a repo.
|
|
764
|
+
const id = path.split('/').pop().replace(/\.md$/, '');
|
|
765
|
+
if (!id)
|
|
766
|
+
continue;
|
|
767
|
+
staleEntities.push({ repoName: repo.name, entityId: id, deleted: status === 'D' });
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
catch (err) {
|
|
771
|
+
log(`failed to diff ${repo.name}: ${err instanceof Error ? err.message : 'unknown'}`);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
if (staleEntities.length === 0) {
|
|
775
|
+
// Nothing changed via git diff. If we did first-time work above, that
|
|
776
|
+
// counts as a fresh run; otherwise this was a no-op incremental boot.
|
|
777
|
+
return { total, fresh: anyFreshRepo };
|
|
778
|
+
}
|
|
779
|
+
// Dedupe: if an entity appears multiple times (e.g. M then D), the last
|
|
780
|
+
// entry wins. Order matters — git log is newest-first by default, so we
|
|
781
|
+
// reverse before reducing to get the newest state per (repo, id).
|
|
782
|
+
const seen = new Map();
|
|
783
|
+
for (const item of staleEntities.slice().reverse()) {
|
|
784
|
+
seen.set(`${item.repoName}/${item.entityId}`, item);
|
|
785
|
+
}
|
|
786
|
+
for (const item of seen.values()) {
|
|
787
|
+
try {
|
|
788
|
+
if (item.deleted) {
|
|
789
|
+
// Delete by (repo, id) — type isn't recoverable from a deleted file.
|
|
790
|
+
// The new column-based matcher in vectorService handles it without
|
|
791
|
+
// a frontmatter lookup.
|
|
792
|
+
await vectorService.deleteByRepoAndId(item.repoName, item.entityId);
|
|
793
|
+
}
|
|
794
|
+
else {
|
|
795
|
+
const graph = workspaceManager.getGraph(item.repoName);
|
|
796
|
+
const entity = graph.getById(item.entityId);
|
|
797
|
+
await vectorService.upsert(item.repoName, entity);
|
|
798
|
+
total++;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
catch {
|
|
802
|
+
// Entity may have been deleted then re-created; safe to skip.
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
// Stamp every repo we touched. Empty-diff repos already had a timestamp
|
|
806
|
+
// (we skipped the rebuild path) — re-stamping is cheap and keeps the
|
|
807
|
+
// "since" window tight for the next boot.
|
|
808
|
+
for (const repo of repos) {
|
|
809
|
+
vectorService.setLastIndexedTime(repo.name);
|
|
810
|
+
}
|
|
811
|
+
return { total, fresh: anyFreshRepo };
|
|
812
|
+
}
|
|
280
813
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
281
814
|
/**
|
|
282
815
|
* Build a text representation of an entity for FTS/embedding.
|
|
283
816
|
* Combines entity type, key frontmatter fields, and markdown body.
|
|
817
|
+
*
|
|
818
|
+
* `extraText` is appended after the body — used by VectorService to
|
|
819
|
+
* fold PDF sidecar text into asset-entity embeddings. Kept as a plain
|
|
820
|
+
* string parameter (not file IO) so this stays pure and unit-testable.
|
|
821
|
+
*
|
|
284
822
|
* Exported for testing.
|
|
285
823
|
*/
|
|
286
|
-
export function buildEntityText(entity) {
|
|
824
|
+
export function buildEntityText(entity, extraText) {
|
|
287
825
|
const parts = [];
|
|
288
826
|
// Entity type and ID as context
|
|
289
827
|
parts.push(`${entity.entityType}: ${entity.data.name || entity.id}`);
|
|
@@ -317,6 +855,11 @@ export function buildEntityText(entity) {
|
|
|
317
855
|
if (plainText)
|
|
318
856
|
parts.push(plainText);
|
|
319
857
|
}
|
|
858
|
+
if (extraText) {
|
|
859
|
+
const trimmed = extraText.trim();
|
|
860
|
+
if (trimmed)
|
|
861
|
+
parts.push(trimmed);
|
|
862
|
+
}
|
|
320
863
|
return parts.join('\n');
|
|
321
864
|
}
|
|
322
865
|
//# sourceMappingURL=vector-service.js.map
|