studiograph 1.3.48-next.13 → 1.3.48-next.131

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.
Files changed (1008) hide show
  1. package/README.md +7 -7
  2. package/dist/agent/agent-pool.d.ts +27 -1
  3. package/dist/agent/agent-pool.js +55 -12
  4. package/dist/agent/agent-pool.js.map +1 -1
  5. package/dist/agent/followups.d.ts +34 -0
  6. package/dist/agent/followups.js +52 -0
  7. package/dist/agent/followups.js.map +1 -0
  8. package/dist/agent/orchestrator.d.ts +29 -2
  9. package/dist/agent/orchestrator.js +251 -38
  10. package/dist/agent/orchestrator.js.map +1 -1
  11. package/dist/agent/prompts/entity-types-section.d.ts +30 -0
  12. package/dist/agent/prompts/entity-types-section.js +83 -0
  13. package/dist/agent/prompts/entity-types-section.js.map +1 -0
  14. package/dist/agent/prompts/system.md +106 -47
  15. package/dist/agent/skill-loader.d.ts +30 -17
  16. package/dist/agent/skill-loader.js +63 -30
  17. package/dist/agent/skill-loader.js.map +1 -1
  18. package/dist/agent/skills/entity-schema.md +79 -343
  19. package/dist/agent/skills/interview/entity-templates.md +38 -37
  20. package/dist/agent/skills/interview/question-domains.md +54 -49
  21. package/dist/agent/skills/interview/skill.md +89 -14
  22. package/dist/agent/tools/capture-tools.d.ts +31 -0
  23. package/dist/agent/tools/capture-tools.js +40 -0
  24. package/dist/agent/tools/capture-tools.js.map +1 -0
  25. package/dist/agent/tools/folder-tools.d.ts +47 -0
  26. package/dist/agent/tools/folder-tools.js +249 -0
  27. package/dist/agent/tools/folder-tools.js.map +1 -0
  28. package/dist/agent/tools/fs-tools.d.ts +6 -5
  29. package/dist/agent/tools/fs-tools.js +5 -5
  30. package/dist/agent/tools/fs-tools.js.map +1 -1
  31. package/dist/agent/tools/graph-tools.d.ts +25 -72
  32. package/dist/agent/tools/graph-tools.js +362 -366
  33. package/dist/agent/tools/graph-tools.js.map +1 -1
  34. package/dist/agent/tools/history-tools.d.ts +95 -0
  35. package/dist/agent/tools/history-tools.js +461 -0
  36. package/dist/agent/tools/history-tools.js.map +1 -0
  37. package/dist/agent/tools/load-skill.d.ts +6 -5
  38. package/dist/agent/tools/load-skill.js +3 -3
  39. package/dist/agent/tools/load-skill.js.map +1 -1
  40. package/dist/agent/tools/message-tools.d.ts +13 -11
  41. package/dist/agent/tools/message-tools.js +31 -39
  42. package/dist/agent/tools/message-tools.js.map +1 -1
  43. package/dist/agent/tools/ops-tools.d.ts +5 -4
  44. package/dist/agent/tools/ops-tools.js +99 -212
  45. package/dist/agent/tools/ops-tools.js.map +1 -1
  46. package/dist/agent/tools/permission-tools.d.ts +39 -16
  47. package/dist/agent/tools/permission-tools.js +66 -41
  48. package/dist/agent/tools/permission-tools.js.map +1 -1
  49. package/dist/agent/tools/tool-loader.js +5 -4
  50. package/dist/agent/tools/tool-loader.js.map +1 -1
  51. package/dist/agent/tools/web-tools.js +58 -9
  52. package/dist/agent/tools/web-tools.js.map +1 -1
  53. package/dist/cli/commands/about.d.ts +1 -0
  54. package/dist/cli/commands/about.js +55 -3
  55. package/dist/cli/commands/about.js.map +1 -1
  56. package/dist/cli/commands/audit.d.ts +21 -0
  57. package/dist/cli/commands/audit.js +174 -0
  58. package/dist/cli/commands/audit.js.map +1 -0
  59. package/dist/cli/commands/clear.d.ts +5 -0
  60. package/dist/cli/commands/clear.js +144 -1
  61. package/dist/cli/commands/clear.js.map +1 -1
  62. package/dist/cli/commands/clone.d.ts +1 -1
  63. package/dist/cli/commands/clone.js +82 -23
  64. package/dist/cli/commands/clone.js.map +1 -1
  65. package/dist/cli/commands/deploy.js +79 -18
  66. package/dist/cli/commands/deploy.js.map +1 -1
  67. package/dist/cli/commands/folder.d.ts +11 -0
  68. package/dist/cli/commands/folder.js +186 -0
  69. package/dist/cli/commands/folder.js.map +1 -0
  70. package/dist/cli/commands/index.js +2 -2
  71. package/dist/cli/commands/index.js.map +1 -1
  72. package/dist/cli/commands/init.js +16 -14
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/commands/join.d.ts +1 -1
  75. package/dist/cli/commands/join.js +26 -14
  76. package/dist/cli/commands/join.js.map +1 -1
  77. package/dist/cli/commands/mcp.js +12 -4
  78. package/dist/cli/commands/mcp.js.map +1 -1
  79. package/dist/cli/commands/r2.d.ts +3 -0
  80. package/dist/cli/commands/r2.js +196 -1
  81. package/dist/cli/commands/r2.js.map +1 -1
  82. package/dist/cli/commands/redeploy.js +41 -1
  83. package/dist/cli/commands/redeploy.js.map +1 -1
  84. package/dist/cli/commands/secrets.d.ts +23 -0
  85. package/dist/cli/commands/secrets.js +256 -0
  86. package/dist/cli/commands/secrets.js.map +1 -0
  87. package/dist/cli/commands/serve.js +143 -24
  88. package/dist/cli/commands/serve.js.map +1 -1
  89. package/dist/cli/commands/start.js +140 -71
  90. package/dist/cli/commands/start.js.map +1 -1
  91. package/dist/cli/commands/sync.d.ts +1 -1
  92. package/dist/cli/commands/sync.js +509 -163
  93. package/dist/cli/commands/sync.js.map +1 -1
  94. package/dist/cli/commands/user.js +8 -24
  95. package/dist/cli/commands/user.js.map +1 -1
  96. package/dist/cli/index.js +8 -7
  97. package/dist/cli/index.js.map +1 -1
  98. package/dist/cli/railway-provisioning.d.ts +53 -0
  99. package/dist/cli/railway-provisioning.js +85 -0
  100. package/dist/cli/railway-provisioning.js.map +1 -0
  101. package/dist/cli/scaffolding.d.ts +4 -2
  102. package/dist/cli/scaffolding.js +42 -47
  103. package/dist/cli/scaffolding.js.map +1 -1
  104. package/dist/cli/setup-wizard.d.ts +30 -49
  105. package/dist/cli/setup-wizard.js +35 -38
  106. package/dist/cli/setup-wizard.js.map +1 -1
  107. package/dist/core/accent-palette.d.ts +22 -0
  108. package/dist/core/accent-palette.js +47 -0
  109. package/dist/core/accent-palette.js.map +1 -0
  110. package/dist/core/entity-body-templates.d.ts +21 -0
  111. package/dist/core/entity-body-templates.js +48 -0
  112. package/dist/core/entity-body-templates.js.map +1 -0
  113. package/dist/core/entity-types-catalog.d.ts +65 -0
  114. package/dist/core/entity-types-catalog.js +136 -0
  115. package/dist/core/entity-types-catalog.js.map +1 -0
  116. package/dist/core/feature-flags.d.ts +22 -0
  117. package/dist/core/feature-flags.js +15 -0
  118. package/dist/core/feature-flags.js.map +1 -0
  119. package/dist/core/features.d.ts +16 -0
  120. package/dist/core/features.js +48 -0
  121. package/dist/core/features.js.map +1 -0
  122. package/dist/core/folder-paths.d.ts +41 -0
  123. package/dist/core/folder-paths.js +95 -0
  124. package/dist/core/folder-paths.js.map +1 -0
  125. package/dist/core/folder-sidecar.d.ts +16 -0
  126. package/dist/core/folder-sidecar.js +45 -0
  127. package/dist/core/folder-sidecar.js.map +1 -0
  128. package/dist/core/graph.d.ts +471 -19
  129. package/dist/core/graph.js +1411 -284
  130. package/dist/core/graph.js.map +1 -1
  131. package/dist/core/schema-registry.js +1 -19
  132. package/dist/core/schema-registry.js.map +1 -1
  133. package/dist/core/schemas/connector.d.ts +67 -0
  134. package/dist/core/schemas/connector.js +100 -0
  135. package/dist/core/schemas/connector.js.map +1 -0
  136. package/dist/core/schemas/workspace.d.ts +122 -0
  137. package/dist/core/schemas/workspace.js +211 -0
  138. package/dist/core/schemas/workspace.js.map +1 -0
  139. package/dist/core/secrets/SecretStore.d.ts +77 -0
  140. package/dist/core/secrets/SecretStore.js +13 -0
  141. package/dist/core/secrets/SecretStore.js.map +1 -0
  142. package/dist/core/secrets/SettingsResolver.d.ts +54 -0
  143. package/dist/core/secrets/SettingsResolver.js +80 -0
  144. package/dist/core/secrets/SettingsResolver.js.map +1 -0
  145. package/dist/core/secrets/SettingsStore.d.ts +30 -0
  146. package/dist/core/secrets/SettingsStore.js +9 -0
  147. package/dist/core/secrets/SettingsStore.js.map +1 -0
  148. package/dist/core/secrets/SqliteEncryptedStore.d.ts +78 -0
  149. package/dist/core/secrets/SqliteEncryptedStore.js +581 -0
  150. package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
  151. package/dist/core/secrets/audit.d.ts +36 -0
  152. package/dist/core/secrets/audit.js +60 -0
  153. package/dist/core/secrets/audit.js.map +1 -0
  154. package/dist/core/secrets/auth-db-migration.d.ts +129 -0
  155. package/dist/core/secrets/auth-db-migration.js +653 -0
  156. package/dist/core/secrets/auth-db-migration.js.map +1 -0
  157. package/dist/core/secrets/bundle.d.ts +141 -0
  158. package/dist/core/secrets/bundle.js +435 -0
  159. package/dist/core/secrets/bundle.js.map +1 -0
  160. package/dist/core/secrets/dual-write.d.ts +76 -0
  161. package/dist/core/secrets/dual-write.js +236 -0
  162. package/dist/core/secrets/dual-write.js.map +1 -0
  163. package/dist/core/secrets/encryption.d.ts +44 -0
  164. package/dist/core/secrets/encryption.js +97 -0
  165. package/dist/core/secrets/encryption.js.map +1 -0
  166. package/dist/core/secrets/importer.d.ts +94 -0
  167. package/dist/core/secrets/importer.js +319 -0
  168. package/dist/core/secrets/importer.js.map +1 -0
  169. package/dist/core/secrets/index.d.ts +49 -0
  170. package/dist/core/secrets/index.js +74 -0
  171. package/dist/core/secrets/index.js.map +1 -0
  172. package/dist/core/secrets/master-key.d.ts +38 -0
  173. package/dist/core/secrets/master-key.js +122 -0
  174. package/dist/core/secrets/master-key.js.map +1 -0
  175. package/dist/core/secrets/probes/anthropic.d.ts +98 -0
  176. package/dist/core/secrets/probes/anthropic.js +300 -0
  177. package/dist/core/secrets/probes/anthropic.js.map +1 -0
  178. package/dist/core/secrets/probes/brave.d.ts +9 -0
  179. package/dist/core/secrets/probes/brave.js +15 -0
  180. package/dist/core/secrets/probes/brave.js.map +1 -0
  181. package/dist/core/secrets/probes/r2.d.ts +15 -0
  182. package/dist/core/secrets/probes/r2.js +14 -0
  183. package/dist/core/secrets/probes/r2.js.map +1 -0
  184. package/dist/core/secrets/probes/voyage.d.ts +13 -0
  185. package/dist/core/secrets/probes/voyage.js +52 -0
  186. package/dist/core/secrets/probes/voyage.js.map +1 -0
  187. package/dist/core/secrets/read-flip.d.ts +59 -0
  188. package/dist/core/secrets/read-flip.js +87 -0
  189. package/dist/core/secrets/read-flip.js.map +1 -0
  190. package/dist/core/secrets/registry.d.ts +188 -0
  191. package/dist/core/secrets/registry.js +531 -0
  192. package/dist/core/secrets/registry.js.map +1 -0
  193. package/dist/core/types.d.ts +70 -483
  194. package/dist/core/types.js +6 -3
  195. package/dist/core/types.js.map +1 -1
  196. package/dist/core/user-config.d.ts +52 -12
  197. package/dist/core/user-config.js +119 -14
  198. package/dist/core/user-config.js.map +1 -1
  199. package/dist/core/validation.d.ts +603 -1409
  200. package/dist/core/validation.js +248 -146
  201. package/dist/core/validation.js.map +1 -1
  202. package/dist/core/workspace-manager.d.ts +35 -14
  203. package/dist/core/workspace-manager.js +105 -56
  204. package/dist/core/workspace-manager.js.map +1 -1
  205. package/dist/core/workspace.d.ts +19 -5
  206. package/dist/core/workspace.js +66 -39
  207. package/dist/core/workspace.js.map +1 -1
  208. package/dist/mcp/connector-manager.d.ts +16 -1
  209. package/dist/mcp/connector-manager.js +44 -5
  210. package/dist/mcp/connector-manager.js.map +1 -1
  211. package/dist/mcp/server.d.ts +11 -3
  212. package/dist/mcp/server.js +30 -5
  213. package/dist/mcp/server.js.map +1 -1
  214. package/dist/mcp/tools.d.ts +27 -2
  215. package/dist/mcp/tools.js +544 -113
  216. package/dist/mcp/tools.js.map +1 -1
  217. package/dist/server/__tests__/helpers/graph-api.d.ts +18 -0
  218. package/dist/server/__tests__/helpers/graph-api.js +16 -0
  219. package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
  220. package/dist/server/commit-audit.d.ts +26 -0
  221. package/dist/server/commit-audit.js +30 -0
  222. package/dist/server/commit-audit.js.map +1 -0
  223. package/dist/server/index.d.ts +14 -3
  224. package/dist/server/index.js +385 -177
  225. package/dist/server/index.js.map +1 -1
  226. package/dist/server/middleware/sanitize.d.ts +46 -0
  227. package/dist/server/middleware/sanitize.js +171 -0
  228. package/dist/server/middleware/sanitize.js.map +1 -0
  229. package/dist/server/routes/asset-api.js +217 -65
  230. package/dist/server/routes/asset-api.js.map +1 -1
  231. package/dist/server/routes/audit-api.d.ts +24 -0
  232. package/dist/server/routes/audit-api.js +117 -0
  233. package/dist/server/routes/audit-api.js.map +1 -0
  234. package/dist/server/routes/auth-api.js +220 -44
  235. package/dist/server/routes/auth-api.js.map +1 -1
  236. package/dist/server/routes/capture-api.d.ts +10 -3
  237. package/dist/server/routes/capture-api.js +180 -24
  238. package/dist/server/routes/capture-api.js.map +1 -1
  239. package/dist/server/routes/chat.d.ts +4 -1
  240. package/dist/server/routes/chat.js +178 -46
  241. package/dist/server/routes/chat.js.map +1 -1
  242. package/dist/server/routes/config-api.d.ts +21 -0
  243. package/dist/server/routes/config-api.js +256 -0
  244. package/dist/server/routes/config-api.js.map +1 -0
  245. package/dist/server/routes/connectors-api.js +24 -18
  246. package/dist/server/routes/connectors-api.js.map +1 -1
  247. package/dist/server/routes/event-ingest-api.d.ts +15 -0
  248. package/dist/server/routes/event-ingest-api.js +125 -0
  249. package/dist/server/routes/event-ingest-api.js.map +1 -0
  250. package/dist/server/routes/features-api.d.ts +19 -0
  251. package/dist/server/routes/features-api.js +28 -0
  252. package/dist/server/routes/features-api.js.map +1 -0
  253. package/dist/server/routes/git-http.d.ts +2 -2
  254. package/dist/server/routes/git-http.js +69 -34
  255. package/dist/server/routes/git-http.js.map +1 -1
  256. package/dist/server/routes/graph-api-access.d.ts +35 -0
  257. package/dist/server/routes/graph-api-access.js +93 -0
  258. package/dist/server/routes/graph-api-access.js.map +1 -0
  259. package/dist/server/routes/graph-api.d.ts +3 -2
  260. package/dist/server/routes/graph-api.js +1014 -315
  261. package/dist/server/routes/graph-api.js.map +1 -1
  262. package/dist/server/routes/health.d.ts +18 -0
  263. package/dist/server/routes/health.js +74 -0
  264. package/dist/server/routes/health.js.map +1 -0
  265. package/dist/server/routes/insights-api.js +156 -33
  266. package/dist/server/routes/insights-api.js.map +1 -1
  267. package/dist/server/routes/mcp.d.ts +6 -3
  268. package/dist/server/routes/mcp.js +22 -6
  269. package/dist/server/routes/mcp.js.map +1 -1
  270. package/dist/server/routes/messages-api.d.ts +3 -3
  271. package/dist/server/routes/messages-api.js +308 -120
  272. package/dist/server/routes/messages-api.js.map +1 -1
  273. package/dist/server/routes/permissions-api.d.ts +9 -2
  274. package/dist/server/routes/permissions-api.js +87 -31
  275. package/dist/server/routes/permissions-api.js.map +1 -1
  276. package/dist/server/routes/secrets-api.d.ts +36 -0
  277. package/dist/server/routes/secrets-api.js +308 -0
  278. package/dist/server/routes/secrets-api.js.map +1 -0
  279. package/dist/server/routes/settings-api.d.ts +29 -0
  280. package/dist/server/routes/settings-api.js +180 -0
  281. package/dist/server/routes/settings-api.js.map +1 -0
  282. package/dist/server/routes/workspace-api.d.ts +2 -1
  283. package/dist/server/routes/workspace-api.js +131 -20
  284. package/dist/server/routes/workspace-api.js.map +1 -1
  285. package/dist/server/routes/ws.d.ts +3 -2
  286. package/dist/server/routes/ws.js +68 -18
  287. package/dist/server/routes/ws.js.map +1 -1
  288. package/dist/server/session-manager.d.ts +48 -5
  289. package/dist/server/session-manager.js +175 -11
  290. package/dist/server/session-manager.js.map +1 -1
  291. package/dist/server/ws-hub.d.ts +134 -22
  292. package/dist/server/ws-hub.js +0 -0
  293. package/dist/server/ws-hub.js.map +1 -1
  294. package/dist/server/yjs-manager.d.ts +107 -7
  295. package/dist/server/yjs-manager.js +444 -38
  296. package/dist/server/yjs-manager.js.map +1 -1
  297. package/dist/server/yjs-persistence.d.ts +143 -0
  298. package/dist/server/yjs-persistence.js +543 -0
  299. package/dist/server/yjs-persistence.js.map +1 -0
  300. package/dist/server/yjs-text-diff.d.ts +32 -0
  301. package/dist/server/yjs-text-diff.js +61 -0
  302. package/dist/server/yjs-text-diff.js.map +1 -0
  303. package/dist/services/access-control.d.ts +53 -0
  304. package/dist/services/access-control.js +132 -0
  305. package/dist/services/access-control.js.map +1 -0
  306. package/dist/services/asset-upload-service.d.ts +53 -0
  307. package/dist/services/asset-upload-service.js +200 -0
  308. package/dist/services/asset-upload-service.js.map +1 -0
  309. package/dist/services/assets/base.d.ts +38 -0
  310. package/dist/services/assets/base.js +55 -0
  311. package/dist/services/assets/base.js.map +1 -1
  312. package/dist/services/assets/index.d.ts +41 -1
  313. package/dist/services/assets/index.js +65 -0
  314. package/dist/services/assets/index.js.map +1 -1
  315. package/dist/services/assets/local.d.ts +7 -1
  316. package/dist/services/assets/local.js +83 -0
  317. package/dist/services/assets/local.js.map +1 -1
  318. package/dist/services/assets/r2.d.ts +28 -1
  319. package/dist/services/assets/r2.js +75 -1
  320. package/dist/services/assets/r2.js.map +1 -1
  321. package/dist/services/auth-service.d.ts +184 -36
  322. package/dist/services/auth-service.js +763 -138
  323. package/dist/services/auth-service.js.map +1 -1
  324. package/dist/services/briefing.d.ts +1 -1
  325. package/dist/services/briefing.js +12 -35
  326. package/dist/services/briefing.js.map +1 -1
  327. package/dist/services/event-processor.d.ts +104 -0
  328. package/dist/services/event-processor.js +443 -0
  329. package/dist/services/event-processor.js.map +1 -0
  330. package/dist/services/folder-creation.d.ts +33 -0
  331. package/dist/services/folder-creation.js +103 -0
  332. package/dist/services/folder-creation.js.map +1 -0
  333. package/dist/services/git.d.ts +44 -0
  334. package/dist/services/git.js +162 -55
  335. package/dist/services/git.js.map +1 -1
  336. package/dist/services/heartbeat.d.ts +19 -12
  337. package/dist/services/heartbeat.js +162 -107
  338. package/dist/services/heartbeat.js.map +1 -1
  339. package/dist/services/import-service.d.ts +37 -2
  340. package/dist/services/import-service.js +222 -123
  341. package/dist/services/import-service.js.map +1 -1
  342. package/dist/services/lint-service.js +7 -14
  343. package/dist/services/lint-service.js.map +1 -1
  344. package/dist/services/markdown.js +6 -2
  345. package/dist/services/markdown.js.map +1 -1
  346. package/dist/services/message-service.d.ts +62 -21
  347. package/dist/services/message-service.js +160 -43
  348. package/dist/services/message-service.js.map +1 -1
  349. package/dist/services/personal-folder.d.ts +40 -0
  350. package/dist/services/personal-folder.js +101 -0
  351. package/dist/services/personal-folder.js.map +1 -0
  352. package/dist/services/vector-service.d.ts +73 -3
  353. package/dist/services/vector-service.js +106 -7
  354. package/dist/services/vector-service.js.map +1 -1
  355. package/dist/services/workspace-access.d.ts +106 -0
  356. package/dist/services/workspace-access.js +149 -0
  357. package/dist/services/workspace-access.js.map +1 -0
  358. package/dist/utils/git.js +3 -3
  359. package/dist/utils/git.js.map +1 -1
  360. package/dist/utils/log.d.ts +42 -0
  361. package/dist/utils/log.js +137 -0
  362. package/dist/utils/log.js.map +1 -0
  363. package/dist/utils/preflight.js +2 -2
  364. package/dist/utils/preflight.js.map +1 -1
  365. package/dist/utils/version-checker.d.ts +4 -1
  366. package/dist/utils/version-checker.js +8 -8
  367. package/dist/utils/version-checker.js.map +1 -1
  368. package/dist/web/_app/immutable/assets/0.Bp6xXZUi.css +2 -0
  369. package/dist/web/_app/immutable/assets/11.DlIf1mKh.css +1 -0
  370. package/dist/web/_app/immutable/assets/12.Dmlt28l2.css +1 -0
  371. package/dist/web/_app/immutable/assets/13.CmLrbzZp.css +1 -0
  372. package/dist/web/_app/immutable/assets/2.oo1ac0x_.css +1 -0
  373. package/dist/web/_app/immutable/assets/3.DJJsQzDb.css +1 -0
  374. package/dist/web/_app/immutable/assets/4.CZ-fNJ91.css +1 -0
  375. package/dist/web/_app/immutable/assets/AgentOverlay.BfWESlQU.css +1 -0
  376. package/dist/web/_app/immutable/assets/AssetManagerModal.ZfasE2L3.css +1 -0
  377. package/dist/web/_app/immutable/assets/CalendarView.CeNagvyK.css +1 -0
  378. package/dist/web/_app/immutable/assets/ChatPanel.po0gYtVH.css +1 -0
  379. package/dist/web/_app/immutable/assets/FolderMembersPanel.Bepw-r0F.css +1 -0
  380. package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
  381. package/dist/web/_app/immutable/assets/FolderPicker.B5KdvRYl.css +1 -0
  382. package/dist/web/_app/immutable/assets/GalleryView.Dy-qQjEc.css +1 -0
  383. package/dist/web/_app/immutable/assets/GraphView.BHnGIltS.css +1 -0
  384. package/dist/web/_app/immutable/assets/KanbanView.G3NZ0uHb.css +1 -0
  385. package/dist/web/_app/immutable/assets/SettingsDialog.tBn8y9DD.css +1 -0
  386. package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
  387. package/dist/web/_app/immutable/assets/TagFilter.DNipjifq.css +1 -0
  388. package/dist/web/_app/immutable/assets/TagPickerSheet.DJPuqnTg.css +1 -0
  389. package/dist/web/_app/immutable/assets/WorkspaceView.B9zA92UB.css +1 -0
  390. package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
  391. package/dist/web/_app/immutable/assets/dialog.BxVal_19.css +1 -0
  392. package/dist/web/_app/immutable/assets/dist.B5hGjnfj.css +1 -0
  393. package/dist/web/_app/immutable/assets/dist.DDCWxn3B.css +1 -0
  394. package/dist/web/_app/immutable/assets/dropdown-menu.BSsUUQ3o.css +1 -0
  395. package/dist/web/_app/immutable/assets/entity-row.Bl5FyNCt.css +1 -0
  396. package/dist/web/_app/immutable/assets/greeting.Bm7lTneV.css +1 -0
  397. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
  398. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
  399. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
  400. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
  401. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
  402. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
  403. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
  404. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
  405. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
  406. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
  407. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
  408. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
  409. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
  410. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
  411. package/dist/web/_app/immutable/assets/inline-list.DORLo4xF.css +1 -0
  412. package/dist/web/_app/immutable/assets/notifications.clodJdp5.css +1 -0
  413. package/dist/web/_app/immutable/assets/radio-group.GJJRVPUJ.css +1 -0
  414. package/dist/web/_app/immutable/assets/select.D_AV992j.css +1 -0
  415. package/dist/web/_app/immutable/chunks/-KAQXGuI2.js +1 -0
  416. package/dist/web/_app/immutable/chunks/-wzwcH00.js +1 -0
  417. package/dist/web/_app/immutable/chunks/07l_1Zpm2.js +1 -0
  418. package/dist/web/_app/immutable/chunks/38oWKNzM2.js +6 -0
  419. package/dist/web/_app/immutable/chunks/54VmiJfH.js +1 -0
  420. package/dist/web/_app/immutable/chunks/6LRpFvjo.js +185 -0
  421. package/dist/web/_app/immutable/chunks/7R0Rp3Mz.js +1 -0
  422. package/dist/web/_app/immutable/chunks/9bCTHkeS.js +1 -0
  423. package/dist/web/_app/immutable/chunks/B-822WnD2.js +22 -0
  424. package/dist/web/_app/immutable/chunks/B0HUvliX2.js +2 -0
  425. package/dist/web/_app/immutable/chunks/B12eXGpE.js +1 -0
  426. package/dist/web/_app/immutable/chunks/B5af0X0p2.js +1 -0
  427. package/dist/web/_app/immutable/chunks/B6iYNwo72.js +1 -0
  428. package/dist/web/_app/immutable/chunks/B7EMtoAB.js +1 -0
  429. package/dist/web/_app/immutable/chunks/B7L4gmPR.js +2 -0
  430. package/dist/web/_app/immutable/chunks/B9qBGxh62.js +3 -0
  431. package/dist/web/_app/immutable/chunks/BDJYj9yi.js +2 -0
  432. package/dist/web/_app/immutable/chunks/BEpMEjHO.js +1 -0
  433. package/dist/web/_app/immutable/chunks/BErNpj-S2.js +1 -0
  434. package/dist/web/_app/immutable/chunks/BHBk4zfV.js +1 -0
  435. package/dist/web/_app/immutable/chunks/BHH-JGNF.js +1 -0
  436. package/dist/web/_app/immutable/chunks/BKe5wPiN.js +1 -0
  437. package/dist/web/_app/immutable/chunks/BNTlsKDJ.js +1 -0
  438. package/dist/web/_app/immutable/chunks/BOgcXgis2.js +1 -0
  439. package/dist/web/_app/immutable/chunks/BOyyDrjn2.js +1 -0
  440. package/dist/web/_app/immutable/chunks/BPR_ufQ0.js +41 -0
  441. package/dist/web/_app/immutable/chunks/BRcFsc6v.js +5 -0
  442. package/dist/web/_app/immutable/chunks/BT3KAag_.js +3 -0
  443. package/dist/web/_app/immutable/chunks/BX2T6xiZ.js +224 -0
  444. package/dist/web/_app/immutable/chunks/BZnJ8tbJ.js +1 -0
  445. package/dist/web/_app/immutable/chunks/Ba1Yzb7u.js +1 -0
  446. package/dist/web/_app/immutable/chunks/BcsvgA3B2.js +1 -0
  447. package/dist/web/_app/immutable/chunks/BfbS7rGT.js +1 -0
  448. package/dist/web/_app/immutable/chunks/BgagL41Z.js +1 -0
  449. package/dist/web/_app/immutable/chunks/BiUh0Sik.js +1 -0
  450. package/dist/web/_app/immutable/chunks/Biajc_oU.js +1 -0
  451. package/dist/web/_app/immutable/chunks/Bl9Pzopy.js +1 -0
  452. package/dist/web/_app/immutable/chunks/BmcU05mO.js +1 -0
  453. package/dist/web/_app/immutable/chunks/Bmgp0jlT.js +1 -0
  454. package/dist/web/_app/immutable/chunks/BmgyOoEp.js +1 -0
  455. package/dist/web/_app/immutable/chunks/Bq0-jBGC2.js +1 -0
  456. package/dist/web/_app/immutable/chunks/BqGj0_GS.js +1 -0
  457. package/dist/web/_app/immutable/chunks/Bsc9K3Pz.js +1 -0
  458. package/dist/web/_app/immutable/chunks/Bssb691Q.js +1 -0
  459. package/dist/web/_app/immutable/chunks/BuzQceOn.js +1 -0
  460. package/dist/web/_app/immutable/chunks/BzeVNab0.js +1 -0
  461. package/dist/web/_app/immutable/chunks/C-OaypFN.js +1 -0
  462. package/dist/web/_app/immutable/chunks/C0fjDjvE2.js +1 -0
  463. package/dist/web/_app/immutable/chunks/C0pTXwEX.js +2 -0
  464. package/dist/web/_app/immutable/chunks/C3Enww9L2.js +1 -0
  465. package/dist/web/_app/immutable/chunks/C3oa0Cks.js +1 -0
  466. package/dist/web/_app/immutable/chunks/CC-YWp-f.js +1 -0
  467. package/dist/web/_app/immutable/chunks/CGdKvXV92.js +1 -0
  468. package/dist/web/_app/immutable/chunks/CH0siYFL.js +1 -0
  469. package/dist/web/_app/immutable/chunks/CIchr8Tk2.js +1 -0
  470. package/dist/web/_app/immutable/chunks/CK_yXDQI.js +1 -0
  471. package/dist/web/_app/immutable/chunks/CLPtMig0.js +1 -0
  472. package/dist/web/_app/immutable/chunks/CLSxJmTj.js +2 -0
  473. package/dist/web/_app/immutable/chunks/CPQNcHIB.js +3 -0
  474. package/dist/web/_app/immutable/chunks/CPt2D5aU.js +1 -0
  475. package/dist/web/_app/immutable/chunks/CQ-2yccd.js +7 -0
  476. package/dist/web/_app/immutable/chunks/CS6VEwn7.js +1 -0
  477. package/dist/web/_app/immutable/chunks/CSGIGrrK.js +1 -0
  478. package/dist/web/_app/immutable/chunks/CSsDOIrk.js +1 -0
  479. package/dist/web/_app/immutable/chunks/CVXvEWhv2.js +1 -0
  480. package/dist/web/_app/immutable/chunks/CaChtuYU2.js +1 -0
  481. package/dist/web/_app/immutable/chunks/CbiwvM3R2.js +1 -0
  482. package/dist/web/_app/immutable/chunks/CdCuBMLm.js +156 -0
  483. package/dist/web/_app/immutable/chunks/CfqjDDMu.js +1 -0
  484. package/dist/web/_app/immutable/chunks/CjGzUnEF2.js +1 -0
  485. package/dist/web/_app/immutable/chunks/Cjgbiel7.js +1 -0
  486. package/dist/web/_app/immutable/chunks/ClNEskRf.js +1 -0
  487. package/dist/web/_app/immutable/chunks/CnqSKqA62.js +1 -0
  488. package/dist/web/_app/immutable/chunks/CqyqKPuh2.js +1 -0
  489. package/dist/web/_app/immutable/chunks/CrnX-oFV.js +1 -0
  490. package/dist/web/_app/immutable/chunks/CsGahE3a.js +1 -0
  491. package/dist/web/_app/immutable/chunks/CsXIliss.js +1 -0
  492. package/dist/web/_app/immutable/chunks/Ct3quP0F.js +1 -0
  493. package/dist/web/_app/immutable/chunks/CvZaxjRC.js +1 -0
  494. package/dist/web/_app/immutable/chunks/CwD4G56R.js +5 -0
  495. package/dist/web/_app/immutable/chunks/CxalqrMB.js +1 -0
  496. package/dist/web/_app/immutable/chunks/D1Ap3evT2.js +1 -0
  497. package/dist/web/_app/immutable/chunks/D7qgUfnr.js +2487 -0
  498. package/dist/web/_app/immutable/chunks/D9-_Euza2.js +1 -0
  499. package/dist/web/_app/immutable/chunks/DCCaoKt42.js +1 -0
  500. package/dist/web/_app/immutable/chunks/DDKweOZr2.js +23 -0
  501. package/dist/web/_app/immutable/chunks/DHeU-hHI2.js +2 -0
  502. package/dist/web/_app/immutable/chunks/DHepUItL.js +1 -0
  503. package/dist/web/_app/immutable/chunks/DL_KbCKq.js +8 -0
  504. package/dist/web/_app/immutable/chunks/DNtqqgv32.js +1 -0
  505. package/dist/web/_app/immutable/chunks/DRl7vwNC2.js +184 -0
  506. package/dist/web/_app/immutable/chunks/DTc5W_V6.js +1 -0
  507. package/dist/web/_app/immutable/chunks/DZetJu9k2.js +1 -0
  508. package/dist/web/_app/immutable/chunks/DaiJs3St.js +1 -0
  509. package/dist/web/_app/immutable/chunks/DhuJRrEX2.js +1 -0
  510. package/dist/web/_app/immutable/chunks/DiP2EplP.js +3 -0
  511. package/dist/web/_app/immutable/chunks/Dm25ot5x2.js +1 -0
  512. package/dist/web/_app/immutable/chunks/DqOcb9RX2.js +83 -0
  513. package/dist/web/_app/immutable/chunks/DrbUJCAE.js +1 -0
  514. package/dist/web/_app/immutable/chunks/Dt4HY2cT2.js +2 -0
  515. package/dist/web/_app/immutable/chunks/DtGUCMv8.js +6 -0
  516. package/dist/web/_app/immutable/chunks/Du2-B3c8.js +1 -0
  517. package/dist/web/_app/immutable/chunks/DwdkE4UD2.js +1 -0
  518. package/dist/web/_app/immutable/chunks/DxWesPbn.js +1 -0
  519. package/dist/web/_app/immutable/chunks/DyYZqUV72.js +1 -0
  520. package/dist/web/_app/immutable/chunks/HfUnhvrv2.js +1 -0
  521. package/dist/web/_app/immutable/chunks/Je8-BtCk2.js +1 -0
  522. package/dist/web/_app/immutable/chunks/LAN53VbP2.js +5 -0
  523. package/dist/web/_app/immutable/chunks/MSB7eA4_.js +1 -0
  524. package/dist/web/_app/immutable/chunks/NPe9WyW1.js +1 -0
  525. package/dist/web/_app/immutable/chunks/O6IzcxXJ.js +2 -0
  526. package/dist/web/_app/immutable/chunks/SXhc9rJW.js +1 -0
  527. package/dist/web/_app/immutable/chunks/TuBvdkhV2.js +1 -0
  528. package/dist/web/_app/immutable/chunks/U40J2SnU.js +1 -0
  529. package/dist/web/_app/immutable/chunks/VS3l21Gu.js +1 -0
  530. package/dist/web/_app/immutable/chunks/YEPEvlbU2.js +1 -0
  531. package/dist/web/_app/immutable/chunks/Z7TNRcgK.js +11 -0
  532. package/dist/web/_app/immutable/chunks/ZCekGjo6.js +5 -0
  533. package/dist/web/_app/immutable/chunks/_rnxQ655.js +4 -0
  534. package/dist/web/_app/immutable/chunks/dTXrX5Bw.js +2 -0
  535. package/dist/web/_app/immutable/chunks/gNXLhsdy.js +1 -0
  536. package/dist/web/_app/immutable/chunks/hKSTEN36.js +1 -0
  537. package/dist/web/_app/immutable/chunks/jZZTbzL5.js +1 -0
  538. package/dist/web/_app/immutable/chunks/l4FIBKss.js +1 -0
  539. package/dist/web/_app/immutable/chunks/l_4snZnh2.js +1 -0
  540. package/dist/web/_app/immutable/chunks/q6R6T-lK.js +1 -0
  541. package/dist/web/_app/immutable/chunks/qgprkMcL.js +1 -0
  542. package/dist/web/_app/immutable/chunks/rOisBLC62.js +14 -0
  543. package/dist/web/_app/immutable/chunks/t08TznXc2.js +1 -0
  544. package/dist/web/_app/immutable/chunks/t62M88qj.js +1 -0
  545. package/dist/web/_app/immutable/chunks/uCohGWC42.js +1 -0
  546. package/dist/web/_app/immutable/chunks/uqxmB78b.js +1 -0
  547. package/dist/web/_app/immutable/chunks/vwTMEIJQ.js +1 -0
  548. package/dist/web/_app/immutable/chunks/w1FCELam.js +64 -0
  549. package/dist/web/_app/immutable/chunks/zmjgin7A.js +1 -0
  550. package/dist/web/_app/immutable/chunks/zumDjcgJ.js +1 -0
  551. package/dist/web/_app/immutable/entry/app.B3JEO5sy.js +2 -0
  552. package/dist/web/_app/immutable/entry/start.Dk84vnrL.js +1 -0
  553. package/dist/web/_app/immutable/nodes/0.BKLFgYTV.js +2 -0
  554. package/dist/web/_app/immutable/nodes/1.Djf_1kN1.js +1 -0
  555. package/dist/web/_app/immutable/nodes/10.De6eGWLx.js +1 -0
  556. package/dist/web/_app/immutable/nodes/11.CDsfSRTw.js +1 -0
  557. package/dist/web/_app/immutable/nodes/12.BeKkKpkY.js +1 -0
  558. package/dist/web/_app/immutable/nodes/13.BcI8xwSy.js +1 -0
  559. package/dist/web/_app/immutable/nodes/2.ZMZ-QAZ7.js +106 -0
  560. package/dist/web/_app/immutable/nodes/3.C1ZiAfle.js +2 -0
  561. package/dist/web/_app/immutable/nodes/4.Chmqy9KF.js +2 -0
  562. package/dist/web/_app/immutable/nodes/5.Bpvr_Vcq.js +1 -0
  563. package/dist/web/_app/immutable/nodes/6.BHa_gOs3.js +1 -0
  564. package/dist/web/_app/immutable/nodes/7.D0hg4Eap.js +1 -0
  565. package/dist/web/_app/immutable/nodes/8.3ZUUxJqR.js +1 -0
  566. package/dist/web/_app/immutable/nodes/9.Ducy-oqR.js +1 -0
  567. package/dist/web/_app/version.json +1 -1
  568. package/dist/web/favicon-16.png +0 -0
  569. package/dist/web/favicon-180.png +0 -0
  570. package/dist/web/favicon-32.png +0 -0
  571. package/dist/web/favicon-48.png +0 -0
  572. package/dist/web/favicon-512.png +0 -0
  573. package/dist/web/favicon.ico +0 -0
  574. package/dist/web/favicon.svg +8 -0
  575. package/dist/web/index.html +64 -21
  576. package/dist/web/studiograph-logomark.svg +29 -0
  577. package/package.json +28 -14
  578. package/dist/agent/role-loader.d.ts +0 -24
  579. package/dist/agent/role-loader.js +0 -67
  580. package/dist/agent/role-loader.js.map +0 -1
  581. package/dist/agent/skills/enrich-entities.md +0 -136
  582. package/dist/agent/skills/obsidian-source-setup.md +0 -246
  583. package/dist/agent/skills/skill-loader.d.ts +0 -48
  584. package/dist/agent/skills/skill-loader.js +0 -166
  585. package/dist/agent/skills/skill-loader.js.map +0 -1
  586. package/dist/agent/skills/sync-configuration.md +0 -119
  587. package/dist/agent/skills/sync-setup.md +0 -82
  588. package/dist/agent/tools/sync-tools.d.ts +0 -35
  589. package/dist/agent/tools/sync-tools.js +0 -992
  590. package/dist/agent/tools/sync-tools.js.map +0 -1
  591. package/dist/auth/github.d.ts +0 -56
  592. package/dist/auth/github.js +0 -169
  593. package/dist/auth/github.js.map +0 -1
  594. package/dist/cli/commands/access.d.ts +0 -11
  595. package/dist/cli/commands/access.js +0 -156
  596. package/dist/cli/commands/access.js.map +0 -1
  597. package/dist/cli/commands/app.d.ts +0 -7
  598. package/dist/cli/commands/app.js +0 -268
  599. package/dist/cli/commands/app.js.map +0 -1
  600. package/dist/cli/commands/auth.d.ts +0 -10
  601. package/dist/cli/commands/auth.js +0 -79
  602. package/dist/cli/commands/auth.js.map +0 -1
  603. package/dist/cli/commands/collection.d.ts +0 -10
  604. package/dist/cli/commands/collection.js +0 -185
  605. package/dist/cli/commands/collection.js.map +0 -1
  606. package/dist/cli/commands/enrich.d.ts +0 -11
  607. package/dist/cli/commands/enrich.js +0 -135
  608. package/dist/cli/commands/enrich.js.map +0 -1
  609. package/dist/cli/commands/graphrag.d.ts +0 -12
  610. package/dist/cli/commands/graphrag.js +0 -122
  611. package/dist/cli/commands/graphrag.js.map +0 -1
  612. package/dist/cli/commands/members.d.ts +0 -11
  613. package/dist/cli/commands/members.js +0 -230
  614. package/dist/cli/commands/members.js.map +0 -1
  615. package/dist/cli/commands/org.d.ts +0 -10
  616. package/dist/cli/commands/org.js +0 -132
  617. package/dist/cli/commands/org.js.map +0 -1
  618. package/dist/cli/commands/provision.d.ts +0 -8
  619. package/dist/cli/commands/provision.js +0 -116
  620. package/dist/cli/commands/provision.js.map +0 -1
  621. package/dist/cli/commands/resolve.d.ts +0 -8
  622. package/dist/cli/commands/resolve.js +0 -85
  623. package/dist/cli/commands/resolve.js.map +0 -1
  624. package/dist/cli/commands/review.d.ts +0 -19
  625. package/dist/cli/commands/review.js +0 -128
  626. package/dist/cli/commands/review.js.map +0 -1
  627. package/dist/cli/commands/source.d.ts +0 -16
  628. package/dist/cli/commands/source.js +0 -159
  629. package/dist/cli/commands/source.js.map +0 -1
  630. package/dist/cli/commands/sync-collection.d.ts +0 -14
  631. package/dist/cli/commands/sync-collection.js +0 -355
  632. package/dist/cli/commands/sync-collection.js.map +0 -1
  633. package/dist/cli/commands/sync-entities.d.ts +0 -13
  634. package/dist/cli/commands/sync-entities.js +0 -242
  635. package/dist/cli/commands/sync-entities.js.map +0 -1
  636. package/dist/cli/commands/team.d.ts +0 -12
  637. package/dist/cli/commands/team.js +0 -185
  638. package/dist/cli/commands/team.js.map +0 -1
  639. package/dist/cli/sync-review-interactive.d.ts +0 -31
  640. package/dist/cli/sync-review-interactive.js +0 -393
  641. package/dist/cli/sync-review-interactive.js.map +0 -1
  642. package/dist/core/migration-runner.d.ts +0 -42
  643. package/dist/core/migration-runner.js +0 -232
  644. package/dist/core/migration-runner.js.map +0 -1
  645. package/dist/core/migration-types.d.ts +0 -101
  646. package/dist/core/migration-types.js +0 -21
  647. package/dist/core/migration-types.js.map +0 -1
  648. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
  649. package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
  650. package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
  651. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
  652. package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
  653. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
  654. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
  655. package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
  656. package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
  657. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
  658. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
  659. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
  660. package/dist/core/migrations/index.d.ts +0 -11
  661. package/dist/core/migrations/index.js +0 -23
  662. package/dist/core/migrations/index.js.map +0 -1
  663. package/dist/integrations/asana.d.ts +0 -26
  664. package/dist/integrations/asana.js +0 -78
  665. package/dist/integrations/asana.js.map +0 -1
  666. package/dist/integrations/figma-local.d.ts +0 -16
  667. package/dist/integrations/figma-local.js +0 -10
  668. package/dist/integrations/figma-local.js.map +0 -1
  669. package/dist/integrations/figma.d.ts +0 -17
  670. package/dist/integrations/figma.js +0 -17
  671. package/dist/integrations/figma.js.map +0 -1
  672. package/dist/integrations/granola.d.ts +0 -24
  673. package/dist/integrations/granola.js +0 -60
  674. package/dist/integrations/granola.js.map +0 -1
  675. package/dist/integrations/linear.d.ts +0 -14
  676. package/dist/integrations/linear.js +0 -80
  677. package/dist/integrations/linear.js.map +0 -1
  678. package/dist/integrations/paper-local.d.ts +0 -14
  679. package/dist/integrations/paper-local.js +0 -10
  680. package/dist/integrations/paper-local.js.map +0 -1
  681. package/dist/integrations/paper.d.ts +0 -2
  682. package/dist/integrations/paper.js +0 -10
  683. package/dist/integrations/paper.js.map +0 -1
  684. package/dist/integrations/pipedrive.d.ts +0 -26
  685. package/dist/integrations/pipedrive.js +0 -97
  686. package/dist/integrations/pipedrive.js.map +0 -1
  687. package/dist/integrations/registry.d.ts +0 -8
  688. package/dist/integrations/registry.js +0 -7
  689. package/dist/integrations/registry.js.map +0 -1
  690. package/dist/integrations/types.d.ts +0 -43
  691. package/dist/integrations/types.js +0 -5
  692. package/dist/integrations/types.js.map +0 -1
  693. package/dist/lib/lib/utils.d.ts +0 -2
  694. package/dist/lib/lib/utils.js +0 -6
  695. package/dist/lib/lib/utils.js.map +0 -1
  696. package/dist/mcp/connectors/asana.d.ts +0 -2
  697. package/dist/mcp/connectors/asana.js +0 -20
  698. package/dist/mcp/connectors/asana.js.map +0 -1
  699. package/dist/mcp/connectors/definitions.d.ts +0 -45
  700. package/dist/mcp/connectors/definitions.js +0 -32
  701. package/dist/mcp/connectors/definitions.js.map +0 -1
  702. package/dist/mcp/connectors/figma.d.ts +0 -5
  703. package/dist/mcp/connectors/figma.js +0 -21
  704. package/dist/mcp/connectors/figma.js.map +0 -1
  705. package/dist/mcp/connectors/gdrive.d.ts +0 -2
  706. package/dist/mcp/connectors/gdrive.js +0 -20
  707. package/dist/mcp/connectors/gdrive.js.map +0 -1
  708. package/dist/mcp/connectors/granola.d.ts +0 -2
  709. package/dist/mcp/connectors/granola.js +0 -12
  710. package/dist/mcp/connectors/granola.js.map +0 -1
  711. package/dist/mcp/connectors/linear.d.ts +0 -2
  712. package/dist/mcp/connectors/linear.js +0 -19
  713. package/dist/mcp/connectors/linear.js.map +0 -1
  714. package/dist/mcp/connectors/obsidian.d.ts +0 -2
  715. package/dist/mcp/connectors/obsidian.js +0 -19
  716. package/dist/mcp/connectors/obsidian.js.map +0 -1
  717. package/dist/mcp/connectors/pipedrive.d.ts +0 -2
  718. package/dist/mcp/connectors/pipedrive.js +0 -20
  719. package/dist/mcp/connectors/pipedrive.js.map +0 -1
  720. package/dist/mcp/connectors/slack.d.ts +0 -2
  721. package/dist/mcp/connectors/slack.js +0 -21
  722. package/dist/mcp/connectors/slack.js.map +0 -1
  723. package/dist/mcp/server-oauth-provider.d.ts +0 -56
  724. package/dist/mcp/server-oauth-provider.js +0 -142
  725. package/dist/mcp/server-oauth-provider.js.map +0 -1
  726. package/dist/server/agents/agent-loader.d.ts +0 -16
  727. package/dist/server/agents/agent-loader.js +0 -175
  728. package/dist/server/agents/agent-loader.js.map +0 -1
  729. package/dist/server/agents/agent-runner.d.ts +0 -33
  730. package/dist/server/agents/agent-runner.js +0 -187
  731. package/dist/server/agents/agent-runner.js.map +0 -1
  732. package/dist/server/agents/agent-runtime.d.ts +0 -39
  733. package/dist/server/agents/agent-runtime.js +0 -214
  734. package/dist/server/agents/agent-runtime.js.map +0 -1
  735. package/dist/server/agents/base-agent.d.ts +0 -30
  736. package/dist/server/agents/base-agent.js +0 -88
  737. package/dist/server/agents/base-agent.js.map +0 -1
  738. package/dist/server/agents/executive-digest.d.ts +0 -16
  739. package/dist/server/agents/executive-digest.js +0 -115
  740. package/dist/server/agents/executive-digest.js.map +0 -1
  741. package/dist/server/agents/graph-steward.d.ts +0 -16
  742. package/dist/server/agents/graph-steward.js +0 -59
  743. package/dist/server/agents/graph-steward.js.map +0 -1
  744. package/dist/server/agents/meeting-followup.d.ts +0 -16
  745. package/dist/server/agents/meeting-followup.js +0 -88
  746. package/dist/server/agents/meeting-followup.js.map +0 -1
  747. package/dist/server/agents/pipeline-monitor.d.ts +0 -15
  748. package/dist/server/agents/pipeline-monitor.js +0 -86
  749. package/dist/server/agents/pipeline-monitor.js.map +0 -1
  750. package/dist/server/agents/types.d.ts +0 -81
  751. package/dist/server/agents/types.js +0 -41
  752. package/dist/server/agents/types.js.map +0 -1
  753. package/dist/server/chrome/chrome.css +0 -691
  754. package/dist/server/chrome/chrome.js +0 -374
  755. package/dist/server/collab-authority.d.ts +0 -70
  756. package/dist/server/collab-authority.js +0 -218
  757. package/dist/server/collab-authority.js.map +0 -1
  758. package/dist/server/collab.d.ts +0 -29
  759. package/dist/server/collab.js +0 -195
  760. package/dist/server/collab.js.map +0 -1
  761. package/dist/server/commit-scheduler.d.ts +0 -39
  762. package/dist/server/commit-scheduler.js +0 -113
  763. package/dist/server/commit-scheduler.js.map +0 -1
  764. package/dist/server/plugin-loader.d.ts +0 -53
  765. package/dist/server/plugin-loader.js +0 -155
  766. package/dist/server/plugin-loader.js.map +0 -1
  767. package/dist/server/routes/agents-api.d.ts +0 -10
  768. package/dist/server/routes/agents-api.js +0 -25
  769. package/dist/server/routes/agents-api.js.map +0 -1
  770. package/dist/server/routes/collab.d.ts +0 -6
  771. package/dist/server/routes/collab.js +0 -10
  772. package/dist/server/routes/collab.js.map +0 -1
  773. package/dist/server/routes/git-api.d.ts +0 -9
  774. package/dist/server/routes/git-api.js +0 -82
  775. package/dist/server/routes/git-api.js.map +0 -1
  776. package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
  777. package/dist/server/routes/meeting-ingest-api.js +0 -98
  778. package/dist/server/routes/meeting-ingest-api.js.map +0 -1
  779. package/dist/server/routes/sync-api.d.ts +0 -26
  780. package/dist/server/routes/sync-api.js +0 -848
  781. package/dist/server/routes/sync-api.js.map +0 -1
  782. package/dist/server/routes/webhook.d.ts +0 -14
  783. package/dist/server/routes/webhook.js +0 -102
  784. package/dist/server/routes/webhook.js.map +0 -1
  785. package/dist/services/batch-processor.d.ts +0 -49
  786. package/dist/services/batch-processor.js +0 -166
  787. package/dist/services/batch-processor.js.map +0 -1
  788. package/dist/services/csv-service.d.ts +0 -36
  789. package/dist/services/csv-service.js +0 -143
  790. package/dist/services/csv-service.js.map +0 -1
  791. package/dist/services/github-provisioner.d.ts +0 -36
  792. package/dist/services/github-provisioner.js +0 -126
  793. package/dist/services/github-provisioner.js.map +0 -1
  794. package/dist/services/github-service.d.ts +0 -99
  795. package/dist/services/github-service.js +0 -310
  796. package/dist/services/github-service.js.map +0 -1
  797. package/dist/services/image-import-service.d.ts +0 -24
  798. package/dist/services/image-import-service.js +0 -108
  799. package/dist/services/image-import-service.js.map +0 -1
  800. package/dist/services/insights.d.ts +0 -38
  801. package/dist/services/insights.js +0 -269
  802. package/dist/services/insights.js.map +0 -1
  803. package/dist/services/meeting-processor.d.ts +0 -91
  804. package/dist/services/meeting-processor.js +0 -331
  805. package/dist/services/meeting-processor.js.map +0 -1
  806. package/dist/services/sync/collection-sync.d.ts +0 -60
  807. package/dist/services/sync/collection-sync.js +0 -509
  808. package/dist/services/sync/collection-sync.js.map +0 -1
  809. package/dist/services/sync/commit.d.ts +0 -60
  810. package/dist/services/sync/commit.js +0 -354
  811. package/dist/services/sync/commit.js.map +0 -1
  812. package/dist/services/sync/context-index.d.ts +0 -69
  813. package/dist/services/sync/context-index.js +0 -280
  814. package/dist/services/sync/context-index.js.map +0 -1
  815. package/dist/services/sync/data-fetcher.d.ts +0 -31
  816. package/dist/services/sync/data-fetcher.js +0 -12
  817. package/dist/services/sync/data-fetcher.js.map +0 -1
  818. package/dist/services/sync/derive.d.ts +0 -34
  819. package/dist/services/sync/derive.js +0 -164
  820. package/dist/services/sync/derive.js.map +0 -1
  821. package/dist/services/sync/enrichment-state.d.ts +0 -31
  822. package/dist/services/sync/enrichment-state.js +0 -63
  823. package/dist/services/sync/enrichment-state.js.map +0 -1
  824. package/dist/services/sync/enrichment.d.ts +0 -25
  825. package/dist/services/sync/enrichment.js +0 -121
  826. package/dist/services/sync/enrichment.js.map +0 -1
  827. package/dist/services/sync/entity-refresh.d.ts +0 -30
  828. package/dist/services/sync/entity-refresh.js +0 -275
  829. package/dist/services/sync/entity-refresh.js.map +0 -1
  830. package/dist/services/sync/frontmatter-extractor.d.ts +0 -40
  831. package/dist/services/sync/frontmatter-extractor.js +0 -279
  832. package/dist/services/sync/frontmatter-extractor.js.map +0 -1
  833. package/dist/services/sync/graph-match-state.d.ts +0 -33
  834. package/dist/services/sync/graph-match-state.js +0 -61
  835. package/dist/services/sync/graph-match-state.js.map +0 -1
  836. package/dist/services/sync/graph-match.d.ts +0 -53
  837. package/dist/services/sync/graph-match.js +0 -316
  838. package/dist/services/sync/graph-match.js.map +0 -1
  839. package/dist/services/sync/graphrag-client.d.ts +0 -43
  840. package/dist/services/sync/graphrag-client.js +0 -94
  841. package/dist/services/sync/graphrag-client.js.map +0 -1
  842. package/dist/services/sync/graphrag-config.d.ts +0 -16
  843. package/dist/services/sync/graphrag-config.js +0 -39
  844. package/dist/services/sync/graphrag-config.js.map +0 -1
  845. package/dist/services/sync/graphrag-context.d.ts +0 -14
  846. package/dist/services/sync/graphrag-context.js +0 -109
  847. package/dist/services/sync/graphrag-context.js.map +0 -1
  848. package/dist/services/sync/graphrag-indexer.d.ts +0 -30
  849. package/dist/services/sync/graphrag-indexer.js +0 -358
  850. package/dist/services/sync/graphrag-indexer.js.map +0 -1
  851. package/dist/services/sync/llm.d.ts +0 -32
  852. package/dist/services/sync/llm.js +0 -115
  853. package/dist/services/sync/llm.js.map +0 -1
  854. package/dist/services/sync/mcp-client.d.ts +0 -71
  855. package/dist/services/sync/mcp-client.js +0 -299
  856. package/dist/services/sync/mcp-client.js.map +0 -1
  857. package/dist/services/sync/model-factory.d.ts +0 -13
  858. package/dist/services/sync/model-factory.js +0 -38
  859. package/dist/services/sync/model-factory.js.map +0 -1
  860. package/dist/services/sync/name-quality.d.ts +0 -31
  861. package/dist/services/sync/name-quality.js +0 -60
  862. package/dist/services/sync/name-quality.js.map +0 -1
  863. package/dist/services/sync/output-schemas.d.ts +0 -92
  864. package/dist/services/sync/output-schemas.js +0 -43
  865. package/dist/services/sync/output-schemas.js.map +0 -1
  866. package/dist/services/sync/prompts.d.ts +0 -19
  867. package/dist/services/sync/prompts.js +0 -128
  868. package/dist/services/sync/prompts.js.map +0 -1
  869. package/dist/services/sync/reconciler.d.ts +0 -48
  870. package/dist/services/sync/reconciler.js +0 -294
  871. package/dist/services/sync/reconciler.js.map +0 -1
  872. package/dist/services/sync/rest-client.d.ts +0 -40
  873. package/dist/services/sync/rest-client.js +0 -100
  874. package/dist/services/sync/rest-client.js.map +0 -1
  875. package/dist/services/sync/source-config.d.ts +0 -67
  876. package/dist/services/sync/source-config.js +0 -304
  877. package/dist/services/sync/source-config.js.map +0 -1
  878. package/dist/services/sync/source-definitions/asana.d.ts +0 -14
  879. package/dist/services/sync/source-definitions/asana.js +0 -42
  880. package/dist/services/sync/source-definitions/asana.js.map +0 -1
  881. package/dist/services/sync/source-definitions/definitions.d.ts +0 -8
  882. package/dist/services/sync/source-definitions/definitions.js +0 -8
  883. package/dist/services/sync/source-definitions/definitions.js.map +0 -1
  884. package/dist/services/sync/source-definitions/gdrive.d.ts +0 -16
  885. package/dist/services/sync/source-definitions/gdrive.js +0 -68
  886. package/dist/services/sync/source-definitions/gdrive.js.map +0 -1
  887. package/dist/services/sync/source-definitions/granola.d.ts +0 -2
  888. package/dist/services/sync/source-definitions/granola.js +0 -21
  889. package/dist/services/sync/source-definitions/granola.js.map +0 -1
  890. package/dist/services/sync/source-definitions/linear.d.ts +0 -2
  891. package/dist/services/sync/source-definitions/linear.js +0 -62
  892. package/dist/services/sync/source-definitions/linear.js.map +0 -1
  893. package/dist/services/sync/source-definitions/obsidian.d.ts +0 -2
  894. package/dist/services/sync/source-definitions/obsidian.js +0 -55
  895. package/dist/services/sync/source-definitions/obsidian.js.map +0 -1
  896. package/dist/services/sync/source-definitions/pipedrive.d.ts +0 -2
  897. package/dist/services/sync/source-definitions/pipedrive.js +0 -43
  898. package/dist/services/sync/source-definitions/pipedrive.js.map +0 -1
  899. package/dist/services/sync/staging.d.ts +0 -53
  900. package/dist/services/sync/staging.js +0 -130
  901. package/dist/services/sync/staging.js.map +0 -1
  902. package/dist/services/sync/structured-extractor.d.ts +0 -57
  903. package/dist/services/sync/structured-extractor.js +0 -584
  904. package/dist/services/sync/structured-extractor.js.map +0 -1
  905. package/dist/services/sync/sync-runner.d.ts +0 -32
  906. package/dist/services/sync/sync-runner.js +0 -195
  907. package/dist/services/sync/sync-runner.js.map +0 -1
  908. package/dist/services/sync/sync-state.d.ts +0 -43
  909. package/dist/services/sync/sync-state.js +0 -154
  910. package/dist/services/sync/sync-state.js.map +0 -1
  911. package/dist/services/sync/types.d.ts +0 -381
  912. package/dist/services/sync/types.js +0 -8
  913. package/dist/services/sync/types.js.map +0 -1
  914. package/dist/services/sync/unstructured-extractor.d.ts +0 -27
  915. package/dist/services/sync/unstructured-extractor.js +0 -185
  916. package/dist/services/sync/unstructured-extractor.js.map +0 -1
  917. package/dist/utils/merge-resolver.d.ts +0 -59
  918. package/dist/utils/merge-resolver.js +0 -303
  919. package/dist/utils/merge-resolver.js.map +0 -1
  920. package/dist/utils/workspace-config.d.ts +0 -8
  921. package/dist/utils/workspace-config.js +0 -22
  922. package/dist/utils/workspace-config.js.map +0 -1
  923. package/dist/web/_app/immutable/assets/0.QUqBcyuu.css +0 -1
  924. package/dist/web/_app/immutable/assets/11.2jzI3cZY.css +0 -1
  925. package/dist/web/_app/immutable/assets/12.CT4xL4K3.css +0 -1
  926. package/dist/web/_app/immutable/assets/13.BUrHkYry.css +0 -1
  927. package/dist/web/_app/immutable/assets/2.5jNm7Pm1.css +0 -1
  928. package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
  929. package/dist/web/_app/immutable/assets/4.BjPwtpNd.css +0 -1
  930. package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
  931. package/dist/web/_app/immutable/assets/6.DXZr_rI_.css +0 -1
  932. package/dist/web/_app/immutable/assets/GraphView.D9ePpZez.css +0 -1
  933. package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
  934. package/dist/web/_app/immutable/assets/ViewToolbar.CZjsdjy4.css +0 -1
  935. package/dist/web/_app/immutable/assets/WorkspaceView.B-1DbivC.css +0 -1
  936. package/dist/web/_app/immutable/assets/wikilinks.CtSydmQl.css +0 -1
  937. package/dist/web/_app/immutable/chunks/3--t-YNA.js +0 -1
  938. package/dist/web/_app/immutable/chunks/5OU-4caN.js +0 -1
  939. package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
  940. package/dist/web/_app/immutable/chunks/B6FUcAv5.js +0 -1
  941. package/dist/web/_app/immutable/chunks/B9gDgSlp.js +0 -1
  942. package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
  943. package/dist/web/_app/immutable/chunks/BFtIWl5z.js +0 -1
  944. package/dist/web/_app/immutable/chunks/BHKpz6_7.js +0 -1
  945. package/dist/web/_app/immutable/chunks/BNfrhBeA.js +0 -1
  946. package/dist/web/_app/immutable/chunks/BgO5HlCg.js +0 -2
  947. package/dist/web/_app/immutable/chunks/BqnODQDb.js +0 -1
  948. package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
  949. package/dist/web/_app/immutable/chunks/BvIFhEn7.js +0 -2
  950. package/dist/web/_app/immutable/chunks/BvfdTHv8.js +0 -1
  951. package/dist/web/_app/immutable/chunks/BxGm65PH.js +0 -1
  952. package/dist/web/_app/immutable/chunks/BxyxnEKw.js +0 -1
  953. package/dist/web/_app/immutable/chunks/BygFIGq4.js +0 -1
  954. package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
  955. package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
  956. package/dist/web/_app/immutable/chunks/CIb_hHMy.js +0 -1
  957. package/dist/web/_app/immutable/chunks/CNKK6nZb.js +0 -1
  958. package/dist/web/_app/immutable/chunks/CQ5FjHZK.js +0 -1
  959. package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
  960. package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
  961. package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
  962. package/dist/web/_app/immutable/chunks/CaEaeeKb.js +0 -1
  963. package/dist/web/_app/immutable/chunks/Ch6e_wpP.js +0 -1
  964. package/dist/web/_app/immutable/chunks/Ci4zzCVB.js +0 -2
  965. package/dist/web/_app/immutable/chunks/CknqBVQE.js +0 -1
  966. package/dist/web/_app/immutable/chunks/Cmfiirqp.js +0 -4
  967. package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
  968. package/dist/web/_app/immutable/chunks/CrFpCC6p.js +0 -1
  969. package/dist/web/_app/immutable/chunks/CxX8hcT6.js +0 -1
  970. package/dist/web/_app/immutable/chunks/D0T1ps1G.js +0 -1
  971. package/dist/web/_app/immutable/chunks/D2ZEj9xD.js +0 -1
  972. package/dist/web/_app/immutable/chunks/D3sy0IkA.js +0 -2
  973. package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
  974. package/dist/web/_app/immutable/chunks/DHWoAC4y.js +0 -1
  975. package/dist/web/_app/immutable/chunks/DYYBfXU3.js +0 -1
  976. package/dist/web/_app/immutable/chunks/DiNPRA8T.js +0 -1
  977. package/dist/web/_app/immutable/chunks/DkjsqHkM.js +0 -1
  978. package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
  979. package/dist/web/_app/immutable/chunks/DpMCynC3.js +0 -1
  980. package/dist/web/_app/immutable/chunks/DqrybUuA.js +0 -1
  981. package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
  982. package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
  983. package/dist/web/_app/immutable/chunks/O9MAeAgV.js +0 -5
  984. package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
  985. package/dist/web/_app/immutable/chunks/SKSQ4m85.js +0 -2
  986. package/dist/web/_app/immutable/chunks/WEBTyD-H.js +0 -1
  987. package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
  988. package/dist/web/_app/immutable/chunks/bBXT5iJP.js +0 -1
  989. package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
  990. package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
  991. package/dist/web/_app/immutable/chunks/xkNhbnff.js +0 -1
  992. package/dist/web/_app/immutable/chunks/zoVX1Zab.js +0 -1
  993. package/dist/web/_app/immutable/entry/app.GfE4z2GO.js +0 -2
  994. package/dist/web/_app/immutable/entry/start.H-LFJK9u.js +0 -1
  995. package/dist/web/_app/immutable/nodes/0.Bwi7tTNC.js +0 -2
  996. package/dist/web/_app/immutable/nodes/1.DgNJPEWk.js +0 -1
  997. package/dist/web/_app/immutable/nodes/10.BW_XCD2O.js +0 -1
  998. package/dist/web/_app/immutable/nodes/11.DM7RX3Ms.js +0 -1
  999. package/dist/web/_app/immutable/nodes/12.DKgssZo8.js +0 -1
  1000. package/dist/web/_app/immutable/nodes/13.DCdmTre-.js +0 -1
  1001. package/dist/web/_app/immutable/nodes/2.DOA5QBVG.js +0 -266
  1002. package/dist/web/_app/immutable/nodes/3.bpoHQwAI.js +0 -5
  1003. package/dist/web/_app/immutable/nodes/4.ye0Vy7A1.js +0 -11
  1004. package/dist/web/_app/immutable/nodes/5.rxpnYrx_.js +0 -4
  1005. package/dist/web/_app/immutable/nodes/6.DP8HSxtc.js +0 -1
  1006. package/dist/web/_app/immutable/nodes/7.C1h4Bf-E.js +0 -1
  1007. package/dist/web/_app/immutable/nodes/8.BzmQ7S7Y.js +0 -1
  1008. package/dist/web/_app/immutable/nodes/9.CEakpXpF.js +0 -1
