studiograph 1.3.47 → 1.3.48-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -16
- package/dist/agent/agent-pool.d.ts +117 -0
- package/dist/agent/agent-pool.js +287 -0
- package/dist/agent/agent-pool.js.map +1 -0
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +113 -22
- package/dist/agent/orchestrator.js +573 -181
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +36 -0
- package/dist/agent/prompts/entity-types-section.js +90 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +148 -69
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/entity-schema.md +77 -433
- package/dist/agent/skills/interview/entity-templates.md +193 -0
- package/dist/agent/skills/interview/question-domains.md +391 -0
- package/dist/agent/skills/interview/skill.md +204 -0
- package/dist/agent/skills/schema-rules.md +54 -0
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +7 -6
- package/dist/agent/tools/fs-tools.js +5 -4
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +21 -58
- package/dist/agent/tools/graph-tools.js +635 -332
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +130 -236
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +87 -17
- package/dist/agent/tools/permission-tools.js +233 -38
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.d.ts +18 -0
- package/dist/agent/tools/web-tools.js +283 -0
- package/dist/agent/tools/web-tools.js.map +1 -0
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
- package/dist/cli/commands/admin/audit-workspace.js +133 -0
- package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
- package/dist/cli/commands/admin/audit.d.ts +21 -0
- package/dist/cli/commands/admin/audit.js +174 -0
- package/dist/cli/commands/admin/audit.js.map +1 -0
- package/dist/cli/commands/admin/backup.d.ts +54 -0
- package/dist/cli/commands/admin/backup.js +207 -0
- package/dist/cli/commands/admin/backup.js.map +1 -0
- package/dist/cli/commands/admin/folder.d.ts +11 -0
- package/dist/cli/commands/admin/folder.js +186 -0
- package/dist/cli/commands/admin/folder.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +16 -0
- package/dist/cli/commands/admin/index.js +46 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
- package/dist/cli/commands/admin/migrate-assets.js +184 -0
- package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +56 -0
- package/dist/cli/commands/admin/migrate.js +263 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/restore.d.ts +24 -0
- package/dist/cli/commands/admin/restore.js +228 -0
- package/dist/cli/commands/admin/restore.js.map +1 -0
- package/dist/cli/commands/admin/secrets.d.ts +23 -0
- package/dist/cli/commands/admin/secrets.js +256 -0
- package/dist/cli/commands/admin/secrets.js.map +1 -0
- package/dist/cli/commands/admin/settings.d.ts +28 -0
- package/dist/cli/commands/admin/settings.js +284 -0
- package/dist/cli/commands/admin/settings.js.map +1 -0
- package/dist/cli/commands/admin/token.d.ts +42 -0
- package/dist/cli/commands/admin/token.js +126 -0
- package/dist/cli/commands/admin/token.js.map +1 -0
- package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
- package/dist/cli/commands/admin/transfer-ownership.js +106 -0
- package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
- package/dist/cli/commands/admin/user.d.ts +11 -0
- package/dist/cli/commands/admin/user.js +187 -0
- package/dist/cli/commands/admin/user.js.map +1 -0
- package/dist/cli/commands/clone.d.ts +25 -3
- package/dist/cli/commands/clone.js +142 -36
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/commit.d.ts +1 -1
- package/dist/cli/commands/commit.js +24 -11
- package/dist/cli/commands/commit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +23 -107
- package/dist/cli/commands/config.js +52 -260
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/connector.d.ts +10 -13
- package/dist/cli/commands/connector.js +16 -58
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.js +215 -68
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +2 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +10 -30
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.js +12 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/orphans.js +14 -30
- package/dist/cli/commands/orphans.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +223 -204
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +65 -12
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +22 -6
- package/dist/cli/commands/reset.js +142 -63
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/serve.js +209 -24
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +372 -202
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/crypto-bundle.d.ts +39 -0
- package/dist/cli/crypto-bundle.js +94 -0
- package/dist/cli/crypto-bundle.js.map +1 -0
- package/dist/cli/index.js +24 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-pin.d.ts +68 -0
- package/dist/cli/railway-pin.js +96 -0
- package/dist/cli/railway-pin.js.map +1 -0
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +33 -52
- package/dist/cli/setup-wizard.js +43 -68
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/cell-anchor.d.ts +29 -0
- package/dist/core/cell-anchor.js +53 -0
- package/dist/core/cell-anchor.js.map +1 -0
- package/dist/core/comment-anchor.d.ts +41 -0
- package/dist/core/comment-anchor.js +147 -0
- package/dist/core/comment-anchor.js.map +1 -0
- package/dist/core/commit-messages.d.ts +57 -0
- package/dist/core/commit-messages.js +85 -0
- package/dist/core/commit-messages.js.map +1 -0
- package/dist/core/embeds.d.ts +56 -0
- package/dist/core/embeds.js +103 -0
- package/dist/core/embeds.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +53 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +140 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +36 -0
- package/dist/core/folder-sidecar.js +91 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/graph.d.ts +675 -14
- package/dist/core/graph.js +2118 -314
- package/dist/core/graph.js.map +1 -1
- package/dist/core/history-diff.d.ts +35 -0
- package/dist/core/history-diff.js +114 -0
- package/dist/core/history-diff.js.map +1 -0
- package/dist/core/schema-registry.d.ts +59 -0
- package/dist/core/schema-registry.js +198 -0
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +81 -0
- package/dist/core/secrets/dual-write.js +247 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/index.d.ts +49 -0
- package/dist/core/secrets/index.js +74 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
- package/dist/core/secrets/r2-structural-migration.js +109 -0
- package/dist/core/secrets/r2-structural-migration.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +598 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +77 -455
- package/dist/core/types.js +17 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +75 -7
- package/dist/core/user-config.js +155 -7
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +717 -1791
- package/dist/core/validation.js +357 -228
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +79 -12
- package/dist/core/workspace-manager.js +213 -73
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +69 -35
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/comment-virtual-entity.d.ts +36 -0
- package/dist/mcp/comment-virtual-entity.js +71 -0
- package/dist/mcp/comment-virtual-entity.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +94 -13
- package/dist/mcp/connector-manager.js +283 -62
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/oauth-provider.d.ts +27 -33
- package/dist/mcp/oauth-provider.js +65 -134
- package/dist/mcp/oauth-provider.js.map +1 -1
- package/dist/mcp/oauth-registry.d.ts +62 -0
- package/dist/mcp/oauth-registry.js +85 -0
- package/dist/mcp/oauth-registry.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -3
- package/dist/mcp/server.js +30 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/state-signer.d.ts +41 -0
- package/dist/mcp/state-signer.js +120 -0
- package/dist/mcp/state-signer.js.map +1 -0
- package/dist/mcp/tools.d.ts +35 -2
- package/dist/mcp/tools.js +1051 -117
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +18 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/body-write-coordinator.d.ts +151 -0
- package/dist/server/body-write-coordinator.js +161 -0
- package/dist/server/body-write-coordinator.js.map +1 -0
- package/dist/server/cloud-billing-flow.d.ts +32 -0
- package/dist/server/cloud-billing-flow.js +75 -0
- package/dist/server/cloud-billing-flow.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +14 -3
- package/dist/server/index.js +451 -193
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +171 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/asset-api.d.ts +10 -0
- package/dist/server/routes/asset-api.js +294 -0
- package/dist/server/routes/asset-api.js.map +1 -0
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.d.ts +3 -2
- package/dist/server/routes/auth-api.js +519 -38
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +18 -0
- package/dist/server/routes/capture-api.js +257 -0
- package/dist/server/routes/capture-api.js.map +1 -0
- package/dist/server/routes/chat.d.ts +4 -1
- package/dist/server/routes/chat.js +298 -88
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/comments-api.d.ts +15 -0
- package/dist/server/routes/comments-api.js +444 -0
- package/dist/server/routes/comments-api.js.map +1 -0
- package/dist/server/routes/config-api.d.ts +21 -0
- package/dist/server/routes/config-api.js +256 -0
- package/dist/server/routes/config-api.js.map +1 -0
- package/dist/server/routes/connectors-api.d.ts +17 -0
- package/dist/server/routes/connectors-api.js +410 -0
- package/dist/server/routes/connectors-api.js.map +1 -0
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/event-ingest-api.js +125 -0
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +3 -3
- package/dist/server/routes/git-http.js +86 -38
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +35 -0
- package/dist/server/routes/graph-api-access.js +105 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +3 -2
- package/dist/server/routes/graph-api.js +1321 -263
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/insights-api.d.ts +1 -2
- package/dist/server/routes/insights-api.js +149 -41
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +7 -3
- package/dist/server/routes/mcp.js +22 -6
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -30
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/r2-api.d.ts +25 -0
- package/dist/server/routes/r2-api.js +276 -0
- package/dist/server/routes/r2-api.js.map +1 -0
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +308 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +180 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/url-api.d.ts +7 -0
- package/dist/server/routes/url-api.js +74 -0
- package/dist/server/routes/url-api.js.map +1 -0
- package/dist/server/routes/views-api.js +81 -7
- package/dist/server/routes/views-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +124 -35
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +2 -1
- package/dist/server/routes/ws.js +64 -16
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +182 -15
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +138 -14
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +285 -7
- package/dist/server/yjs-manager.js +907 -36
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +165 -0
- package/dist/server/yjs-persistence.js +557 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +73 -0
- package/dist/services/access-control.js +146 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/asset-listing.d.ts +39 -0
- package/dist/services/asset-listing.js +125 -0
- package/dist/services/asset-listing.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +53 -0
- package/dist/services/asset-upload-service.js +201 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/assets/asset-index-service.d.ts +82 -0
- package/dist/services/assets/asset-index-service.js +167 -0
- package/dist/services/assets/asset-index-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +44 -0
- package/dist/services/assets/base.js +55 -0
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +69 -1
- package/dist/services/assets/index.js +125 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +12 -1
- package/dist/services/assets/local.js +100 -1
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2-sync.d.ts +88 -0
- package/dist/services/assets/r2-sync.js +412 -0
- package/dist/services/assets/r2-sync.js.map +1 -0
- package/dist/services/assets/r2.d.ts +34 -1
- package/dist/services/assets/r2.js +93 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +314 -36
- package/dist/services/auth-service.js +1126 -139
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/bookmark-import-service.d.ts +49 -0
- package/dist/services/bookmark-import-service.js +250 -0
- package/dist/services/bookmark-import-service.js.map +1 -0
- package/dist/services/cloud-inference-billing.d.ts +64 -0
- package/dist/services/cloud-inference-billing.js +313 -0
- package/dist/services/cloud-inference-billing.js.map +1 -0
- package/dist/services/comment-service.d.ts +97 -0
- package/dist/services/comment-service.js +341 -0
- package/dist/services/comment-service.js.map +1 -0
- package/dist/services/csv-service.d.ts +22 -17
- package/dist/services/csv-service.js +55 -92
- package/dist/services/csv-service.js.map +1 -1
- package/dist/services/entity-mutations.d.ts +161 -0
- package/dist/services/entity-mutations.js +296 -0
- package/dist/services/entity-mutations.js.map +1 -0
- package/dist/services/event-processor.d.ts +104 -0
- package/dist/services/event-processor.js +441 -0
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +54 -0
- package/dist/services/git.js +188 -54
- package/dist/services/git.js.map +1 -1
- package/dist/services/graph-maintenance.d.ts +42 -0
- package/dist/services/graph-maintenance.js +143 -0
- package/dist/services/graph-maintenance.js.map +1 -0
- package/dist/services/import-service.d.ts +45 -2
- package/dist/services/import-service.js +304 -100
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +9 -16
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.d.ts +12 -1
- package/dist/services/markdown.js +71 -6
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +22 -14
- package/dist/services/memory-service.js +53 -35
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/mention-detector.d.ts +23 -0
- package/dist/services/mention-detector.js +47 -0
- package/dist/services/mention-detector.js.map +1 -0
- package/dist/services/notification-broadcast.d.ts +32 -0
- package/dist/services/notification-broadcast.js +38 -0
- package/dist/services/notification-broadcast.js.map +1 -0
- package/dist/services/notification-service.d.ts +41 -0
- package/dist/services/notification-service.js +100 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/user-person-bridge.d.ts +118 -0
- package/dist/services/user-person-bridge.js +306 -0
- package/dist/services/user-person-bridge.js.map +1 -0
- package/dist/services/vector-service.d.ts +146 -6
- package/dist/services/vector-service.js +276 -13
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +106 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/utils/git.d.ts +17 -2
- package/dist/utils/git.js +23 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +12 -19
- package/dist/utils/version-checker.js +14 -104
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.DDqq11xY.css +2 -0
- package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/13.7d-Q37wc.css +1 -0
- package/dist/web/_app/immutable/assets/14.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/2.CGK2ky-K.css +1 -0
- package/dist/web/_app/immutable/assets/3.CV0abekd.css +1 -0
- package/dist/web/_app/immutable/assets/4.fGsEpo95.css +1 -0
- package/dist/web/_app/immutable/assets/AgentOverlay.DqzjAOm4.css +1 -0
- package/dist/web/_app/immutable/assets/AssetManagerModal.BKJfPAPk.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.bNewSxkH.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.DX1oBeF_.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.B5KdvRYl.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.DgvSjS0I.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.D0QbZFd6.css +1 -0
- package/dist/web/_app/immutable/assets/Markdown.B4lW7Llh.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.DYWYMFSO.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/StopFilledAlt.clodJdp5.css +1 -0
- package/dist/web/_app/immutable/assets/TimelineView.DA-H6dvv.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.BS1ildu7.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/formatting.B912lpdG.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
- package/dist/web/_app/immutable/assets/list-columns.DCMVmy_Q.css +1 -0
- package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/sheet.DJPuqnTg.css +1 -0
- package/dist/web/_app/immutable/assets/speech-dictation.C5CYFhS1.css +1 -0
- package/dist/web/_app/immutable/chunks/0iDDDyaZ.js +1 -0
- package/dist/web/_app/immutable/chunks/2LgrBrpS2.js +2 -0
- package/dist/web/_app/immutable/chunks/3EfPAYzi2.js +1 -0
- package/dist/web/_app/immutable/chunks/7Bu427my2.js +184 -0
- package/dist/web/_app/immutable/chunks/96h3ktuk.js +1 -0
- package/dist/web/_app/immutable/chunks/A6FJA1AF.js +1 -0
- package/dist/web/_app/immutable/chunks/B-FAwCqe2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-V5eMSw2.js +1 -0
- package/dist/web/_app/immutable/chunks/B-i9_YVM.js +1 -0
- package/dist/web/_app/immutable/chunks/B15-kvCe2.js +1 -0
- package/dist/web/_app/immutable/chunks/B1KZ7zY32.js +2 -0
- package/dist/web/_app/immutable/chunks/B4gpzeQ2.js +1 -0
- package/dist/web/_app/immutable/chunks/B6Lt-qaJ2.js +1 -0
- package/dist/web/_app/immutable/chunks/B7tbGyiU2.js +1 -0
- package/dist/web/_app/immutable/chunks/BBxt8lpa.js +1 -0
- package/dist/web/_app/immutable/chunks/BCaRi2AF.js +1 -0
- package/dist/web/_app/immutable/chunks/BJ6Z7eAM.js +2 -0
- package/dist/web/_app/immutable/chunks/BM_vIwVC.js +83 -0
- package/dist/web/_app/immutable/chunks/BQULA6er.js +4 -0
- package/dist/web/_app/immutable/chunks/BQW-EDgP2.js +224 -0
- package/dist/web/_app/immutable/chunks/BR6jMpLB.js +1 -0
- package/dist/web/_app/immutable/chunks/BVnuLlVg.js +1 -0
- package/dist/web/_app/immutable/chunks/BddNmQ8j.js +1 -0
- package/dist/web/_app/immutable/chunks/BeuunHPO.js +1 -0
- package/dist/web/_app/immutable/chunks/BhTmSo4n2.js +1 -0
- package/dist/web/_app/immutable/chunks/BikW7mty2.js +1 -0
- package/dist/web/_app/immutable/chunks/BkyFvJvz.js +1 -0
- package/dist/web/_app/immutable/chunks/BlyFGPFV.js +22 -0
- package/dist/web/_app/immutable/chunks/Bo5dghSu.js +3 -0
- package/dist/web/_app/immutable/chunks/BpPyho8Y.js +3 -0
- package/dist/web/_app/immutable/chunks/BsuvyNDN2.js +2 -0
- package/dist/web/_app/immutable/chunks/BuKi0vpu2.js +7 -0
- package/dist/web/_app/immutable/chunks/BuuYnIjE.js +1 -0
- package/dist/web/_app/immutable/chunks/By4lVKNC.js +2 -0
- package/dist/web/_app/immutable/chunks/ByQGCIwO.js +5 -0
- package/dist/web/_app/immutable/chunks/ByidpUhu.js +1 -0
- package/dist/web/_app/immutable/chunks/C35TIzaB.js +1 -0
- package/dist/web/_app/immutable/chunks/C5dM5op-.js +1 -0
- package/dist/web/_app/immutable/chunks/C6Nx0jpM.js +1 -0
- package/dist/web/_app/immutable/chunks/C6pVyOEl2.js +1 -0
- package/dist/web/_app/immutable/chunks/C80GKPZ9.js +1 -0
- package/dist/web/_app/immutable/chunks/C94TJqPI.js +1 -0
- package/dist/web/_app/immutable/chunks/C9PETsiT.js +1 -0
- package/dist/web/_app/immutable/chunks/CAuAQ81a2.js +1 -0
- package/dist/web/_app/immutable/chunks/CBnzSITi2.js +1 -0
- package/dist/web/_app/immutable/chunks/CC9p2p6w.js +1 -0
- package/dist/web/_app/immutable/chunks/CCLR-AJL2.js +185 -0
- package/dist/web/_app/immutable/chunks/CD0X7XPW.js +6 -0
- package/dist/web/_app/immutable/chunks/CDTjuBSm.js +1 -0
- package/dist/web/_app/immutable/chunks/CH-KYFIm.js +64 -0
- package/dist/web/_app/immutable/chunks/CHj8fObQ2.js +9 -0
- package/dist/web/_app/immutable/chunks/CK-UnH-n2.js +1 -0
- package/dist/web/_app/immutable/chunks/CKH5BEAh.js +1 -0
- package/dist/web/_app/immutable/chunks/CPSupDJp2.js +2 -0
- package/dist/web/_app/immutable/chunks/CSUrYOis.js +1 -0
- package/dist/web/_app/immutable/chunks/CYTTTma0.js +3 -0
- package/dist/web/_app/immutable/chunks/Cbaut_us2.js +1 -0
- package/dist/web/_app/immutable/chunks/CiIpSx5n2.js +1 -0
- package/dist/web/_app/immutable/chunks/CkLfUXwy.js +1 -0
- package/dist/web/_app/immutable/chunks/CokE4L8B2.js +1 -0
- package/dist/web/_app/immutable/chunks/CpLdnbh3.js +1 -0
- package/dist/web/_app/immutable/chunks/CvDrXJk9.js +1 -0
- package/dist/web/_app/immutable/chunks/D00MFB9_2.js +1 -0
- package/dist/web/_app/immutable/chunks/D41CbXmM.js +1 -0
- package/dist/web/_app/immutable/chunks/D5Hj-MPO2.js +1 -0
- package/dist/web/_app/immutable/chunks/D6nLEmZy2.js +1 -0
- package/dist/web/_app/immutable/chunks/D71ZlQBM2.js +2 -0
- package/dist/web/_app/immutable/chunks/D9ql9vXU.js +1 -0
- package/dist/web/_app/immutable/chunks/DAXW5iLp.js +1 -0
- package/dist/web/_app/immutable/chunks/DBzQ8LyQ2.js +2 -0
- package/dist/web/_app/immutable/chunks/DIb5rAPU2.js +1 -0
- package/dist/web/_app/immutable/chunks/DOmH4G9o.js +14 -0
- package/dist/web/_app/immutable/chunks/DQMWa2t72.js +1 -0
- package/dist/web/_app/immutable/chunks/DRsswX8S.js +1 -0
- package/dist/web/_app/immutable/chunks/DTCHhxD5.js +1 -0
- package/dist/web/_app/immutable/chunks/DUwgGBxa.js +1 -0
- package/dist/web/_app/immutable/chunks/DVcy5Pp82.js +1 -0
- package/dist/web/_app/immutable/chunks/DWygwzcO.js +1 -0
- package/dist/web/_app/immutable/chunks/DYXDRmoo.js +1 -0
- package/dist/web/_app/immutable/chunks/DZ-YyRVM.js +1 -0
- package/dist/web/_app/immutable/chunks/D_HVOuHV.js +1 -0
- package/dist/web/_app/immutable/chunks/DaoOQFPb.js +1 -0
- package/dist/web/_app/immutable/chunks/DdLkNvPf.js +23 -0
- package/dist/web/_app/immutable/chunks/DiMQob8p.js +1 -0
- package/dist/web/_app/immutable/chunks/DiQJ9DLy.js +1 -0
- package/dist/web/_app/immutable/chunks/DlORZqfE.js +1 -0
- package/dist/web/_app/immutable/chunks/DmeYl7eL.js +2 -0
- package/dist/web/_app/immutable/chunks/Dng3OcRd2.js +1 -0
- package/dist/web/_app/immutable/chunks/DoKMFfJd.js +1 -0
- package/dist/web/_app/immutable/chunks/DpzG2mVI2.js +1 -0
- package/dist/web/_app/immutable/chunks/DvJSCDuZ2.js +1 -0
- package/dist/web/_app/immutable/chunks/DvPuaTCl2.js +5 -0
- package/dist/web/_app/immutable/chunks/ItgU4ei5.js +1 -0
- package/dist/web/_app/immutable/chunks/JJDMrjj62.js +1 -0
- package/dist/web/_app/immutable/chunks/OTTMDMTW.js +1 -0
- package/dist/web/_app/immutable/chunks/RmiWpCin2.js +1 -0
- package/dist/web/_app/immutable/chunks/ZTiqmKJy2.js +1 -0
- package/dist/web/_app/immutable/chunks/ahC5WoXX2.js +1 -0
- package/dist/web/_app/immutable/chunks/e3SY5t2O2.js +2692 -0
- package/dist/web/_app/immutable/chunks/g09ZrevW.js +1 -0
- package/dist/web/_app/immutable/chunks/go8N1nWD2.js +3 -0
- package/dist/web/_app/immutable/chunks/nTAmRNKw2.js +1 -0
- package/dist/web/_app/immutable/chunks/oBQOivfH2.js +1 -0
- package/dist/web/_app/immutable/chunks/oUTRxd0f.js +1 -0
- package/dist/web/_app/immutable/chunks/s_7BJJYy.js +2 -0
- package/dist/web/_app/immutable/chunks/uuFM-ygL.js +1 -0
- package/dist/web/_app/immutable/chunks/v7me-ydg.js +2 -0
- package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/dist/web/_app/immutable/chunks/zl16E4yc2.js +1 -0
- package/dist/web/_app/immutable/entry/app.CbuUtkoM.js +2 -0
- package/dist/web/_app/immutable/entry/start.DeZyKwOT.js +1 -0
- package/dist/web/_app/immutable/nodes/0.C4PMtdx9.js +2 -0
- package/dist/web/_app/immutable/nodes/1.BwVfPLMn.js +1 -0
- package/dist/web/_app/immutable/nodes/10.DPr_SYan.js +1 -0
- package/dist/web/_app/immutable/nodes/11.CJAmEchE.js +1 -0
- package/dist/web/_app/immutable/nodes/12.ChMWXPMk.js +1 -0
- package/dist/web/_app/immutable/nodes/13.8vOKq8ue.js +1 -0
- package/dist/web/_app/immutable/nodes/14.BOSNmj9h.js +1 -0
- package/dist/web/_app/immutable/nodes/2.7N4BLwhX.js +109 -0
- package/dist/web/_app/immutable/nodes/3.Cd-tx8Ej.js +2 -0
- package/dist/web/_app/immutable/nodes/4.DtuT-syy.js +14 -0
- package/dist/web/_app/immutable/nodes/5.YwNHOrkt.js +1 -0
- package/dist/web/_app/immutable/nodes/6.BSPlYQuq.js +1 -0
- package/dist/web/_app/immutable/nodes/7.DPXzwW0H.js +1 -0
- package/dist/web/_app/immutable/nodes/8.Dhpk7w3X.js +1 -0
- package/dist/web/_app/immutable/nodes/9.Dd4iAQN5.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +54 -19
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +34 -14
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/obsidian-source-setup.md +0 -246
- package/dist/agent/skills/skill-loader.d.ts +0 -48
- package/dist/agent/skills/skill-loader.js +0 -166
- package/dist/agent/skills/skill-loader.js.map +0 -1
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/sync-tools.d.ts +0 -35
- package/dist/agent/tools/sync-tools.js +0 -992
- package/dist/agent/tools/sync-tools.js.map +0 -1
- package/dist/auth/github.d.ts +0 -56
- package/dist/auth/github.js +0 -169
- package/dist/auth/github.js.map +0 -1
- package/dist/cli/commands/access.d.ts +0 -11
- package/dist/cli/commands/access.js +0 -156
- package/dist/cli/commands/access.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -10
- package/dist/cli/commands/auth.js +0 -79
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/clear.d.ts +0 -5
- package/dist/cli/commands/clear.js +0 -36
- package/dist/cli/commands/clear.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js +0 -187
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/enrich.d.ts +0 -11
- package/dist/cli/commands/enrich.js +0 -135
- package/dist/cli/commands/enrich.js.map +0 -1
- package/dist/cli/commands/graphrag.d.ts +0 -12
- package/dist/cli/commands/graphrag.js +0 -122
- package/dist/cli/commands/graphrag.js.map +0 -1
- package/dist/cli/commands/join.d.ts +0 -9
- package/dist/cli/commands/join.js +0 -255
- package/dist/cli/commands/join.js.map +0 -1
- package/dist/cli/commands/members.d.ts +0 -11
- package/dist/cli/commands/members.js +0 -230
- package/dist/cli/commands/members.js.map +0 -1
- package/dist/cli/commands/org.d.ts +0 -10
- package/dist/cli/commands/org.js +0 -132
- package/dist/cli/commands/org.js.map +0 -1
- package/dist/cli/commands/provision.d.ts +0 -8
- package/dist/cli/commands/provision.js +0 -116
- package/dist/cli/commands/provision.js.map +0 -1
- package/dist/cli/commands/resolve.d.ts +0 -8
- package/dist/cli/commands/resolve.js +0 -85
- package/dist/cli/commands/resolve.js.map +0 -1
- package/dist/cli/commands/review.d.ts +0 -19
- package/dist/cli/commands/review.js +0 -128
- package/dist/cli/commands/review.js.map +0 -1
- package/dist/cli/commands/source.d.ts +0 -16
- package/dist/cli/commands/source.js +0 -159
- package/dist/cli/commands/source.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -7
- package/dist/cli/commands/start.js +0 -589
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/sync-collection.d.ts +0 -14
- package/dist/cli/commands/sync-collection.js +0 -355
- package/dist/cli/commands/sync-collection.js.map +0 -1
- package/dist/cli/commands/sync-entities.d.ts +0 -13
- package/dist/cli/commands/sync-entities.js +0 -242
- package/dist/cli/commands/sync-entities.js.map +0 -1
- package/dist/cli/commands/team.d.ts +0 -12
- package/dist/cli/commands/team.js +0 -185
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -8
- package/dist/cli/commands/update.js +0 -155
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/user.d.ts +0 -7
- package/dist/cli/commands/user.js +0 -153
- package/dist/cli/commands/user.js.map +0 -1
- package/dist/cli/scaffolding.d.ts +0 -12
- package/dist/cli/scaffolding.js +0 -397
- package/dist/cli/scaffolding.js.map +0 -1
- package/dist/cli/sync-review-interactive.d.ts +0 -31
- package/dist/cli/sync-review-interactive.js +0 -393
- package/dist/cli/sync-review-interactive.js.map +0 -1
- package/dist/core/migration-runner.d.ts +0 -42
- package/dist/core/migration-runner.js +0 -232
- package/dist/core/migration-runner.js.map +0 -1
- package/dist/core/migration-types.d.ts +0 -101
- package/dist/core/migration-types.js +0 -21
- package/dist/core/migration-types.js.map +0 -1
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
- package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
- package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
- package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
- package/dist/core/migrations/index.d.ts +0 -11
- package/dist/core/migrations/index.js +0 -23
- package/dist/core/migrations/index.js.map +0 -1
- package/dist/integrations/asana.d.ts +0 -26
- package/dist/integrations/asana.js +0 -78
- package/dist/integrations/asana.js.map +0 -1
- package/dist/integrations/figma-local.d.ts +0 -16
- package/dist/integrations/figma-local.js +0 -10
- package/dist/integrations/figma-local.js.map +0 -1
- package/dist/integrations/figma.d.ts +0 -17
- package/dist/integrations/figma.js +0 -17
- package/dist/integrations/figma.js.map +0 -1
- package/dist/integrations/granola.d.ts +0 -24
- package/dist/integrations/granola.js +0 -60
- package/dist/integrations/granola.js.map +0 -1
- package/dist/integrations/linear.d.ts +0 -14
- package/dist/integrations/linear.js +0 -80
- package/dist/integrations/linear.js.map +0 -1
- package/dist/integrations/paper-local.d.ts +0 -14
- package/dist/integrations/paper-local.js +0 -10
- package/dist/integrations/paper-local.js.map +0 -1
- package/dist/integrations/paper.d.ts +0 -2
- package/dist/integrations/paper.js +0 -10
- package/dist/integrations/paper.js.map +0 -1
- package/dist/integrations/pipedrive.d.ts +0 -26
- package/dist/integrations/pipedrive.js +0 -97
- package/dist/integrations/pipedrive.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -15
- package/dist/integrations/registry.js +0 -27
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -38
- package/dist/integrations/types.js +0 -9
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/mcp/connectors/asana.d.ts +0 -2
- package/dist/mcp/connectors/asana.js +0 -20
- package/dist/mcp/connectors/asana.js.map +0 -1
- package/dist/mcp/connectors/definitions.d.ts +0 -45
- package/dist/mcp/connectors/definitions.js +0 -32
- package/dist/mcp/connectors/definitions.js.map +0 -1
- package/dist/mcp/connectors/figma.d.ts +0 -5
- package/dist/mcp/connectors/figma.js +0 -21
- package/dist/mcp/connectors/figma.js.map +0 -1
- package/dist/mcp/connectors/gdrive.d.ts +0 -2
- package/dist/mcp/connectors/gdrive.js +0 -20
- package/dist/mcp/connectors/gdrive.js.map +0 -1
- package/dist/mcp/connectors/granola.d.ts +0 -2
- package/dist/mcp/connectors/granola.js +0 -12
- package/dist/mcp/connectors/granola.js.map +0 -1
- package/dist/mcp/connectors/linear.d.ts +0 -2
- package/dist/mcp/connectors/linear.js +0 -19
- package/dist/mcp/connectors/linear.js.map +0 -1
- package/dist/mcp/connectors/obsidian.d.ts +0 -2
- package/dist/mcp/connectors/obsidian.js +0 -19
- package/dist/mcp/connectors/obsidian.js.map +0 -1
- package/dist/mcp/connectors/pipedrive.d.ts +0 -2
- package/dist/mcp/connectors/pipedrive.js +0 -20
- package/dist/mcp/connectors/pipedrive.js.map +0 -1
- package/dist/mcp/connectors/slack.d.ts +0 -2
- package/dist/mcp/connectors/slack.js +0 -21
- package/dist/mcp/connectors/slack.js.map +0 -1
- package/dist/mcp/server-oauth-provider.d.ts +0 -56
- package/dist/mcp/server-oauth-provider.js +0 -142
- package/dist/mcp/server-oauth-provider.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/collab-authority.d.ts +0 -70
- package/dist/server/collab-authority.js +0 -218
- package/dist/server/collab-authority.js.map +0 -1
- package/dist/server/collab.d.ts +0 -29
- package/dist/server/collab.js +0 -195
- package/dist/server/collab.js.map +0 -1
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/collab.d.ts +0 -6
- package/dist/server/routes/collab.js +0 -10
- package/dist/server/routes/collab.js.map +0 -1
- package/dist/server/routes/git-api.d.ts +0 -9
- package/dist/server/routes/git-api.js +0 -82
- package/dist/server/routes/git-api.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -15
- package/dist/server/routes/meeting-ingest-api.js +0 -323
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/sync-api.d.ts +0 -26
- package/dist/server/routes/sync-api.js +0 -814
- package/dist/server/routes/sync-api.js.map +0 -1
- package/dist/server/routes/webhook.d.ts +0 -14
- package/dist/server/routes/webhook.js +0 -102
- package/dist/server/routes/webhook.js.map +0 -1
- package/dist/services/github-provisioner.d.ts +0 -36
- package/dist/services/github-provisioner.js +0 -126
- package/dist/services/github-provisioner.js.map +0 -1
- package/dist/services/github-service.d.ts +0 -99
- package/dist/services/github-service.js +0 -310
- package/dist/services/github-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -246
- package/dist/services/insights.js.map +0 -1
- package/dist/services/sync/collection-sync.d.ts +0 -60
- package/dist/services/sync/collection-sync.js +0 -509
- package/dist/services/sync/collection-sync.js.map +0 -1
- package/dist/services/sync/commit.d.ts +0 -60
- package/dist/services/sync/commit.js +0 -354
- package/dist/services/sync/commit.js.map +0 -1
- package/dist/services/sync/context-index.d.ts +0 -69
- package/dist/services/sync/context-index.js +0 -280
- package/dist/services/sync/context-index.js.map +0 -1
- package/dist/services/sync/data-fetcher.d.ts +0 -31
- package/dist/services/sync/data-fetcher.js +0 -12
- package/dist/services/sync/data-fetcher.js.map +0 -1
- package/dist/services/sync/derive.d.ts +0 -34
- package/dist/services/sync/derive.js +0 -164
- package/dist/services/sync/derive.js.map +0 -1
- package/dist/services/sync/enrichment-state.d.ts +0 -31
- package/dist/services/sync/enrichment-state.js +0 -63
- package/dist/services/sync/enrichment-state.js.map +0 -1
- package/dist/services/sync/enrichment.d.ts +0 -25
- package/dist/services/sync/enrichment.js +0 -121
- package/dist/services/sync/enrichment.js.map +0 -1
- package/dist/services/sync/entity-refresh.d.ts +0 -30
- package/dist/services/sync/entity-refresh.js +0 -275
- package/dist/services/sync/entity-refresh.js.map +0 -1
- package/dist/services/sync/frontmatter-extractor.d.ts +0 -40
- package/dist/services/sync/frontmatter-extractor.js +0 -279
- package/dist/services/sync/frontmatter-extractor.js.map +0 -1
- package/dist/services/sync/graph-match-state.d.ts +0 -33
- package/dist/services/sync/graph-match-state.js +0 -61
- package/dist/services/sync/graph-match-state.js.map +0 -1
- package/dist/services/sync/graph-match.d.ts +0 -53
- package/dist/services/sync/graph-match.js +0 -316
- package/dist/services/sync/graph-match.js.map +0 -1
- package/dist/services/sync/graphrag-client.d.ts +0 -43
- package/dist/services/sync/graphrag-client.js +0 -94
- package/dist/services/sync/graphrag-client.js.map +0 -1
- package/dist/services/sync/graphrag-config.d.ts +0 -16
- package/dist/services/sync/graphrag-config.js +0 -39
- package/dist/services/sync/graphrag-config.js.map +0 -1
- package/dist/services/sync/graphrag-context.d.ts +0 -14
- package/dist/services/sync/graphrag-context.js +0 -109
- package/dist/services/sync/graphrag-context.js.map +0 -1
- package/dist/services/sync/graphrag-indexer.d.ts +0 -30
- package/dist/services/sync/graphrag-indexer.js +0 -358
- package/dist/services/sync/graphrag-indexer.js.map +0 -1
- package/dist/services/sync/llm.d.ts +0 -32
- package/dist/services/sync/llm.js +0 -115
- package/dist/services/sync/llm.js.map +0 -1
- package/dist/services/sync/mcp-client.d.ts +0 -71
- package/dist/services/sync/mcp-client.js +0 -299
- package/dist/services/sync/mcp-client.js.map +0 -1
- package/dist/services/sync/model-factory.d.ts +0 -13
- package/dist/services/sync/model-factory.js +0 -38
- package/dist/services/sync/model-factory.js.map +0 -1
- package/dist/services/sync/name-quality.d.ts +0 -31
- package/dist/services/sync/name-quality.js +0 -60
- package/dist/services/sync/name-quality.js.map +0 -1
- package/dist/services/sync/output-schemas.d.ts +0 -92
- package/dist/services/sync/output-schemas.js +0 -43
- package/dist/services/sync/output-schemas.js.map +0 -1
- package/dist/services/sync/prompts.d.ts +0 -19
- package/dist/services/sync/prompts.js +0 -128
- package/dist/services/sync/prompts.js.map +0 -1
- package/dist/services/sync/reconciler.d.ts +0 -48
- package/dist/services/sync/reconciler.js +0 -294
- package/dist/services/sync/reconciler.js.map +0 -1
- package/dist/services/sync/rest-client.d.ts +0 -40
- package/dist/services/sync/rest-client.js +0 -100
- package/dist/services/sync/rest-client.js.map +0 -1
- package/dist/services/sync/source-config.d.ts +0 -67
- package/dist/services/sync/source-config.js +0 -304
- package/dist/services/sync/source-config.js.map +0 -1
- package/dist/services/sync/source-definitions/asana.d.ts +0 -14
- package/dist/services/sync/source-definitions/asana.js +0 -42
- package/dist/services/sync/source-definitions/asana.js.map +0 -1
- package/dist/services/sync/source-definitions/definitions.d.ts +0 -8
- package/dist/services/sync/source-definitions/definitions.js +0 -8
- package/dist/services/sync/source-definitions/definitions.js.map +0 -1
- package/dist/services/sync/source-definitions/gdrive.d.ts +0 -16
- package/dist/services/sync/source-definitions/gdrive.js +0 -68
- package/dist/services/sync/source-definitions/gdrive.js.map +0 -1
- package/dist/services/sync/source-definitions/granola.d.ts +0 -2
- package/dist/services/sync/source-definitions/granola.js +0 -21
- package/dist/services/sync/source-definitions/granola.js.map +0 -1
- package/dist/services/sync/source-definitions/linear.d.ts +0 -2
- package/dist/services/sync/source-definitions/linear.js +0 -62
- package/dist/services/sync/source-definitions/linear.js.map +0 -1
- package/dist/services/sync/source-definitions/obsidian.d.ts +0 -2
- package/dist/services/sync/source-definitions/obsidian.js +0 -55
- package/dist/services/sync/source-definitions/obsidian.js.map +0 -1
- package/dist/services/sync/source-definitions/pipedrive.d.ts +0 -2
- package/dist/services/sync/source-definitions/pipedrive.js +0 -43
- package/dist/services/sync/source-definitions/pipedrive.js.map +0 -1
- package/dist/services/sync/staging.d.ts +0 -53
- package/dist/services/sync/staging.js +0 -130
- package/dist/services/sync/staging.js.map +0 -1
- package/dist/services/sync/structured-extractor.d.ts +0 -57
- package/dist/services/sync/structured-extractor.js +0 -584
- package/dist/services/sync/structured-extractor.js.map +0 -1
- package/dist/services/sync/sync-runner.d.ts +0 -32
- package/dist/services/sync/sync-runner.js +0 -195
- package/dist/services/sync/sync-runner.js.map +0 -1
- package/dist/services/sync/sync-state.d.ts +0 -43
- package/dist/services/sync/sync-state.js +0 -154
- package/dist/services/sync/sync-state.js.map +0 -1
- package/dist/services/sync/types.d.ts +0 -381
- package/dist/services/sync/types.js +0 -8
- package/dist/services/sync/types.js.map +0 -1
- package/dist/services/sync/unstructured-extractor.d.ts +0 -27
- package/dist/services/sync/unstructured-extractor.js +0 -185
- package/dist/services/sync/unstructured-extractor.js.map +0 -1
- package/dist/utils/merge-resolver.d.ts +0 -59
- package/dist/utils/merge-resolver.js +0 -303
- package/dist/utils/merge-resolver.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.DdizXOKi.css +0 -1
- package/dist/web/_app/immutable/assets/10.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.n7-yW_Fs.css +0 -1
- package/dist/web/_app/immutable/assets/3.BtaZagnv.css +0 -1
- package/dist/web/_app/immutable/assets/4.DT7X0x5S.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.CquhUpOu.css +0 -1
- package/dist/web/_app/immutable/assets/7.CjbDRbuG.css +0 -1
- package/dist/web/_app/immutable/assets/8.S1QdUGNM.css +0 -1
- package/dist/web/_app/immutable/assets/9.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/Copy.FS8bdfxr.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.D-QW2oKe.css +0 -1
- package/dist/web/_app/immutable/assets/index.D6tMDJWk.css +0 -1
- package/dist/web/_app/immutable/chunks/37NdyH6G.js +0 -32
- package/dist/web/_app/immutable/chunks/4Hhzb6pv.js +0 -1
- package/dist/web/_app/immutable/chunks/72bZS3G9.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/B-7hHz7B.js +0 -1
- package/dist/web/_app/immutable/chunks/B340SUKR.js +0 -1
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BDoWDZaG.js +0 -1
- package/dist/web/_app/immutable/chunks/BFyl1ZHO.js +0 -1
- package/dist/web/_app/immutable/chunks/BS2rFAVq.js +0 -1
- package/dist/web/_app/immutable/chunks/BSsDC_p4.js +0 -1
- package/dist/web/_app/immutable/chunks/BTX2Jr8_.js +0 -1
- package/dist/web/_app/immutable/chunks/BWNY8zw6.js +0 -2
- package/dist/web/_app/immutable/chunks/BdPUVvAi.js +0 -1
- package/dist/web/_app/immutable/chunks/BmsJVLyy.js +0 -1
- package/dist/web/_app/immutable/chunks/BoAosqzE.js +0 -1
- package/dist/web/_app/immutable/chunks/Bs-tL5OR.js +0 -1
- package/dist/web/_app/immutable/chunks/Bsacq2UX.js +0 -1
- package/dist/web/_app/immutable/chunks/BuewkNdS.js +0 -4
- package/dist/web/_app/immutable/chunks/ByunV8un.js +0 -1
- package/dist/web/_app/immutable/chunks/C7VoTosa.js +0 -2
- package/dist/web/_app/immutable/chunks/CDV5Q7RN.js +0 -1
- package/dist/web/_app/immutable/chunks/CJ8__CWt.js +0 -1
- package/dist/web/_app/immutable/chunks/CJUKmosC.js +0 -5
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CT6oIU-C.js +0 -1
- package/dist/web/_app/immutable/chunks/CTRxNfZk.js +0 -1
- package/dist/web/_app/immutable/chunks/CWQRQXxy.js +0 -1
- package/dist/web/_app/immutable/chunks/CXH6iFbA.js +0 -1
- package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
- package/dist/web/_app/immutable/chunks/CdeYcEuU.js +0 -1
- package/dist/web/_app/immutable/chunks/CmCtpZ1Y.js +0 -1
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CrdV0ttd.js +0 -1
- package/dist/web/_app/immutable/chunks/CscoF-YL.js +0 -18
- package/dist/web/_app/immutable/chunks/Cx4YdFMk.js +0 -1
- package/dist/web/_app/immutable/chunks/D7ZqAKi9.js +0 -3
- package/dist/web/_app/immutable/chunks/DGbA7IXh.js +0 -2
- package/dist/web/_app/immutable/chunks/DbbB6Up5.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DtM5cEDu.js +0 -1
- package/dist/web/_app/immutable/chunks/Eqahi7_S.js +0 -2
- package/dist/web/_app/immutable/chunks/FFlLQIiS.js +0 -1
- package/dist/web/_app/immutable/chunks/O9Eb9k00.js +0 -1
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/QF8MAmnc.js +0 -1
- package/dist/web/_app/immutable/chunks/UjzxCpxn.js +0 -1
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/Y90OgS-9.js +0 -1
- package/dist/web/_app/immutable/chunks/cLyZlkXv.js +0 -1
- package/dist/web/_app/immutable/chunks/iDtAARVW.js +0 -2
- package/dist/web/_app/immutable/chunks/oC_W7W7p.js +0 -1
- package/dist/web/_app/immutable/chunks/rJdWIgh-.js +0 -1
- package/dist/web/_app/immutable/chunks/tvOsokaa.js +0 -1
- package/dist/web/_app/immutable/chunks/uLEXaPwE.js +0 -1
- package/dist/web/_app/immutable/chunks/vSaooFHB.js +0 -1
- package/dist/web/_app/immutable/entry/app.DAR-mtfg.js +0 -2
- package/dist/web/_app/immutable/entry/start.xDnyRaR1.js +0 -1
- package/dist/web/_app/immutable/nodes/0.D0aV-Zro.js +0 -2
- package/dist/web/_app/immutable/nodes/1.C7QoM8qD.js +0 -1
- package/dist/web/_app/immutable/nodes/10.DrDOAjOD.js +0 -1
- package/dist/web/_app/immutable/nodes/2.B0OgNuKW.js +0 -168
- package/dist/web/_app/immutable/nodes/3.BZ4qHGZi.js +0 -1
- package/dist/web/_app/immutable/nodes/4.hm-mxuuj.js +0 -12
- package/dist/web/_app/immutable/nodes/5.Bdbt4fjx.js +0 -4
- package/dist/web/_app/immutable/nodes/6.BXrCI40c.js +0 -2
- package/dist/web/_app/immutable/nodes/7.Chd4i9bm.js +0 -2
- package/dist/web/_app/immutable/nodes/8.B8SF-aNs.js +0 -1
- package/dist/web/_app/immutable/nodes/9.YDeu-RnO.js +0 -1
|
@@ -4,100 +4,208 @@
|
|
|
4
4
|
* Manages the Pi-Mono agent instance and coordinates with workspace managers.
|
|
5
5
|
* Loads skills, handles system prompts, and manages conversation flow.
|
|
6
6
|
*/
|
|
7
|
-
import { readFileSync, existsSync
|
|
7
|
+
import { readFileSync, existsSync } from 'fs';
|
|
8
8
|
import { join, dirname } from 'path';
|
|
9
9
|
import { homedir } from 'os';
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
11
|
const __filename = fileURLToPath(import.meta.url);
|
|
12
12
|
const __dirname = dirname(__filename);
|
|
13
|
-
import { getModel } from '@mariozechner/pi-ai';
|
|
13
|
+
import { getModel, completeSimple } from '@mariozechner/pi-ai';
|
|
14
14
|
import { Agent } from '@mariozechner/pi-agent-core';
|
|
15
15
|
import { WorkspaceManager } from '../core/workspace-manager.js';
|
|
16
|
+
import { findPersonRefForUser } from '../services/user-person-bridge.js';
|
|
16
17
|
import { createGraphTools } from './tools/graph-tools.js';
|
|
17
|
-
import {
|
|
18
|
+
import { createFolderTools } from './tools/folder-tools.js';
|
|
19
|
+
import { createHistoryTools } from './tools/history-tools.js';
|
|
18
20
|
import { loadSkillIndex, buildSkillIndexPrompt, loadEagerSkills } from './skill-loader.js';
|
|
19
21
|
import { createLoadSkillTool } from './tools/load-skill.js';
|
|
20
22
|
import { loadCustomTools } from './tools/tool-loader.js';
|
|
21
23
|
import { ConnectorManager } from '../mcp/connector-manager.js';
|
|
22
24
|
import { buildConnectorRegistry, createConnectorTools } from './tools/connector-tools.js';
|
|
23
25
|
import { createFsTools } from './tools/fs-tools.js';
|
|
26
|
+
import { createWebTools } from './tools/web-tools.js';
|
|
24
27
|
import { createOpsTools } from './tools/ops-tools.js';
|
|
25
28
|
import { createPermissionTools } from './tools/permission-tools.js';
|
|
29
|
+
import { createCaptureTools } from './tools/capture-tools.js';
|
|
30
|
+
import { renderEntityTypesSection } from './prompts/entity-types-section.js';
|
|
31
|
+
import { ENTITY_SCHEMAS } from '../core/validation.js';
|
|
26
32
|
import { AuthService } from '../services/auth-service.js';
|
|
33
|
+
import * as access from '../services/access-control.js';
|
|
27
34
|
import { loadUserConfig, resolveApiKey, resolveProvider, resolveModelId } from '../core/user-config.js';
|
|
35
|
+
import { onSecretMutation } from '../core/secrets/index.js';
|
|
36
|
+
import { AgentPool } from './agent-pool.js';
|
|
37
|
+
import { addInferenceUsage, createCloudInferenceStreamFn, createInferenceUsageSummary, isStudiographCreditsMode, studiographCreditsModel, } from '../services/cloud-inference-billing.js';
|
|
28
38
|
export class AgentOrchestrator {
|
|
29
39
|
workspacePath;
|
|
30
40
|
workspaceManager;
|
|
31
|
-
|
|
41
|
+
pool;
|
|
32
42
|
config;
|
|
33
43
|
gitUser;
|
|
34
44
|
skillsDirs;
|
|
35
45
|
toolsDirs;
|
|
36
46
|
registryRef = { registry: null };
|
|
37
|
-
_highlightCallback = null;
|
|
38
|
-
_mutationCallback = null;
|
|
39
|
-
_currentUser = null;
|
|
40
47
|
authService;
|
|
41
48
|
recentMemory;
|
|
42
|
-
currentSessionId = null;
|
|
43
49
|
sessionsDir;
|
|
50
|
+
// Per-session context — used by tool closures via the pool's contextMap
|
|
51
|
+
// Legacy fields kept for backward compat with callers that set them before chat()
|
|
52
|
+
_currentUser = null;
|
|
53
|
+
_highlightCallback = null;
|
|
54
|
+
_mutationCallback = null;
|
|
55
|
+
currentSessionId = null;
|
|
56
|
+
_sessionUserId;
|
|
44
57
|
constructor(config) {
|
|
45
58
|
this.workspacePath = config.workspacePath;
|
|
46
59
|
this.config = config.workspaceConfig;
|
|
47
60
|
this.gitUser = config.gitUser;
|
|
48
61
|
this.recentMemory = config.recentMemory;
|
|
49
|
-
|
|
62
|
+
// Prefer the route-level AuthService so we share the master-key
|
|
63
|
+
// crypto wiring + the OAuth-mutation pubsub. Fallback construction
|
|
64
|
+
// only fires in tests / CLI scenarios that don't supply one — those
|
|
65
|
+
// paths don't read encrypted oauth_tokens, so the missing crypto is
|
|
66
|
+
// harmless there.
|
|
67
|
+
this.authService = config.authService ?? new AuthService(config.workspacePath);
|
|
50
68
|
this.sessionsDir = join(homedir(), '.studiograph', 'sessions');
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
const userSkillsDir = join(homedir(), '.studiograph', 'skills');
|
|
69
|
+
// Skills: filesystem dirs are now bundled-only. User/workspace authoring
|
|
70
|
+
// moves to graph `skill` entities (enumerated per-user in createAgentInstance).
|
|
54
71
|
const userToolsDir = join(homedir(), '.studiograph', 'tools');
|
|
55
|
-
const workspaceSkillsDir = join(this.workspacePath, '.studiograph', 'skills');
|
|
56
72
|
const workspaceToolsDir = join(this.workspacePath, '.studiograph', 'tools');
|
|
57
73
|
const bundledSkillsDir = join(__dirname, 'skills');
|
|
58
|
-
this.skillsDirs = [
|
|
74
|
+
this.skillsDirs = [bundledSkillsDir, ...(config.skillsDirs ?? [])];
|
|
59
75
|
this.toolsDirs = [userToolsDir, workspaceToolsDir, ...(config.toolsDirs ?? [])];
|
|
60
|
-
// Use shared workspace manager if provided, otherwise create one
|
|
61
76
|
this.workspaceManager = config.workspaceManager ?? new WorkspaceManager(this.workspacePath, this.config, this.gitUser);
|
|
62
|
-
// Initialize
|
|
63
|
-
this.
|
|
77
|
+
// Initialize agent pool — each session gets its own Agent instance
|
|
78
|
+
this.pool = new AgentPool({
|
|
79
|
+
createAgent: (userId) => this.createAgentInstance(userId),
|
|
80
|
+
loadCustomTools: (agent, userId) => this.loadCustomToolsAsync(agent, userId),
|
|
81
|
+
sessionsDir: this.sessionsDir,
|
|
82
|
+
});
|
|
83
|
+
// Evict cached agents when an operator changes a model.* key via
|
|
84
|
+
// Settings UI / CLI. Without this, the running agent keeps using
|
|
85
|
+
// the apiKey/provider/modelId it captured at createAgentInstance
|
|
86
|
+
// time, and the operator's rotation appears to have no effect
|
|
87
|
+
// until the next process restart. Other keys (r2.*, search.*) are
|
|
88
|
+
// read fresh on each tool call, so eviction isn't needed for them.
|
|
89
|
+
onSecretMutation((key) => {
|
|
90
|
+
if (key.startsWith('model.')) {
|
|
91
|
+
this.pool.invalidateAll();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Evict the user's pooled agent when their OAuth state changes.
|
|
95
|
+
// ConnectorManager.buildTools resolves per-user OAuth at agent-
|
|
96
|
+
// construction time only; mid-session connect/disconnect would
|
|
97
|
+
// otherwise leave the agent with a stale tool list (the connector
|
|
98
|
+
// would stay invisible after Connect, or stay visible after
|
|
99
|
+
// Disconnect). Scoped per-user — other users' sessions are
|
|
100
|
+
// untouched.
|
|
101
|
+
this.authService.onOAuthMutation((userId) => {
|
|
102
|
+
this.pool.invalidateUser(userId);
|
|
103
|
+
});
|
|
64
104
|
}
|
|
65
105
|
/**
|
|
66
106
|
* Create Pi-Mono agent with tools and system prompt.
|
|
67
107
|
* Custom tools and skills are loaded asynchronously via initAsync().
|
|
68
108
|
*/
|
|
69
|
-
|
|
109
|
+
createAgentInstance(userId) {
|
|
70
110
|
const userConfig = loadUserConfig();
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
const
|
|
111
|
+
const useCreditsGateway = isStudiographCreditsMode();
|
|
112
|
+
const provider = useCreditsGateway ? 'studiograph-cloud' : resolveProvider(userConfig, this.config);
|
|
113
|
+
const modelId = useCreditsGateway ? studiographCreditsModel().id : resolveModelId(userConfig, this.config);
|
|
114
|
+
const apiKey = useCreditsGateway ? 'studiograph-cloud-gateway' : resolveApiKey(userConfig, this.config);
|
|
74
115
|
if (!apiKey) {
|
|
75
116
|
throw new Error('API key not found in config or environment');
|
|
76
117
|
}
|
|
77
|
-
const model =
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// Build
|
|
118
|
+
const model = useCreditsGateway
|
|
119
|
+
? studiographCreditsModel()
|
|
120
|
+
: getModel(provider, modelId);
|
|
121
|
+
// Build skill index — bundled filesystem skills + graph `skill` entries
|
|
122
|
+
// from folders the user can access. Graph skills take priority over
|
|
123
|
+
// bundled on name collision (user-authored overrides can customise
|
|
124
|
+
// built-in skills).
|
|
125
|
+
const promptRepos = this.getPromptRepoScope(userId);
|
|
126
|
+
const graphSkills = this.enumerateGraphSkills(promptRepos, userId);
|
|
127
|
+
const bundledSkills = loadSkillIndex(this.skillsDirs);
|
|
128
|
+
const seen = new Set(graphSkills.map((s) => s.name));
|
|
129
|
+
const skillIndex = [...graphSkills, ...bundledSkills.filter(s => !seen.has(s.name))];
|
|
130
|
+
const graphResolver = (repo, id) => this.readGraphSkillBody(repo, id);
|
|
131
|
+
// Build tools — closures read per-session context from the pool
|
|
132
|
+
// The pool sets context before each withAgent call, so these resolve correctly
|
|
133
|
+
// Closures that resolve per-session context at call time.
|
|
134
|
+
// The pool sets context before each withAgent callback; the closure
|
|
135
|
+
// finds which session owns this agent and reads from that context.
|
|
136
|
+
const getUser = () => {
|
|
137
|
+
const sid = this.pool.findSessionForAgent(agent);
|
|
138
|
+
return sid ? (this.pool.getContext(sid).user ?? null) : this._currentUser;
|
|
139
|
+
};
|
|
140
|
+
const onHighlight = (ids) => {
|
|
141
|
+
const sid = this.pool.findSessionForAgent(agent);
|
|
142
|
+
if (sid)
|
|
143
|
+
this.pool.getContext(sid).onHighlight?.(ids);
|
|
144
|
+
else
|
|
145
|
+
this._highlightCallback?.(ids);
|
|
146
|
+
};
|
|
147
|
+
const onMutation = (m) => {
|
|
148
|
+
const sid = this.pool.findSessionForAgent(agent);
|
|
149
|
+
if (sid)
|
|
150
|
+
this.pool.getContext(sid).onMutation?.(m);
|
|
151
|
+
else
|
|
152
|
+
this._mutationCallback?.(m);
|
|
153
|
+
};
|
|
154
|
+
const onAgentActivity = (action, repo) => {
|
|
155
|
+
const sid = this.pool.findSessionForAgent(agent);
|
|
156
|
+
if (sid)
|
|
157
|
+
this.pool.getContext(sid).onAgentActivity?.(action, repo);
|
|
158
|
+
};
|
|
159
|
+
/** Resolves the per-session capture callback at tool-call time. The
|
|
160
|
+
* capture flow installs it via AgentContext; other flows leave it
|
|
161
|
+
* undefined and the tool becomes a no-op acknowledgement. */
|
|
162
|
+
const getNothingToCaptureCallback = () => {
|
|
163
|
+
const sid = this.pool.findSessionForAgent(agent);
|
|
164
|
+
if (!sid)
|
|
165
|
+
return undefined;
|
|
166
|
+
return this.pool.getContext(sid).onNothingToCapture ?? undefined;
|
|
167
|
+
};
|
|
81
168
|
const tools = [
|
|
82
|
-
...createGraphTools(this.workspaceManager, this.gitUser, this.workspacePath,
|
|
83
|
-
...
|
|
169
|
+
...createGraphTools(this.workspaceManager, this.gitUser, this.workspacePath, onHighlight, onMutation, getUser, this.authService, onAgentActivity),
|
|
170
|
+
...createFolderTools(this.workspaceManager, this.gitUser, onMutation, getUser, this.authService, onAgentActivity),
|
|
171
|
+
...createHistoryTools(this.workspaceManager, this.gitUser, onMutation, getUser, this.authService, onAgentActivity),
|
|
84
172
|
...createOpsTools(this.workspacePath, this.config),
|
|
85
|
-
...createPermissionTools(this.authService,
|
|
86
|
-
...createFsTools(
|
|
87
|
-
|
|
173
|
+
...createPermissionTools(this.authService, getUser, this.workspaceManager),
|
|
174
|
+
...createFsTools(getUser),
|
|
175
|
+
...createWebTools(this.config.search),
|
|
176
|
+
...createCaptureTools(getNothingToCaptureCallback),
|
|
177
|
+
createLoadSkillTool(skillIndex, graphResolver),
|
|
88
178
|
];
|
|
89
179
|
// Build system prompt — base + auto-generated tool reference + memory + eager skills + skill index
|
|
90
|
-
const systemPrompt = this.buildSystemPrompt(skillIndex, tools, this.recentMemory);
|
|
180
|
+
const systemPrompt = this.buildSystemPrompt(skillIndex, tools, this.recentMemory, graphResolver, promptRepos, userId);
|
|
91
181
|
// Log registered tools at startup (verbose only)
|
|
92
182
|
if (process.env.STUDIOGRAPH_VERBOSE === '1') {
|
|
93
183
|
console.log(`🔧 ${tools.length} tools registered: ${tools.map((t) => t.name).join(', ')}`);
|
|
94
184
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
185
|
+
// Dedup the bundled tools array — guards against any future
|
|
186
|
+
// createXxxTools() collision so we never hand a duplicate-name list
|
|
187
|
+
// to the Agent constructor (Anthropic 400s on `tools: Tool names must
|
|
188
|
+
// be unique.`).
|
|
189
|
+
const dedupedTools = [];
|
|
190
|
+
const bundledSeen = new Set();
|
|
191
|
+
for (const t of tools) {
|
|
192
|
+
const name = t.name;
|
|
193
|
+
if (!name || bundledSeen.has(name))
|
|
194
|
+
continue;
|
|
195
|
+
bundledSeen.add(name);
|
|
196
|
+
dedupedTools.push(t);
|
|
197
|
+
}
|
|
198
|
+
const agent = new Agent({
|
|
199
|
+
getApiKey: () => apiKey,
|
|
200
|
+
initialState: { model, systemPrompt, tools: dedupedTools },
|
|
201
|
+
streamFn: useCreditsGateway ? createCloudInferenceStreamFn() : undefined,
|
|
202
|
+
});
|
|
203
|
+
// Custom tools are loaded asynchronously by the pool wrapper
|
|
204
|
+
// (config.loadCustomTools, wired to loadCustomToolsAsync). Do NOT call
|
|
205
|
+
// it here — calling it twice fires two concurrent Promise.alls, both
|
|
206
|
+
// racing to mutate agent.state.tools, and the inter-microtask dedup
|
|
207
|
+
// can't always prevent Anthropic seeing a duplicated list on the very
|
|
208
|
+
// first prompt. Single fire site = no race.
|
|
101
209
|
return agent;
|
|
102
210
|
}
|
|
103
211
|
/**
|
|
@@ -105,12 +213,20 @@ export class AgentOrchestrator {
|
|
|
105
213
|
* Runs async after construction — custom tools may not be available for the
|
|
106
214
|
* very first message if initialisation is extremely fast, but in practice
|
|
107
215
|
* the first user message arrives well after startup.
|
|
216
|
+
*
|
|
217
|
+
* `userId` is forwarded into `ConnectorManager.buildTools` so per-user MCP
|
|
218
|
+
* OAuth tokens are resolved at tool-build time. Without it the runtime
|
|
219
|
+
* silently falls back to workspace-shared static headers (the deferred
|
|
220
|
+
* gap before 2026-05-13). The agent pool keys agents per-session and
|
|
221
|
+
* supplies the session's userId on creation; CLI / non-interactive
|
|
222
|
+
* spawns pass `undefined` and intentionally land on the workspace
|
|
223
|
+
* fallback.
|
|
108
224
|
*/
|
|
109
|
-
loadCustomToolsAsync(agent) {
|
|
225
|
+
loadCustomToolsAsync(agent, userId) {
|
|
110
226
|
const context = { workspaceManager: this.workspaceManager, gitUser: this.gitUser };
|
|
111
|
-
Promise.all([
|
|
227
|
+
return Promise.all([
|
|
112
228
|
loadCustomTools(this.toolsDirs, context),
|
|
113
|
-
ConnectorManager.buildTools(ConnectorManager.loadConfigs(this.workspacePath)),
|
|
229
|
+
ConnectorManager.buildTools(ConnectorManager.loadConfigs(this.workspacePath), { userId, authService: this.authService }),
|
|
114
230
|
]).then(([customTools, connectorTools]) => {
|
|
115
231
|
const extra = [...customTools];
|
|
116
232
|
if (connectorTools.length > 0) {
|
|
@@ -119,8 +235,27 @@ export class AgentOrchestrator {
|
|
|
119
235
|
this.registryRef.registry = registry;
|
|
120
236
|
}
|
|
121
237
|
if (extra.length > 0) {
|
|
238
|
+
// Dedup by name — this method can be invoked more than once per agent
|
|
239
|
+
// (createAgentInstance schedules it, and the pool also calls it via
|
|
240
|
+
// its loadCustomTools callback). Without dedup we end up with
|
|
241
|
+
// duplicate tool registrations, which Anthropic rejects on the next
|
|
242
|
+
// turn with: 400 "tools: Tool names must be unique."
|
|
122
243
|
const existing = agent.state.tools;
|
|
123
|
-
|
|
244
|
+
const seen = new Set(existing.map((t) => t.name));
|
|
245
|
+
const merged = [...existing];
|
|
246
|
+
for (const t of extra) {
|
|
247
|
+
if (seen.has(t.name))
|
|
248
|
+
continue;
|
|
249
|
+
seen.add(t.name);
|
|
250
|
+
merged.push(t);
|
|
251
|
+
}
|
|
252
|
+
if (merged.length !== existing.length) {
|
|
253
|
+
agent.state.tools = merged;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (process.env.STUDIOGRAPH_VERBOSE === '1') {
|
|
257
|
+
// eslint-disable-next-line no-console
|
|
258
|
+
console.log(`[orchestrator] loadCustomToolsAsync done: customTools=${customTools.length}, connectorTools=${connectorTools.length}, total agent.state.tools=${agent.state.tools.length}`);
|
|
124
259
|
}
|
|
125
260
|
}).catch(err => {
|
|
126
261
|
console.warn('Failed to load custom/connector tools:', err);
|
|
@@ -129,11 +264,11 @@ export class AgentOrchestrator {
|
|
|
129
264
|
/**
|
|
130
265
|
* Build the full system prompt: base prompt + eager skill content + skill index.
|
|
131
266
|
*/
|
|
132
|
-
buildSystemPrompt(skillIndex, tools, recentMemory) {
|
|
267
|
+
buildSystemPrompt(skillIndex, tools, recentMemory, graphResolver, promptRepos = this.workspaceManager.getAllRepoConfigs(), userId) {
|
|
133
268
|
const promptPath = join(__dirname, 'prompts', 'system.md');
|
|
134
269
|
let base = existsSync(promptPath)
|
|
135
270
|
? readFileSync(promptPath, 'utf-8')
|
|
136
|
-
: this.getDefaultSystemPrompt();
|
|
271
|
+
: this.getDefaultSystemPrompt(promptRepos);
|
|
137
272
|
// Auto-generate tool reference from registered tools, grouped by category
|
|
138
273
|
const categories = {
|
|
139
274
|
'Entity Management': [],
|
|
@@ -157,6 +292,10 @@ export class AgentOrchestrator {
|
|
|
157
292
|
categories['Skills'].push(t);
|
|
158
293
|
else if (['create_entity', 'get_entity', 'update_entity', 'delete_entity', 'search_entities', 'list_entities', 'get_related', 'get_backlinks', 'validate_wikilinks', 'get_workspace_summary', 'list_repos', 'query_dataset', 'append_rows', 'get_entity_schema', 'lint_entities'].includes(name))
|
|
159
294
|
categories['Entity Management'].push(t);
|
|
295
|
+
else if (['create_folder', 'create_subfolder', 'rename_folder', 'delete_folder', 'list_folders', 'move_entity', 'transfer_entity'].includes(name))
|
|
296
|
+
(categories['Folders'] ??= []).push(t);
|
|
297
|
+
else if (['list_file_history', 'list_folder_history', 'list_recent_deletions', 'read_file_at_commit', 'get_entity_diff', 'restore_file'].includes(name))
|
|
298
|
+
(categories['Git History'] ??= []).push(t);
|
|
160
299
|
else
|
|
161
300
|
categories['Other'].push(t);
|
|
162
301
|
}
|
|
@@ -165,13 +304,26 @@ export class AgentOrchestrator {
|
|
|
165
304
|
.map(([cat, items]) => `**${cat}:**\n${items.map((t) => `- \`${t.name}\` — ${t.description}`).join('\n')}`)
|
|
166
305
|
.join('\n\n');
|
|
167
306
|
base = base.replace('{{TOOL_REFERENCE}}', toolRef);
|
|
307
|
+
// Render the agent-visible entity type list from the launch allowlist +
|
|
308
|
+
// any workspace-defined custom types.
|
|
309
|
+
const registry = this.workspaceManager.getSchemaRegistry();
|
|
310
|
+
const builtinTypes = new Set(Object.keys(ENTITY_SCHEMAS));
|
|
311
|
+
const customTypes = registry.getAllTypes().filter(t => !builtinTypes.has(t));
|
|
312
|
+
base = base.replace('{{ENTITY_TYPES}}', renderEntityTypesSection({ customTypes }));
|
|
168
313
|
const parts = [base.trim()];
|
|
169
|
-
// Inject workspace
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
314
|
+
// Inject workspace identity from graph entities (org, team, capabilities, guidelines)
|
|
315
|
+
// Falls back to ABOUT.md if the graph has no organization entries
|
|
316
|
+
const identitySection = this.buildWorkspaceIdentity(promptRepos);
|
|
317
|
+
if (identitySection) {
|
|
318
|
+
parts.push(identitySection);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
const aboutPath = join(this.workspacePath, '.studiograph', 'ABOUT.md');
|
|
322
|
+
if (existsSync(aboutPath)) {
|
|
323
|
+
const aboutContent = readFileSync(aboutPath, 'utf-8');
|
|
324
|
+
if (aboutContent.trim()) {
|
|
325
|
+
parts.push(`## Workspace Identity\n\n${aboutContent}`);
|
|
326
|
+
}
|
|
175
327
|
}
|
|
176
328
|
}
|
|
177
329
|
// Append workspace schema extensions (org-specific fields and custom types)
|
|
@@ -179,12 +331,40 @@ export class AgentOrchestrator {
|
|
|
179
331
|
if (schemaSection) {
|
|
180
332
|
parts.push(schemaSection);
|
|
181
333
|
}
|
|
334
|
+
// Inject per-repo subfolder inventory so the agent knows the existing
|
|
335
|
+
// folder layout without calling list_folders for every routing decision.
|
|
336
|
+
// Capped per-repo to keep system prompt size bounded.
|
|
337
|
+
const folderInventory = this.buildFolderInventory(promptRepos);
|
|
338
|
+
if (folderInventory) {
|
|
339
|
+
parts.push(folderInventory);
|
|
340
|
+
}
|
|
182
341
|
// Inject recent memory context (today + yesterday daily memory)
|
|
183
342
|
if (recentMemory) {
|
|
184
343
|
parts.push(`## Memory Context\n\n${recentMemory}`);
|
|
185
344
|
}
|
|
345
|
+
// Inject current-user identity + bridge so the agent can read its own
|
|
346
|
+
// handle and the linked person entity from the prompt instead of
|
|
347
|
+
// having to call list_users on every turn.
|
|
348
|
+
if (userId) {
|
|
349
|
+
const u = this.authService.findUserById(userId);
|
|
350
|
+
if (u) {
|
|
351
|
+
const ref = findPersonRefForUser(this.workspaceManager, u.handle);
|
|
352
|
+
const lines = [
|
|
353
|
+
`## Current User`,
|
|
354
|
+
``,
|
|
355
|
+
`- Display name: ${u.displayName}`,
|
|
356
|
+
`- Handle: \`${u.handle}\` (use this for created_by/updated_by audit, @mentions, and link_person_to_user)`,
|
|
357
|
+
`- Email: ${u.email}`,
|
|
358
|
+
`- Role: ${u.role}`,
|
|
359
|
+
ref
|
|
360
|
+
? `- Linked person entity: \`[[${ref.entityId}]]\` in \`${ref.repo}\` — when the user refers to themselves, this is their record. Write enrichments here via update_entity; never call link_person_to_user for the current user.`
|
|
361
|
+
: `- Linked person entity: **none.** The auth↔person bridge has no record for this user (legacy account, ambiguous migration, or team_repo unconfigured). If the user wants a bridge, propose creating one via search + link_person_to_user, or auto-provisioning via update_workspace team_repo.`,
|
|
362
|
+
];
|
|
363
|
+
parts.push(lines.join('\n'));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
186
366
|
// Inline eager skills directly into the system prompt
|
|
187
|
-
const eagerContent = loadEagerSkills(skillIndex);
|
|
367
|
+
const eagerContent = loadEagerSkills(skillIndex, graphResolver);
|
|
188
368
|
if (eagerContent) {
|
|
189
369
|
parts.push(eagerContent);
|
|
190
370
|
}
|
|
@@ -195,13 +375,191 @@ export class AgentOrchestrator {
|
|
|
195
375
|
}
|
|
196
376
|
return parts.join('\n\n');
|
|
197
377
|
}
|
|
378
|
+
/**
|
|
379
|
+
* Enumerate skill entities across all folders the user can access. Each
|
|
380
|
+
* skill becomes a SkillMeta with a `graph://<repo>/<id>` sentinel
|
|
381
|
+
* entrypoint. Priority order: user's private folder first, then shared
|
|
382
|
+
* folders alphabetically. First occurrence of a given name wins.
|
|
383
|
+
*/
|
|
384
|
+
getPromptRepoScope(userId) {
|
|
385
|
+
if (!userId)
|
|
386
|
+
return this.workspaceManager.getAllRepoConfigs();
|
|
387
|
+
const user = this.authService.findUserById(userId);
|
|
388
|
+
if (!user)
|
|
389
|
+
return [];
|
|
390
|
+
return access.getAccessibleRepos(user, this.workspaceManager, this.authService);
|
|
391
|
+
}
|
|
392
|
+
enumerateGraphSkills(accessibleRepos, userId) {
|
|
393
|
+
const skills = [];
|
|
394
|
+
const seen = new Set();
|
|
395
|
+
const personalRepo = userId ? this.workspaceManager.getUserPersonalRepo(userId) : undefined;
|
|
396
|
+
const sortedRepos = [...accessibleRepos]
|
|
397
|
+
.sort((a, b) => {
|
|
398
|
+
if (personalRepo && a.name === personalRepo.name)
|
|
399
|
+
return -1;
|
|
400
|
+
if (personalRepo && b.name === personalRepo.name)
|
|
401
|
+
return 1;
|
|
402
|
+
return a.name.localeCompare(b.name);
|
|
403
|
+
});
|
|
404
|
+
for (const repo of sortedRepos) {
|
|
405
|
+
try {
|
|
406
|
+
const graph = this.workspaceManager.getGraph(repo.name);
|
|
407
|
+
const entries = graph.list('skill');
|
|
408
|
+
for (const entry of entries) {
|
|
409
|
+
if (seen.has(entry.id))
|
|
410
|
+
continue;
|
|
411
|
+
seen.add(entry.id);
|
|
412
|
+
const data = entry.data;
|
|
413
|
+
skills.push({
|
|
414
|
+
name: entry.id,
|
|
415
|
+
description: typeof data.description === 'string' ? data.description : '',
|
|
416
|
+
loading: data.loading === 'eager' ? 'eager' : 'on-demand',
|
|
417
|
+
dir: `graph://${repo.name}`,
|
|
418
|
+
entrypoint: `graph://${repo.name}/${entry.id}`,
|
|
419
|
+
isDirectory: false,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
// skip repos that fail to load
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return skills;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Load the markdown body of a skill entity by (repo, id).
|
|
431
|
+
*/
|
|
432
|
+
readGraphSkillBody(repo, id) {
|
|
433
|
+
try {
|
|
434
|
+
const graph = this.workspaceManager.getGraph(repo);
|
|
435
|
+
const entries = graph.list('skill');
|
|
436
|
+
const entry = entries.find(e => e.id === id);
|
|
437
|
+
if (!entry)
|
|
438
|
+
return `Error: skill "${id}" not found in folder "${repo}".`;
|
|
439
|
+
return entry.document?.content ?? '';
|
|
440
|
+
}
|
|
441
|
+
catch (e) {
|
|
442
|
+
return `Error loading skill "${id}" from "${repo}": ${e?.message ?? e}`;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Build a workspace identity section from graph entities.
|
|
447
|
+
* Reads organization, person, practice-area, and guideline entries
|
|
448
|
+
* to compose a concise identity summary for the system prompt.
|
|
449
|
+
* Returns null if no organization entries exist.
|
|
450
|
+
*/
|
|
451
|
+
buildWorkspaceIdentity(repos) {
|
|
452
|
+
try {
|
|
453
|
+
const listScoped = (entityType) => repos.flatMap(repo => {
|
|
454
|
+
try {
|
|
455
|
+
return this.workspaceManager.getGraph(repo.name).list(entityType);
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
return [];
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
const orgs = listScoped('organization');
|
|
462
|
+
if (orgs.length === 0)
|
|
463
|
+
return null;
|
|
464
|
+
const lines = ['## Workspace Identity'];
|
|
465
|
+
// Organization(s)
|
|
466
|
+
for (const org of orgs.slice(0, 3)) {
|
|
467
|
+
const name = org.data.name || org.id;
|
|
468
|
+
const industry = org.data.industry ? ` (${org.data.industry})` : '';
|
|
469
|
+
lines.push(`\n### ${name}${industry}`);
|
|
470
|
+
if (org.document.content.trim()) {
|
|
471
|
+
// Include first ~500 chars of body for context
|
|
472
|
+
const body = org.document.content.trim();
|
|
473
|
+
lines.push(body.length > 500 ? body.slice(0, 500) + '...' : body);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// Team
|
|
477
|
+
const people = listScoped('person');
|
|
478
|
+
if (people.length > 0) {
|
|
479
|
+
lines.push('\n### Team');
|
|
480
|
+
for (const person of people.slice(0, 15)) {
|
|
481
|
+
const name = person.data.name || person.id;
|
|
482
|
+
const role = person.data.role ? ` — ${person.data.role}` : '';
|
|
483
|
+
const location = person.data.location ? ` (${person.data.location})` : '';
|
|
484
|
+
lines.push(`- ${name}${role}${location}`);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// Services (capabilities + methodologies — replaces former practice areas)
|
|
488
|
+
const services = listScoped('service');
|
|
489
|
+
if (services.length > 0) {
|
|
490
|
+
lines.push('\n### Capabilities');
|
|
491
|
+
// Top-level services (no `sprint` parent) read as the firm's overall
|
|
492
|
+
// capabilities; nested services are sprint-level details. Surface
|
|
493
|
+
// top-level only here to keep the system prompt compact.
|
|
494
|
+
const topLevel = services.filter(s => !s.data.sprint);
|
|
495
|
+
const list = topLevel.length > 0 ? topLevel : services;
|
|
496
|
+
lines.push(list.map(s => s.data.name || s.id).join(', '));
|
|
497
|
+
}
|
|
498
|
+
// Guidelines (communication style, preferences) — now document.category=guideline
|
|
499
|
+
const guidelines = listScoped('document').filter(d => d.data.category === 'guideline');
|
|
500
|
+
if (guidelines.length > 0) {
|
|
501
|
+
lines.push('\n### Guidelines');
|
|
502
|
+
for (const g of guidelines.slice(0, 5)) {
|
|
503
|
+
const name = g.data.name || g.id;
|
|
504
|
+
lines.push(`\n**${name}**`);
|
|
505
|
+
if (g.document.content.trim()) {
|
|
506
|
+
const body = g.document.content.trim();
|
|
507
|
+
lines.push(body.length > 300 ? body.slice(0, 300) + '...' : body);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return lines.join('\n');
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
return null;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Per-repo subfolder summary for the system prompt. Lists each accessible
|
|
519
|
+
* repo with up to MAX_PER_REPO subfolder paths so the agent can route new
|
|
520
|
+
* entries into existing folders without calling list_folders for every
|
|
521
|
+
* decision. Refresh cadence is per-session (system prompt is built once).
|
|
522
|
+
*/
|
|
523
|
+
buildFolderInventory(repos) {
|
|
524
|
+
const MAX_PER_REPO = 8;
|
|
525
|
+
if (repos.length === 0)
|
|
526
|
+
return null;
|
|
527
|
+
const lines = [];
|
|
528
|
+
for (const repo of repos) {
|
|
529
|
+
let folders = [];
|
|
530
|
+
try {
|
|
531
|
+
folders = this.workspaceManager.getGraph(repo.name).listFolders().map(f => f.path);
|
|
532
|
+
}
|
|
533
|
+
catch {
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
const display = repo.display_name || repo.name;
|
|
537
|
+
if (folders.length === 0) {
|
|
538
|
+
lines.push(`- **${display}** (\`${repo.name}\`): no subfolders`);
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
const shown = folders.slice(0, MAX_PER_REPO).map(p => `\`${p}\``).join(', ');
|
|
542
|
+
const more = folders.length > MAX_PER_REPO ? ` (+${folders.length - MAX_PER_REPO} more)` : '';
|
|
543
|
+
lines.push(`- **${display}** (\`${repo.name}\`): ${shown}${more}`);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
if (lines.length === 0)
|
|
547
|
+
return null;
|
|
548
|
+
return `## Folder Inventory\n\nExisting subfolders per repo. Prefer placing new entries in an existing folder when one fits. Folder paths are repo-relative POSIX.\n\n${lines.join('\n')}`;
|
|
549
|
+
}
|
|
198
550
|
/**
|
|
199
551
|
* Fallback system prompt when prompts/system.md is not found.
|
|
200
552
|
*/
|
|
201
|
-
getDefaultSystemPrompt() {
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
553
|
+
getDefaultSystemPrompt(promptRepos = this.workspaceManager.getAllRepoConfigs()) {
|
|
554
|
+
const totalEntities = promptRepos.reduce((count, repo) => {
|
|
555
|
+
try {
|
|
556
|
+
return count + this.workspaceManager.getGraph(repo.name).search({}).length;
|
|
557
|
+
}
|
|
558
|
+
catch {
|
|
559
|
+
return count;
|
|
560
|
+
}
|
|
561
|
+
}, 0);
|
|
562
|
+
const repoList = promptRepos
|
|
205
563
|
.map(r => ` - ${r.name} (${r.type}): ${r.description}`)
|
|
206
564
|
.join('\n');
|
|
207
565
|
return `# Studiograph AI Assistant
|
|
@@ -211,8 +569,8 @@ You are Studiograph, an AI assistant helping creative teams manage their knowled
|
|
|
211
569
|
## Workspace
|
|
212
570
|
|
|
213
571
|
**Team:** ${this.config.team_name}
|
|
214
|
-
**Repositories:** ${
|
|
215
|
-
**Total Entities:** ${
|
|
572
|
+
**Repositories:** ${promptRepos.length}
|
|
573
|
+
**Total Entities:** ${totalEntities}
|
|
216
574
|
|
|
217
575
|
**Available Repositories:**
|
|
218
576
|
${repoList}`;
|
|
@@ -220,46 +578,88 @@ ${repoList}`;
|
|
|
220
578
|
/**
|
|
221
579
|
* Send a message to the agent
|
|
222
580
|
*/
|
|
581
|
+
/**
|
|
582
|
+
* Send a message and await the full agent response.
|
|
583
|
+
* Uses the current session (set via switchSession) or a default session.
|
|
584
|
+
*/
|
|
223
585
|
async chat(userMessage) {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
586
|
+
const sessionId = this.currentSessionId ?? 'default';
|
|
587
|
+
const ctx = {
|
|
588
|
+
user: this._currentUser,
|
|
589
|
+
onHighlight: this._highlightCallback,
|
|
590
|
+
onMutation: this._mutationCallback,
|
|
591
|
+
};
|
|
592
|
+
return this.pool.withAgent(sessionId, ctx, async (agent) => {
|
|
593
|
+
return new Promise((resolve, reject) => {
|
|
594
|
+
let content = '';
|
|
595
|
+
const toolCalls = [];
|
|
596
|
+
const usage = createInferenceUsageSummary();
|
|
597
|
+
const unsubscribe = agent.subscribe((event) => {
|
|
598
|
+
if (event.type === 'message_end') {
|
|
599
|
+
const msg = event.message;
|
|
600
|
+
if (msg?.role === 'assistant') {
|
|
601
|
+
addInferenceUsage(usage, msg.usage);
|
|
602
|
+
content = msg.content
|
|
603
|
+
.filter((b) => b.type === 'text')
|
|
604
|
+
.map((b) => b.text)
|
|
605
|
+
.join('');
|
|
606
|
+
for (const block of msg.content) {
|
|
607
|
+
if (block.type === 'toolCall') {
|
|
608
|
+
toolCalls.push({ tool: block.name, input: block.input, output: null });
|
|
609
|
+
}
|
|
247
610
|
}
|
|
248
611
|
}
|
|
249
612
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
613
|
+
else if (event.type === 'agent_end') {
|
|
614
|
+
unsubscribe();
|
|
615
|
+
resolve({ content, toolCalls, usage });
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
agent.prompt(userMessage).catch((error) => {
|
|
253
619
|
unsubscribe();
|
|
254
|
-
|
|
255
|
-
}
|
|
620
|
+
reject(error);
|
|
621
|
+
});
|
|
256
622
|
});
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
623
|
+
}, { userId: this._sessionUserId });
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Send a message with an explicit session ID and context.
|
|
627
|
+
* Preferred over the legacy setCurrentUser + switchSession + chat pattern.
|
|
628
|
+
*/
|
|
629
|
+
async chatInSession(sessionId, userMessage, opts) {
|
|
630
|
+
const ctx = { user: opts?.user ?? null };
|
|
631
|
+
return this.pool.withAgent(sessionId, ctx, async (agent) => {
|
|
632
|
+
return new Promise((resolve, reject) => {
|
|
633
|
+
let content = '';
|
|
634
|
+
const toolCalls = [];
|
|
635
|
+
const usage = createInferenceUsageSummary();
|
|
636
|
+
const unsubscribe = agent.subscribe((event) => {
|
|
637
|
+
if (event.type === 'message_end') {
|
|
638
|
+
const msg = event.message;
|
|
639
|
+
if (msg?.role === 'assistant') {
|
|
640
|
+
addInferenceUsage(usage, msg.usage);
|
|
641
|
+
content = msg.content
|
|
642
|
+
.filter((b) => b.type === 'text')
|
|
643
|
+
.map((b) => b.text)
|
|
644
|
+
.join('');
|
|
645
|
+
for (const block of msg.content) {
|
|
646
|
+
if (block.type === 'toolCall') {
|
|
647
|
+
toolCalls.push({ tool: block.name, input: block.input, output: null });
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
else if (event.type === 'agent_end') {
|
|
653
|
+
unsubscribe();
|
|
654
|
+
resolve({ content, toolCalls, usage });
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
agent.prompt(userMessage).catch((error) => {
|
|
658
|
+
unsubscribe();
|
|
659
|
+
reject(error);
|
|
660
|
+
});
|
|
261
661
|
});
|
|
262
|
-
});
|
|
662
|
+
}, { userId: opts?.userId, fallbackHistory: opts?.fallbackHistory });
|
|
263
663
|
}
|
|
264
664
|
/**
|
|
265
665
|
* Get workspace manager (for tools)
|
|
@@ -267,6 +667,62 @@ ${repoList}`;
|
|
|
267
667
|
getWorkspaceManager() {
|
|
268
668
|
return this.workspaceManager;
|
|
269
669
|
}
|
|
670
|
+
getModelSelection() {
|
|
671
|
+
const userConfig = loadUserConfig();
|
|
672
|
+
return {
|
|
673
|
+
provider: resolveProvider(userConfig, this.config),
|
|
674
|
+
modelId: resolveModelId(userConfig, this.config),
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* One-shot, tool-free model call that names a conversation from its opening
|
|
679
|
+
* exchange (the ChatGPT pattern). Used by POST /api/chat/title after the
|
|
680
|
+
* first assistant reply. Deliberately lightweight: no agent pool, no tools,
|
|
681
|
+
* no system context — just the configured model and a tight instruction.
|
|
682
|
+
*
|
|
683
|
+
* Returns null (caller keeps the truncated first-message title) when there's
|
|
684
|
+
* no usable title, no API key, or we're in Studiograph Credits gateway mode —
|
|
685
|
+
* the gateway routes inference through its own client (cloud-inference-billing),
|
|
686
|
+
* not pi-ai's complete(), so a direct completeSimple() can't reach it. Titles
|
|
687
|
+
* via the gateway are a follow-up if we want them.
|
|
688
|
+
*/
|
|
689
|
+
async generateConversationTitle(firstUserMessage, assistantReply) {
|
|
690
|
+
if (isStudiographCreditsMode())
|
|
691
|
+
return null;
|
|
692
|
+
const userConfig = loadUserConfig();
|
|
693
|
+
const provider = resolveProvider(userConfig, this.config);
|
|
694
|
+
const modelId = resolveModelId(userConfig, this.config);
|
|
695
|
+
const apiKey = resolveApiKey(userConfig, this.config);
|
|
696
|
+
if (!apiKey)
|
|
697
|
+
return null;
|
|
698
|
+
const model = getModel(provider, modelId);
|
|
699
|
+
const systemPrompt = 'You name a conversation from its opening exchange. Reply with ONLY the ' +
|
|
700
|
+
'title: 3 to 6 words, Title Case, no surrounding quotes, no trailing ' +
|
|
701
|
+
'punctuation. Describe the topic, not the speaker (e.g. "Cooper Hewitt ' +
|
|
702
|
+
'DEM Sync Notes", not "User Talks About a Meeting").';
|
|
703
|
+
const userText = `First message:\n${firstUserMessage}\n\nAssistant reply:\n${assistantReply}`.slice(0, 2000);
|
|
704
|
+
// No `temperature` — newer models (e.g. claude-opus-4-7) reject it with a
|
|
705
|
+
// 400 "temperature is deprecated for this model". maxTokens is plenty for a
|
|
706
|
+
// few-word title.
|
|
707
|
+
const result = await completeSimple(model, { systemPrompt, messages: [{ role: 'user', content: userText, timestamp: Date.now() }] }, { apiKey, maxTokens: 32 });
|
|
708
|
+
// Surface provider errors (e.g. a rejected option) so the route logs them
|
|
709
|
+
// instead of silently returning null and the client keeping its fallback.
|
|
710
|
+
if (result.stopReason === 'error') {
|
|
711
|
+
throw new Error(result.errorMessage || 'title model call failed');
|
|
712
|
+
}
|
|
713
|
+
const raw = result.content
|
|
714
|
+
.filter((c) => c.type === 'text')
|
|
715
|
+
.map((c) => c.text)
|
|
716
|
+
.join('')
|
|
717
|
+
.trim();
|
|
718
|
+
// Strip wrapping quotes / trailing punctuation the model may add anyway.
|
|
719
|
+
const title = raw.replace(/^["'`]+|["'`]+$/g, '').replace(/[.!?]+$/, '').trim().slice(0, 60);
|
|
720
|
+
if (!title)
|
|
721
|
+
return null;
|
|
722
|
+
const usage = createInferenceUsageSummary();
|
|
723
|
+
addInferenceUsage(usage, result.usage);
|
|
724
|
+
return { title, usage };
|
|
725
|
+
}
|
|
270
726
|
/**
|
|
271
727
|
* Get workspace summary
|
|
272
728
|
*/
|
|
@@ -280,7 +736,7 @@ ${repoList}`;
|
|
|
280
736
|
return this.workspaceManager.getRepoNames();
|
|
281
737
|
}
|
|
282
738
|
/**
|
|
283
|
-
* Set the current authenticated user for per-
|
|
739
|
+
* Set the current authenticated user for per-folder access filtering.
|
|
284
740
|
* Called per-request by the chat endpoint. Null = full access (API key / open mode).
|
|
285
741
|
*/
|
|
286
742
|
setCurrentUser(user) {
|
|
@@ -311,14 +767,19 @@ ${repoList}`;
|
|
|
311
767
|
this._mutationCallback?.(m);
|
|
312
768
|
}
|
|
313
769
|
/**
|
|
314
|
-
* Expose the raw pi-agent-core Agent instance.
|
|
770
|
+
* Expose the raw pi-agent-core Agent instance for a session (for SSE streaming).
|
|
771
|
+
* Returns the default session agent if no sessionId specified.
|
|
315
772
|
*/
|
|
316
|
-
getAgent() {
|
|
317
|
-
return this.
|
|
773
|
+
getAgent(sessionId) {
|
|
774
|
+
return this.pool.getAgent(sessionId ?? this.currentSessionId ?? 'default');
|
|
318
775
|
}
|
|
319
|
-
/**
|
|
320
|
-
|
|
321
|
-
this.
|
|
776
|
+
/** Get the agent pool (for advanced callers that need direct pool access). */
|
|
777
|
+
getPool() {
|
|
778
|
+
return this.pool;
|
|
779
|
+
}
|
|
780
|
+
/** Abort the agent for a session. */
|
|
781
|
+
abort(sessionId) {
|
|
782
|
+
this.pool.abort(sessionId ?? this.currentSessionId ?? 'default');
|
|
322
783
|
}
|
|
323
784
|
/**
|
|
324
785
|
* Get the current session ID (null if none active).
|
|
@@ -327,105 +788,36 @@ ${repoList}`;
|
|
|
327
788
|
return this.currentSessionId;
|
|
328
789
|
}
|
|
329
790
|
/**
|
|
330
|
-
* Switch
|
|
331
|
-
*
|
|
332
|
-
* - Existing session file → restore messages from disk
|
|
333
|
-
* - No file but fallback history → inject as context message
|
|
334
|
-
* - Nothing → clear messages for a fresh start
|
|
791
|
+
* Switch session (backward compat — sets state for next chat() call).
|
|
792
|
+
* With the pool, actual session loading happens lazily in withAgent().
|
|
335
793
|
*/
|
|
336
|
-
async switchSession(sessionId, fallbackHistory) {
|
|
337
|
-
|
|
338
|
-
return;
|
|
339
|
-
// Save current session before switching
|
|
340
|
-
if (this.currentSessionId) {
|
|
341
|
-
this.saveSession();
|
|
342
|
-
}
|
|
794
|
+
async switchSession(sessionId, fallbackHistory, userId) {
|
|
795
|
+
this._sessionUserId = userId;
|
|
343
796
|
this.currentSessionId = sessionId;
|
|
344
|
-
|
|
345
|
-
//
|
|
346
|
-
const sessionPath = join(this.sessionsDir, `${sessionId}.json`);
|
|
347
|
-
if (existsSync(sessionPath)) {
|
|
348
|
-
try {
|
|
349
|
-
const data = JSON.parse(readFileSync(sessionPath, 'utf-8'));
|
|
350
|
-
if (Array.isArray(data.messages) && data.messages.length > 0) {
|
|
351
|
-
this.agent.replaceMessages(data.messages);
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
catch {
|
|
356
|
-
// Corrupted file — fall through
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
// Fallback: inject frontend history as a context message
|
|
797
|
+
// Pre-create the agent in the pool if fallback history is provided
|
|
798
|
+
// (so the pool has the context ready when chat() runs)
|
|
360
799
|
if (fallbackHistory && fallbackHistory.length > 0) {
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
role: 'user',
|
|
366
|
-
content: [{ type: 'text', text: `[Prior conversation context]\n\n${transcript}` }],
|
|
367
|
-
timestamp: Date.now(),
|
|
368
|
-
};
|
|
369
|
-
this.agent.replaceMessages([contextMsg]);
|
|
370
|
-
return;
|
|
800
|
+
const ctx = { user: this._currentUser };
|
|
801
|
+
await this.pool.withAgent(sessionId, ctx, async () => {
|
|
802
|
+
// Agent is created and loaded — nothing else to do
|
|
803
|
+
}, { userId, fallbackHistory });
|
|
371
804
|
}
|
|
372
|
-
// Fresh start
|
|
373
|
-
this.agent.clearMessages();
|
|
374
805
|
}
|
|
375
806
|
/**
|
|
376
|
-
* Save
|
|
807
|
+
* Save session (backward compat — pool auto-saves after each withAgent call).
|
|
377
808
|
*/
|
|
378
809
|
saveSession() {
|
|
379
|
-
|
|
380
|
-
return;
|
|
381
|
-
const messages = this.agent.state.messages;
|
|
382
|
-
if (messages.length === 0)
|
|
383
|
-
return;
|
|
384
|
-
if (!existsSync(this.sessionsDir)) {
|
|
385
|
-
mkdirSync(this.sessionsDir, { recursive: true });
|
|
386
|
-
}
|
|
387
|
-
const sessionPath = join(this.sessionsDir, `${this.currentSessionId}.json`);
|
|
388
|
-
writeFileSync(sessionPath, JSON.stringify({
|
|
389
|
-
sessionId: this.currentSessionId,
|
|
390
|
-
updatedAt: new Date().toISOString(),
|
|
391
|
-
messages,
|
|
392
|
-
}), 'utf-8');
|
|
393
|
-
this.pruneSessions(20);
|
|
810
|
+
// Pool handles session persistence automatically
|
|
394
811
|
}
|
|
395
812
|
/**
|
|
396
813
|
* Clear all saved sessions from disk.
|
|
397
814
|
*/
|
|
398
815
|
clearSessions() {
|
|
399
|
-
|
|
400
|
-
return 0;
|
|
401
|
-
const files = readdirSync(this.sessionsDir).filter(f => f.endsWith('.json'));
|
|
402
|
-
for (const f of files) {
|
|
403
|
-
try {
|
|
404
|
-
unlinkSync(join(this.sessionsDir, f));
|
|
405
|
-
}
|
|
406
|
-
catch { /* ignore */ }
|
|
407
|
-
}
|
|
408
|
-
return files.length;
|
|
816
|
+
return this.pool.clearSessions(this._sessionUserId);
|
|
409
817
|
}
|
|
410
|
-
/**
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
pruneSessions(keep) {
|
|
414
|
-
if (!existsSync(this.sessionsDir))
|
|
415
|
-
return;
|
|
416
|
-
const files = readdirSync(this.sessionsDir)
|
|
417
|
-
.filter(f => f.endsWith('.json'))
|
|
418
|
-
.map(f => {
|
|
419
|
-
const p = join(this.sessionsDir, f);
|
|
420
|
-
return { name: f, path: p, mtime: statSync(p).mtimeMs };
|
|
421
|
-
})
|
|
422
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
423
|
-
for (const file of files.slice(keep)) {
|
|
424
|
-
try {
|
|
425
|
-
unlinkSync(file.path);
|
|
426
|
-
}
|
|
427
|
-
catch { /* ignore */ }
|
|
428
|
-
}
|
|
818
|
+
/** Shut down the agent pool (save all sessions, stop idle reaper). */
|
|
819
|
+
async shutdown() {
|
|
820
|
+
await this.pool.shutdown();
|
|
429
821
|
}
|
|
430
822
|
}
|
|
431
823
|
//# sourceMappingURL=orchestrator.js.map
|