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
package/dist/mcp/tools.js CHANGED
@@ -5,11 +5,21 @@
5
5
  * methods — no new business logic. Results are returned as JSON text so the
6
6
  * MCP client (Claude Desktop) can process structured data.
7
7
  *
8
+ * Every tool enforces per-user access control via `services/access-control.ts`.
9
+ * Callers (the HTTP /mcp route, the stdio MCP server) must resolve a user
10
+ * identity before registering tools — `registerTools` requires a user in its
11
+ * `McpAccessContext` argument so there is no anonymous MCP path.
12
+ *
8
13
  * Note: `inputSchema` is cast to `any` at each call site because the MCP SDK's
9
14
  * ZodRawShapeCompat type does not accept ZodObject in TypeScript's strict mode.
10
15
  * Runtime schema validation is handled correctly by the SDK regardless.
11
16
  */
12
17
  import { z } from 'zod';
18
+ import { ENTITY_SCHEMAS } from '../core/validation.js';
19
+ import { getAccessibleRepos, hasRepoAccess, canWriteRepo, getAccessibleEntityIds, filterWikilinks, } from '../services/access-control.js';
20
+ import { createSharedFolder, FolderCreationError } from '../services/folder-creation.js';
21
+ import { isCuratedEntityType } from '../core/entity-types-catalog.js';
22
+ import { getAgentAllowedEntityTypes } from '../agent/prompts/entity-types-section.js';
13
23
  // ── helpers ───────────────────────────────────────────────────────────────────