@@ -1,848 +0,0 @@
1
- /**
2
- * Sync API routes
3
- *
4
- * REST endpoints for collection-scoped sync:
5
- * POST /api/repos/:repo/sync — run sync for a collection
6
- * POST /api/repos/:repo/entities/:type/:id/refresh — get refresh diff
7
- * POST /api/repos/:repo/entities/:type/:id/refresh/apply — apply refresh
8
- * GET /api/repos/:repo/sync/status — sync config and last sync time
9
- * GET /api/sources — list source definitions
10
- * GET /api/sources/:name — get a single source definition
11
- * POST /api/sources/:name — create/update source definition
12
- * DELETE /api/sources/:name — remove source definition
13
- * GET /api/connectors — list available MCP connectors
14
- * GET /api/connectors/:name/config — get connector config (secrets masked)
15
- * POST /api/connectors/:name/config — create/update connector config
16
- * DELETE /api/connectors/:name/config — remove connector config
17
- * POST /api/connectors/:name/oauth/authorize — initiate OAuth flow
18
- * GET /api/oauth/callback/:name — OAuth callback (browser redirect)
19
- * GET /api/connectors/:name/oauth/status — poll OAuth connection status
20
- * POST /api/connectors/:name/oauth/disconnect — clear OAuth tokens
21
- */
22
- import { Workspace } from '../../core/workspace.js';
23
- import { syncRepo, syncSource } from '../../services/sync/collection-sync.js';
24
- import { refreshEntity } from '../../services/sync/entity-refresh.js';
25
- import { SourceConfigManager } from '../../services/sync/source-config.js';
26
- import { ConnectorManager, KNOWN_CONNECTORS } from '../../mcp/connector-manager.js';
27
- import { ServerOAuthProvider, decodeOAuthState } from '../../mcp/server-oauth-provider.js';
28
- import { auth as mcpAuth } from '@modelcontextprotocol/sdk/client/auth.js';
29
- /**
30
- * Creates a fetch wrapper for OAuth that handles providers with broken or missing
31
- * metadata discovery endpoints. When custom OAuth endpoints are configured, returns
32
- * synthetic metadata so the SDK uses the correct authorize/token URLs.
33
- */
34
- function createOAuthFetch(oauthApp) {
35
- return async (input, init) => {
36
- const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
37
- // Intercept .well-known discovery requests
38
- if (url.includes('.well-known/')) {
39
- // If we have custom endpoints, return synthetic metadata
40
- if (oauthApp?.authorization_endpoint && oauthApp?.token_endpoint) {
41
- const metadata = {
42
- issuer: new URL(oauthApp.authorization_endpoint).origin,
43
- authorization_endpoint: oauthApp.authorization_endpoint,
44
- token_endpoint: oauthApp.token_endpoint,
45
- response_types_supported: ['code'],
46
- code_challenge_methods_supported: ['S256'],
47
- };
48
- return new Response(JSON.stringify(metadata), {
49
- status: 200,
50
- headers: { 'Content-Type': 'application/json' },
51
- });
52
- }
53
- // Otherwise, try the real endpoint but convert 5xx to 404
54
- const res = await fetch(input, init);
55
- if (res.status >= 500) {
56
- return new Response(null, { status: 404 });
57
- }
58
- return res;
59
- }
60
- return fetch(input, init);
61
- };
62
- }
63
- import { SOURCE_DEFINITIONS } from '../../services/sync/source-definitions/definitions.js';
64
- import { join } from 'path';
65
- /** Check if the current user is an admin (or API key mode). */
66
- function isAdmin(req) {
67
- const user = req.user;
68
- if (!user)
69
- return true; // API key / open mode
70
- return user.role === 'admin';
71
- }
72
- /** Check if user can access a repo (admin, or has collection access, or owns private collection). */
73
- function hasRepoAccess(req, repoName, workspaceManager, authService) {
74
- const user = req.user;
75
- if (!user)
76
- return true; // API key / open mode
77
- const repoConfig = workspaceManager.getRepoConfig(repoName);
78
- if (repoConfig?.private && repoConfig?.owner_id === user.id)
79
- return true;
80
- if (user.role === 'admin')
81
- return true;
82
- return authService.getUserCollections(user.id).includes(repoName);
83
- }
84
- /** Check if user can run sync on a repo (admin for shared, owner for private). */
85
- function canSync(req, repoName, workspaceManager, authService) {
86
- const user = req.user;
87
- if (!user)
88
- return true; // API key / open mode
89
- const repoConfig = workspaceManager.getRepoConfig(repoName);
90
- if (repoConfig?.private && repoConfig?.owner_id === user.id)
91
- return true;
92
- return user.role === 'admin';
93
- }
94
- export async function registerSyncApiRoutes(fastify, workspaceManager, authService, workspacePath, wsHub) {
95
- // POST /api/repos/:repo/sync — run all sync rules that apply to a collection
96
- // (collection-level rules + any workspace-level rules targeting this collection)
97
- fastify.post('/api/repos/:repo/sync', async (req, reply) => {
98
- const { repo } = req.params;
99
- if (!canSync(req, repo, workspaceManager, authService)) {
100
- return reply.status(403).send({ error: 'Only admins can sync shared collections' });
101
- }
102
- const actor = req.user?.displayName ?? 'sync';
103
- const progress = (msg) => {
104
- console.log(`[sync] ${msg}`);
105
- wsHub?.broadcast({ type: 'sync_progress', repo, message: msg, actor, timestamp: new Date().toISOString() });
106
- };
107
- try {
108
- const workspace = new Workspace(workspacePath);
109
- const config = await workspace.loadConfig();
110
- const user = req.user;
111
- const { results } = await syncRepo({
112
- workspacePath,
113
- collectionName: repo,
114
- workspaceConfig: config,
115
- schemaExtensions: config.schema_extensions,
116
- onProgress: progress,
117
- userId: user?.id,
118
- authService,
119
- serverUrl: await getServerUrl(req),
120
- });
121
- const allCreated = results.reduce((s, r) => r.targets.reduce((ts, t) => ts + t.created, 0) + s, 0);
122
- const sources = results.map(r => r.source).join(', ') || repo;
123
- wsHub?.broadcast({
124
- type: 'sync_complete',
125
- repo,
126
- source: sources,
127
- created: allCreated,
128
- updated: 0,
129
- deleted: 0,
130
- actor,
131
- timestamp: new Date().toISOString(),
132
- });
133
- return { success: true, results };
134
- }
135
- catch (err) {
136
- return reply.status(400).send({
137
- success: false,
138
- error: err instanceof Error ? err.message : 'Unknown error',
139
- });
140
- }
141
- });
142
- // POST /api/repos/:repo/import — import files as entities (any authenticated user)
143
- fastify.post('/api/repos/:repo/import', async (req, reply) => {
144
- const { repo } = req.params;
145
- if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
146
- return reply.status(403).send({ error: 'Access denied' });
147
- }
148
- try {
149
- const { importFile, isSupportedFile } = await import('../../services/import-service.js');
150
- const graph = workspaceManager.getGraph(repo);
151
- const results = [];
152
- // Accept JSON body with files array: [{ filename, content }]
153
- const body = req.body;
154
- if (!body?.files || !Array.isArray(body.files)) {
155
- return reply.status(400).send({ error: 'Expected { files: [{ filename, content }] }' });
156
- }
157
- for (const file of body.files) {
158
- if (!file.filename || !isSupportedFile(file.filename)) {
159
- results.push({ entityId: '', entityType: '', status: 'error', error: `Unsupported file: ${file.filename}` });
160
- continue;
161
- }
162
- const result = await importFile(graph, file.filename, file.content);
163
- results.push(result);
164
- }
165
- // Commit all imported entities in one go
166
- const created = results.filter(r => r.status === 'created').length;
167
- if (created > 0) {
168
- const { spawnSync } = await import('child_process');
169
- const repoConfig = workspaceManager.getRepoConfig(repo);
170
- const repoPath = repoConfig ? join(workspacePath, repoConfig.path) : join(workspacePath, repo);
171
- spawnSync('git', ['add', '-A'], { cwd: repoPath, stdio: 'ignore' });
172
- spawnSync('git', ['-c', 'user.name=Studiograph Import', '-c', 'user.email=import@studiograph.local', 'commit', '-m', `import: ${created} entities`], { cwd: repoPath, stdio: 'ignore' });
173
- }
174
- return {
175
- success: true,
176
- imported: created,
177
- skipped: results.filter(r => r.status === 'skipped').length,
178
- errors: results.filter(r => r.status === 'error').map(r => r.error),
179
- results,
180
- };
181
- }
182
- catch (err) {
183
- return reply.status(400).send({
184
- success: false,
185
- error: err instanceof Error ? err.message : 'Unknown error',
186
- });
187
- }
188
- });
189
- // POST /api/repos/:repo/import/batch — batch import with LLM processing
190
- fastify.post('/api/repos/:repo/import/batch', async (req, reply) => {
191
- const { repo } = req.params;
192
- if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
193
- return reply.status(403).send({ error: 'Access denied' });
194
- }
195
- try {
196
- const { processBatch } = await import('../../services/batch-processor.js');
197
- const graph = workspaceManager.getGraph(repo);
198
- const schemaRegistry = workspaceManager.getSchemaRegistry();
199
- const body = req.body;
200
- if (!body?.files || !Array.isArray(body.files)) {
201
- return reply.status(400).send({ error: 'Expected { files: [{ filename, content }] }' });
202
- }
203
- const user = req.user;
204
- const gitUser = user
205
- ? { id: String(user.id), name: user.displayName ?? user.email, email: user.email }
206
- : { id: 'import', name: 'Studiograph Import', email: 'import@studiograph.local' };
207
- const results = await processBatch(body.files, graph, schemaRegistry, undefined, gitUser);
208
- const created = results.filter(r => r.status === 'created').length;
209
- return {
210
- success: true,
211
- imported: created,
212
- errors: results.filter(r => r.status === 'error').map(r => r.error),
213
- results,
214
- };
215
- }
216
- catch (err) {
217
- return reply.status(400).send({
218
- success: false,
219
- error: err instanceof Error ? err.message : 'Unknown error',
220
- });
221
- }
222
- });
223
- // POST /api/sync — run all sync rules (collection-level + workspace-level)
224
- fastify.post('/api/sync', async (req, reply) => {
225
- if (!isAdmin(req)) {
226
- return reply.status(403).send({ error: 'Admin access required' });
227
- }
228
- const user = req.user;
229
- const actor = user?.displayName ?? 'sync';
230
- try {
231
- const workspace = new Workspace(workspacePath);
232
- const config = await workspace.loadConfig();
233
- const sUrl = await getServerUrl(req);
234
- const results = [];
235
- // All events from the global sync are keyed to 'workspace' so the sidebar
236
- // toast (started with startSyncToast('workspace')) receives progress updates.
237
- const broadcast = (msg) => {
238
- console.log(`[sync] ${msg}`);
239
- wsHub?.broadcast({ type: 'sync_progress', repo: 'workspace', message: msg, actor, timestamp: new Date().toISOString() });
240
- };
241
- const authCtx = { userId: user?.id, authService, serverUrl: sUrl };
242
- // Group collection-level rules by (source, entity_type) so each source is
243
- // fetched exactly once and results are distributed to all matching collections.
244
- const grouped = new Map();
245
- for (const repo of config.repos) {
246
- const collectionRules = repo.sync;
247
- if (!collectionRules || collectionRules.length === 0)
248
- continue;
249
- for (const rule of collectionRules) {
250
- const key = `${rule.source}::${rule.entity_type ?? ''}`;
251
- if (!grouped.has(key)) {
252
- grouped.set(key, { source: rule.source, entity_type: rule.entity_type, targets: [] });
253
- }
254
- grouped.get(key).targets.push({ repo: repo.name, filter: rule.filter });
255
- }
256
- }
257
- // Run each group as a single sync source call (one fetch, N writes)
258
- for (const syntheticRule of grouped.values()) {
259
- try {
260
- results.push(await syncSource({
261
- workspacePath,
262
- rule: syntheticRule,
263
- workspaceConfig: config,
264
- schemaExtensions: config.schema_extensions,
265
- onProgress: broadcast,
266
- ...authCtx,
267
- }));
268
- }
269
- catch (err) {
270
- const msg = err instanceof Error ? err.message : String(err);
271
- results.push({ source: syntheticRule.source, targets: syntheticRule.targets.map((t) => ({ repo: t.repo, created: 0, skipped: 0, derived: 0, errors: [msg] })) });
272
- }
273
- }
274
- // Run explicit workspace-level rules from config.sync
275
- for (const rule of config.sync ?? []) {
276
- try {
277
- results.push(await syncSource({
278
- workspacePath,
279
- rule,
280
- workspaceConfig: config,
281
- schemaExtensions: config.schema_extensions,
282
- onProgress: broadcast,
283
- ...authCtx,
284
- }));
285
- }
286
- catch (err) {
287
- const msg = err instanceof Error ? err.message : String(err);
288
- results.push({ source: rule.source, targets: rule.targets.map((t) => ({ repo: t.repo, created: 0, skipped: 0, derived: 0, errors: [msg] })) });
289
- }
290
- }
291
- return { success: true, results };
292
- }
293
- catch (err) {
294
- return reply.status(400).send({
295
- success: false,
296
- error: err instanceof Error ? err.message : 'Unknown error',
297
- });
298
- }
299
- });
300
- // POST /api/repos/:repo/entities/:type/:id/refresh — get refresh diff
301
- fastify.post('/api/repos/:repo/entities/:type/:id/refresh', async (req, reply) => {
302
- const { repo, type, id } = req.params;
303
- if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
304
- return reply.status(403).send({ error: 'Access denied' });
305
- }
306
- try {
307
- const workspace = new Workspace(workspacePath);
308
- const config = await workspace.loadConfig();
309
- const user = req.user;
310
- const result = await refreshEntity({
311
- workspacePath,
312
- collectionName: repo,
313
- entityType: type,
314
- entityId: id,
315
- workspaceConfig: config,
316
- schemaExtensions: config.schema_extensions,
317
- apply: false,
318
- userId: user?.id,
319
- authService,
320
- serverUrl: getServerUrl(req),
321
- });
322
- return { success: true, result };
323
- }
324
- catch (err) {
325
- return reply.status(400).send({
326
- success: false,
327
- error: err instanceof Error ? err.message : 'Unknown error',
328
- });
329
- }
330
- });
331
- // POST /api/repos/:repo/entities/:type/:id/refresh/apply — apply refresh
332
- fastify.post('/api/repos/:repo/entities/:type/:id/refresh/apply', async (req, reply) => {
333
- const { repo, type, id } = req.params;
334
- if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
335
- return reply.status(403).send({ error: 'Access denied' });
336
- }
337
- try {
338
- const workspace = new Workspace(workspacePath);
339
- const config = await workspace.loadConfig();
340
- const user = req.user;
341
- const result = await refreshEntity({
342
- workspacePath,
343
- collectionName: repo,
344
- entityType: type,
345
- entityId: id,
346
- workspaceConfig: config,
347
- schemaExtensions: config.schema_extensions,
348
- apply: true,
349
- userId: user?.id,
350
- authService,
351
- serverUrl: getServerUrl(req),
352
- });
353
- return { success: true, result };
354
- }
355
- catch (err) {
356
- return reply.status(400).send({
357
- success: false,
358
- error: err instanceof Error ? err.message : 'Unknown error',
359
- });
360
- }
361
- });
362
- // GET /api/repos/:repo/sync/status — sync config and last sync time
363
- fastify.get('/api/repos/:repo/sync/status', async (req, reply) => {
364
- const { repo } = req.params;
365
- if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
366
- return reply.status(403).send({ error: 'Access denied' });
367
- }
368
- try {
369
- const workspace = new Workspace(workspacePath);
370
- const config = await workspace.loadConfig();
371
- const repoConfig = workspaceManager.getRepoConfig(repo);
372
- const syncRules = repoConfig?.sync;
373
- // Get synced entity count and last sync time
374
- let syncedCount = 0;
375
- let lastSync = null;
376
- try {
377
- const graph = workspaceManager.getGraph(repo);
378
- const entities = graph.list();
379
- for (const entity of entities) {
380
- const syncedAt = entity.data?.synced_at;
381
- if (syncedAt) {
382
- syncedCount++;
383
- if (!lastSync || syncedAt > lastSync)
384
- lastSync = syncedAt;
385
- }
386
- }
387
- }
388
- catch {
389
- // collection may be empty
390
- }
391
- const workspaceSyncRules = (config.sync ?? []).filter(r => r.targets.some(t => t.repo === repo));
392
- return {
393
- success: true,
394
- collection: repo,
395
- syncRules: syncRules ?? [],
396
- workspaceSyncRules,
397
- syncedCount,
398
- lastSync,
399
- };
400
- }
401
- catch (err) {
402
- return reply.status(400).send({
403
- success: false,
404
- error: err instanceof Error ? err.message : 'Unknown error',
405
- });
406
- }
407
- });
408
- // GET /api/sources — list all source definitions
409
- fastify.get('/api/sources', async (req, reply) => {
410
- if (!isAdmin(req)) {
411
- return reply.status(403).send({ error: 'Admin access required' });
412
- }
413
- const configMgr = new SourceConfigManager(workspacePath);
414
- const sources = [];
415
- const connectorConfigs = ConnectorManager.loadConfigs(workspacePath);
416
- // Scan on-disk source files
417
- const { readdirSync, existsSync } = await import('fs');
418
- const sourcesDir = join(workspacePath, '.studiograph', 'sources');
419
- const seen = new Set();
420
- if (existsSync(sourcesDir)) {
421
- for (const file of readdirSync(sourcesDir)) {
422
- if (!file.endsWith('.json'))
423
- continue;
424
- const name = file.replace('.json', '');
425
- seen.add(name);
426
- const def = configMgr.getDefinition(name);
427
- if (def) {
428
- const hasConfig = connectorConfigs.some(c => c.name === def.connector);
429
- const isKnownOAuth = KNOWN_CONNECTORS[def.connector]?.auth === 'oauth';
430
- sources.push({
431
- name,
432
- format: 'new',
433
- connector: def.connector,
434
- entityTypes: Object.keys(def.entities),
435
- localOnly: false,
436
- filterFields: def.filter_fields ?? [],
437
- configured: hasConfig || isKnownOAuth,
438
- });
439
- }
440
- else {
441
- const old = configMgr.get(name);
442
- if (old) {
443
- const hasConfig = connectorConfigs.some(c => c.name === old.connector);
444
- const isKnownOAuth = KNOWN_CONNECTORS[old.connector]?.auth === 'oauth';
445
- sources.push({
446
- name: old.name,
447
- format: 'legacy',
448
- connector: old.connector,
449
- entityTypes: old.entity_mappings.map(m => m.entity_type),
450
- localOnly: false,
451
- filterFields: SOURCE_DEFINITIONS[old.connector]?.filter_fields ?? [],
452
- configured: hasConfig || isKnownOAuth,
453
- });
454
- }
455
- }
456
- }
457
- }
458
- // Add built-in templates that don't have an on-disk file
459
- for (const [name, def] of Object.entries(SOURCE_DEFINITIONS)) {
460
- if (seen.has(name))
461
- continue;
462
- // A source is configured if: connector config exists on disk, OR it's a known OAuth connector
463
- // (OAuth connectors don't need manual config — users just click Connect)
464
- const hasConfig = connectorConfigs.some(c => c.name === def.connector);
465
- const isKnownOAuth = KNOWN_CONNECTORS[def.connector]?.auth === 'oauth';
466
- sources.push({
467
- name,
468
- format: 'new',
469
- connector: def.connector,
470
- entityTypes: Object.keys(def.entities),
471
- localOnly: false,
472
- filterFields: def.filter_fields ?? [],
473
- configured: hasConfig || isKnownOAuth,
474
- });
475
- }
476
- return { success: true, sources };
477
- });
478
- // GET /api/sources/:name — get a single source definition (full JSON)
479
- fastify.get('/api/sources/:name', async (req, reply) => {
480
- if (!isAdmin(req)) {
481
- return reply.status(403).send({ error: 'Admin access required' });
482
- }
483
- const { name } = req.params;
484
- const configMgr = new SourceConfigManager(workspacePath);
485
- const def = configMgr.getDefinition(name);
486
- if (def) {
487
- return { success: true, source: def };
488
- }
489
- const old = configMgr.get(name);
490
- if (old) {
491
- return { success: true, source: old };
492
- }
493
- return reply.status(404).send({ success: false, error: `Source "${name}" not found` });
494
- });
495
- // POST /api/sources/:name — create or update a source definition
496
- fastify.post('/api/sources/:name', async (req, reply) => {
497
- if (!isAdmin(req)) {
498
- return reply.status(403).send({ error: 'Admin access required' });
499
- }
500
- const { name } = req.params;
501
- const body = req.body;
502
- const configMgr = new SourceConfigManager(workspacePath);
503
- // Auto-create from built-in template
504
- if (body && body.fromTemplate === true) {
505
- const template = SOURCE_DEFINITIONS[name];
506
- if (!template) {
507
- return reply.status(400).send({
508
- success: false,
509
- error: `No built-in template found for "${name}"`,
510
- });
511
- }
512
- if (!template.entities || Object.keys(template.entities).length === 0) {
513
- return reply.status(400).send({
514
- success: false,
515
- error: `Template for "${name}" has no entity configs`,
516
- });
517
- }
518
- const savedDef = { ...template, name, enabled: true, added_at: new Date().toISOString() };
519
- configMgr.saveDefinition(name, savedDef);
520
- return { success: true, message: `Source "${name}" created from template` };
521
- }
522
- // Standard create/update with full definition
523
- const validation = configMgr.validateDefinition(body);
524
- if (!validation.valid) {
525
- return reply.status(400).send({
526
- success: false,
527
- errors: validation.errors,
528
- });
529
- }
530
- configMgr.saveDefinition(name, body);
531
- return { success: true, message: `Source "${name}" saved` };
532
- });
533
- // DELETE /api/sources/:name — remove a source definition
534
- fastify.delete('/api/sources/:name', async (req, reply) => {
535
- if (!isAdmin(req)) {
536
- return reply.status(403).send({ error: 'Admin access required' });
537
- }
538
- const { name } = req.params;
539
- const configMgr = new SourceConfigManager(workspacePath);
540
- const removed = configMgr.remove(name);
541
- if (removed) {
542
- return { success: true, message: `Source "${name}" removed` };
543
- }
544
- return reply.status(404).send({ success: false, error: `Source "${name}" not found` });
545
- });
546
- // GET /api/connectors — list known + installed MCP connectors with status
547
- fastify.get('/api/connectors', async (req, reply) => {
548
- const user = req.user;
549
- const userId = user?.id;
550
- const configMgr = new SourceConfigManager(workspacePath);
551
- const installedConfigs = ConnectorManager.loadConfigs(workspacePath);
552
- const installedMap = new Map(installedConfigs.map(c => [c.name, c]));
553
- const connectors = [];
554
- // 1. All known connectors (always listed)
555
- for (const [name, known] of Object.entries(KNOWN_CONNECTORS)) {
556
- const installed = installedMap.get(name);
557
- const hasSource = configMgr.getDefinition(name) !== null || configMgr.get(name) !== null;
558
- const template = SOURCE_DEFINITIONS[name];
559
- const hasTemplate = !!(template?.entities && Object.keys(template.entities).length > 0);
560
- // Connected if: OAuth tokens exist for this user, or manual headers present
561
- let connected = false;
562
- if (known.auth === 'oauth' && userId) {
563
- connected = authService.hasOAuthTokens(userId, name);
564
- }
565
- else if (known.auth === 'none') {
566
- connected = !!installed; // local connectors are "connected" when configured
567
- }
568
- else if (installed?.headers?.['Authorization']) {
569
- connected = true;
570
- }
571
- const secretEnv = known.oauth?.client_secret_env;
572
- const oauthConfigured = !secretEnv || !!process.env[secretEnv];
573
- connectors.push({
574
- name,
575
- url: known.url,
576
- description: installed?.description || known.description,
577
- configured: !!installed,
578
- connected,
579
- auth: known.auth,
580
- hasSource,
581
- hasTemplate,
582
- isKnown: true,
583
- oauthConfigured,
584
- });
585
- installedMap.delete(name);
586
- }
587
- // 2. Custom user-added connectors (not in KNOWN_CONNECTORS)
588
- for (const config of installedMap.values()) {
589
- const hasSource = configMgr.getDefinition(config.name) !== null || configMgr.get(config.name) !== null;
590
- const template = SOURCE_DEFINITIONS[config.name];
591
- const hasTemplate = !!(template?.entities && Object.keys(template.entities).length > 0);
592
- connectors.push({
593
- name: config.name,
594
- url: config.url,
595
- description: config.description || '',
596
- configured: true,
597
- connected: !!config.headers?.['Authorization'],
598
- auth: config.auth ?? 'headers',
599
- hasSource,
600
- hasTemplate,
601
- isKnown: false,
602
- oauthConfigured: true, // custom connectors don't use pre-registered OAuth
603
- });
604
- }
605
- return { success: true, connectors };
606
- });
607
- // GET /api/connectors/:name/config — get connector config with masked secrets
608
- fastify.get('/api/connectors/:name/config', async (req, reply) => {
609
- if (!isAdmin(req)) {
610
- return reply.status(403).send({ error: 'Admin access required' });
611
- }
612
- const { name } = req.params;
613
- const config = ConnectorManager.loadConfig(name, workspacePath);
614
- if (!config) {
615
- return { success: true, config: null };
616
- }
617
- // Mask Authorization header
618
- const masked = { ...config };
619
- if (masked.headers) {
620
- masked.headers = { ...masked.headers };
621
- for (const key of Object.keys(masked.headers)) {
622
- if (key.toLowerCase() === 'authorization') {
623
- masked.headers[key] = '••••••••';
624
- }
625
- }
626
- }
627
- return { success: true, config: masked };
628
- });
629
- // POST /api/connectors/:name/config — create or update connector config
630
- fastify.post('/api/connectors/:name/config', async (req, reply) => {
631
- if (!isAdmin(req)) {
632
- return reply.status(403).send({ error: 'Admin access required' });
633
- }
634
- const { name } = req.params;
635
- const body = req.body;
636
- if (!body || !body.url) {
637
- return reply.status(400).send({ error: 'url is required' });
638
- }
639
- const config = {
640
- name,
641
- url: body.url,
642
- headers: body.headers,
643
- description: body.description ?? name,
644
- };
645
- ConnectorManager.saveConfig(config);
646
- ConnectorManager.saveWorkspaceConfig(config, workspacePath);
647
- // Auto-create source definition from template if one exists
648
- const template = SOURCE_DEFINITIONS[name];
649
- if (template) {
650
- const configMgr = new SourceConfigManager(workspacePath);
651
- const existingSource = configMgr.getDefinition(name);
652
- if (!existingSource && template.entities && Object.keys(template.entities).length > 0) {
653
- const savedDef = { ...template, name, enabled: true, added_at: new Date().toISOString() };
654
- configMgr.saveDefinition(name, savedDef);
655
- }
656
- }
657
- return { success: true, message: `Connector "${name}" configured` };
658
- });
659
- // DELETE /api/connectors/:name/config — remove connector config
660
- fastify.delete('/api/connectors/:name/config', async (req, reply) => {
661
- if (!isAdmin(req)) {
662
- return reply.status(403).send({ error: 'Admin access required' });
663
- }
664
- const { name } = req.params;
665
- const removed = ConnectorManager.removeConfig(name, workspacePath);
666
- if (removed) {
667
- return { success: true, message: `Connector "${name}" removed` };
668
- }
669
- return reply.status(404).send({ success: false, error: `No config for "${name}"` });
670
- });
671
- // ── OAuth flow routes ────────────────────────────────────────────────────
672
- /** Resolve the server's public URL for OAuth callbacks. Uses request headers so it works on both localhost and production. */
673
- function getServerUrl(req) {
674
- const proto = req.headers['x-forwarded-proto'] || req.protocol || 'http';
675
- const host = req.headers['x-forwarded-host'] || req.headers.host || req.hostname;
676
- return `${proto}://${host}`;
677
- }
678
- // POST /api/connectors/:name/oauth/authorize — initiate OAuth flow
679
- fastify.post('/api/connectors/:name/oauth/authorize', async (req, reply) => {
680
- const user = req.user;
681
- if (!user)
682
- return reply.status(401).send({ error: 'Authentication required' });
683
- const { name } = req.params;
684
- const known = KNOWN_CONNECTORS[name];
685
- if (!known) {
686
- return reply.status(400).send({ error: `Unknown connector "${name}". OAuth is only available for known connectors.` });
687
- }
688
- // Ensure connector config exists
689
- let config = ConnectorManager.loadConfig(name, workspacePath);
690
- if (!config) {
691
- config = { name, url: known.url, auth: 'oauth', description: known.description };
692
- ConnectorManager.saveConfig(config);
693
- ConnectorManager.saveWorkspaceConfig(config, workspacePath);
694
- }
695
- const serverUrl = getServerUrl(req);
696
- const provider = new ServerOAuthProvider(name, user.id, authService, serverUrl, known.oauth);
697
- try {
698
- const result = await mcpAuth(provider, { serverUrl: known.url, fetchFn: createOAuthFetch(known.oauth) });
699
- if (result === 'AUTHORIZED') {
700
- // Already authorized (tokens valid)
701
- return { success: true, connected: true };
702
- }
703
- // result === 'REDIRECT' — provider.authorizationUrl is set
704
- if (!provider.authorizationUrl) {
705
- return reply.status(500).send({ error: 'OAuth flow did not produce an authorization URL' });
706
- }
707
- return { success: true, authorizationUrl: provider.authorizationUrl };
708
- }
709
- catch (err) {
710
- const msg = err instanceof Error ? err.message : String(err);
711
- console.error(`[oauth] authorize error for ${name}:`, msg);
712
- return reply.status(500).send({ error: `OAuth initialization failed: ${msg}` });
713
- }
714
- });
715
- // GET /api/oauth/callback/:name — OAuth callback (browser redirect from OAuth provider)
716
- // Public endpoint — user identity comes from the state parameter (cross-site redirects don't carry cookies).
717
- fastify.get('/api/oauth/callback/:name', async (req, reply) => {
718
- const { name } = req.params;
719
- try {
720
- const { code, state } = req.query;
721
- const known = KNOWN_CONNECTORS[name];
722
- if (!code) {
723
- const error = req.query.error || 'missing authorization code';
724
- return reply.type('text/html').send(`<html><body><h2>Authorization failed</h2><p>${error}</p><p>You can close this tab.</p></body></html>`);
725
- }
726
- if (!known) {
727
- return reply.status(400).type('text/html').send(`<html><body><h2>Unknown connector</h2><p>"${name}" is not a known connector.</p></body></html>`);
728
- }
729
- const decoded = state ? decodeOAuthState(state) : null;
730
- if (!decoded) {
731
- return reply.status(400).type('text/html').send('<html><body><h2>Authorization failed</h2><p>Invalid or missing state parameter. Please try connecting again.</p></body></html>');
732
- }
733
- const serverUrl = getServerUrl(req);
734
- const provider = new ServerOAuthProvider(decoded.connectorName, decoded.userId, authService, serverUrl, known?.oauth);
735
- await mcpAuth(provider, { serverUrl: known.url, authorizationCode: code, fetchFn: createOAuthFetch(known?.oauth) });
736
- return reply.type('text/html').send(`<html><body><h2>Connected to ${name}</h2><p>You can close this tab and return to Studiograph.</p></body></html>`);
737
- }
738
- catch (err) {
739
- const msg = err instanceof Error ? err.message : String(err);
740
- console.error(`[oauth] callback error for ${name}:`, msg);
741
- return reply.type('text/html').send(`<html><body><h2>Authorization failed</h2><p>${msg}</p><p>You can close this tab and try again.</p></body></html>`);
742
- }
743
- });
744
- // GET /api/connectors/:name/oauth/status — poll for OAuth connection status
745
- fastify.get('/api/connectors/:name/oauth/status', async (req, reply) => {
746
- const user = req.user;
747
- if (!user)
748
- return reply.status(401).send({ error: 'Authentication required' });
749
- const { name } = req.params;
750
- const connected = authService.hasOAuthTokens(user.id, name);
751
- const known = KNOWN_CONNECTORS[name];
752
- // Check if the required client secret env var is set on the server
753
- const secretEnv = known?.oauth?.client_secret_env;
754
- const oauthConfigured = !secretEnv || !!process.env[secretEnv];
755
- return { connected, oauthConfigured };
756
- });
757
- // POST /api/connectors/:name/oauth/disconnect — clear OAuth tokens
758
- fastify.post('/api/connectors/:name/oauth/disconnect', async (req, reply) => {
759
- const user = req.user;
760
- if (!user)
761
- return reply.status(401).send({ error: 'Authentication required' });
762
- const { name } = req.params;
763
- authService.clearOAuthData(user.id, name);
764
- return { success: true };
765
- });
766
- // GET /api/config/bundle — export all shareable workspace config (admin only)
767
- fastify.get('/api/config/bundle', async (req, reply) => {
768
- if (!isAdmin(req)) {
769
- return reply.status(403).send({ error: 'Admin access required' });
770
- }
771
- const { readdirSync, readFileSync, existsSync } = await import('fs');
772
- const workspace = new Workspace(workspacePath);
773
- const config = await workspace.loadConfig();
774
- const about = workspace.loadAbout();
775
- const seed = authService.getSeedData();
776
- // Source definitions
777
- const sources = {};
778
- const sourcesDir = join(workspacePath, '.studiograph', 'sources');
779
- if (existsSync(sourcesDir)) {
780
- for (const entry of readdirSync(sourcesDir)) {
781
- if (!entry.endsWith('.json'))
782
- continue;
783
- try {
784
- sources[entry.replace('.json', '')] = JSON.parse(readFileSync(join(sourcesDir, entry), 'utf-8'));
785
- }
786
- catch { /* skip malformed */ }
787
- }
788
- }
789
- // Workspace connector configs (already stripped of secrets)
790
- const connectors = ConnectorManager.loadWorkspaceConfigs(workspacePath);
791
- return reply.send({ workspace: config, about, authSeed: seed, sources, connectors });
792
- });
793
- // POST /api/config/bundle — import config bundle from a remote admin (admin only)
794
- fastify.post('/api/config/bundle', async (req, reply) => {
795
- if (!isAdmin(req)) {
796
- return reply.status(403).send({ error: 'Admin access required' });
797
- }
798
- const { mkdirSync, writeFileSync } = await import('fs');
799
- const bundle = req.body;
800
- if (!bundle) {
801
- return reply.status(400).send({ error: 'Request body is required' });
802
- }
803
- const sgDir = join(workspacePath, '.studiograph');
804
- const applied = [];
805
- // 1. Workspace config — merge: keep server-local fields, update shared fields
806
- if (bundle.workspace) {
807
- const workspace = new Workspace(workspacePath);
808
- const local = await workspace.loadConfig().catch(() => ({}));
809
- const merged = { ...local, ...bundle.workspace };
810
- // Preserve server-local fields
811
- if (local.server_url)
812
- merged.server_url = local.server_url;
813
- writeFileSync(join(sgDir, 'workspace.json'), JSON.stringify(merged, null, 2), 'utf-8');
814
- applied.push('workspace');
815
- }
816
- // 2. ABOUT.md
817
- if (bundle.about !== undefined && bundle.about !== null) {
818
- writeFileSync(join(sgDir, 'ABOUT.md'), bundle.about, 'utf-8');
819
- applied.push('about');
820
- }
821
- // 3. Auth seed
822
- if (bundle.authSeed) {
823
- writeFileSync(join(sgDir, 'auth-seed.json'), JSON.stringify(bundle.authSeed, null, 2), 'utf-8');
824
- authService.applySeed();
825
- applied.push(`auth (${bundle.authSeed.users?.length ?? 0} users)`);
826
- }
827
- // 4. Sources
828
- if (bundle.sources && Object.keys(bundle.sources).length > 0) {
829
- const sourcesDir = join(sgDir, 'sources');
830
- mkdirSync(sourcesDir, { recursive: true });
831
- for (const [name, def] of Object.entries(bundle.sources)) {
832
- writeFileSync(join(sourcesDir, `${name}.json`), JSON.stringify(def, null, 2), 'utf-8');
833
- }
834
- applied.push(`sources (${Object.keys(bundle.sources).join(', ')})`);
835
- }
836
- // 5. Connectors (sanitized)
837
- if (bundle.connectors && bundle.connectors.length > 0) {
838
- const connectorsDir = join(sgDir, 'connectors');
839
- mkdirSync(connectorsDir, { recursive: true });
840
- for (const conn of bundle.connectors) {
841
- writeFileSync(join(connectorsDir, `${conn.name}.json`), JSON.stringify(conn, null, 2), 'utf-8');
842
- }
843
- applied.push(`connectors (${bundle.connectors.map((c) => c.name).join(', ')})`);
844
- }
845
- return reply.send({ success: true, applied });
846
- });
847
- }
848
- //# sourceMappingURL=sync-api.js.map