studiograph 1.3.48-next.13 → 1.3.48-next.130
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/agent/agent-pool.d.ts +14 -1
- package/dist/agent/agent-pool.js +37 -12
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/followups.d.ts +34 -0
- package/dist/agent/followups.js +52 -0
- package/dist/agent/followups.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +29 -2
- package/dist/agent/orchestrator.js +239 -38
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/entity-types-section.d.ts +30 -0
- package/dist/agent/prompts/entity-types-section.js +83 -0
- package/dist/agent/prompts/entity-types-section.js.map +1 -0
- package/dist/agent/prompts/system.md +106 -47
- package/dist/agent/skill-loader.d.ts +30 -17
- package/dist/agent/skill-loader.js +63 -30
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/entity-schema.md +79 -343
- package/dist/agent/skills/interview/entity-templates.md +38 -37
- package/dist/agent/skills/interview/question-domains.md +54 -49
- package/dist/agent/skills/interview/skill.md +89 -14
- package/dist/agent/tools/capture-tools.d.ts +31 -0
- package/dist/agent/tools/capture-tools.js +40 -0
- package/dist/agent/tools/capture-tools.js.map +1 -0
- package/dist/agent/tools/folder-tools.d.ts +47 -0
- package/dist/agent/tools/folder-tools.js +249 -0
- package/dist/agent/tools/folder-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +6 -5
- package/dist/agent/tools/fs-tools.js +5 -5
- package/dist/agent/tools/fs-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.d.ts +25 -72
- package/dist/agent/tools/graph-tools.js +362 -366
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/history-tools.d.ts +95 -0
- package/dist/agent/tools/history-tools.js +461 -0
- package/dist/agent/tools/history-tools.js.map +1 -0
- package/dist/agent/tools/load-skill.d.ts +6 -5
- package/dist/agent/tools/load-skill.js +3 -3
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/message-tools.d.ts +13 -11
- package/dist/agent/tools/message-tools.js +31 -39
- package/dist/agent/tools/message-tools.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +5 -4
- package/dist/agent/tools/ops-tools.js +99 -212
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +39 -16
- package/dist/agent/tools/permission-tools.js +66 -41
- package/dist/agent/tools/permission-tools.js.map +1 -1
- package/dist/agent/tools/tool-loader.js +5 -4
- package/dist/agent/tools/tool-loader.js.map +1 -1
- package/dist/agent/tools/web-tools.js +58 -9
- package/dist/agent/tools/web-tools.js.map +1 -1
- package/dist/cli/commands/about.d.ts +1 -0
- package/dist/cli/commands/about.js +55 -3
- package/dist/cli/commands/about.js.map +1 -1
- package/dist/cli/commands/audit.d.ts +21 -0
- package/dist/cli/commands/audit.js +174 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/clear.d.ts +5 -0
- package/dist/cli/commands/clear.js +144 -1
- package/dist/cli/commands/clear.js.map +1 -1
- package/dist/cli/commands/clone.d.ts +1 -1
- package/dist/cli/commands/clone.js +47 -12
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/deploy.js +79 -18
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/folder.d.ts +11 -0
- package/dist/cli/commands/folder.js +186 -0
- package/dist/cli/commands/folder.js.map +1 -0
- package/dist/cli/commands/index.js +2 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +16 -14
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.d.ts +1 -1
- package/dist/cli/commands/join.js +26 -14
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/mcp.js +12 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/r2.d.ts +3 -0
- package/dist/cli/commands/r2.js +196 -1
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.js +41 -1
- package/dist/cli/commands/redeploy.js.map +1 -1
- package/dist/cli/commands/secrets.d.ts +23 -0
- package/dist/cli/commands/secrets.js +256 -0
- package/dist/cli/commands/secrets.js.map +1 -0
- package/dist/cli/commands/serve.js +143 -24
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/start.js +140 -71
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +509 -163
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/user.js +8 -24
- package/dist/cli/commands/user.js.map +1 -1
- package/dist/cli/index.js +8 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/railway-provisioning.d.ts +53 -0
- package/dist/cli/railway-provisioning.js +85 -0
- package/dist/cli/railway-provisioning.js.map +1 -0
- package/dist/cli/scaffolding.d.ts +4 -2
- package/dist/cli/scaffolding.js +42 -47
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +30 -49
- package/dist/cli/setup-wizard.js +35 -38
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/core/accent-palette.d.ts +22 -0
- package/dist/core/accent-palette.js +47 -0
- package/dist/core/accent-palette.js.map +1 -0
- package/dist/core/entity-body-templates.d.ts +21 -0
- package/dist/core/entity-body-templates.js +48 -0
- package/dist/core/entity-body-templates.js.map +1 -0
- package/dist/core/entity-types-catalog.d.ts +65 -0
- package/dist/core/entity-types-catalog.js +136 -0
- package/dist/core/entity-types-catalog.js.map +1 -0
- package/dist/core/feature-flags.d.ts +22 -0
- package/dist/core/feature-flags.js +15 -0
- package/dist/core/feature-flags.js.map +1 -0
- package/dist/core/features.d.ts +16 -0
- package/dist/core/features.js +48 -0
- package/dist/core/features.js.map +1 -0
- package/dist/core/folder-paths.d.ts +41 -0
- package/dist/core/folder-paths.js +95 -0
- package/dist/core/folder-paths.js.map +1 -0
- package/dist/core/folder-sidecar.d.ts +16 -0
- package/dist/core/folder-sidecar.js +45 -0
- package/dist/core/folder-sidecar.js.map +1 -0
- package/dist/core/graph.d.ts +471 -19
- package/dist/core/graph.js +1411 -284
- package/dist/core/graph.js.map +1 -1
- package/dist/core/schema-registry.js +1 -19
- package/dist/core/schema-registry.js.map +1 -1
- package/dist/core/schemas/connector.d.ts +67 -0
- package/dist/core/schemas/connector.js +100 -0
- package/dist/core/schemas/connector.js.map +1 -0
- package/dist/core/schemas/workspace.d.ts +122 -0
- package/dist/core/schemas/workspace.js +211 -0
- package/dist/core/schemas/workspace.js.map +1 -0
- package/dist/core/secrets/SecretStore.d.ts +77 -0
- package/dist/core/secrets/SecretStore.js +13 -0
- package/dist/core/secrets/SecretStore.js.map +1 -0
- package/dist/core/secrets/SettingsResolver.d.ts +54 -0
- package/dist/core/secrets/SettingsResolver.js +80 -0
- package/dist/core/secrets/SettingsResolver.js.map +1 -0
- package/dist/core/secrets/SettingsStore.d.ts +30 -0
- package/dist/core/secrets/SettingsStore.js +9 -0
- package/dist/core/secrets/SettingsStore.js.map +1 -0
- package/dist/core/secrets/SqliteEncryptedStore.d.ts +78 -0
- package/dist/core/secrets/SqliteEncryptedStore.js +581 -0
- package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
- package/dist/core/secrets/audit.d.ts +36 -0
- package/dist/core/secrets/audit.js +60 -0
- package/dist/core/secrets/audit.js.map +1 -0
- package/dist/core/secrets/auth-db-migration.d.ts +129 -0
- package/dist/core/secrets/auth-db-migration.js +653 -0
- package/dist/core/secrets/auth-db-migration.js.map +1 -0
- package/dist/core/secrets/bundle.d.ts +141 -0
- package/dist/core/secrets/bundle.js +435 -0
- package/dist/core/secrets/bundle.js.map +1 -0
- package/dist/core/secrets/dual-write.d.ts +76 -0
- package/dist/core/secrets/dual-write.js +236 -0
- package/dist/core/secrets/dual-write.js.map +1 -0
- package/dist/core/secrets/encryption.d.ts +44 -0
- package/dist/core/secrets/encryption.js +97 -0
- package/dist/core/secrets/encryption.js.map +1 -0
- package/dist/core/secrets/importer.d.ts +94 -0
- package/dist/core/secrets/importer.js +319 -0
- package/dist/core/secrets/importer.js.map +1 -0
- package/dist/core/secrets/index.d.ts +35 -0
- package/dist/core/secrets/index.js +59 -0
- package/dist/core/secrets/index.js.map +1 -0
- package/dist/core/secrets/master-key.d.ts +38 -0
- package/dist/core/secrets/master-key.js +122 -0
- package/dist/core/secrets/master-key.js.map +1 -0
- package/dist/core/secrets/probes/anthropic.d.ts +98 -0
- package/dist/core/secrets/probes/anthropic.js +300 -0
- package/dist/core/secrets/probes/anthropic.js.map +1 -0
- package/dist/core/secrets/probes/brave.d.ts +9 -0
- package/dist/core/secrets/probes/brave.js +15 -0
- package/dist/core/secrets/probes/brave.js.map +1 -0
- package/dist/core/secrets/probes/r2.d.ts +15 -0
- package/dist/core/secrets/probes/r2.js +14 -0
- package/dist/core/secrets/probes/r2.js.map +1 -0
- package/dist/core/secrets/probes/voyage.d.ts +13 -0
- package/dist/core/secrets/probes/voyage.js +52 -0
- package/dist/core/secrets/probes/voyage.js.map +1 -0
- package/dist/core/secrets/read-flip.d.ts +59 -0
- package/dist/core/secrets/read-flip.js +87 -0
- package/dist/core/secrets/read-flip.js.map +1 -0
- package/dist/core/secrets/registry.d.ts +188 -0
- package/dist/core/secrets/registry.js +539 -0
- package/dist/core/secrets/registry.js.map +1 -0
- package/dist/core/types.d.ts +70 -483
- package/dist/core/types.js +6 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +52 -12
- package/dist/core/user-config.js +119 -14
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +603 -1409
- package/dist/core/validation.js +248 -146
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +35 -14
- package/dist/core/workspace-manager.js +105 -56
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +19 -5
- package/dist/core/workspace.js +66 -39
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/connector-manager.d.ts +16 -1
- package/dist/mcp/connector-manager.js +44 -5
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/server.d.ts +11 -3
- package/dist/mcp/server.js +30 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +27 -2
- package/dist/mcp/tools.js +544 -113
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/__tests__/helpers/graph-api.d.ts +18 -0
- package/dist/server/__tests__/helpers/graph-api.js +16 -0
- package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
- package/dist/server/commit-audit.d.ts +26 -0
- package/dist/server/commit-audit.js +30 -0
- package/dist/server/commit-audit.js.map +1 -0
- package/dist/server/index.d.ts +14 -3
- package/dist/server/index.js +388 -177
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/sanitize.d.ts +46 -0
- package/dist/server/middleware/sanitize.js +171 -0
- package/dist/server/middleware/sanitize.js.map +1 -0
- package/dist/server/routes/asset-api.js +217 -65
- package/dist/server/routes/asset-api.js.map +1 -1
- package/dist/server/routes/audit-api.d.ts +24 -0
- package/dist/server/routes/audit-api.js +117 -0
- package/dist/server/routes/audit-api.js.map +1 -0
- package/dist/server/routes/auth-api.js +220 -44
- package/dist/server/routes/auth-api.js.map +1 -1
- package/dist/server/routes/capture-api.d.ts +10 -3
- package/dist/server/routes/capture-api.js +180 -24
- package/dist/server/routes/capture-api.js.map +1 -1
- package/dist/server/routes/chat.d.ts +4 -1
- package/dist/server/routes/chat.js +178 -46
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/config-api.d.ts +21 -0
- package/dist/server/routes/config-api.js +256 -0
- package/dist/server/routes/config-api.js.map +1 -0
- package/dist/server/routes/connectors-api.js +24 -18
- package/dist/server/routes/connectors-api.js.map +1 -1
- package/dist/server/routes/event-ingest-api.d.ts +15 -0
- package/dist/server/routes/event-ingest-api.js +125 -0
- package/dist/server/routes/event-ingest-api.js.map +1 -0
- package/dist/server/routes/features-api.d.ts +19 -0
- package/dist/server/routes/features-api.js +28 -0
- package/dist/server/routes/features-api.js.map +1 -0
- package/dist/server/routes/git-http.d.ts +2 -2
- package/dist/server/routes/git-http.js +69 -34
- package/dist/server/routes/git-http.js.map +1 -1
- package/dist/server/routes/graph-api-access.d.ts +35 -0
- package/dist/server/routes/graph-api-access.js +93 -0
- package/dist/server/routes/graph-api-access.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +3 -2
- package/dist/server/routes/graph-api.js +1014 -315
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/health.d.ts +18 -0
- package/dist/server/routes/health.js +74 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/insights-api.js +156 -33
- package/dist/server/routes/insights-api.js.map +1 -1
- package/dist/server/routes/mcp.d.ts +6 -3
- package/dist/server/routes/mcp.js +22 -6
- package/dist/server/routes/mcp.js.map +1 -1
- package/dist/server/routes/messages-api.d.ts +3 -3
- package/dist/server/routes/messages-api.js +308 -120
- package/dist/server/routes/messages-api.js.map +1 -1
- package/dist/server/routes/permissions-api.d.ts +9 -2
- package/dist/server/routes/permissions-api.js +87 -31
- package/dist/server/routes/permissions-api.js.map +1 -1
- package/dist/server/routes/secrets-api.d.ts +36 -0
- package/dist/server/routes/secrets-api.js +303 -0
- package/dist/server/routes/secrets-api.js.map +1 -0
- package/dist/server/routes/settings-api.d.ts +29 -0
- package/dist/server/routes/settings-api.js +177 -0
- package/dist/server/routes/settings-api.js.map +1 -0
- package/dist/server/routes/workspace-api.d.ts +2 -1
- package/dist/server/routes/workspace-api.js +131 -20
- package/dist/server/routes/workspace-api.js.map +1 -1
- package/dist/server/routes/ws.d.ts +3 -2
- package/dist/server/routes/ws.js +68 -18
- package/dist/server/routes/ws.js.map +1 -1
- package/dist/server/session-manager.d.ts +48 -5
- package/dist/server/session-manager.js +175 -11
- package/dist/server/session-manager.js.map +1 -1
- package/dist/server/ws-hub.d.ts +134 -22
- package/dist/server/ws-hub.js +0 -0
- package/dist/server/ws-hub.js.map +1 -1
- package/dist/server/yjs-manager.d.ts +107 -7
- package/dist/server/yjs-manager.js +444 -38
- package/dist/server/yjs-manager.js.map +1 -1
- package/dist/server/yjs-persistence.d.ts +143 -0
- package/dist/server/yjs-persistence.js +543 -0
- package/dist/server/yjs-persistence.js.map +1 -0
- package/dist/server/yjs-text-diff.d.ts +32 -0
- package/dist/server/yjs-text-diff.js +61 -0
- package/dist/server/yjs-text-diff.js.map +1 -0
- package/dist/services/access-control.d.ts +53 -0
- package/dist/services/access-control.js +132 -0
- package/dist/services/access-control.js.map +1 -0
- package/dist/services/asset-upload-service.d.ts +53 -0
- package/dist/services/asset-upload-service.js +200 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +38 -0
- package/dist/services/assets/base.js +55 -0
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +41 -1
- package/dist/services/assets/index.js +65 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/assets/local.d.ts +7 -1
- package/dist/services/assets/local.js +83 -0
- package/dist/services/assets/local.js.map +1 -1
- package/dist/services/assets/r2.d.ts +28 -1
- package/dist/services/assets/r2.js +75 -1
- package/dist/services/assets/r2.js.map +1 -1
- package/dist/services/auth-service.d.ts +184 -36
- package/dist/services/auth-service.js +763 -138
- package/dist/services/auth-service.js.map +1 -1
- package/dist/services/briefing.d.ts +1 -1
- package/dist/services/briefing.js +12 -35
- package/dist/services/briefing.js.map +1 -1
- package/dist/services/event-processor.d.ts +104 -0
- package/dist/services/event-processor.js +443 -0
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/folder-creation.d.ts +33 -0
- package/dist/services/folder-creation.js +103 -0
- package/dist/services/folder-creation.js.map +1 -0
- package/dist/services/git.d.ts +44 -0
- package/dist/services/git.js +162 -55
- package/dist/services/git.js.map +1 -1
- package/dist/services/heartbeat.d.ts +19 -12
- package/dist/services/heartbeat.js +162 -107
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/import-service.d.ts +37 -2
- package/dist/services/import-service.js +222 -123
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/lint-service.js +7 -14
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.js +6 -2
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/message-service.d.ts +62 -21
- package/dist/services/message-service.js +160 -43
- package/dist/services/message-service.js.map +1 -1
- package/dist/services/personal-folder.d.ts +40 -0
- package/dist/services/personal-folder.js +101 -0
- package/dist/services/personal-folder.js.map +1 -0
- package/dist/services/vector-service.d.ts +73 -3
- package/dist/services/vector-service.js +106 -7
- package/dist/services/vector-service.js.map +1 -1
- package/dist/services/workspace-access.d.ts +106 -0
- package/dist/services/workspace-access.js +149 -0
- package/dist/services/workspace-access.js.map +1 -0
- package/dist/utils/git.js +3 -3
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/log.d.ts +42 -0
- package/dist/utils/log.js +137 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/preflight.js +2 -2
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +4 -1
- package/dist/utils/version-checker.js +8 -8
- package/dist/utils/version-checker.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.Bp6xXZUi.css +2 -0
- package/dist/web/_app/immutable/assets/11.DlIf1mKh.css +1 -0
- package/dist/web/_app/immutable/assets/12.Dmlt28l2.css +1 -0
- package/dist/web/_app/immutable/assets/13.CmLrbzZp.css +1 -0
- package/dist/web/_app/immutable/assets/2.oo1ac0x_.css +1 -0
- package/dist/web/_app/immutable/assets/3.DJJsQzDb.css +1 -0
- package/dist/web/_app/immutable/assets/4.CZ-fNJ91.css +1 -0
- package/dist/web/_app/immutable/assets/AgentOverlay.BfWESlQU.css +1 -0
- package/dist/web/_app/immutable/assets/AssetManagerModal.ZfasE2L3.css +1 -0
- package/dist/web/_app/immutable/assets/CalendarView.CeNagvyK.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.po0gYtVH.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMembersPanel.Bepw-r0F.css +1 -0
- package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
- package/dist/web/_app/immutable/assets/FolderPicker.B5KdvRYl.css +1 -0
- package/dist/web/_app/immutable/assets/GalleryView.Dy-qQjEc.css +1 -0
- package/dist/web/_app/immutable/assets/GraphView.BHnGIltS.css +1 -0
- package/dist/web/_app/immutable/assets/KanbanView.G3NZ0uHb.css +1 -0
- package/dist/web/_app/immutable/assets/SettingsDialog.tBn8y9DD.css +1 -0
- package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
- package/dist/web/_app/immutable/assets/TagFilter.DNipjifq.css +1 -0
- package/dist/web/_app/immutable/assets/TagPickerSheet.DJPuqnTg.css +1 -0
- package/dist/web/_app/immutable/assets/WorkspaceView.B9zA92UB.css +1 -0
- package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
- package/dist/web/_app/immutable/assets/dialog.BxVal_19.css +1 -0
- package/dist/web/_app/immutable/assets/dist.B5hGjnfj.css +1 -0
- package/dist/web/_app/immutable/assets/dist.DDCWxn3B.css +1 -0
- package/dist/web/_app/immutable/assets/dropdown-menu.BSsUUQ3o.css +1 -0
- package/dist/web/_app/immutable/assets/entity-row.Bl5FyNCt.css +1 -0
- package/dist/web/_app/immutable/assets/greeting.Bm7lTneV.css +1 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
- package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
- package/dist/web/_app/immutable/assets/inline-list.DORLo4xF.css +1 -0
- package/dist/web/_app/immutable/assets/notifications.clodJdp5.css +1 -0
- package/dist/web/_app/immutable/assets/radio-group.GJJRVPUJ.css +1 -0
- package/dist/web/_app/immutable/assets/select.D_AV992j.css +1 -0
- package/dist/web/_app/immutable/chunks/-KAQXGuI2.js +1 -0
- package/dist/web/_app/immutable/chunks/-wzwcH00.js +1 -0
- package/dist/web/_app/immutable/chunks/07l_1Zpm2.js +1 -0
- package/dist/web/_app/immutable/chunks/1i1V0Z172.js +2 -0
- package/dist/web/_app/immutable/chunks/38oWKNzM2.js +6 -0
- package/dist/web/_app/immutable/chunks/54VmiJfH.js +1 -0
- package/dist/web/_app/immutable/chunks/6LRpFvjo.js +185 -0
- package/dist/web/_app/immutable/chunks/9bCTHkeS.js +1 -0
- package/dist/web/_app/immutable/chunks/B-822WnD2.js +22 -0
- package/dist/web/_app/immutable/chunks/B0HUvliX2.js +2 -0
- package/dist/web/_app/immutable/chunks/B12eXGpE.js +1 -0
- package/dist/web/_app/immutable/chunks/B2-Cx5XA.js +1 -0
- package/dist/web/_app/immutable/chunks/B5af0X0p2.js +1 -0
- package/dist/web/_app/immutable/chunks/B6iYNwo72.js +1 -0
- package/dist/web/_app/immutable/chunks/B7EMtoAB.js +1 -0
- package/dist/web/_app/immutable/chunks/B9qBGxh62.js +3 -0
- package/dist/web/_app/immutable/chunks/B9rVXblv.js +1 -0
- package/dist/web/_app/immutable/chunks/BEpMEjHO.js +1 -0
- package/dist/web/_app/immutable/chunks/BErNpj-S2.js +1 -0
- package/dist/web/_app/immutable/chunks/BHBk4zfV.js +1 -0
- package/dist/web/_app/immutable/chunks/BHH-JGNF.js +1 -0
- package/dist/web/_app/immutable/chunks/BNTlsKDJ.js +1 -0
- package/dist/web/_app/immutable/chunks/BOgcXgis2.js +1 -0
- package/dist/web/_app/immutable/chunks/BOyyDrjn2.js +1 -0
- package/dist/web/_app/immutable/chunks/BPR_ufQ0.js +41 -0
- package/dist/web/_app/immutable/chunks/BRcFsc6v.js +5 -0
- package/dist/web/_app/immutable/chunks/BT3KAag_.js +3 -0
- package/dist/web/_app/immutable/chunks/BX2T6xiZ.js +224 -0
- package/dist/web/_app/immutable/chunks/BZnJ8tbJ.js +1 -0
- package/dist/web/_app/immutable/chunks/Ba1Yzb7u.js +1 -0
- package/dist/web/_app/immutable/chunks/BcsvgA3B2.js +1 -0
- package/dist/web/_app/immutable/chunks/BfbS7rGT.js +1 -0
- package/dist/web/_app/immutable/chunks/BgagL41Z.js +1 -0
- package/dist/web/_app/immutable/chunks/Bk-AcswV.js +1 -0
- package/dist/web/_app/immutable/chunks/Bl9Pzopy.js +1 -0
- package/dist/web/_app/immutable/chunks/BmcU05mO.js +1 -0
- package/dist/web/_app/immutable/chunks/Bmgp0jlT.js +1 -0
- package/dist/web/_app/immutable/chunks/BpDONXUo.js +8 -0
- package/dist/web/_app/immutable/chunks/BpTXLx8I2.js +5 -0
- package/dist/web/_app/immutable/chunks/Bq0-jBGC2.js +1 -0
- package/dist/web/_app/immutable/chunks/BqGj0_GS.js +1 -0
- package/dist/web/_app/immutable/chunks/Bsc9K3Pz.js +1 -0
- package/dist/web/_app/immutable/chunks/Bssb691Q.js +1 -0
- package/dist/web/_app/immutable/chunks/BuzQceOn.js +1 -0
- package/dist/web/_app/immutable/chunks/BzeVNab0.js +1 -0
- package/dist/web/_app/immutable/chunks/C-OaypFN.js +1 -0
- package/dist/web/_app/immutable/chunks/C0fjDjvE2.js +1 -0
- package/dist/web/_app/immutable/chunks/C0pTXwEX.js +2 -0
- package/dist/web/_app/immutable/chunks/C3Enww9L2.js +1 -0
- package/dist/web/_app/immutable/chunks/C3oa0Cks.js +1 -0
- package/dist/web/_app/immutable/chunks/C7GIvT8T.js +2 -0
- package/dist/web/_app/immutable/chunks/CC-YWp-f.js +1 -0
- package/dist/web/_app/immutable/chunks/CGdKvXV92.js +1 -0
- package/dist/web/_app/immutable/chunks/CH0siYFL.js +1 -0
- package/dist/web/_app/immutable/chunks/CIc2MMme2.js +1 -0
- package/dist/web/_app/immutable/chunks/CIchr8Tk2.js +1 -0
- package/dist/web/_app/immutable/chunks/CK_yXDQI.js +1 -0
- package/dist/web/_app/immutable/chunks/CLSxJmTj.js +2 -0
- package/dist/web/_app/immutable/chunks/CMhHc1Bq2.js +2 -0
- package/dist/web/_app/immutable/chunks/CNGba6T4.js +1 -0
- package/dist/web/_app/immutable/chunks/CPt2D5aU.js +1 -0
- package/dist/web/_app/immutable/chunks/CQ-2yccd.js +7 -0
- package/dist/web/_app/immutable/chunks/CS6VEwn7.js +1 -0
- package/dist/web/_app/immutable/chunks/CSsDOIrk.js +1 -0
- package/dist/web/_app/immutable/chunks/CVXvEWhv2.js +1 -0
- package/dist/web/_app/immutable/chunks/CaChtuYU2.js +1 -0
- package/dist/web/_app/immutable/chunks/CbiwvM3R2.js +1 -0
- package/dist/web/_app/immutable/chunks/CdCuBMLm.js +156 -0
- package/dist/web/_app/immutable/chunks/CiyqPsJo.js +1 -0
- package/dist/web/_app/immutable/chunks/CjGzUnEF2.js +1 -0
- package/dist/web/_app/immutable/chunks/Cjgbiel7.js +1 -0
- package/dist/web/_app/immutable/chunks/CnqSKqA62.js +1 -0
- package/dist/web/_app/immutable/chunks/CqyqKPuh2.js +1 -0
- package/dist/web/_app/immutable/chunks/CrnX-oFV.js +1 -0
- package/dist/web/_app/immutable/chunks/CsGahE3a.js +1 -0
- package/dist/web/_app/immutable/chunks/Ct3quP0F.js +1 -0
- package/dist/web/_app/immutable/chunks/CtlAYPxw.js +1 -0
- package/dist/web/_app/immutable/chunks/CvZaxjRC.js +1 -0
- package/dist/web/_app/immutable/chunks/CwD4G56R.js +5 -0
- package/dist/web/_app/immutable/chunks/CwROuREs.js +1 -0
- package/dist/web/_app/immutable/chunks/CxalqrMB.js +1 -0
- package/dist/web/_app/immutable/chunks/D7qgUfnr.js +2487 -0
- package/dist/web/_app/immutable/chunks/D9-_Euza2.js +1 -0
- package/dist/web/_app/immutable/chunks/DC69SASj.js +2 -0
- package/dist/web/_app/immutable/chunks/DCCaoKt42.js +1 -0
- package/dist/web/_app/immutable/chunks/DDKweOZr2.js +23 -0
- package/dist/web/_app/immutable/chunks/DEY60osH.js +1 -0
- package/dist/web/_app/immutable/chunks/DG3QZPgI.js +1 -0
- package/dist/web/_app/immutable/chunks/DHepUItL.js +1 -0
- package/dist/web/_app/immutable/chunks/DNtqqgv32.js +1 -0
- package/dist/web/_app/immutable/chunks/DRl7vwNC2.js +184 -0
- package/dist/web/_app/immutable/chunks/DTc5W_V6.js +1 -0
- package/dist/web/_app/immutable/chunks/DaiJs3St.js +1 -0
- package/dist/web/_app/immutable/chunks/DfITyMKh2.js +1 -0
- package/dist/web/_app/immutable/chunks/DhuJRrEX2.js +1 -0
- package/dist/web/_app/immutable/chunks/DiP2EplP.js +3 -0
- package/dist/web/_app/immutable/chunks/DjlDV2JG.js +1 -0
- package/dist/web/_app/immutable/chunks/Dm25ot5x2.js +1 -0
- package/dist/web/_app/immutable/chunks/DpuSt-SO.js +2 -0
- package/dist/web/_app/immutable/chunks/DqOcb9RX2.js +83 -0
- package/dist/web/_app/immutable/chunks/DrbUJCAE.js +1 -0
- package/dist/web/_app/immutable/chunks/Du2-B3c8.js +1 -0
- package/dist/web/_app/immutable/chunks/DwdkE4UD2.js +1 -0
- package/dist/web/_app/immutable/chunks/DxWesPbn.js +1 -0
- package/dist/web/_app/immutable/chunks/DyYZqUV72.js +1 -0
- package/dist/web/_app/immutable/chunks/HfUnhvrv2.js +1 -0
- package/dist/web/_app/immutable/chunks/Je8-BtCk2.js +1 -0
- package/dist/web/_app/immutable/chunks/MSB7eA4_.js +1 -0
- package/dist/web/_app/immutable/chunks/NPe9WyW1.js +1 -0
- package/dist/web/_app/immutable/chunks/O6IzcxXJ.js +2 -0
- package/dist/web/_app/immutable/chunks/SXhc9rJW.js +1 -0
- package/dist/web/_app/immutable/chunks/SbWhkPMt.js +6 -0
- package/dist/web/_app/immutable/chunks/U40J2SnU.js +1 -0
- package/dist/web/_app/immutable/chunks/VS3l21Gu.js +1 -0
- package/dist/web/_app/immutable/chunks/YEPEvlbU2.js +1 -0
- package/dist/web/_app/immutable/chunks/Z7TNRcgK.js +11 -0
- package/dist/web/_app/immutable/chunks/ZCekGjo6.js +5 -0
- package/dist/web/_app/immutable/chunks/_rnxQ655.js +4 -0
- package/dist/web/_app/immutable/chunks/aALpjBW2.js +1 -0
- package/dist/web/_app/immutable/chunks/gNXLhsdy.js +1 -0
- package/dist/web/_app/immutable/chunks/hKSTEN36.js +1 -0
- package/dist/web/_app/immutable/chunks/jZZTbzL5.js +1 -0
- package/dist/web/_app/immutable/chunks/l4FIBKss.js +1 -0
- package/dist/web/_app/immutable/chunks/l_4snZnh2.js +1 -0
- package/dist/web/_app/immutable/chunks/mz-cgRgP.js +3 -0
- package/dist/web/_app/immutable/chunks/qgprkMcL.js +1 -0
- package/dist/web/_app/immutable/chunks/rOisBLC62.js +14 -0
- package/dist/web/_app/immutable/chunks/t08TznXc2.js +1 -0
- package/dist/web/_app/immutable/chunks/t62M88qj.js +1 -0
- package/dist/web/_app/immutable/chunks/uCohGWC42.js +1 -0
- package/dist/web/_app/immutable/chunks/uqxmB78b.js +1 -0
- package/dist/web/_app/immutable/chunks/vJkT0IPN.js +1 -0
- package/dist/web/_app/immutable/chunks/vwTMEIJQ.js +1 -0
- package/dist/web/_app/immutable/chunks/w1FCELam.js +64 -0
- package/dist/web/_app/immutable/chunks/xEzUlKaR2.js +1 -0
- package/dist/web/_app/immutable/chunks/zumDjcgJ.js +1 -0
- package/dist/web/_app/immutable/entry/app.DtdPIxaY.js +2 -0
- package/dist/web/_app/immutable/entry/start.Cqf8YmDj.js +1 -0
- package/dist/web/_app/immutable/nodes/0.CktqlAe7.js +2 -0
- package/dist/web/_app/immutable/nodes/1.Bs7cz_ba.js +1 -0
- package/dist/web/_app/immutable/nodes/10.CAQtOBqO.js +1 -0
- package/dist/web/_app/immutable/nodes/11.l9TQGnJm.js +1 -0
- package/dist/web/_app/immutable/nodes/12.CttDoIpY.js +1 -0
- package/dist/web/_app/immutable/nodes/13.E5fh69kS.js +1 -0
- package/dist/web/_app/immutable/nodes/2.DnLSJfx-.js +106 -0
- package/dist/web/_app/immutable/nodes/3.Bw8R0Jw5.js +2 -0
- package/dist/web/_app/immutable/nodes/4.Cl0HgeTG.js +2 -0
- package/dist/web/_app/immutable/nodes/5.BpIWwWi9.js +1 -0
- package/dist/web/_app/immutable/nodes/6.jpx6ZgOI.js +1 -0
- package/dist/web/_app/immutable/nodes/7.YTFykZQe.js +1 -0
- package/dist/web/_app/immutable/nodes/8.Chy0HNU1.js +1 -0
- package/dist/web/_app/immutable/nodes/9.D10JpFt2.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/favicon-16.png +0 -0
- package/dist/web/favicon-180.png +0 -0
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon-48.png +0 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +8 -0
- package/dist/web/index.html +64 -21
- package/dist/web/studiograph-logomark.svg +29 -0
- package/package.json +28 -14
- package/dist/agent/role-loader.d.ts +0 -24
- package/dist/agent/role-loader.js +0 -67
- package/dist/agent/role-loader.js.map +0 -1
- package/dist/agent/skills/enrich-entities.md +0 -136
- package/dist/agent/skills/obsidian-source-setup.md +0 -246
- package/dist/agent/skills/skill-loader.d.ts +0 -48
- package/dist/agent/skills/skill-loader.js +0 -166
- package/dist/agent/skills/skill-loader.js.map +0 -1
- package/dist/agent/skills/sync-configuration.md +0 -119
- package/dist/agent/skills/sync-setup.md +0 -82
- package/dist/agent/tools/sync-tools.d.ts +0 -35
- package/dist/agent/tools/sync-tools.js +0 -992
- package/dist/agent/tools/sync-tools.js.map +0 -1
- package/dist/auth/github.d.ts +0 -56
- package/dist/auth/github.js +0 -169
- package/dist/auth/github.js.map +0 -1
- package/dist/cli/commands/access.d.ts +0 -11
- package/dist/cli/commands/access.js +0 -156
- package/dist/cli/commands/access.js.map +0 -1
- package/dist/cli/commands/app.d.ts +0 -7
- package/dist/cli/commands/app.js +0 -268
- package/dist/cli/commands/app.js.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -10
- package/dist/cli/commands/auth.js +0 -79
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/collection.d.ts +0 -10
- package/dist/cli/commands/collection.js +0 -185
- package/dist/cli/commands/collection.js.map +0 -1
- package/dist/cli/commands/enrich.d.ts +0 -11
- package/dist/cli/commands/enrich.js +0 -135
- package/dist/cli/commands/enrich.js.map +0 -1
- package/dist/cli/commands/graphrag.d.ts +0 -12
- package/dist/cli/commands/graphrag.js +0 -122
- package/dist/cli/commands/graphrag.js.map +0 -1
- package/dist/cli/commands/members.d.ts +0 -11
- package/dist/cli/commands/members.js +0 -230
- package/dist/cli/commands/members.js.map +0 -1
- package/dist/cli/commands/org.d.ts +0 -10
- package/dist/cli/commands/org.js +0 -132
- package/dist/cli/commands/org.js.map +0 -1
- package/dist/cli/commands/provision.d.ts +0 -8
- package/dist/cli/commands/provision.js +0 -116
- package/dist/cli/commands/provision.js.map +0 -1
- package/dist/cli/commands/resolve.d.ts +0 -8
- package/dist/cli/commands/resolve.js +0 -85
- package/dist/cli/commands/resolve.js.map +0 -1
- package/dist/cli/commands/review.d.ts +0 -19
- package/dist/cli/commands/review.js +0 -128
- package/dist/cli/commands/review.js.map +0 -1
- package/dist/cli/commands/source.d.ts +0 -16
- package/dist/cli/commands/source.js +0 -159
- package/dist/cli/commands/source.js.map +0 -1
- package/dist/cli/commands/sync-collection.d.ts +0 -14
- package/dist/cli/commands/sync-collection.js +0 -355
- package/dist/cli/commands/sync-collection.js.map +0 -1
- package/dist/cli/commands/sync-entities.d.ts +0 -13
- package/dist/cli/commands/sync-entities.js +0 -242
- package/dist/cli/commands/sync-entities.js.map +0 -1
- package/dist/cli/commands/team.d.ts +0 -12
- package/dist/cli/commands/team.js +0 -185
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/sync-review-interactive.d.ts +0 -31
- package/dist/cli/sync-review-interactive.js +0 -393
- package/dist/cli/sync-review-interactive.js.map +0 -1
- package/dist/core/migration-runner.d.ts +0 -42
- package/dist/core/migration-runner.js +0 -232
- package/dist/core/migration-runner.js.map +0 -1
- package/dist/core/migration-types.d.ts +0 -101
- package/dist/core/migration-types.js +0 -21
- package/dist/core/migration-types.js.map +0 -1
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
- package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
- package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
- package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
- package/dist/core/migrations/index.d.ts +0 -11
- package/dist/core/migrations/index.js +0 -23
- package/dist/core/migrations/index.js.map +0 -1
- package/dist/integrations/asana.d.ts +0 -26
- package/dist/integrations/asana.js +0 -78
- package/dist/integrations/asana.js.map +0 -1
- package/dist/integrations/figma-local.d.ts +0 -16
- package/dist/integrations/figma-local.js +0 -10
- package/dist/integrations/figma-local.js.map +0 -1
- package/dist/integrations/figma.d.ts +0 -17
- package/dist/integrations/figma.js +0 -17
- package/dist/integrations/figma.js.map +0 -1
- package/dist/integrations/granola.d.ts +0 -24
- package/dist/integrations/granola.js +0 -60
- package/dist/integrations/granola.js.map +0 -1
- package/dist/integrations/linear.d.ts +0 -14
- package/dist/integrations/linear.js +0 -80
- package/dist/integrations/linear.js.map +0 -1
- package/dist/integrations/paper-local.d.ts +0 -14
- package/dist/integrations/paper-local.js +0 -10
- package/dist/integrations/paper-local.js.map +0 -1
- package/dist/integrations/paper.d.ts +0 -2
- package/dist/integrations/paper.js +0 -10
- package/dist/integrations/paper.js.map +0 -1
- package/dist/integrations/pipedrive.d.ts +0 -26
- package/dist/integrations/pipedrive.js +0 -97
- package/dist/integrations/pipedrive.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -8
- package/dist/integrations/registry.js +0 -7
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -43
- package/dist/integrations/types.js +0 -5
- package/dist/integrations/types.js.map +0 -1
- package/dist/lib/lib/utils.d.ts +0 -2
- package/dist/lib/lib/utils.js +0 -6
- package/dist/lib/lib/utils.js.map +0 -1
- package/dist/mcp/connectors/asana.d.ts +0 -2
- package/dist/mcp/connectors/asana.js +0 -20
- package/dist/mcp/connectors/asana.js.map +0 -1
- package/dist/mcp/connectors/definitions.d.ts +0 -45
- package/dist/mcp/connectors/definitions.js +0 -32
- package/dist/mcp/connectors/definitions.js.map +0 -1
- package/dist/mcp/connectors/figma.d.ts +0 -5
- package/dist/mcp/connectors/figma.js +0 -21
- package/dist/mcp/connectors/figma.js.map +0 -1
- package/dist/mcp/connectors/gdrive.d.ts +0 -2
- package/dist/mcp/connectors/gdrive.js +0 -20
- package/dist/mcp/connectors/gdrive.js.map +0 -1
- package/dist/mcp/connectors/granola.d.ts +0 -2
- package/dist/mcp/connectors/granola.js +0 -12
- package/dist/mcp/connectors/granola.js.map +0 -1
- package/dist/mcp/connectors/linear.d.ts +0 -2
- package/dist/mcp/connectors/linear.js +0 -19
- package/dist/mcp/connectors/linear.js.map +0 -1
- package/dist/mcp/connectors/obsidian.d.ts +0 -2
- package/dist/mcp/connectors/obsidian.js +0 -19
- package/dist/mcp/connectors/obsidian.js.map +0 -1
- package/dist/mcp/connectors/pipedrive.d.ts +0 -2
- package/dist/mcp/connectors/pipedrive.js +0 -20
- package/dist/mcp/connectors/pipedrive.js.map +0 -1
- package/dist/mcp/connectors/slack.d.ts +0 -2
- package/dist/mcp/connectors/slack.js +0 -21
- package/dist/mcp/connectors/slack.js.map +0 -1
- package/dist/mcp/server-oauth-provider.d.ts +0 -56
- package/dist/mcp/server-oauth-provider.js +0 -142
- package/dist/mcp/server-oauth-provider.js.map +0 -1
- package/dist/server/agents/agent-loader.d.ts +0 -16
- package/dist/server/agents/agent-loader.js +0 -175
- package/dist/server/agents/agent-loader.js.map +0 -1
- package/dist/server/agents/agent-runner.d.ts +0 -33
- package/dist/server/agents/agent-runner.js +0 -187
- package/dist/server/agents/agent-runner.js.map +0 -1
- package/dist/server/agents/agent-runtime.d.ts +0 -39
- package/dist/server/agents/agent-runtime.js +0 -214
- package/dist/server/agents/agent-runtime.js.map +0 -1
- package/dist/server/agents/base-agent.d.ts +0 -30
- package/dist/server/agents/base-agent.js +0 -88
- package/dist/server/agents/base-agent.js.map +0 -1
- package/dist/server/agents/executive-digest.d.ts +0 -16
- package/dist/server/agents/executive-digest.js +0 -115
- package/dist/server/agents/executive-digest.js.map +0 -1
- package/dist/server/agents/graph-steward.d.ts +0 -16
- package/dist/server/agents/graph-steward.js +0 -59
- package/dist/server/agents/graph-steward.js.map +0 -1
- package/dist/server/agents/meeting-followup.d.ts +0 -16
- package/dist/server/agents/meeting-followup.js +0 -88
- package/dist/server/agents/meeting-followup.js.map +0 -1
- package/dist/server/agents/pipeline-monitor.d.ts +0 -15
- package/dist/server/agents/pipeline-monitor.js +0 -86
- package/dist/server/agents/pipeline-monitor.js.map +0 -1
- package/dist/server/agents/types.d.ts +0 -81
- package/dist/server/agents/types.js +0 -41
- package/dist/server/agents/types.js.map +0 -1
- package/dist/server/chrome/chrome.css +0 -691
- package/dist/server/chrome/chrome.js +0 -374
- package/dist/server/collab-authority.d.ts +0 -70
- package/dist/server/collab-authority.js +0 -218
- package/dist/server/collab-authority.js.map +0 -1
- package/dist/server/collab.d.ts +0 -29
- package/dist/server/collab.js +0 -195
- package/dist/server/collab.js.map +0 -1
- package/dist/server/commit-scheduler.d.ts +0 -39
- package/dist/server/commit-scheduler.js +0 -113
- package/dist/server/commit-scheduler.js.map +0 -1
- package/dist/server/plugin-loader.d.ts +0 -53
- package/dist/server/plugin-loader.js +0 -155
- package/dist/server/plugin-loader.js.map +0 -1
- package/dist/server/routes/agents-api.d.ts +0 -10
- package/dist/server/routes/agents-api.js +0 -25
- package/dist/server/routes/agents-api.js.map +0 -1
- package/dist/server/routes/collab.d.ts +0 -6
- package/dist/server/routes/collab.js +0 -10
- package/dist/server/routes/collab.js.map +0 -1
- package/dist/server/routes/git-api.d.ts +0 -9
- package/dist/server/routes/git-api.js +0 -82
- package/dist/server/routes/git-api.js.map +0 -1
- package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
- package/dist/server/routes/meeting-ingest-api.js +0 -98
- package/dist/server/routes/meeting-ingest-api.js.map +0 -1
- package/dist/server/routes/sync-api.d.ts +0 -26
- package/dist/server/routes/sync-api.js +0 -848
- package/dist/server/routes/sync-api.js.map +0 -1
- package/dist/server/routes/webhook.d.ts +0 -14
- package/dist/server/routes/webhook.js +0 -102
- package/dist/server/routes/webhook.js.map +0 -1
- package/dist/services/batch-processor.d.ts +0 -49
- package/dist/services/batch-processor.js +0 -166
- package/dist/services/batch-processor.js.map +0 -1
- package/dist/services/csv-service.d.ts +0 -36
- package/dist/services/csv-service.js +0 -143
- package/dist/services/csv-service.js.map +0 -1
- package/dist/services/github-provisioner.d.ts +0 -36
- package/dist/services/github-provisioner.js +0 -126
- package/dist/services/github-provisioner.js.map +0 -1
- package/dist/services/github-service.d.ts +0 -99
- package/dist/services/github-service.js +0 -310
- package/dist/services/github-service.js.map +0 -1
- package/dist/services/image-import-service.d.ts +0 -24
- package/dist/services/image-import-service.js +0 -108
- package/dist/services/image-import-service.js.map +0 -1
- package/dist/services/insights.d.ts +0 -38
- package/dist/services/insights.js +0 -269
- package/dist/services/insights.js.map +0 -1
- package/dist/services/meeting-processor.d.ts +0 -91
- package/dist/services/meeting-processor.js +0 -331
- package/dist/services/meeting-processor.js.map +0 -1
- package/dist/services/sync/collection-sync.d.ts +0 -60
- package/dist/services/sync/collection-sync.js +0 -509
- package/dist/services/sync/collection-sync.js.map +0 -1
- package/dist/services/sync/commit.d.ts +0 -60
- package/dist/services/sync/commit.js +0 -354
- package/dist/services/sync/commit.js.map +0 -1
- package/dist/services/sync/context-index.d.ts +0 -69
- package/dist/services/sync/context-index.js +0 -280
- package/dist/services/sync/context-index.js.map +0 -1
- package/dist/services/sync/data-fetcher.d.ts +0 -31
- package/dist/services/sync/data-fetcher.js +0 -12
- package/dist/services/sync/data-fetcher.js.map +0 -1
- package/dist/services/sync/derive.d.ts +0 -34
- package/dist/services/sync/derive.js +0 -164
- package/dist/services/sync/derive.js.map +0 -1
- package/dist/services/sync/enrichment-state.d.ts +0 -31
- package/dist/services/sync/enrichment-state.js +0 -63
- package/dist/services/sync/enrichment-state.js.map +0 -1
- package/dist/services/sync/enrichment.d.ts +0 -25
- package/dist/services/sync/enrichment.js +0 -121
- package/dist/services/sync/enrichment.js.map +0 -1
- package/dist/services/sync/entity-refresh.d.ts +0 -30
- package/dist/services/sync/entity-refresh.js +0 -275
- package/dist/services/sync/entity-refresh.js.map +0 -1
- package/dist/services/sync/frontmatter-extractor.d.ts +0 -40
- package/dist/services/sync/frontmatter-extractor.js +0 -279
- package/dist/services/sync/frontmatter-extractor.js.map +0 -1
- package/dist/services/sync/graph-match-state.d.ts +0 -33
- package/dist/services/sync/graph-match-state.js +0 -61
- package/dist/services/sync/graph-match-state.js.map +0 -1
- package/dist/services/sync/graph-match.d.ts +0 -53
- package/dist/services/sync/graph-match.js +0 -316
- package/dist/services/sync/graph-match.js.map +0 -1
- package/dist/services/sync/graphrag-client.d.ts +0 -43
- package/dist/services/sync/graphrag-client.js +0 -94
- package/dist/services/sync/graphrag-client.js.map +0 -1
- package/dist/services/sync/graphrag-config.d.ts +0 -16
- package/dist/services/sync/graphrag-config.js +0 -39
- package/dist/services/sync/graphrag-config.js.map +0 -1
- package/dist/services/sync/graphrag-context.d.ts +0 -14
- package/dist/services/sync/graphrag-context.js +0 -109
- package/dist/services/sync/graphrag-context.js.map +0 -1
- package/dist/services/sync/graphrag-indexer.d.ts +0 -30
- package/dist/services/sync/graphrag-indexer.js +0 -358
- package/dist/services/sync/graphrag-indexer.js.map +0 -1
- package/dist/services/sync/llm.d.ts +0 -32
- package/dist/services/sync/llm.js +0 -115
- package/dist/services/sync/llm.js.map +0 -1
- package/dist/services/sync/mcp-client.d.ts +0 -71
- package/dist/services/sync/mcp-client.js +0 -299
- package/dist/services/sync/mcp-client.js.map +0 -1
- package/dist/services/sync/model-factory.d.ts +0 -13
- package/dist/services/sync/model-factory.js +0 -38
- package/dist/services/sync/model-factory.js.map +0 -1
- package/dist/services/sync/name-quality.d.ts +0 -31
- package/dist/services/sync/name-quality.js +0 -60
- package/dist/services/sync/name-quality.js.map +0 -1
- package/dist/services/sync/output-schemas.d.ts +0 -92
- package/dist/services/sync/output-schemas.js +0 -43
- package/dist/services/sync/output-schemas.js.map +0 -1
- package/dist/services/sync/prompts.d.ts +0 -19
- package/dist/services/sync/prompts.js +0 -128
- package/dist/services/sync/prompts.js.map +0 -1
- package/dist/services/sync/reconciler.d.ts +0 -48
- package/dist/services/sync/reconciler.js +0 -294
- package/dist/services/sync/reconciler.js.map +0 -1
- package/dist/services/sync/rest-client.d.ts +0 -40
- package/dist/services/sync/rest-client.js +0 -100
- package/dist/services/sync/rest-client.js.map +0 -1
- package/dist/services/sync/source-config.d.ts +0 -67
- package/dist/services/sync/source-config.js +0 -304
- package/dist/services/sync/source-config.js.map +0 -1
- package/dist/services/sync/source-definitions/asana.d.ts +0 -14
- package/dist/services/sync/source-definitions/asana.js +0 -42
- package/dist/services/sync/source-definitions/asana.js.map +0 -1
- package/dist/services/sync/source-definitions/definitions.d.ts +0 -8
- package/dist/services/sync/source-definitions/definitions.js +0 -8
- package/dist/services/sync/source-definitions/definitions.js.map +0 -1
- package/dist/services/sync/source-definitions/gdrive.d.ts +0 -16
- package/dist/services/sync/source-definitions/gdrive.js +0 -68
- package/dist/services/sync/source-definitions/gdrive.js.map +0 -1
- package/dist/services/sync/source-definitions/granola.d.ts +0 -2
- package/dist/services/sync/source-definitions/granola.js +0 -21
- package/dist/services/sync/source-definitions/granola.js.map +0 -1
- package/dist/services/sync/source-definitions/linear.d.ts +0 -2
- package/dist/services/sync/source-definitions/linear.js +0 -62
- package/dist/services/sync/source-definitions/linear.js.map +0 -1
- package/dist/services/sync/source-definitions/obsidian.d.ts +0 -2
- package/dist/services/sync/source-definitions/obsidian.js +0 -55
- package/dist/services/sync/source-definitions/obsidian.js.map +0 -1
- package/dist/services/sync/source-definitions/pipedrive.d.ts +0 -2
- package/dist/services/sync/source-definitions/pipedrive.js +0 -43
- package/dist/services/sync/source-definitions/pipedrive.js.map +0 -1
- package/dist/services/sync/staging.d.ts +0 -53
- package/dist/services/sync/staging.js +0 -130
- package/dist/services/sync/staging.js.map +0 -1
- package/dist/services/sync/structured-extractor.d.ts +0 -57
- package/dist/services/sync/structured-extractor.js +0 -584
- package/dist/services/sync/structured-extractor.js.map +0 -1
- package/dist/services/sync/sync-runner.d.ts +0 -32
- package/dist/services/sync/sync-runner.js +0 -195
- package/dist/services/sync/sync-runner.js.map +0 -1
- package/dist/services/sync/sync-state.d.ts +0 -43
- package/dist/services/sync/sync-state.js +0 -154
- package/dist/services/sync/sync-state.js.map +0 -1
- package/dist/services/sync/types.d.ts +0 -381
- package/dist/services/sync/types.js +0 -8
- package/dist/services/sync/types.js.map +0 -1
- package/dist/services/sync/unstructured-extractor.d.ts +0 -27
- package/dist/services/sync/unstructured-extractor.js +0 -185
- package/dist/services/sync/unstructured-extractor.js.map +0 -1
- package/dist/utils/merge-resolver.d.ts +0 -59
- package/dist/utils/merge-resolver.js +0 -303
- package/dist/utils/merge-resolver.js.map +0 -1
- package/dist/utils/workspace-config.d.ts +0 -8
- package/dist/utils/workspace-config.js +0 -22
- package/dist/utils/workspace-config.js.map +0 -1
- package/dist/web/_app/immutable/assets/0.QUqBcyuu.css +0 -1
- package/dist/web/_app/immutable/assets/11.2jzI3cZY.css +0 -1
- package/dist/web/_app/immutable/assets/12.CT4xL4K3.css +0 -1
- package/dist/web/_app/immutable/assets/13.BUrHkYry.css +0 -1
- package/dist/web/_app/immutable/assets/2.5jNm7Pm1.css +0 -1
- package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
- package/dist/web/_app/immutable/assets/4.BjPwtpNd.css +0 -1
- package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
- package/dist/web/_app/immutable/assets/6.DXZr_rI_.css +0 -1
- package/dist/web/_app/immutable/assets/GraphView.D9ePpZez.css +0 -1
- package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
- package/dist/web/_app/immutable/assets/ViewToolbar.CZjsdjy4.css +0 -1
- package/dist/web/_app/immutable/assets/WorkspaceView.B-1DbivC.css +0 -1
- package/dist/web/_app/immutable/assets/wikilinks.CtSydmQl.css +0 -1
- package/dist/web/_app/immutable/chunks/3--t-YNA.js +0 -1
- package/dist/web/_app/immutable/chunks/5OU-4caN.js +0 -1
- package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
- package/dist/web/_app/immutable/chunks/B6FUcAv5.js +0 -1
- package/dist/web/_app/immutable/chunks/B9gDgSlp.js +0 -1
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
- package/dist/web/_app/immutable/chunks/BFtIWl5z.js +0 -1
- package/dist/web/_app/immutable/chunks/BHKpz6_7.js +0 -1
- package/dist/web/_app/immutable/chunks/BNfrhBeA.js +0 -1
- package/dist/web/_app/immutable/chunks/BgO5HlCg.js +0 -2
- package/dist/web/_app/immutable/chunks/BqnODQDb.js +0 -1
- package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
- package/dist/web/_app/immutable/chunks/BvIFhEn7.js +0 -2
- package/dist/web/_app/immutable/chunks/BvfdTHv8.js +0 -1
- package/dist/web/_app/immutable/chunks/BxGm65PH.js +0 -1
- package/dist/web/_app/immutable/chunks/BxyxnEKw.js +0 -1
- package/dist/web/_app/immutable/chunks/BygFIGq4.js +0 -1
- package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
- package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
- package/dist/web/_app/immutable/chunks/CIb_hHMy.js +0 -1
- package/dist/web/_app/immutable/chunks/CNKK6nZb.js +0 -1
- package/dist/web/_app/immutable/chunks/CQ5FjHZK.js +0 -1
- package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
- package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
- package/dist/web/_app/immutable/chunks/CaEaeeKb.js +0 -1
- package/dist/web/_app/immutable/chunks/Ch6e_wpP.js +0 -1
- package/dist/web/_app/immutable/chunks/Ci4zzCVB.js +0 -2
- package/dist/web/_app/immutable/chunks/CknqBVQE.js +0 -1
- package/dist/web/_app/immutable/chunks/Cmfiirqp.js +0 -4
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
- package/dist/web/_app/immutable/chunks/CrFpCC6p.js +0 -1
- package/dist/web/_app/immutable/chunks/CxX8hcT6.js +0 -1
- package/dist/web/_app/immutable/chunks/D0T1ps1G.js +0 -1
- package/dist/web/_app/immutable/chunks/D2ZEj9xD.js +0 -1
- package/dist/web/_app/immutable/chunks/D3sy0IkA.js +0 -2
- package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
- package/dist/web/_app/immutable/chunks/DHWoAC4y.js +0 -1
- package/dist/web/_app/immutable/chunks/DYYBfXU3.js +0 -1
- package/dist/web/_app/immutable/chunks/DiNPRA8T.js +0 -1
- package/dist/web/_app/immutable/chunks/DkjsqHkM.js +0 -1
- package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
- package/dist/web/_app/immutable/chunks/DpMCynC3.js +0 -1
- package/dist/web/_app/immutable/chunks/DqrybUuA.js +0 -1
- package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
- package/dist/web/_app/immutable/chunks/O9MAeAgV.js +0 -5
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
- package/dist/web/_app/immutable/chunks/SKSQ4m85.js +0 -2
- package/dist/web/_app/immutable/chunks/WEBTyD-H.js +0 -1
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
- package/dist/web/_app/immutable/chunks/bBXT5iJP.js +0 -1
- package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
- package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
- package/dist/web/_app/immutable/chunks/xkNhbnff.js +0 -1
- package/dist/web/_app/immutable/chunks/zoVX1Zab.js +0 -1
- package/dist/web/_app/immutable/entry/app.GfE4z2GO.js +0 -2
- package/dist/web/_app/immutable/entry/start.H-LFJK9u.js +0 -1
- package/dist/web/_app/immutable/nodes/0.Bwi7tTNC.js +0 -2
- package/dist/web/_app/immutable/nodes/1.DgNJPEWk.js +0 -1
- package/dist/web/_app/immutable/nodes/10.BW_XCD2O.js +0 -1
- package/dist/web/_app/immutable/nodes/11.DM7RX3Ms.js +0 -1
- package/dist/web/_app/immutable/nodes/12.DKgssZo8.js +0 -1
- package/dist/web/_app/immutable/nodes/13.DCdmTre-.js +0 -1
- package/dist/web/_app/immutable/nodes/2.DOA5QBVG.js +0 -266
- package/dist/web/_app/immutable/nodes/3.bpoHQwAI.js +0 -5
- package/dist/web/_app/immutable/nodes/4.ye0Vy7A1.js +0 -11
- package/dist/web/_app/immutable/nodes/5.rxpnYrx_.js +0 -4
- package/dist/web/_app/immutable/nodes/6.DP8HSxtc.js +0 -1
- package/dist/web/_app/immutable/nodes/7.C1h4Bf-E.js +0 -1
- package/dist/web/_app/immutable/nodes/8.BzmQ7S7Y.js +0 -1
- package/dist/web/_app/immutable/nodes/9.CEakpXpF.js +0 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual-write helpers — Phase 5 of the secrets refactor.
|
|
3
|
+
*
|
|
4
|
+
* Every legacy writer of a configuration file (user.json, workspace.json,
|
|
5
|
+
* connectors/*.json) also mirrors the registry-mapped fields into the
|
|
6
|
+
* encrypted store. The legacy file remains authoritative through Phase 5;
|
|
7
|
+
* Phase 6 flipped the read path so the store is the source of truth at
|
|
8
|
+
* read time.
|
|
9
|
+
*
|
|
10
|
+
* Failure modes are deliberately non-fatal: a dropped dual-write must
|
|
11
|
+
* never block the legacy write, because the file is still the source of
|
|
12
|
+
* truth. Failures route to `console.warn` for now — Phase 11 swaps in the
|
|
13
|
+
* sanitizing log wrapper.
|
|
14
|
+
*
|
|
15
|
+
* Idempotency is provided by the store itself: writes use INSERT … ON
|
|
16
|
+
* CONFLICT DO UPDATE, so writing the same key twice yields a single row
|
|
17
|
+
* whose `updated_at` advances.
|
|
18
|
+
*
|
|
19
|
+
* `looksLikeEnvPlaceholder()` filters `$ENV_VAR` strings out — connector
|
|
20
|
+
* configs use those as placeholders, and the literal `$FOO_AUTH` is not
|
|
21
|
+
* actually a credential value worth mirroring into the store.
|
|
22
|
+
*
|
|
23
|
+
* After the scope-collapse refactor, the store is single-tier (the
|
|
24
|
+
* process IS the workspace), so the mirror helpers no longer thread a
|
|
25
|
+
* scope or scopeId — every write lands in the single secrets.db.
|
|
26
|
+
*/
|
|
27
|
+
import type { ActorContext } from './SecretStore.js';
|
|
28
|
+
/**
|
|
29
|
+
* Returns true when the store singleton was successfully initialized at
|
|
30
|
+
* boot. Every dual-write entry point guards on this before touching the
|
|
31
|
+
* store. Historically gated on the `STUDIOGRAPH_NEW_STORE` env flag too;
|
|
32
|
+
* the flag was removed once Phase 6 stabilized in production.
|
|
33
|
+
*/
|
|
34
|
+
export declare function dualWriteEnabled(): boolean;
|
|
35
|
+
interface MirrorContext {
|
|
36
|
+
actor: ActorContext;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Dual-write `user.json` fields into the encrypted store. The mapping
|
|
40
|
+
* from user.json path → registry key is inlined below; Phase 12b
|
|
41
|
+
* (2026-05-12) dropped the registry's `migrationSource` annotation
|
|
42
|
+
* that used to drive this iteration, since it was the annotation's
|
|
43
|
+
* sole remaining consumer (the importer was removed in Phase 12a).
|
|
44
|
+
*
|
|
45
|
+
* The actor is `{ type: 'system', systemId: 'dual-write' }` because the
|
|
46
|
+
* caller is a file writer, not a user action; UI-driven changes that
|
|
47
|
+
* route through the Phase 7 APIs supply a real user actor.
|
|
48
|
+
*/
|
|
49
|
+
export declare function mirrorUserConfig(config: unknown, ctx?: MirrorContext): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Dual-write a connector config. Iterates the connector-secret registry
|
|
52
|
+
* entries and resolves their paths under the specific connector's config
|
|
53
|
+
* (e.g., `headers.Authorization` → `connector.<name>.auth`).
|
|
54
|
+
*
|
|
55
|
+
* The registry uses pattern names like `connector.<name>.auth`; we expand
|
|
56
|
+
* to a concrete key per connector at write time. `<name>` is the connector
|
|
57
|
+
* name verbatim, lowercased for stability — connector names are already
|
|
58
|
+
* url-safe slugs per `parseConfigBlock`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function mirrorConnectorConfig(config: {
|
|
61
|
+
name: string;
|
|
62
|
+
headers?: Record<string, string>;
|
|
63
|
+
oauth?: {
|
|
64
|
+
client_secret?: string;
|
|
65
|
+
};
|
|
66
|
+
} & Record<string, unknown>, ctx?: MirrorContext): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Dual-write workspace.json secret-bearing fields (R2 credentials are
|
|
69
|
+
* the only ones today). Non-secret fields (e.g. r2.endpoint, r2.bucket)
|
|
70
|
+
* are NOT mirrored from workspace.json because the file remains
|
|
71
|
+
* authoritative until Phase 6 read-flip; mirroring them would create
|
|
72
|
+
* drift if a user hand-edits the file. Only the secret slots — which
|
|
73
|
+
* the Phase 6 resolver MUST read from the store — round-trip here.
|
|
74
|
+
*/
|
|
75
|
+
export declare function mirrorWorkspaceConfig(config: unknown, ctx?: MirrorContext): Promise<void>;
|
|
76
|
+
export {};
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual-write helpers — Phase 5 of the secrets refactor.
|
|
3
|
+
*
|
|
4
|
+
* Every legacy writer of a configuration file (user.json, workspace.json,
|
|
5
|
+
* connectors/*.json) also mirrors the registry-mapped fields into the
|
|
6
|
+
* encrypted store. The legacy file remains authoritative through Phase 5;
|
|
7
|
+
* Phase 6 flipped the read path so the store is the source of truth at
|
|
8
|
+
* read time.
|
|
9
|
+
*
|
|
10
|
+
* Failure modes are deliberately non-fatal: a dropped dual-write must
|
|
11
|
+
* never block the legacy write, because the file is still the source of
|
|
12
|
+
* truth. Failures route to `console.warn` for now — Phase 11 swaps in the
|
|
13
|
+
* sanitizing log wrapper.
|
|
14
|
+
*
|
|
15
|
+
* Idempotency is provided by the store itself: writes use INSERT … ON
|
|
16
|
+
* CONFLICT DO UPDATE, so writing the same key twice yields a single row
|
|
17
|
+
* whose `updated_at` advances.
|
|
18
|
+
*
|
|
19
|
+
* `looksLikeEnvPlaceholder()` filters `$ENV_VAR` strings out — connector
|
|
20
|
+
* configs use those as placeholders, and the literal `$FOO_AUTH` is not
|
|
21
|
+
* actually a credential value worth mirroring into the store.
|
|
22
|
+
*
|
|
23
|
+
* After the scope-collapse refactor, the store is single-tier (the
|
|
24
|
+
* process IS the workspace), so the mirror helpers no longer thread a
|
|
25
|
+
* scope or scopeId — every write lands in the single secrets.db.
|
|
26
|
+
*/
|
|
27
|
+
import { getKeyDef } from './registry.js';
|
|
28
|
+
import { getSecretStore, hasSecretStore } from './index.js';
|
|
29
|
+
/**
|
|
30
|
+
* Returns true when the store singleton was successfully initialized at
|
|
31
|
+
* boot. Every dual-write entry point guards on this before touching the
|
|
32
|
+
* store. Historically gated on the `STUDIOGRAPH_NEW_STORE` env flag too;
|
|
33
|
+
* the flag was removed once Phase 6 stabilized in production.
|
|
34
|
+
*/
|
|
35
|
+
export function dualWriteEnabled() {
|
|
36
|
+
return hasSecretStore();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* `$ENV_VAR` placeholder values are written into connector configs as the
|
|
40
|
+
* sanitized form of a real secret. Mirroring them into the encrypted store
|
|
41
|
+
* would be pointless and would shadow whatever the env variable actually
|
|
42
|
+
* resolves to. Skip them.
|
|
43
|
+
*/
|
|
44
|
+
function looksLikeEnvPlaceholder(s) {
|
|
45
|
+
return typeof s === 'string' && /^\$[A-Z_][A-Z0-9_]*$/.test(s);
|
|
46
|
+
}
|
|
47
|
+
function isNonEmptyString(v) {
|
|
48
|
+
return typeof v === 'string' && v.length > 0;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Pull a nested value out of a plain object using a dot-separated path.
|
|
52
|
+
* Returns undefined for any missing intermediate.
|
|
53
|
+
*/
|
|
54
|
+
function readPath(obj, path) {
|
|
55
|
+
if (!obj || typeof obj !== 'object')
|
|
56
|
+
return undefined;
|
|
57
|
+
const parts = path.split('.');
|
|
58
|
+
let cur = obj;
|
|
59
|
+
for (const p of parts) {
|
|
60
|
+
if (cur == null || typeof cur !== 'object')
|
|
61
|
+
return undefined;
|
|
62
|
+
cur = cur[p];
|
|
63
|
+
}
|
|
64
|
+
return cur;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Whether a registry entry lives in the workspace secrets.db at all
|
|
68
|
+
* (vs bootstrap or user-* which live elsewhere).
|
|
69
|
+
*/
|
|
70
|
+
function isStoreManaged(c) {
|
|
71
|
+
return c === 'workspace-secret' || c === 'workspace-setting';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Best-effort wrapper that swallows store errors. Logs to stderr so a
|
|
75
|
+
* lost mirror is visible without bringing the legacy write down with it.
|
|
76
|
+
*/
|
|
77
|
+
async function safeMirror(label, fn) {
|
|
78
|
+
try {
|
|
79
|
+
await fn();
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
83
|
+
// eslint-disable-next-line no-console
|
|
84
|
+
console.warn(`[secrets] dual-write ${label} failed: ${msg}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const DEFAULT_ACTOR = { type: 'system', systemId: 'dual-write' };
|
|
88
|
+
/**
|
|
89
|
+
* Mirror a single value into the store under a canonical registry key.
|
|
90
|
+
* Routes to the secret or settings table based on classification. Empty
|
|
91
|
+
* strings and undefined skip the write entirely — callers that want to
|
|
92
|
+
* clear a value should call the delete API explicitly. `$ENV_VAR`
|
|
93
|
+
* placeholders are skipped too (see module comment).
|
|
94
|
+
*/
|
|
95
|
+
async function mirrorOne(def, value, ctx) {
|
|
96
|
+
if (value === undefined || value === null || value === '')
|
|
97
|
+
return;
|
|
98
|
+
if (looksLikeEnvPlaceholder(value))
|
|
99
|
+
return;
|
|
100
|
+
if (!isStoreManaged(def.classification))
|
|
101
|
+
return; // bootstrap or user-* — not the store's job.
|
|
102
|
+
const store = getSecretStore();
|
|
103
|
+
const isSecret = def.classification.endsWith('-secret');
|
|
104
|
+
if (isSecret) {
|
|
105
|
+
if (!isNonEmptyString(value))
|
|
106
|
+
return;
|
|
107
|
+
await store.set({ key: def.name, value }, ctx.actor);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Setting: any JSON-serializable value goes through.
|
|
111
|
+
await store.set({ key: def.name, value }, ctx.actor);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Dual-write `user.json` fields into the encrypted store. The mapping
|
|
115
|
+
* from user.json path → registry key is inlined below; Phase 12b
|
|
116
|
+
* (2026-05-12) dropped the registry's `migrationSource` annotation
|
|
117
|
+
* that used to drive this iteration, since it was the annotation's
|
|
118
|
+
* sole remaining consumer (the importer was removed in Phase 12a).
|
|
119
|
+
*
|
|
120
|
+
* The actor is `{ type: 'system', systemId: 'dual-write' }` because the
|
|
121
|
+
* caller is a file writer, not a user action; UI-driven changes that
|
|
122
|
+
* route through the Phase 7 APIs supply a real user actor.
|
|
123
|
+
*/
|
|
124
|
+
export async function mirrorUserConfig(config, ctx = { actor: DEFAULT_ACTOR }) {
|
|
125
|
+
if (!dualWriteEnabled())
|
|
126
|
+
return;
|
|
127
|
+
await safeMirror('user.json', async () => {
|
|
128
|
+
const mappings = [
|
|
129
|
+
{ key: 'railway.token', path: 'railway_token' },
|
|
130
|
+
{ key: 'model.provider', path: 'model_provider' },
|
|
131
|
+
{ key: 'model.id', path: 'model_id' },
|
|
132
|
+
{ key: 'voyage.api_key', path: 'voyage_api_key' },
|
|
133
|
+
{ key: 'r2.access_key_id', path: 'r2.access_key_id' },
|
|
134
|
+
{ key: 'r2.secret_access_key', path: 'r2.secret_access_key' },
|
|
135
|
+
];
|
|
136
|
+
for (const m of mappings) {
|
|
137
|
+
const def = getKeyDef(m.key);
|
|
138
|
+
if (!def)
|
|
139
|
+
continue;
|
|
140
|
+
const value = readPath(config, m.path);
|
|
141
|
+
await mirrorOne(def, value, ctx);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Dual-write a connector config. Iterates the connector-secret registry
|
|
147
|
+
* entries and resolves their paths under the specific connector's config
|
|
148
|
+
* (e.g., `headers.Authorization` → `connector.<name>.auth`).
|
|
149
|
+
*
|
|
150
|
+
* The registry uses pattern names like `connector.<name>.auth`; we expand
|
|
151
|
+
* to a concrete key per connector at write time. `<name>` is the connector
|
|
152
|
+
* name verbatim, lowercased for stability — connector names are already
|
|
153
|
+
* url-safe slugs per `parseConfigBlock`.
|
|
154
|
+
*/
|
|
155
|
+
export async function mirrorConnectorConfig(config, ctx = { actor: DEFAULT_ACTOR }) {
|
|
156
|
+
if (!dualWriteEnabled())
|
|
157
|
+
return;
|
|
158
|
+
if (!config?.name)
|
|
159
|
+
return;
|
|
160
|
+
const connector = String(config.name).toLowerCase();
|
|
161
|
+
await safeMirror(`connector ${connector}`, async () => {
|
|
162
|
+
const store = getSecretStore();
|
|
163
|
+
// Authorization header → connector.<name>.auth
|
|
164
|
+
const auth = config.headers?.['Authorization'] ?? config.headers?.['authorization'];
|
|
165
|
+
if (isNonEmptyString(auth) && !looksLikeEnvPlaceholder(auth)) {
|
|
166
|
+
await store.set({
|
|
167
|
+
key: `connector.${connector}.auth`,
|
|
168
|
+
value: auth,
|
|
169
|
+
provider: connector,
|
|
170
|
+
}, ctx.actor);
|
|
171
|
+
}
|
|
172
|
+
// OAuth client secret → connector.<name>.oauth_secret
|
|
173
|
+
const oauthSecret = config.oauth?.client_secret;
|
|
174
|
+
if (isNonEmptyString(oauthSecret) && !looksLikeEnvPlaceholder(oauthSecret)) {
|
|
175
|
+
await store.set({
|
|
176
|
+
key: `connector.${connector}.oauth_secret`,
|
|
177
|
+
value: oauthSecret,
|
|
178
|
+
provider: connector,
|
|
179
|
+
}, ctx.actor);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Dual-write workspace.json secret-bearing fields (R2 credentials are
|
|
185
|
+
* the only ones today). Non-secret fields (e.g. r2.endpoint, r2.bucket)
|
|
186
|
+
* are NOT mirrored from workspace.json because the file remains
|
|
187
|
+
* authoritative until Phase 6 read-flip; mirroring them would create
|
|
188
|
+
* drift if a user hand-edits the file. Only the secret slots — which
|
|
189
|
+
* the Phase 6 resolver MUST read from the store — round-trip here.
|
|
190
|
+
*/
|
|
191
|
+
export async function mirrorWorkspaceConfig(config, ctx = { actor: DEFAULT_ACTOR }) {
|
|
192
|
+
if (!dualWriteEnabled())
|
|
193
|
+
return;
|
|
194
|
+
await safeMirror('workspace.json', async () => {
|
|
195
|
+
// workspace.json has its own nesting (`r2_config.access_key_id`) that
|
|
196
|
+
// doesn't match the registry's flat paths. Translate explicitly.
|
|
197
|
+
const accessKey = readPath(config, 'r2_config.access_key_id');
|
|
198
|
+
const secretKey = readPath(config, 'r2_config.secret_access_key');
|
|
199
|
+
const accessDef = getKeyDef('r2.access_key_id');
|
|
200
|
+
const secretDef = getKeyDef('r2.secret_access_key');
|
|
201
|
+
if (accessDef && isNonEmptyString(accessKey)) {
|
|
202
|
+
await mirrorOne(accessDef, accessKey, ctx);
|
|
203
|
+
}
|
|
204
|
+
if (secretDef && isNonEmptyString(secretKey)) {
|
|
205
|
+
await mirrorOne(secretDef, secretKey, ctx);
|
|
206
|
+
}
|
|
207
|
+
// Non-secret search settings live in workspace.json today (provider,
|
|
208
|
+
// api_key, google_cx). Per plan §3 the search api_key is
|
|
209
|
+
// secret-class; mirror it when present and non-placeholder.
|
|
210
|
+
const searchApiKey = readPath(config, 'search.api_key');
|
|
211
|
+
const searchProvider = readPath(config, 'search.provider');
|
|
212
|
+
if (isNonEmptyString(searchApiKey) && !looksLikeEnvPlaceholder(searchApiKey)) {
|
|
213
|
+
const key = searchProviderKey(typeof searchProvider === 'string' ? searchProvider : undefined);
|
|
214
|
+
if (key) {
|
|
215
|
+
const def = getKeyDef(key);
|
|
216
|
+
if (def)
|
|
217
|
+
await mirrorOne(def, searchApiKey, ctx);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const googleCx = readPath(config, 'search.google_cx');
|
|
221
|
+
if (isNonEmptyString(googleCx)) {
|
|
222
|
+
const def = getKeyDef('search.google.cx');
|
|
223
|
+
if (def)
|
|
224
|
+
await mirrorOne(def, googleCx, ctx);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function searchProviderKey(provider) {
|
|
229
|
+
switch (provider) {
|
|
230
|
+
case 'brave': return 'search.brave.api_key';
|
|
231
|
+
case 'google': return 'search.google.api_key';
|
|
232
|
+
case 'tavily': return 'search.tavily.api_key';
|
|
233
|
+
default: return undefined;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=dual-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dual-write.js","sourceRoot":"","sources":["../../../src/core/secrets/dual-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XChaCha20-Poly1305 AEAD with row-bound AAD.
|
|
3
|
+
*
|
|
4
|
+
* Every encrypted row binds (scope, scopeId, key, keyVersion) into the AAD.
|
|
5
|
+
* Swapping a row from one slot to another (e.g. via `UPDATE secrets SET key=...`)
|
|
6
|
+
* invalidates the AAD and triggers an AEAD failure on decrypt — making
|
|
7
|
+
* row-substitution attacks observable.
|
|
8
|
+
*
|
|
9
|
+
* Wire format (base64-encoded): `nonce[24] || ciphertext || tag[16]`.
|
|
10
|
+
* The nonce is randomly generated per encrypt; XChaCha20's 192-bit nonce
|
|
11
|
+
* makes random selection collision-safe across realistic key lifetimes.
|
|
12
|
+
*/
|
|
13
|
+
export interface AADInput {
|
|
14
|
+
scope: string;
|
|
15
|
+
scopeId: string;
|
|
16
|
+
key: string;
|
|
17
|
+
keyVersion: string;
|
|
18
|
+
}
|
|
19
|
+
export interface EncryptedRow {
|
|
20
|
+
ciphertext: string;
|
|
21
|
+
keyVersion: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Encrypt `plaintext` under `masterKey` with AAD bound to `ctx`.
|
|
25
|
+
* Returns base64(nonce || ciphertext || tag) and the keyVersion that was
|
|
26
|
+
* baked into the AAD. Caller is responsible for storing both.
|
|
27
|
+
*/
|
|
28
|
+
export declare function encrypt(masterKey: Uint8Array, plaintext: string, ctx: AADInput): EncryptedRow;
|
|
29
|
+
/**
|
|
30
|
+
* Decrypt a row. Throws on:
|
|
31
|
+
* - AAD mismatch (row moved between slots; key/scope/version doesn't match)
|
|
32
|
+
* - tag failure (ciphertext or nonce tampered)
|
|
33
|
+
* - wrong master key
|
|
34
|
+
* - malformed wire format (truncated, bad base64)
|
|
35
|
+
*
|
|
36
|
+
* The thrown error MUST NOT carry the ciphertext or any partial plaintext.
|
|
37
|
+
*/
|
|
38
|
+
export declare function decrypt(masterKey: Uint8Array, row: EncryptedRow, ctx: AADInput): string;
|
|
39
|
+
/**
|
|
40
|
+
* Generate a fresh master key suitable for `encrypt()`. 32 random bytes.
|
|
41
|
+
* Caller is responsible for base64-encoding for env-var transport and
|
|
42
|
+
* persistence (see master-key.ts).
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateMasterKey(): Uint8Array;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XChaCha20-Poly1305 AEAD with row-bound AAD.
|
|
3
|
+
*
|
|
4
|
+
* Every encrypted row binds (scope, scopeId, key, keyVersion) into the AAD.
|
|
5
|
+
* Swapping a row from one slot to another (e.g. via `UPDATE secrets SET key=...`)
|
|
6
|
+
* invalidates the AAD and triggers an AEAD failure on decrypt — making
|
|
7
|
+
* row-substitution attacks observable.
|
|
8
|
+
*
|
|
9
|
+
* Wire format (base64-encoded): `nonce[24] || ciphertext || tag[16]`.
|
|
10
|
+
* The nonce is randomly generated per encrypt; XChaCha20's 192-bit nonce
|
|
11
|
+
* makes random selection collision-safe across realistic key lifetimes.
|
|
12
|
+
*/
|
|
13
|
+
import { xchacha20poly1305 } from '@noble/ciphers/chacha';
|
|
14
|
+
import { randomBytes } from '@noble/ciphers/webcrypto';
|
|
15
|
+
const NONCE_LEN = 24;
|
|
16
|
+
const utf8 = new TextEncoder();
|
|
17
|
+
const utf8d = new TextDecoder();
|
|
18
|
+
/**
|
|
19
|
+
* Canonical AAD encoding. We bind the four-tuple via JSON-array encoding
|
|
20
|
+
* so the result is unambiguous regardless of what characters the
|
|
21
|
+
* components carry. Earlier versions used a `|` join, which collided
|
|
22
|
+
* silently if any component happened to contain the pipe character —
|
|
23
|
+
* `(scope=instance, key='a|b', scopeId='c', mk_v1)` produced the same
|
|
24
|
+
* AAD bytes as `(scope=instance, key='a', scopeId='b|c', mk_v1)`,
|
|
25
|
+
* opening a row-swap window. JSON.stringify on a fixed-shape array is
|
|
26
|
+
* trivially auditable and robust to any future key/scopeId additions
|
|
27
|
+
* (e.g., connector keys with `|` or quoted scopeIds).
|
|
28
|
+
*
|
|
29
|
+
* Encoding choice is part of the wire format — changing it invalidates
|
|
30
|
+
* every existing ciphertext. The branch this lands in has not yet
|
|
31
|
+
* shipped Phase 5/6, so no rotation runbook is needed.
|
|
32
|
+
*/
|
|
33
|
+
function aad(input) {
|
|
34
|
+
return utf8.encode(JSON.stringify([input.scope, input.scopeId, input.key, input.keyVersion]));
|
|
35
|
+
}
|
|
36
|
+
function toBase64(bytes) {
|
|
37
|
+
// Buffer is the fastest path on Node and is already a transitive dep.
|
|
38
|
+
return Buffer.from(bytes).toString('base64');
|
|
39
|
+
}
|
|
40
|
+
function fromBase64(b64) {
|
|
41
|
+
return new Uint8Array(Buffer.from(b64, 'base64'));
|
|
42
|
+
}
|
|
43
|
+
function concat(a, b) {
|
|
44
|
+
const out = new Uint8Array(a.length + b.length);
|
|
45
|
+
out.set(a, 0);
|
|
46
|
+
out.set(b, a.length);
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Encrypt `plaintext` under `masterKey` with AAD bound to `ctx`.
|
|
51
|
+
* Returns base64(nonce || ciphertext || tag) and the keyVersion that was
|
|
52
|
+
* baked into the AAD. Caller is responsible for storing both.
|
|
53
|
+
*/
|
|
54
|
+
export function encrypt(masterKey, plaintext, ctx) {
|
|
55
|
+
if (masterKey.length !== 32) {
|
|
56
|
+
throw new Error(`encryption: master key must be 32 bytes (got ${masterKey.length})`);
|
|
57
|
+
}
|
|
58
|
+
const nonce = randomBytes(NONCE_LEN);
|
|
59
|
+
const cipher = xchacha20poly1305(masterKey, nonce, aad(ctx));
|
|
60
|
+
const ct = cipher.encrypt(utf8.encode(plaintext));
|
|
61
|
+
return { ciphertext: toBase64(concat(nonce, ct)), keyVersion: ctx.keyVersion };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Decrypt a row. Throws on:
|
|
65
|
+
* - AAD mismatch (row moved between slots; key/scope/version doesn't match)
|
|
66
|
+
* - tag failure (ciphertext or nonce tampered)
|
|
67
|
+
* - wrong master key
|
|
68
|
+
* - malformed wire format (truncated, bad base64)
|
|
69
|
+
*
|
|
70
|
+
* The thrown error MUST NOT carry the ciphertext or any partial plaintext.
|
|
71
|
+
*/
|
|
72
|
+
export function decrypt(masterKey, row, ctx) {
|
|
73
|
+
if (masterKey.length !== 32) {
|
|
74
|
+
throw new Error(`encryption: master key must be 32 bytes (got ${masterKey.length})`);
|
|
75
|
+
}
|
|
76
|
+
const buf = fromBase64(row.ciphertext);
|
|
77
|
+
if (buf.length < NONCE_LEN + 16) {
|
|
78
|
+
throw new Error('encryption: ciphertext too short');
|
|
79
|
+
}
|
|
80
|
+
const nonce = buf.slice(0, NONCE_LEN);
|
|
81
|
+
const ct = buf.slice(NONCE_LEN);
|
|
82
|
+
// The keyVersion in the AAD comes from `ctx`, not `row` — caller decides
|
|
83
|
+
// which version to attempt. (rotate_master flips ctx.keyVersion to mk_v(N+1)
|
|
84
|
+
// and, on failure, retries with mk_v(N) using the previous master key.)
|
|
85
|
+
const cipher = xchacha20poly1305(masterKey, nonce, aad(ctx));
|
|
86
|
+
const pt = cipher.decrypt(ct);
|
|
87
|
+
return utf8d.decode(pt);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Generate a fresh master key suitable for `encrypt()`. 32 random bytes.
|
|
91
|
+
* Caller is responsible for base64-encoding for env-var transport and
|
|
92
|
+
* persistence (see master-key.ts).
|
|
93
|
+
*/
|
|
94
|
+
export function generateMasterKey() {
|
|
95
|
+
return randomBytes(32);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../../src/core/secrets/encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-run importer — Phase 6 of the secrets refactor.
|
|
3
|
+
*
|
|
4
|
+
* Walks the Key Registry and seeds the encrypted store from whatever
|
|
5
|
+
* plaintext legacy files exist on disk:
|
|
6
|
+
*
|
|
7
|
+
* ~/.studiograph/user.json — workspace settings & secrets
|
|
8
|
+
* ~/.studiograph/auth.json — GitHub PAT (bootstrap class, skipped)
|
|
9
|
+
* ~/.studiograph/connectors/*.json — connector secrets
|
|
10
|
+
* <workspace>/.studiograph/workspace.json — workspace + r2 fields
|
|
11
|
+
*
|
|
12
|
+
* Plus the running process environment for any registry entry whose
|
|
13
|
+
* `envAliases` matches a set `process.env.*`. Env values are mirrored
|
|
14
|
+
* into the store but NEVER overwrite an existing row — they remain the
|
|
15
|
+
* runtime source of truth via the resolver's precedence chain. The
|
|
16
|
+
* import is purely a "warm the store" pass so the read-flip doesn't
|
|
17
|
+
* see empty slots on first boot.
|
|
18
|
+
*
|
|
19
|
+
* Idempotency: a `meta.imported_legacy_at` row gates the whole pass.
|
|
20
|
+
* Once set, the importer is a no-op until the row is cleared
|
|
21
|
+
* (operationally: by deleting it via the SQLite CLI, or by burning the
|
|
22
|
+
* secrets.db file).
|
|
23
|
+
*
|
|
24
|
+
* Conflict rule: never overwrites a key already present in the store.
|
|
25
|
+
* Importer fills empty slots only. This means the store ALWAYS wins
|
|
26
|
+
* over a legacy file — the operator may have already used the API to
|
|
27
|
+
* set a value before the importer ran (race during a redeploy that
|
|
28
|
+
* brought legacy files along), and we must not regress that write.
|
|
29
|
+
*
|
|
30
|
+
* Failure handling: per-source failures (parse errors, missing files)
|
|
31
|
+
* are logged and continued. The whole pass succeeds even if some
|
|
32
|
+
* sources are missing — the goal is to copy what's there, not enforce
|
|
33
|
+
* that everything is there.
|
|
34
|
+
*
|
|
35
|
+
* After the scope-collapse refactor, the store is single-tier — the
|
|
36
|
+
* process IS the workspace. The importer no longer routes writes
|
|
37
|
+
* through a scope dimension.
|
|
38
|
+
*/
|
|
39
|
+
export interface ImporterResult {
|
|
40
|
+
/** True when the importer was a no-op because meta.imported_legacy_at was already set. */
|
|
41
|
+
skipped: boolean;
|
|
42
|
+
/** Count of setting rows the importer wrote. */
|
|
43
|
+
settings: number;
|
|
44
|
+
/** Count of secret rows the importer wrote. */
|
|
45
|
+
secrets: number;
|
|
46
|
+
/** Sources that were read (file paths, normalized). For diagnostics. */
|
|
47
|
+
sources: string[];
|
|
48
|
+
}
|
|
49
|
+
interface ImportContext {
|
|
50
|
+
workspacePath?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Root directory containing `.studiograph/user.json` and
|
|
53
|
+
* `.studiograph/connectors/*.json`. Defaults to `os.homedir()` so the
|
|
54
|
+
* production CLI doesn't need to think about it. Tests inject an
|
|
55
|
+
* isolated temp dir here instead of mutating `process.env.HOME`, which
|
|
56
|
+
* isn't safe to race across vitest workers.
|
|
57
|
+
*/
|
|
58
|
+
homePath?: string;
|
|
59
|
+
/**
|
|
60
|
+
* When true, the importer treats process.env as a source. Useful in
|
|
61
|
+
* Railway boot — env was provisioned by deploy.ts, and we want the
|
|
62
|
+
* resolver to see those values for keys that don't yet have a row.
|
|
63
|
+
*
|
|
64
|
+
* Note: env values are also visible to the resolver directly without
|
|
65
|
+
* being mirrored. We seed them into the store anyway so the audit log
|
|
66
|
+
* captures the provisioning event, and so subsequent reads can be
|
|
67
|
+
* answered without consulting `process.env`.
|
|
68
|
+
*/
|
|
69
|
+
importFromEnv?: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Touch every legacy source once and copy registry-mapped values into
|
|
73
|
+
* the encrypted store. Safe to call repeatedly — guarded by
|
|
74
|
+
* `meta.imported_legacy_at`. Caller (serve.ts) decides whether to log
|
|
75
|
+
* the result; the importer itself is silent on success and
|
|
76
|
+
* `console.warn`s on per-source parse failures.
|
|
77
|
+
*
|
|
78
|
+
* Returns counts so the caller can produce the boot one-liner the plan
|
|
79
|
+
* specifies (`[secrets] Imported N settings, M secrets from legacy files`).
|
|
80
|
+
*/
|
|
81
|
+
export declare function runFirstRunImporter(ctx?: ImportContext): Promise<ImporterResult>;
|
|
82
|
+
/**
|
|
83
|
+
* Test seam: clear the `imported_legacy_at` marker so the next call
|
|
84
|
+
* re-runs the importer. Tests only — production callers should never
|
|
85
|
+
* unmark a successful import.
|
|
86
|
+
*/
|
|
87
|
+
export declare function _resetImportedMarker(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Utility for tests + diagnostics — does the store look "fresh"? Used
|
|
90
|
+
* by the boot path to decide whether to log the importer summary line
|
|
91
|
+
* vs. silently confirm "already imported".
|
|
92
|
+
*/
|
|
93
|
+
export declare function importerHasRun(): boolean;
|
|
94
|
+
export {};
|