14
24
  function ok(data) {
15
25
  return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
@@ -18,30 +28,137 @@ function fail(err) {
18
28
  const msg = err instanceof Error ? err.message : String(err);
19
29
  return { content: [{ type: 'text', text: msg }], isError: true };
20
30
  }
31
+ /** Deny-without-leaking helper — same wording as a missing repo/entity. */
32
+ function notFound(repo) {
33
+ return fail(new Error(`Folder "${repo}" not found`));
34
+ }
21
35
  // Strip frontmatter fields that duplicate the top-level id/type keys
22
36
  function shape(id, entityType, data, extra) {
23
37
  const { id: _id, entity_type: _et, ...rest } = data;
24
38
  return { id, type: entityType, ...rest, ...extra };
25
39
  }
26
40
  // ── tool registration ─────────────────────────────────────────────────────────
27
- export function registerTools(server, wm, authService) {
41
+ export function registerTools(server, wm, authService, ctx) {
42
+ const { user, wsHub, apiTokenName } = ctx;
43
+ // External-agent identity: "<owner>'s <token name>", or "<owner>'s agent"
44
+ // as a fallback when the token has no name (older tokens or contexts that
45
+ // didn't thread the token through). `userId` lets the client paint the chip
46
+ // with the same accent as the owning user's avatar.
47
+ const agentLabel = apiTokenName
48
+ ? `${user.displayName}'s ${apiTokenName}`
49
+ : `${user.displayName}'s agent`;
50
+ const agentIdentity = {
51
+ kind: 'external',
52
+ label: agentLabel,
53
+ userId: String(user.id),
54
+ };
55
+ // Match the broadcast shape used by src/server/routes/graph-api.ts so the
56
+ // realtime listener in web/src/lib/stores/realtime.svelte.ts treats MCP
57
+ // mutations identically to web-UI mutations. The `agent` tag lets clients
58
+ // distinguish agent-driven mutations from human-driven ones.
59
+ function emitEntityChange(action, repo, entityType, entityId) {
60
+ wsHub?.broadcast({
61
+ type: 'entity_change',
62
+ action,
63
+ repo,
64
+ entityType,
65
+ entityId,
66
+ actor: user.displayName,
67
+ source: 'api',
68
+ agent: agentIdentity,
69
+ timestamp: new Date().toISOString(),
70
+ });
71
+ }
72
+ /**
73
+ * Wrap a mutation tool call so the sidebar can show a live "X's agent is
74
+ * acting" chip in the affected folder. `enter` fires before the work,
75
+ * `leave` after — wsHub TTL-cleans on crash. `verb` shapes the chip copy.
76
+ */
77
+ async function withAgentActivity(repo, verb, fn) {
78
+ wsHub?.handleAgentActivity('enter', repo, agentIdentity, verb);
79
+ try {
80
+ return await fn();
81
+ }
82
+ finally {
83
+ wsHub?.handleAgentActivity('leave', repo, agentIdentity, verb);
84
+ }
85
+ }
86
+ // Entity types the MCP surface may create. Matches the agent's allowlist so
87
+ // a workspace looks identical across the main app and MCP clients: the full
88
+ // canonical catalog plus workspace custom types. See
89
+ // src/core/entity-types-catalog.ts.
90
+ const builtinTypeKeys = new Set(Object.keys(ENTITY_SCHEMAS));
91
+ const customWorkspaceTypes = wm.getSchemaRegistry().getAllTypes()
92
+ .filter(t => !builtinTypeKeys.has(t));
93
+ const mcpAllowedCreateTypes = getAgentAllowedEntityTypes(customWorkspaceTypes);
94
+ const mcpAllowedSet = new Set(mcpAllowedCreateTypes);
28
95
  // ── list_repos ────────────────────────────────────────────────────────────
29
- server.registerTool('list_repos', { description: 'List all collections in the Studiograph workspace' }, async () => ok(wm.getAllRepoConfigs()));
96
+ server.registerTool('list_repos', { description: 'List folders in the Studiograph workspace that you have access to' }, async () => ok(getAccessibleRepos(user, wm, authService)));
97
+ // ── create_repo ───────────────────────────────────────────────────────────
98
+ //
99
+ // Creates a new shared folder in the workspace and grants the
100
+ // caller folder-admin access. Shares its implementation with the web route
101
+ // POST /api/repos via services/folder-creation.ts so both surfaces behave
102
+ // identically. After creation, use create_entity with the new folder name
103
+ // to add entries. Folder names are immutable slugs; the display name is
104
+ // editable later via the web UI.
105
+ const createRepoSchema = z.object({
106
+ name: z.string().describe('Folder slug — lowercase kebab-case (letters, digits, hyphens; must start with a letter or digit). ' +
107
+ 'This becomes the folder id and directory name; it cannot be changed without a rename.'),
108
+ display_name: z.string().optional().describe('Human-readable name shown in the UI (e.g. "Client Projects"). Defaults to the slug.'),
109
+ description: z.string().optional().describe('Short description of what this folder is for.'),
110
+ });
111
+ server.registerTool('create_repo', {
112
+ description: 'Create a new shared folder in the workspace. Use this when an agent or ' +
113
+ 'user needs a fresh container for a new project, client area, or topic and no existing ' +
114
+ 'folder fits. The caller is automatically granted folder-admin access. ' +
115
+ 'Follow up with create_entity (passing the new folder name as `repo`) to seed entries. ' +
116
+ 'Folder names must be kebab-case and unique; the private per-user "entries-<id>" ' +
117
+ 'namespace is reserved and will be rejected.',
118
+ inputSchema: createRepoSchema,
119
+ }, async (args) => {
120
+ const { name, display_name, description } = createRepoSchema.parse(args);
121
+ try {
122
+ const repo = await createSharedFolder(wm, authService, { name, display_name, description }, user, wsHub);
123
+ return ok({ success: true, ...repo });
124
+ }
125
+ catch (err) {
126
+ if (err instanceof FolderCreationError) {
127
+ return fail(new Error(err.message));
128
+ }
129
+ return fail(err);
130
+ }
131
+ });
30
132
  // ── list_entities ─────────────────────────────────────────────────────────
31
133
  const listEntitiesSchema = z.object({
32
- repo: z.string().optional().describe('Collection name — omit to list across all collections'),
33
- entity_type: z.string().optional().describe('Entity type filter (project, client, person, meeting…)'),
134
+ repo: z.string().optional().describe('Folder name — omit to list across all folders'),
135
+ entity_type: z.string().optional().describe('Entity type filter (project, client, person, event…)'),
34
136
  limit: z.number().int().positive().optional().describe('Maximum number of results'),
35
137
  });
36
- server.registerTool('list_entities', { description: 'List entities in a collection (or all collections). Optionally filter by entity type.', inputSchema: listEntitiesSchema }, async (args) => {
138
+ server.registerTool('list_entities', { description: 'List entities in a folder (or all folders). Optionally filter by entity type.', inputSchema: listEntitiesSchema }, async (args) => {
37
139
  const { repo, entity_type, limit } = listEntitiesSchema.parse(args);
38
140
  try {
39
141
  if (repo) {
142
+ if (!hasRepoAccess(user, repo, wm, authService))
143
+ return notFound(repo);
40
144
  const entities = wm.getGraph(repo).list(entity_type, limit);
41
145
  return ok(entities.map(e => shape(e.id, e.entityType, e.data)));
42
146
  }
43
- const entities = wm.list(entity_type, limit);
44
- return ok(entities.map(e => shape(e.id, e.entityType, e.data, { repo: e.repoName })));
147
+ // No repo specified → iterate only over the user's accessible folders.
148
+ const accessible = getAccessibleRepos(user, wm, authService);
149
+ const results = [];
150
+ for (const r of accessible) {
151
+ try {
152
+ const list = wm.getGraph(r.name).list(entity_type);
153
+ for (const e of list) {
154
+ results.push(shape(e.id, e.entityType, e.data, { repo: r.name }));
155
+ if (limit && results.length >= limit)
156
+ return ok(results);
157
+ }
158
+ }
159
+ catch { /* skip unmounted repos */ }
160
+ }
161
+ return ok(results);
45
162
  }
46
163
  catch (err) {
47
164
  return fail(err);
@@ -49,12 +166,14 @@ export function registerTools(server, wm, authService) {
49
166
  });
50
167
  // ── get_entity ────────────────────────────────────────────────────────────
51
168
  const getEntitySchema = z.object({
52
- repo: z.string().describe('Collection name'),
169
+ repo: z.string().describe('Folder name'),
53
170
  entity_type: z.string().describe('Entity type (project, client, person…)'),
54
171
  entity_id: z.string().describe('Entity ID (kebab-case slug)'),
55
172
  });
56
173
  server.registerTool('get_entity', { description: 'Get a specific entity — includes full markdown content and frontmatter', inputSchema: getEntitySchema }, async (args) => {
57
174
  const { repo, entity_type, entity_id } = getEntitySchema.parse(args);
175
+ if (!hasRepoAccess(user, repo, wm, authService))
176
+ return notFound(repo);
58
177
  try {
59
178
  const entity = wm.getGraph(repo).get(entity_type, entity_id);
60
179
  return ok({ id: entity.id, type: entity.entityType, data: entity.data, content: entity.document.content });
@@ -67,13 +186,19 @@ export function registerTools(server, wm, authService) {
67
186
  const searchSchema = z.object({
68
187
  query: z.string().optional().describe('Text search query'),
69
188
  entity_type: z.string().optional().describe('Filter by entity type'),
70
- repos: z.array(z.string()).optional().describe('Limit to specific collection names'),
189
+ repos: z.array(z.string()).optional().describe('Limit to specific folder names'),
71
190
  limit: z.number().int().positive().optional().describe('Maximum number of results'),
72
191
  });
73
- server.registerTool('search_entities', { description: 'Full-text search for entities across all collections', inputSchema: searchSchema }, async (args) => {
192
+ server.registerTool('search_entities', { description: 'Full-text search for entities across folders you can access', inputSchema: searchSchema }, async (args) => {
74
193
  const { query, entity_type, repos, limit } = searchSchema.parse(args);
75
194
  try {
76
- const results = await wm.search({ query, entityType: entity_type, repoNames: repos, limit });
195
+ const accessibleNames = new Set(getAccessibleRepos(user, wm, authService).map(r => r.name));
196
+ const scoped = repos
197
+ ? repos.filter(r => accessibleNames.has(r))
198
+ : [...accessibleNames];
199
+ if (scoped.length === 0)
200
+ return ok([]);
201
+ const results = await wm.search({ query, entityType: entity_type, repoNames: scoped, limit });
77
202
  return ok(results.map(e => shape(e.id, e.entityType, e.data, { repo: e.repoName })));
78
203
  }
79
204
  catch (err) {
@@ -81,62 +206,104 @@ export function registerTools(server, wm, authService) {
81
206
  }
82
207
  });
83
208
  // ── create_entity ─────────────────────────────────────────────────────────
209
+ // Constrain `entity_type` to the allowlist so MCP clients (e.g. Claude Desktop)
210
+ // see the same type surface as the main agent. Existing canonical-type entities
211
+ // remain readable/updatable via other tools.
212
+ const createEntityTypeSchema = mcpAllowedCreateTypes.length > 0
213
+ ? z.enum(mcpAllowedCreateTypes)
214
+ : z.string();
84
215
  const createSchema = z.object({
85
- repo: z.string().describe('Collection name'),
86
- entity_type: z.string().describe('Entity type'),
216
+ repo: z.string().describe('Folder name'),
217
+ entity_type: createEntityTypeSchema.describe(`Entity type. Allowed: ${mcpAllowedCreateTypes.join(', ')}.`),
87
218
  entity_id: z.string().describe('Entity ID (kebab-case slug)'),
88
- data: z.record(z.unknown()).describe('Frontmatter fields as a JSON object'),
219
+ data: z.record(z.string(), z.unknown()).describe('Frontmatter fields as a JSON object'),
89
220
  content: z.string().optional().describe('Markdown body content'),
90
221
  });
91
- server.registerTool('create_entity', { description: 'Create a new entity in a collection. Commits to git automatically.', inputSchema: createSchema }, async (args) => {
222
+ server.registerTool('create_entity', { description: 'Create a new entity in a folder. Commits to git automatically.', inputSchema: createSchema }, async (args) => {
92
223
  const { repo, entity_type, entity_id, data, content } = createSchema.parse(args);
93
- try {
94
- const entity = await wm.getGraph(repo).create({
95
- entityType: entity_type,
96
- entityId: entity_id,
97
- data: data,
98
- content,
99
- });
100
- return ok({ success: true, id: entity.id, type: entity.entityType });
224
+ if (!hasRepoAccess(user, repo, wm, authService))
225
+ return notFound(repo);
226
+ if (!canWriteRepo(user, repo, wm, authService)) {
227
+ return fail(new Error(`You do not have write access to folder "${repo}"`));
101
228
  }
102
- catch (err) {
103
- return fail(err);
229
+ // Defense in depth: MCP SDK may not enforce zod enum strictly on all clients.
230
+ if (!mcpAllowedSet.has(entity_type)) {
231
+ if (entity_type === 'asset') {
232
+ // The enum already excludes `asset` (see getAgentAllowedEntityTypes).
233
+ // This handles MCP clients that bypass the enum schema.
234
+ return fail(new Error('Asset entities cannot be created via create_entity — they require a binary blob plus a sidecar text file. Use the workspace upload UI or POST /api/repos/:repo/assets directly.'));
235
+ }
236
+ const hint = isCuratedEntityType(entity_type)
237
+ ? '' // shouldn't happen for any other curated type — they're all allowed
238
+ : ` Allowed: ${mcpAllowedCreateTypes.join(', ')}.`;
239
+ return fail(new Error(`Entity type "${entity_type}" is not a known canonical or workspace custom type.${hint}`));
104
240
  }
241
+ return withAgentActivity(repo, 'creating', async () => {
242
+ try {
243
+ const entity = await wm.getGraph(repo).create({
244
+ entityType: entity_type,
245
+ entityId: entity_id,
246
+ data: data,
247
+ content,
248
+ });
249
+ emitEntityChange('created', repo, entity.entityType, entity.id);
250
+ return ok({ success: true, id: entity.id, type: entity.entityType });
251
+ }
252
+ catch (err) {
253
+ return fail(err);
254
+ }
255
+ });
105
256
  });
106
257
  // ── update_entity ─────────────────────────────────────────────────────────
107
258
  const updateSchema = z.object({
108
- repo: z.string().describe('Collection name'),
259
+ repo: z.string().describe('Folder name'),
109
260
  entity_type: z.string().describe('Entity type'),
110
261
  entity_id: z.string().describe('Entity ID'),
111
- data: z.record(z.unknown()).optional().describe('Frontmatter fields to update (merged with existing)'),
262
+ data: z.record(z.string(), z.unknown()).optional().describe('Frontmatter fields to update (merged with existing)'),
112
263
  content: z.string().optional().describe('New markdown body content'),
113
264
  });
114
265
  server.registerTool('update_entity', { description: 'Update an existing entity. Data fields are merged with existing frontmatter.', inputSchema: updateSchema }, async (args) => {
115
266
  const { repo, entity_type, entity_id, data, content } = updateSchema.parse(args);
116
- try {
117
- const entity = await wm.getGraph(repo).update({
118
- entityType: entity_type,
119
- entityId: entity_id,
120
- data: data,
121
- content,
122
- });
123
- return ok({ success: true, id: entity.id, type: entity.entityType });
124
- }
125
- catch (err) {
126
- return fail(err);
267
+ if (!hasRepoAccess(user, repo, wm, authService))
268
+ return notFound(repo);
269
+ if (!canWriteRepo(user, repo, wm, authService)) {
270
+ return fail(new Error(`You do not have write access to folder "${repo}"`));
127
271
  }
272
+ return withAgentActivity(repo, 'editing', async () => {
273
+ try {
274
+ const entity = await wm.getGraph(repo).update({
275
+ entityType: entity_type,
276
+ entityId: entity_id,
277
+ data: data,
278
+ content,
279
+ });
280
+ emitEntityChange('updated', repo, entity.entityType, entity.id);
281
+ return ok({ success: true, id: entity.id, type: entity.entityType });
282
+ }
283
+ catch (err) {
284
+ return fail(err);
285
+ }
286
+ });
128
287
  });
129
288
  // ── validate_wikilinks ────────────────────────────────────────────────────
130
289
  const validateWikilinksSchema = z.object({
131
- repo: z.string().describe('Collection name'),
290
+ repo: z.string().describe('Folder name'),
132
291
  entity_type: z.string().describe('Entity type'),
133
292
  entity_id: z.string().describe('Entity ID'),
134
293
  });
135
294
  server.registerTool('validate_wikilinks', { description: 'Check which wikilinks in an entity resolve to real entities and which are broken', inputSchema: validateWikilinksSchema }, async (args) => {
136
295
  const { repo, entity_type, entity_id } = validateWikilinksSchema.parse(args);
296
+ if (!hasRepoAccess(user, repo, wm, authService))
297
+ return notFound(repo);
137
298
  try {
138
299
  const result = wm.getGraph(repo).validateWikilinks(entity_type, entity_id);
139
- return ok({ entity_id, valid: result.valid, broken: result.broken, total: result.valid.length + result.broken.length });
300
+ const accessibleIds = getAccessibleEntityIds(user, wm, authService);
301
+ const valid = filterWikilinks(result.valid, accessibleIds);
302
+ // Anything the user can't see is reported as broken rather than valid —
303
+ // it shouldn't leak the target's existence.
304
+ const hiddenFromValid = result.valid.filter(id => !valid.includes(id));
305
+ const broken = [...result.broken, ...hiddenFromValid];
306
+ return ok({ entity_id, valid, broken, total: valid.length + broken.length });
140
307
  }
141
308
  catch (err) {
142
309
  return fail(err);
@@ -144,7 +311,7 @@ export function registerTools(server, wm, authService) {
144
311
  });
145
312
  // ── find_related ──────────────────────────────────────────────────────────
146
313
  const relatedSchema = z.object({
147
- repo: z.string().describe('Collection name'),
314
+ repo: z.string().describe('Folder name'),
148
315
  entity_type: z.string().describe('Entity type'),
149
316
  entity_id: z.string().describe('Entity ID'),
150
317
  direction: z.enum(['outgoing', 'incoming', 'both']).default('both')
@@ -152,15 +319,26 @@ export function registerTools(server, wm, authService) {
152
319
  });
153
320
  server.registerTool('find_related', { description: 'Find entities related via wikilinks (outgoing) or backlinks (incoming)', inputSchema: relatedSchema }, async (args) => {
154
321
  const { repo, entity_type, entity_id, direction } = relatedSchema.parse(args);
322
+ if (!hasRepoAccess(user, repo, wm, authService))
323
+ return notFound(repo);
155
324
  try {
325
+ const accessibleIds = getAccessibleEntityIds(user, wm, authService);
156
326
  const results = [];
157
327
  if (direction === 'outgoing' || direction === 'both') {
158
328
  const related = wm.getGraph(repo).getRelated(entity_type, entity_id);
159
- results.push(...related.map(e => shape(e.id, e.entityType, e.data, { direction: 'outgoing' })));
329
+ for (const e of related) {
330
+ if (accessibleIds && !accessibleIds.has(e.id))
331
+ continue;
332
+ results.push(shape(e.id, e.entityType, e.data, { direction: 'outgoing' }));
333
+ }
160
334
  }
161
335
  if (direction === 'incoming' || direction === 'both') {
162
336
  const backlinks = wm.getBacklinks(repo, entity_type, entity_id);
163
- results.push(...backlinks.map(e => shape(e.id, e.entityType, e.data, { direction: 'incoming', repo: e.repoName })));
337
+ for (const e of backlinks) {
338
+ if (!hasRepoAccess(user, e.repoName, wm, authService))
339
+ continue;
340
+ results.push(shape(e.id, e.entityType, e.data, { direction: 'incoming', repo: e.repoName }));
341
+ }
164
342
  }
165
343
  return ok(results);
166
344
  }
@@ -168,84 +346,337 @@ export function registerTools(server, wm, authService) {
168
346
  return fail(err);
169
347
  }
170
348
  });
171
- // ── View management tools ────────────────────────────────────────────────
172
- if (authService) {
173
- server.registerTool('list_views', { description: 'List the current user\'s saved views.', inputSchema: z.object({}) }, async () => {
174
- try {
175
- return ok(authService.getUserViews(0));
176
- }
177
- catch (err) {
178
- return fail(err);
349
+ // ── list_skills ──────────────────────────────────────────────────────────
350
+ //
351
+ // Surfaces user-authored `skill` entities to external MCP clients so
352
+ // connected agents (Claude Desktop, Cursor, etc.) can discover and run
353
+ // the workspace's codified workflows. Only graph skills (entities) are
354
+ // exposed; bundled filesystem skills (onboarding/interview/enrichment
355
+ // prompts) stay internal to Studiograph's own agent.
356
+ const listSkillsSchema = z.object({
357
+ repo: z.string().optional().describe('Folder name — omit to list across all folders you have access to'),
358
+ });
359
+ function projectSkill(entity, repo) {
360
+ const data = entity.data;
361
+ return {
362
+ id: entity.id,
363
+ name: data.name || entity.id,
364
+ description: data.description ?? '',
365
+ repo,
366
+ loading: data.loading === 'eager' ? 'eager' : 'on-demand',
367
+ };
368
+ }
369
+ // `graph.list('skill')` is lenient — root-level .md files without a
370
+ // declared `entity_type` (READMEs, CHANGELOGs) get tagged as whatever the
371
+ // caller asks for. For MCP we want only real skills, so require the
372
+ // frontmatter to explicitly say `entity_type: skill`.
373
+ function isRealSkill(entity) {
374
+ return entity.data.entity_type === 'skill';
375
+ }
376
+ server.registerTool('list_skills', {
377
+ description: 'List skills (reusable agent instructions) available in the Studiograph workspace. ' +
378
+ 'Skills are user-authored markdown — call get_skill to read the full body and follow ' +
379
+ 'its instructions. Optionally filter by folder.',
380
+ inputSchema: listSkillsSchema,
381
+ }, async (args) => {
382
+ const { repo } = listSkillsSchema.parse(args);
383
+ try {
384
+ if (repo) {
385
+ if (!hasRepoAccess(user, repo, wm, authService))
386
+ return notFound(repo);
387
+ const skills = wm.getGraph(repo).list('skill');
388
+ return ok(skills.filter(isRealSkill).map(e => projectSkill(e, repo)));
179
389
  }
180
- });
181
- const createViewSchema = z.object({
182
- name: z.string().describe('View name'),
183
- selected_type: z.string().optional().describe('Entity type filter (e.g. "task")'),
184
- group_by: z.string().optional().describe('Column to group by (e.g. "status")'),
185
- });
186
- server.registerTool('create_view', { description: 'Create a new saved view. Views appear as tabs in the web UI toolbar.', inputSchema: createViewSchema }, async (args) => {
187
- const { name, selected_type, group_by } = createViewSchema.parse(args);
188
- try {
189
- const config = {
190
- selectedType: selected_type ?? null,
191
- groupBy: group_by ?? null,
192
- sortKey: 'name',
193
- sortAsc: true,
194
- filters: { text: {}, enum: {}, date: {} },
195
- };
196
- const view = authService.createUserView(0, name, 'list', config);
197
- return ok({ success: true, view: { id: view.id, name: view.name, config: view.config } });
390
+ const accessible = getAccessibleRepos(user, wm, authService);
391
+ const results = [];
392
+ for (const r of accessible) {
393
+ try {
394
+ const skills = wm.getGraph(r.name).list('skill');
395
+ for (const e of skills) {
396
+ if (isRealSkill(e))
397
+ results.push(projectSkill(e, r.name));
398
+ }
399
+ }
400
+ catch { /* skip unmounted repos */ }
198
401
  }
199
- catch (err) {
200
- return fail(err);
402
+ return ok(results);
403
+ }
404
+ catch (err) {
405
+ return fail(err);
406
+ }
407
+ });
408
+ // ── get_skill ────────────────────────────────────────────────────────────
409
+ //
410
+ // Returns the full markdown body of a skill alongside its metadata. The
411
+ // body is instructions to follow — the MCP client is the runtime. No
412
+ // server-side agent loop, no parameter substitution in v1.
413
+ const getSkillSchema = z.object({
414
+ name: z.string().describe('Skill id (the entity_id of the skill entity)'),
415
+ repo: z.string().optional().describe('Folder to look in. Omit to search across all accessible folders.'),
416
+ });
417
+ server.registerTool('get_skill', {
418
+ description: 'Fetch the full content of a skill. Returns the skill\'s markdown body along with its ' +
419
+ 'metadata. The body contains instructions to follow — read it and apply it to the current task.',
420
+ inputSchema: getSkillSchema,
421
+ }, async (args) => {
422
+ const { name, repo } = getSkillSchema.parse(args);
423
+ try {
424
+ if (repo) {
425
+ if (!hasRepoAccess(user, repo, wm, authService))
426
+ return notFound(repo);
427
+ try {
428
+ const entity = wm.getGraph(repo).get('skill', name);
429
+ if (!isRealSkill({ data: entity.data })) {
430
+ return fail(new Error(`Skill "${name}" not found`));
431
+ }
432
+ return ok({
433
+ ...projectSkill({ id: entity.id, data: entity.data }, repo),
434
+ content: entity.document.content,
435
+ });
436
+ }
437
+ catch {
438
+ return fail(new Error(`Skill "${name}" not found`));
439
+ }
201
440
  }
202
- });
203
- const updateViewSchema = z.object({
204
- id: z.number().describe('View ID'),
205
- name: z.string().optional().describe('New view name'),
206
- selected_type: z.string().optional().describe('Entity type filter (use "all" to clear)'),
207
- group_by: z.string().optional().describe('Column to group by (use "none" to clear)'),
208
- });
209
- server.registerTool('update_view', { description: 'Update a saved view\'s name or configuration.', inputSchema: updateViewSchema }, async (args) => {
210
- const { id, name, selected_type, group_by } = updateViewSchema.parse(args);
211
- try {
212
- const existing = authService.getUserView(id, 0);
213
- if (!existing)
214
- return fail(`View ${id} not found`);
215
- const fields = {};
216
- if (name)
217
- fields.name = name;
218
- if (selected_type !== undefined || group_by !== undefined) {
219
- const config = { ...existing.config };
220
- if (selected_type !== undefined)
221
- config.selectedType = selected_type === 'all' ? null : selected_type;
222
- if (group_by !== undefined)
223
- config.groupBy = group_by === 'none' ? null : group_by;
224
- fields.config = config;
441
+ // No repo — search accessible folders for the skill by id.
442
+ const accessible = getAccessibleRepos(user, wm, authService);
443
+ const matches = [];
444
+ for (const r of accessible) {
445
+ try {
446
+ const entity = wm.getGraph(r.name).get('skill', name);
447
+ if (!isRealSkill({ data: entity.data }))
448
+ continue;
449
+ matches.push({ repo: r.name, entity });
225
450
  }
226
- authService.updateUserView(id, 0, fields);
227
- return ok({ success: true });
451
+ catch { /* not in this repo */ }
228
452
  }
229
- catch (err) {
230
- return fail(err);
453
+ if (matches.length === 0)
454
+ return fail(new Error(`Skill "${name}" not found`));
455
+ if (matches.length > 1) {
456
+ const folders = matches.map(m => m.repo).join(', ');
457
+ return fail(new Error(`Skill "${name}" exists in multiple folders (${folders}). Specify repo.`));
231
458
  }
232
- });
233
- const deleteViewSchema = z.object({
234
- id: z.number().describe('View ID to delete'),
235
- });
236
- server.registerTool('delete_view', { description: 'Delete a saved view.', inputSchema: deleteViewSchema }, async (args) => {
237
- const { id } = deleteViewSchema.parse(args);
459
+ const { repo: matchRepo, entity } = matches[0];
460
+ return ok({
461
+ ...projectSkill({ id: entity.id, data: entity.data }, matchRepo),
462
+ content: entity.document.content,
463
+ });
464
+ }
465
+ catch (err) {
466
+ return fail(err);
467
+ }
468
+ });
469
+ // ── Git history tools ──────────────────────────────────────────────────────
470
+ //
471
+ // Mirrors the agent's history-tools.ts surface so external MCP clients get
472
+ // the same primitives. Reads gated on hasRepoAccess; restore_file gated on
473
+ // canWriteRepo. Single-entity scope only — multi-entity rollback is
474
+ // intentionally absent (deferred to a future revert_commit).
475
+ const listFileHistorySchema = z.object({
476
+ repo: z.string().describe('Folder name'),
477
+ entity_type: z.string().describe('Entity type'),
478
+ entity_id: z.string().describe('Entry ID'),
479
+ limit: z.number().optional().describe('Max commits (default 20, max 100)'),
480
+ });
481
+ server.registerTool('list_file_history', { description: 'List commits that touched a single entry, newest first.', inputSchema: listFileHistorySchema }, async (args) => {
482
+ const { repo, entity_type, entity_id, limit } = listFileHistorySchema.parse(args);
483
+ try {
484
+ if (!hasRepoAccess(user, repo, wm, authService))
485
+ return fail(`Folder "${repo}" not found`);
486
+ const graph = wm.getGraph(repo);
487
+ const gitService = graph.getGitService();
488
+ if (!gitService)
489
+ return fail('Folder is not git-backed');
490
+ let entityPath;
238
491
  try {
239
- const existing = authService.getUserView(id, 0);
240
- if (!existing)
241
- return fail(`View ${id} not found`);
242
- authService.deleteUserView(id, 0);
243
- return ok({ success: true, message: `Deleted view "${existing.name}"` });
492
+ const entity = graph.get(entity_type, entity_id);
493
+ const { relative: relativePath } = await import('path');
494
+ entityPath = relativePath(graph.getRepoPath(), entity.path);
244
495
  }
245
- catch (err) {
246
- return fail(err);
496
+ catch {
497
+ const idLower = `${entity_id}.md`.toLowerCase();
498
+ const match = gitService.listRecentDeletions(30).find((d) => d.filePath.toLowerCase().endsWith(idLower));
499
+ if (!match)
500
+ return fail(`Entry ${entity_type}/${entity_id} not found in "${repo}".`);
501
+ entityPath = match.filePath;
247
502
  }
248
- });
249
- }
503
+ const cap = Math.min(100, Math.max(1, limit ?? 20));
504
+ const commits = gitService.getFileHistory(entityPath, cap).map((c) => ({
505
+ hash: c.hash.slice(0, 8),
506
+ fullHash: c.hash,
507
+ author: c.author,
508
+ timestamp: c.timestamp,
509
+ message: c.message,
510
+ }));
511
+ return ok({ repo, entityType: entity_type, entityId: entity_id, commits });
512
+ }
513
+ catch (err) {
514
+ return fail(err);
515
+ }
516
+ });
517
+ const listFolderHistorySchema = z.object({
518
+ repo: z.string().describe('Folder name'),
519
+ limit: z.number().optional().describe('Max commits (default 30, max 200)'),
520
+ });
521
+ server.registerTool('list_folder_history', { description: 'List recent commits across an entire folder.', inputSchema: listFolderHistorySchema }, async (args) => {
522
+ const { repo, limit } = listFolderHistorySchema.parse(args);
523
+ try {
524
+ if (!hasRepoAccess(user, repo, wm, authService))
525
+ return fail(`Folder "${repo}" not found`);
526
+ const gitService = wm.getGraph(repo).getGitService();
527
+ if (!gitService)
528
+ return fail('Folder is not git-backed');
529
+ const cap = Math.min(200, Math.max(1, limit ?? 30));
530
+ const commits = gitService.getHistory(cap).map((c) => ({
531
+ hash: c.hash.slice(0, 8),
532
+ fullHash: c.hash,
533
+ author: c.author,
534
+ timestamp: c.timestamp,
535
+ message: c.message,
536
+ }));
537
+ return ok({ repo, commits });
538
+ }
539
+ catch (err) {
540
+ return fail(err);
541
+ }
542
+ });
543
+ const listRecentDeletionsSchema = z.object({
544
+ repo: z.string().describe('Folder name'),
545
+ within_days: z.number().optional().describe('Lookback window (default 7, max 90)'),
546
+ });
547
+ server.registerTool('list_recent_deletions', { description: 'List entries deleted within the last N days. Use before restore_file to find a target.', inputSchema: listRecentDeletionsSchema }, async (args) => {
548
+ const { repo, within_days } = listRecentDeletionsSchema.parse(args);
549
+ try {
550
+ if (!hasRepoAccess(user, repo, wm, authService))
551
+ return fail(`Folder "${repo}" not found`);
552
+ const gitService = wm.getGraph(repo).getGitService();
553
+ if (!gitService)
554
+ return fail('Folder is not git-backed');
555
+ const days = Math.min(90, Math.max(1, within_days ?? 7));
556
+ const raw = gitService.listRecentDeletions(days);
557
+ // Naive coords: use filename basename for entity_id; entity_type
558
+ // sniffed from frontmatter at lastVersionCommit.
559
+ const deletions = raw.map((d) => {
560
+ const idMatch = d.filePath.match(/([^/]+)\.md$/i);
561
+ const entityId = idMatch ? idMatch[1] : null;
562
+ const content = entityId ? gitService.getFileAtCommit(d.filePath, d.lastVersionCommit) : null;
563
+ let entityType = null;
564
+ if (content) {
565
+ const fm = content.match(/^---\s*\n([\s\S]*?)\n---/);
566
+ const tm = fm?.[1].match(/^entity_type:\s*['"]?([\w-]+)['"]?\s*$/m);
567
+ if (tm)
568
+ entityType = tm[1];
569
+ }
570
+ if (!entityId || !entityType)
571
+ return null;
572
+ return {
573
+ entityType,
574
+ entityId,
575
+ deletedAt: d.deletedAt,
576
+ deletedBy: d.deletedBy.name,
577
+ deletedInCommit: d.deletedAtCommit.slice(0, 8),
578
+ lastVersionCommit: d.lastVersionCommit,
579
+ commitMessage: d.commitMessage,
580
+ path: d.filePath,
581
+ };
582
+ }).filter((x) => x !== null);
583
+ return ok({ repo, withinDays: days, deletions });
584
+ }
585
+ catch (err) {
586
+ return fail(err);
587
+ }
588
+ });
589
+ const readFileAtCommitSchema = z.object({
590
+ repo: z.string().describe('Folder name'),
591
+ entity_type: z.string().describe('Entity type'),
592
+ entity_id: z.string().describe('Entry ID'),
593
+ commit_hash: z.string().describe('Commit hash (short or full)'),
594
+ });
595
+ server.registerTool('read_file_at_commit', { description: 'Read an entry\'s full content at a specific commit.', inputSchema: readFileAtCommitSchema }, async (args) => {
596
+ const { repo, entity_type, entity_id, commit_hash } = readFileAtCommitSchema.parse(args);
597
+ try {
598
+ if (!hasRepoAccess(user, repo, wm, authService))
599
+ return fail(`Folder "${repo}" not found`);
600
+ const graph = wm.getGraph(repo);
601
+ const found = graph.getEntityAtCommit(entity_type, entity_id, commit_hash);
602
+ if (!found)
603
+ return fail(`Entry ${entity_type}/${entity_id} not found at commit ${commit_hash}`);
604
+ return ok({ repo, entityType: entity_type, entityId: entity_id, commitHash: commit_hash, path: found.path, content: found.content });
605
+ }
606
+ catch (err) {
607
+ return fail(err);
608
+ }
609
+ });
610
+ const restoreFileSchema = z.object({
611
+ repo: z.string().describe('Folder name'),
612
+ entity_type: z.string().describe('Entity type'),
613
+ entity_id: z.string().describe('Entry ID'),
614
+ commit_hash: z.string().describe('Commit hash to restore from'),
615
+ confirm: z.boolean().optional().describe('Set to true ONLY after the user has approved the preview. Defaults to false.'),
616
+ });
617
+ server.registerTool('restore_file', { description: 'Restore an entry to its content at a specific commit. Preview-then-confirm: first call returns the preview payload, re-invoke with confirm: true to execute.', inputSchema: restoreFileSchema }, async (args) => {
618
+ const { repo, entity_type, entity_id, commit_hash, confirm } = restoreFileSchema.parse(args);
619
+ try {
620
+ if (!hasRepoAccess(user, repo, wm, authService))
621
+ return fail(`Folder "${repo}" not found`);
622
+ if (!canWriteRepo(user, repo, wm, authService))
623
+ return fail(`You don't have permission to write to "${repo}". Editor or admin role required.`);
624
+ const graph = wm.getGraph(repo);
625
+ if (confirm !== true) {
626
+ const found = graph.getEntityAtCommit(entity_type, entity_id, commit_hash);
627
+ if (!found)
628
+ return fail(`Entry ${entity_type}/${entity_id} not found at commit ${commit_hash}`);
629
+ let action = 'recreate';
630
+ try {
631
+ graph.get(entity_type, entity_id);
632
+ action = 'overwrite';
633
+ }
634
+ catch { }
635
+ const sizeBytes = Buffer.byteLength(found.content, 'utf-8');
636
+ const shortHash = commit_hash.length > 8 ? commit_hash.slice(0, 8) : commit_hash;
637
+ return ok({
638
+ success: false,
639
+ code: 'PREVIEW_REQUIRED',
640
+ preview: { action, targetPath: found.path, sizeBytes, commitHash: shortHash },
641
+ message: `Will ${action} ${entity_type}/${entity_id} from ${shortHash} (${sizeBytes} bytes). Re-invoke with confirm: true after approval.`,
642
+ });
643
+ }
644
+ const result = await withAgentActivity(repo, 'editing', async () => {
645
+ const { PathConflictError } = await import('../core/graph.js');
646
+ try {
647
+ return await graph.restoreFile(entity_type, entity_id, commit_hash);
648
+ }
649
+ catch (err) {
650
+ if (err instanceof PathConflictError) {
651
+ return { conflict: { path: err.path, occupiedBy: err.occupiedBy } };
652
+ }
653
+ throw err;
654
+ }
655
+ });
656
+ if ('conflict' in result) {
657
+ return ok({
658
+ success: false,
659
+ code: 'PATH_CONFLICT',
660
+ conflict: result.conflict,
661
+ message: `Cannot restore — ${result.conflict.path} is occupied by ${result.conflict.occupiedBy.entityType}/${result.conflict.occupiedBy.entityId}.`,
662
+ });
663
+ }
664
+ emitEntityChange(result.action === 'recreate' ? 'created' : 'updated', repo, entity_type, entity_id);
665
+ const shortHash = commit_hash.length > 8 ? commit_hash.slice(0, 8) : commit_hash;
666
+ return ok({
667
+ success: true,
668
+ repo,
669
+ entityType: entity_type,
670
+ entityId: entity_id,
671
+ action: result.action,
672
+ path: result.path,
673
+ commitHash: shortHash,
674
+ message: `Restored ${entity_type}/${entity_id} from ${shortHash} (${result.action}).`,
675
+ });
676
+ }
677
+ catch (err) {
678
+ return fail(err);
679
+ }
680
+ });
250
681
  }
251
682
  //# sourceMappingURL=tools.js.map