studiograph 1.3.48-next.21 → 1.3.48-next.211

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 (966) hide show
  1. package/README.md +26 -16
  2. package/dist/agent/agent-pool.d.ts +87 -3
  3. package/dist/agent/agent-pool.js +188 -15
  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 +101 -4
  9. package/dist/agent/orchestrator.js +464 -66
  10. package/dist/agent/orchestrator.js.map +1 -1
  11. package/dist/agent/prompts/entity-types-section.d.ts +34 -0
  12. package/dist/agent/prompts/entity-types-section.js +76 -0
  13. package/dist/agent/prompts/entity-types-section.js.map +1 -0
  14. package/dist/agent/prompts/system.md +112 -54
  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/artifact-canvas/skill.md +152 -0
  19. package/dist/agent/skills/entity-schema.md +75 -431
  20. package/dist/agent/skills/interview/entity-templates.md +38 -37
  21. package/dist/agent/skills/interview/question-domains.md +54 -49
  22. package/dist/agent/skills/interview/skill.md +84 -16
  23. package/dist/agent/skills/schema-rules.md +28 -28
  24. package/dist/agent/tools/artifact-tools.d.ts +124 -0
  25. package/dist/agent/tools/artifact-tools.js +207 -0
  26. package/dist/agent/tools/artifact-tools.js.map +1 -0
  27. package/dist/agent/tools/capture-tools.d.ts +31 -0
  28. package/dist/agent/tools/capture-tools.js +40 -0
  29. package/dist/agent/tools/capture-tools.js.map +1 -0
  30. package/dist/agent/tools/folder-tools.d.ts +47 -0
  31. package/dist/agent/tools/folder-tools.js +249 -0
  32. package/dist/agent/tools/folder-tools.js.map +1 -0
  33. package/dist/agent/tools/fs-tools.d.ts +6 -5
  34. package/dist/agent/tools/fs-tools.js +5 -5
  35. package/dist/agent/tools/fs-tools.js.map +1 -1
  36. package/dist/agent/tools/graph-tools.d.ts +48 -72
  37. package/dist/agent/tools/graph-tools.js +852 -329
  38. package/dist/agent/tools/graph-tools.js.map +1 -1
  39. package/dist/agent/tools/history-tools.d.ts +95 -0
  40. package/dist/agent/tools/history-tools.js +461 -0
  41. package/dist/agent/tools/history-tools.js.map +1 -0
  42. package/dist/agent/tools/load-skill.d.ts +6 -5
  43. package/dist/agent/tools/load-skill.js +3 -3
  44. package/dist/agent/tools/load-skill.js.map +1 -1
  45. package/dist/agent/tools/ops-tools.d.ts +5 -4
  46. package/dist/agent/tools/ops-tools.js +130 -236
  47. package/dist/agent/tools/ops-tools.js.map +1 -1
  48. package/dist/agent/tools/permission-tools.d.ts +87 -17
  49. package/dist/agent/tools/permission-tools.js +233 -43
  50. package/dist/agent/tools/permission-tools.js.map +1 -1
  51. package/dist/agent/tools/tool-loader.js +5 -4
  52. package/dist/agent/tools/tool-loader.js.map +1 -1
  53. package/dist/agent/tools/web-tools.js +58 -9
  54. package/dist/agent/tools/web-tools.js.map +1 -1
  55. package/dist/cli/commands/about.d.ts +1 -0
  56. package/dist/cli/commands/about.js +55 -3
  57. package/dist/cli/commands/about.js.map +1 -1
  58. package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
  59. package/dist/cli/commands/admin/audit-workspace.js +133 -0
  60. package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
  61. package/dist/cli/commands/admin/audit.d.ts +21 -0
  62. package/dist/cli/commands/admin/audit.js +174 -0
  63. package/dist/cli/commands/admin/audit.js.map +1 -0
  64. package/dist/cli/commands/admin/backup.d.ts +54 -0
  65. package/dist/cli/commands/admin/backup.js +207 -0
  66. package/dist/cli/commands/admin/backup.js.map +1 -0
  67. package/dist/cli/commands/admin/folder.d.ts +11 -0
  68. package/dist/cli/commands/{collection.js → admin/folder.js} +33 -32
  69. package/dist/cli/commands/admin/folder.js.map +1 -0
  70. package/dist/cli/commands/admin/index.d.ts +16 -0
  71. package/dist/cli/commands/admin/index.js +46 -0
  72. package/dist/cli/commands/admin/index.js.map +1 -0
  73. package/dist/cli/commands/admin/migrate-assets.d.ts +53 -0
  74. package/dist/cli/commands/admin/migrate-assets.js +184 -0
  75. package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
  76. package/dist/cli/commands/admin/migrate.d.ts +56 -0
  77. package/dist/cli/commands/admin/migrate.js +263 -0
  78. package/dist/cli/commands/admin/migrate.js.map +1 -0
  79. package/dist/cli/commands/admin/restore.d.ts +24 -0
  80. package/dist/cli/commands/admin/restore.js +228 -0
  81. package/dist/cli/commands/admin/restore.js.map +1 -0
  82. package/dist/cli/commands/admin/secrets.d.ts +23 -0
  83. package/dist/cli/commands/admin/secrets.js +256 -0
  84. package/dist/cli/commands/admin/secrets.js.map +1 -0
  85. package/dist/cli/commands/admin/settings.d.ts +28 -0
  86. package/dist/cli/commands/admin/settings.js +284 -0
  87. package/dist/cli/commands/admin/settings.js.map +1 -0
  88. package/dist/cli/commands/admin/token.d.ts +42 -0
  89. package/dist/cli/commands/admin/token.js +126 -0
  90. package/dist/cli/commands/admin/token.js.map +1 -0
  91. package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
  92. package/dist/cli/commands/admin/transfer-ownership.js +106 -0
  93. package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
  94. package/dist/cli/commands/admin/user.d.ts +11 -0
  95. package/dist/cli/commands/admin/user.js +187 -0
  96. package/dist/cli/commands/admin/user.js.map +1 -0
  97. package/dist/cli/commands/clone.d.ts +25 -3
  98. package/dist/cli/commands/clone.js +142 -36
  99. package/dist/cli/commands/clone.js.map +1 -1
  100. package/dist/cli/commands/config.d.ts +23 -107
  101. package/dist/cli/commands/config.js +52 -260
  102. package/dist/cli/commands/config.js.map +1 -1
  103. package/dist/cli/commands/connector.d.ts +10 -13
  104. package/dist/cli/commands/connector.js +16 -58
  105. package/dist/cli/commands/connector.js.map +1 -1
  106. package/dist/cli/commands/deploy.js +215 -68
  107. package/dist/cli/commands/deploy.js.map +1 -1
  108. package/dist/cli/commands/index.js +5 -1
  109. package/dist/cli/commands/index.js.map +1 -1
  110. package/dist/cli/commands/init.js +10 -30
  111. package/dist/cli/commands/init.js.map +1 -1
  112. package/dist/cli/commands/mcp.js +54 -6
  113. package/dist/cli/commands/mcp.js.map +1 -1
  114. package/dist/cli/commands/r2.d.ts +3 -0
  115. package/dist/cli/commands/r2.js +223 -204
  116. package/dist/cli/commands/r2.js.map +1 -1
  117. package/dist/cli/commands/redeploy.js +65 -12
  118. package/dist/cli/commands/redeploy.js.map +1 -1
  119. package/dist/cli/commands/reset.d.ts +22 -6
  120. package/dist/cli/commands/reset.js +132 -34
  121. package/dist/cli/commands/reset.js.map +1 -1
  122. package/dist/cli/commands/serve.js +231 -26
  123. package/dist/cli/commands/serve.js.map +1 -1
  124. package/dist/cli/commands/sync.d.ts +1 -1
  125. package/dist/cli/commands/sync.js +237 -227
  126. package/dist/cli/commands/sync.js.map +1 -1
  127. package/dist/cli/crypto-bundle.d.ts +39 -0
  128. package/dist/cli/crypto-bundle.js +94 -0
  129. package/dist/cli/crypto-bundle.js.map +1 -0
  130. package/dist/cli/index.js +24 -26
  131. package/dist/cli/index.js.map +1 -1
  132. package/dist/cli/railway-pin.d.ts +68 -0
  133. package/dist/cli/railway-pin.js +96 -0
  134. package/dist/cli/railway-pin.js.map +1 -0
  135. package/dist/cli/railway-provisioning.d.ts +53 -0
  136. package/dist/cli/railway-provisioning.js +85 -0
  137. package/dist/cli/railway-provisioning.js.map +1 -0
  138. package/dist/cli/setup-wizard.d.ts +30 -49
  139. package/dist/cli/setup-wizard.js +39 -40
  140. package/dist/cli/setup-wizard.js.map +1 -1
  141. package/dist/core/accent-palette.d.ts +22 -0
  142. package/dist/core/accent-palette.js +47 -0
  143. package/dist/core/accent-palette.js.map +1 -0
  144. package/dist/core/artifact-asset-urls.d.ts +51 -0
  145. package/dist/core/artifact-asset-urls.js +79 -0
  146. package/dist/core/artifact-asset-urls.js.map +1 -0
  147. package/dist/core/artifact-bundle.d.ts +69 -0
  148. package/dist/core/artifact-bundle.js +305 -0
  149. package/dist/core/artifact-bundle.js.map +1 -0
  150. package/dist/core/artifact-escape.d.ts +5 -0
  151. package/dist/core/artifact-escape.js +26 -0
  152. package/dist/core/artifact-escape.js.map +1 -0
  153. package/dist/core/artifact-export.d.ts +17 -0
  154. package/dist/core/artifact-export.js +529 -0
  155. package/dist/core/artifact-export.js.map +1 -0
  156. package/dist/core/cell-anchor.d.ts +29 -0
  157. package/dist/core/cell-anchor.js +53 -0
  158. package/dist/core/cell-anchor.js.map +1 -0
  159. package/dist/core/comment-anchor.d.ts +41 -0
  160. package/dist/core/comment-anchor.js +147 -0
  161. package/dist/core/comment-anchor.js.map +1 -0
  162. package/dist/core/commit-messages.d.ts +57 -0
  163. package/dist/core/commit-messages.js +85 -0
  164. package/dist/core/commit-messages.js.map +1 -0
  165. package/dist/core/embeds.d.ts +96 -0
  166. package/dist/core/embeds.js +196 -0
  167. package/dist/core/embeds.js.map +1 -0
  168. package/dist/core/entity-body-templates.d.ts +21 -0
  169. package/dist/core/entity-body-templates.js +67 -0
  170. package/dist/core/entity-body-templates.js.map +1 -0
  171. package/dist/core/entity-types-catalog.d.ts +65 -0
  172. package/dist/core/entity-types-catalog.js +142 -0
  173. package/dist/core/entity-types-catalog.js.map +1 -0
  174. package/dist/core/field-library.d.ts +62 -0
  175. package/dist/core/field-library.js +129 -0
  176. package/dist/core/field-library.js.map +1 -0
  177. package/dist/core/folder-paths.d.ts +41 -0
  178. package/dist/core/folder-paths.js +95 -0
  179. package/dist/core/folder-paths.js.map +1 -0
  180. package/dist/core/folder-sidecar.d.ts +36 -0
  181. package/dist/core/folder-sidecar.js +91 -0
  182. package/dist/core/folder-sidecar.js.map +1 -0
  183. package/dist/core/format-registry.d.ts +170 -0
  184. package/dist/core/format-registry.js +412 -0
  185. package/dist/core/format-registry.js.map +1 -0
  186. package/dist/core/graph.d.ts +773 -14
  187. package/dist/core/graph.js +2269 -308
  188. package/dist/core/graph.js.map +1 -1
  189. package/dist/core/history-diff.d.ts +35 -0
  190. package/dist/core/history-diff.js +114 -0
  191. package/dist/core/history-diff.js.map +1 -0
  192. package/dist/core/refs.d.ts +41 -0
  193. package/dist/core/refs.js +80 -0
  194. package/dist/core/refs.js.map +1 -0
  195. package/dist/core/schema-registry.d.ts +66 -0
  196. package/dist/core/schema-registry.js +198 -37
  197. package/dist/core/schema-registry.js.map +1 -1
  198. package/dist/core/schemas/connector.d.ts +67 -0
  199. package/dist/core/schemas/connector.js +100 -0
  200. package/dist/core/schemas/connector.js.map +1 -0
  201. package/dist/core/schemas/workspace.d.ts +122 -0
  202. package/dist/core/schemas/workspace.js +211 -0
  203. package/dist/core/schemas/workspace.js.map +1 -0
  204. package/dist/core/secrets/SecretStore.d.ts +77 -0
  205. package/dist/core/secrets/SecretStore.js +13 -0
  206. package/dist/core/secrets/SecretStore.js.map +1 -0
  207. package/dist/core/secrets/SettingsResolver.d.ts +54 -0
  208. package/dist/core/secrets/SettingsResolver.js +80 -0
  209. package/dist/core/secrets/SettingsResolver.js.map +1 -0
  210. package/dist/core/secrets/SettingsStore.d.ts +30 -0
  211. package/dist/core/secrets/SettingsStore.js +9 -0
  212. package/dist/core/secrets/SettingsStore.js.map +1 -0
  213. package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
  214. package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
  215. package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
  216. package/dist/core/secrets/audit.d.ts +36 -0
  217. package/dist/core/secrets/audit.js +60 -0
  218. package/dist/core/secrets/audit.js.map +1 -0
  219. package/dist/core/secrets/auth-db-migration.d.ts +129 -0
  220. package/dist/core/secrets/auth-db-migration.js +653 -0
  221. package/dist/core/secrets/auth-db-migration.js.map +1 -0
  222. package/dist/core/secrets/bundle.d.ts +141 -0
  223. package/dist/core/secrets/bundle.js +435 -0
  224. package/dist/core/secrets/bundle.js.map +1 -0
  225. package/dist/core/secrets/dual-write.d.ts +81 -0
  226. package/dist/core/secrets/dual-write.js +247 -0
  227. package/dist/core/secrets/dual-write.js.map +1 -0
  228. package/dist/core/secrets/encryption.d.ts +44 -0
  229. package/dist/core/secrets/encryption.js +97 -0
  230. package/dist/core/secrets/encryption.js.map +1 -0
  231. package/dist/core/secrets/index.d.ts +49 -0
  232. package/dist/core/secrets/index.js +74 -0
  233. package/dist/core/secrets/index.js.map +1 -0
  234. package/dist/core/secrets/master-key.d.ts +38 -0
  235. package/dist/core/secrets/master-key.js +122 -0
  236. package/dist/core/secrets/master-key.js.map +1 -0
  237. package/dist/core/secrets/probes/anthropic.d.ts +98 -0
  238. package/dist/core/secrets/probes/anthropic.js +300 -0
  239. package/dist/core/secrets/probes/anthropic.js.map +1 -0
  240. package/dist/core/secrets/probes/brave.d.ts +9 -0
  241. package/dist/core/secrets/probes/brave.js +15 -0
  242. package/dist/core/secrets/probes/brave.js.map +1 -0
  243. package/dist/core/secrets/probes/r2.d.ts +15 -0
  244. package/dist/core/secrets/probes/r2.js +14 -0
  245. package/dist/core/secrets/probes/r2.js.map +1 -0
  246. package/dist/core/secrets/probes/tavily.d.ts +18 -0
  247. package/dist/core/secrets/probes/tavily.js +58 -0
  248. package/dist/core/secrets/probes/tavily.js.map +1 -0
  249. package/dist/core/secrets/probes/voyage.d.ts +13 -0
  250. package/dist/core/secrets/probes/voyage.js +52 -0
  251. package/dist/core/secrets/probes/voyage.js.map +1 -0
  252. package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
  253. package/dist/core/secrets/r2-structural-migration.js +109 -0
  254. package/dist/core/secrets/r2-structural-migration.js.map +1 -0
  255. package/dist/core/secrets/read-flip.d.ts +59 -0
  256. package/dist/core/secrets/read-flip.js +87 -0
  257. package/dist/core/secrets/read-flip.js.map +1 -0
  258. package/dist/core/secrets/registry.d.ts +188 -0
  259. package/dist/core/secrets/registry.js +616 -0
  260. package/dist/core/secrets/registry.js.map +1 -0
  261. package/dist/core/types.d.ts +77 -483
  262. package/dist/core/types.js +25 -3
  263. package/dist/core/types.js.map +1 -1
  264. package/dist/core/user-config.d.ts +75 -12
  265. package/dist/core/user-config.js +155 -14
  266. package/dist/core/user-config.js.map +1 -1
  267. package/dist/core/validation.d.ts +786 -1373
  268. package/dist/core/validation.js +458 -147
  269. package/dist/core/validation.js.map +1 -1
  270. package/dist/core/workspace-manager.d.ts +87 -14
  271. package/dist/core/workspace-manager.js +222 -94
  272. package/dist/core/workspace-manager.js.map +1 -1
  273. package/dist/core/workspace.d.ts +19 -5
  274. package/dist/core/workspace.js +67 -39
  275. package/dist/core/workspace.js.map +1 -1
  276. package/dist/mcp/comment-virtual-entity.d.ts +36 -0
  277. package/dist/mcp/comment-virtual-entity.js +71 -0
  278. package/dist/mcp/comment-virtual-entity.js.map +1 -0
  279. package/dist/mcp/connector-manager.d.ts +72 -2
  280. package/dist/mcp/connector-manager.js +211 -32
  281. package/dist/mcp/connector-manager.js.map +1 -1
  282. package/dist/mcp/oauth-provider.d.ts +0 -5
  283. package/dist/mcp/oauth-provider.js +10 -22
  284. package/dist/mcp/oauth-provider.js.map +1 -1
  285. package/dist/mcp/oauth-registry.d.ts +46 -8
  286. package/dist/mcp/oauth-registry.js +52 -13
  287. package/dist/mcp/oauth-registry.js.map +1 -1
  288. package/dist/mcp/server-discovery.d.ts +73 -0
  289. package/dist/mcp/server-discovery.js +164 -0
  290. package/dist/mcp/server-discovery.js.map +1 -0
  291. package/dist/mcp/server.d.ts +24 -3
  292. package/dist/mcp/server.js +53 -10
  293. package/dist/mcp/server.js.map +1 -1
  294. package/dist/mcp/state-signer.d.ts +62 -0
  295. package/dist/mcp/state-signer.js +205 -0
  296. package/dist/mcp/state-signer.js.map +1 -0
  297. package/dist/mcp/stdio-proxy.d.ts +67 -0
  298. package/dist/mcp/stdio-proxy.js +149 -0
  299. package/dist/mcp/stdio-proxy.js.map +1 -0
  300. package/dist/mcp/tools.d.ts +65 -2
  301. package/dist/mcp/tools.js +1772 -124
  302. package/dist/mcp/tools.js.map +1 -1
  303. package/dist/server/__tests__/helpers/graph-api.d.ts +16 -0
  304. package/dist/server/__tests__/helpers/graph-api.js +16 -0
  305. package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
  306. package/dist/server/artifact-asset-mint.d.ts +41 -0
  307. package/dist/server/artifact-asset-mint.js +59 -0
  308. package/dist/server/artifact-asset-mint.js.map +1 -0
  309. package/dist/server/asset-index-queue.d.ts +98 -0
  310. package/dist/server/asset-index-queue.js +193 -0
  311. package/dist/server/asset-index-queue.js.map +1 -0
  312. package/dist/server/body-write-coordinator.d.ts +161 -0
  313. package/dist/server/body-write-coordinator.js +182 -0
  314. package/dist/server/body-write-coordinator.js.map +1 -0
  315. package/dist/server/cloud-billing-flow.d.ts +32 -0
  316. package/dist/server/cloud-billing-flow.js +75 -0
  317. package/dist/server/cloud-billing-flow.js.map +1 -0
  318. package/dist/server/commit-audit.d.ts +26 -0
  319. package/dist/server/commit-audit.js +30 -0
  320. package/dist/server/commit-audit.js.map +1 -0
  321. package/dist/server/index.d.ts +29 -3
  322. package/dist/server/index.js +657 -269
  323. package/dist/server/index.js.map +1 -1
  324. package/dist/server/middleware/sanitize.d.ts +46 -0
  325. package/dist/server/middleware/sanitize.js +182 -0
  326. package/dist/server/middleware/sanitize.js.map +1 -0
  327. package/dist/server/routes/artifact-export-api.d.ts +11 -0
  328. package/dist/server/routes/artifact-export-api.js +159 -0
  329. package/dist/server/routes/artifact-export-api.js.map +1 -0
  330. package/dist/server/routes/asset-api.d.ts +76 -1
  331. package/dist/server/routes/asset-api.js +761 -61
  332. package/dist/server/routes/asset-api.js.map +1 -1
  333. package/dist/server/routes/audit-api.d.ts +24 -0
  334. package/dist/server/routes/audit-api.js +117 -0
  335. package/dist/server/routes/audit-api.js.map +1 -0
  336. package/dist/server/routes/auth-api.js +532 -63
  337. package/dist/server/routes/auth-api.js.map +1 -1
  338. package/dist/server/routes/capture-api.d.ts +10 -3
  339. package/dist/server/routes/capture-api.js +213 -25
  340. package/dist/server/routes/capture-api.js.map +1 -1
  341. package/dist/server/routes/chat-sessions-api.d.ts +13 -0
  342. package/dist/server/routes/chat-sessions-api.js +455 -0
  343. package/dist/server/routes/chat-sessions-api.js.map +1 -0
  344. package/dist/server/routes/chat.d.ts +35 -1
  345. package/dist/server/routes/chat.js +699 -54
  346. package/dist/server/routes/chat.js.map +1 -1
  347. package/dist/server/routes/comments-api.d.ts +15 -0
  348. package/dist/server/routes/comments-api.js +444 -0
  349. package/dist/server/routes/comments-api.js.map +1 -0
  350. package/dist/server/routes/config-api.d.ts +3 -2
  351. package/dist/server/routes/config-api.js +179 -49
  352. package/dist/server/routes/config-api.js.map +1 -1
  353. package/dist/server/routes/connectors-api.js +177 -42
  354. package/dist/server/routes/connectors-api.js.map +1 -1
  355. package/dist/server/routes/event-ingest-api.d.ts +15 -0
  356. package/dist/server/routes/{meeting-ingest-api.js → event-ingest-api.js} +35 -20
  357. package/dist/server/routes/event-ingest-api.js.map +1 -0
  358. package/dist/server/routes/field-library-api.d.ts +28 -0
  359. package/dist/server/routes/field-library-api.js +126 -0
  360. package/dist/server/routes/field-library-api.js.map +1 -0
  361. package/dist/server/routes/git-http.d.ts +2 -2
  362. package/dist/server/routes/git-http.js +86 -39
  363. package/dist/server/routes/git-http.js.map +1 -1
  364. package/dist/server/routes/graph-api-access.d.ts +57 -0
  365. package/dist/server/routes/graph-api-access.js +112 -0
  366. package/dist/server/routes/graph-api-access.js.map +1 -0
  367. package/dist/server/routes/graph-api.d.ts +1 -1
  368. package/dist/server/routes/graph-api.js +1455 -325
  369. package/dist/server/routes/graph-api.js.map +1 -1
  370. package/dist/server/routes/health.d.ts +18 -0
  371. package/dist/server/routes/health.js +74 -0
  372. package/dist/server/routes/health.js.map +1 -0
  373. package/dist/server/routes/import-batch.d.ts +24 -0
  374. package/dist/server/routes/import-batch.js +33 -0
  375. package/dist/server/routes/import-batch.js.map +1 -0
  376. package/dist/server/routes/insights-api.d.ts +9 -2
  377. package/dist/server/routes/insights-api.js +355 -61
  378. package/dist/server/routes/insights-api.js.map +1 -1
  379. package/dist/server/routes/mcp.d.ts +7 -3
  380. package/dist/server/routes/mcp.js +24 -8
  381. package/dist/server/routes/mcp.js.map +1 -1
  382. package/dist/server/routes/oauth-api.d.ts +67 -0
  383. package/dist/server/routes/oauth-api.js +421 -0
  384. package/dist/server/routes/oauth-api.js.map +1 -0
  385. package/dist/server/routes/permissions-api.d.ts +9 -2
  386. package/dist/server/routes/permissions-api.js +87 -31
  387. package/dist/server/routes/permissions-api.js.map +1 -1
  388. package/dist/server/routes/r2-api.d.ts +25 -0
  389. package/dist/server/routes/r2-api.js +276 -0
  390. package/dist/server/routes/r2-api.js.map +1 -0
  391. package/dist/server/routes/secrets-api.d.ts +36 -0
  392. package/dist/server/routes/secrets-api.js +308 -0
  393. package/dist/server/routes/secrets-api.js.map +1 -0
  394. package/dist/server/routes/settings-api.d.ts +29 -0
  395. package/dist/server/routes/settings-api.js +180 -0
  396. package/dist/server/routes/settings-api.js.map +1 -0
  397. package/dist/server/routes/share-api.d.ts +32 -0
  398. package/dist/server/routes/share-api.js +234 -0
  399. package/dist/server/routes/share-api.js.map +1 -0
  400. package/dist/server/routes/views-api.js +51 -0
  401. package/dist/server/routes/views-api.js.map +1 -1
  402. package/dist/server/routes/workspace-api.d.ts +2 -1
  403. package/dist/server/routes/workspace-api.js +142 -23
  404. package/dist/server/routes/workspace-api.js.map +1 -1
  405. package/dist/server/routes/ws.d.ts +3 -2
  406. package/dist/server/routes/ws.js +68 -17
  407. package/dist/server/routes/ws.js.map +1 -1
  408. package/dist/server/session-manager.d.ts +48 -5
  409. package/dist/server/session-manager.js +182 -14
  410. package/dist/server/session-manager.js.map +1 -1
  411. package/dist/server/ws-hub.d.ts +124 -37
  412. package/dist/server/ws-hub.js +0 -0
  413. package/dist/server/ws-hub.js.map +1 -1
  414. package/dist/server/yjs-manager.d.ts +278 -7
  415. package/dist/server/yjs-manager.js +830 -38
  416. package/dist/server/yjs-manager.js.map +1 -1
  417. package/dist/server/yjs-persistence.d.ts +165 -0
  418. package/dist/server/yjs-persistence.js +557 -0
  419. package/dist/server/yjs-persistence.js.map +1 -0
  420. package/dist/server/yjs-text-diff.d.ts +32 -0
  421. package/dist/server/yjs-text-diff.js +61 -0
  422. package/dist/server/yjs-text-diff.js.map +1 -0
  423. package/dist/services/access-control.d.ts +73 -0
  424. package/dist/services/access-control.js +165 -0
  425. package/dist/services/access-control.js.map +1 -0
  426. package/dist/services/artifact-asset-token.d.ts +69 -0
  427. package/dist/services/artifact-asset-token.js +94 -0
  428. package/dist/services/artifact-asset-token.js.map +1 -0
  429. package/dist/services/artifact-library-sources.d.ts +3 -0
  430. package/dist/services/artifact-library-sources.js +44 -0
  431. package/dist/services/artifact-library-sources.js.map +1 -0
  432. package/dist/services/artifact-render-export.d.ts +97 -0
  433. package/dist/services/artifact-render-export.js +467 -0
  434. package/dist/services/artifact-render-export.js.map +1 -0
  435. package/dist/services/asset-caption-service.d.ts +103 -0
  436. package/dist/services/asset-caption-service.js +186 -0
  437. package/dist/services/asset-caption-service.js.map +1 -0
  438. package/dist/services/asset-delete-authz.d.ts +31 -0
  439. package/dist/services/asset-delete-authz.js +61 -0
  440. package/dist/services/asset-delete-authz.js.map +1 -0
  441. package/dist/services/asset-finalize-service.d.ts +58 -0
  442. package/dist/services/asset-finalize-service.js +216 -0
  443. package/dist/services/asset-finalize-service.js.map +1 -0
  444. package/dist/services/asset-import-service.d.ts +111 -0
  445. package/dist/services/asset-import-service.js +394 -0
  446. package/dist/services/asset-import-service.js.map +1 -0
  447. package/dist/services/asset-index-sweep.d.ts +95 -0
  448. package/dist/services/asset-index-sweep.js +249 -0
  449. package/dist/services/asset-index-sweep.js.map +1 -0
  450. package/dist/services/asset-lifecycle-check.d.ts +22 -0
  451. package/dist/services/asset-lifecycle-check.js +80 -0
  452. package/dist/services/asset-lifecycle-check.js.map +1 -0
  453. package/dist/services/asset-listing.d.ts +72 -0
  454. package/dist/services/asset-listing.js +321 -0
  455. package/dist/services/asset-listing.js.map +1 -0
  456. package/dist/services/asset-presign-service.d.ts +68 -0
  457. package/dist/services/asset-presign-service.js +124 -0
  458. package/dist/services/asset-presign-service.js.map +1 -0
  459. package/dist/services/asset-sidecar-service.d.ts +28 -0
  460. package/dist/services/asset-sidecar-service.js +79 -0
  461. package/dist/services/asset-sidecar-service.js.map +1 -0
  462. package/dist/services/asset-upload-errors.d.ts +41 -0
  463. package/dist/services/asset-upload-errors.js +45 -0
  464. package/dist/services/asset-upload-errors.js.map +1 -0
  465. package/dist/services/asset-upload-service.d.ts +56 -0
  466. package/dist/services/asset-upload-service.js +200 -0
  467. package/dist/services/asset-upload-service.js.map +1 -0
  468. package/dist/services/asset-upload-token.d.ts +58 -0
  469. package/dist/services/asset-upload-token.js +75 -0
  470. package/dist/services/asset-upload-token.js.map +1 -0
  471. package/dist/services/assets/asset-index-service.d.ts +127 -0
  472. package/dist/services/assets/asset-index-service.js +227 -0
  473. package/dist/services/assets/asset-index-service.js.map +1 -0
  474. package/dist/services/assets/base.d.ts +128 -2
  475. package/dist/services/assets/base.js +98 -1
  476. package/dist/services/assets/base.js.map +1 -1
  477. package/dist/services/assets/index.d.ts +114 -1
  478. package/dist/services/assets/index.js +221 -0
  479. package/dist/services/assets/index.js.map +1 -1
  480. package/dist/services/assets/local.d.ts +16 -1
  481. package/dist/services/assets/local.js +110 -1
  482. package/dist/services/assets/local.js.map +1 -1
  483. package/dist/services/assets/r2-sync.d.ts +88 -0
  484. package/dist/services/assets/r2-sync.js +412 -0
  485. package/dist/services/assets/r2-sync.js.map +1 -0
  486. package/dist/services/assets/r2.d.ts +87 -1
  487. package/dist/services/assets/r2.js +203 -1
  488. package/dist/services/assets/r2.js.map +1 -1
  489. package/dist/services/auth-service.d.ts +312 -45
  490. package/dist/services/auth-service.js +1011 -195
  491. package/dist/services/auth-service.js.map +1 -1
  492. package/dist/services/chat-session-service.d.ts +188 -0
  493. package/dist/services/chat-session-service.js +512 -0
  494. package/dist/services/chat-session-service.js.map +1 -0
  495. package/dist/services/cloud-inference-billing.d.ts +64 -0
  496. package/dist/services/cloud-inference-billing.js +313 -0
  497. package/dist/services/cloud-inference-billing.js.map +1 -0
  498. package/dist/services/comment-service.d.ts +97 -0
  499. package/dist/services/comment-service.js +341 -0
  500. package/dist/services/comment-service.js.map +1 -0
  501. package/dist/services/comment-virtual-entity.d.ts +36 -0
  502. package/dist/services/comment-virtual-entity.js +71 -0
  503. package/dist/services/comment-virtual-entity.js.map +1 -0
  504. package/dist/services/convert-service.d.ts +64 -0
  505. package/dist/services/convert-service.js +68 -0
  506. package/dist/services/convert-service.js.map +1 -0
  507. package/dist/services/csv-service.d.ts +22 -17
  508. package/dist/services/csv-service.js +55 -92
  509. package/dist/services/csv-service.js.map +1 -1
  510. package/dist/services/entity-mutations.d.ts +213 -0
  511. package/dist/services/entity-mutations.js +380 -0
  512. package/dist/services/entity-mutations.js.map +1 -0
  513. package/dist/services/{meeting-processor.d.ts → event-processor.d.ts} +15 -8
  514. package/dist/services/{meeting-processor.js → event-processor.js} +124 -65
  515. package/dist/services/event-processor.js.map +1 -0
  516. package/dist/services/extract/docx.d.ts +1 -0
  517. package/dist/services/extract/docx.js +233 -0
  518. package/dist/services/extract/docx.js.map +1 -0
  519. package/dist/services/extract/index.d.ts +9 -0
  520. package/dist/services/extract/index.js +10 -0
  521. package/dist/services/extract/index.js.map +1 -0
  522. package/dist/services/extract/pdf.d.ts +13 -0
  523. package/dist/services/extract/pdf.js +69 -0
  524. package/dist/services/extract/pdf.js.map +1 -0
  525. package/dist/services/folder-creation.d.ts +33 -0
  526. package/dist/services/folder-creation.js +103 -0
  527. package/dist/services/folder-creation.js.map +1 -0
  528. package/dist/services/git.d.ts +58 -0
  529. package/dist/services/git.js +194 -55
  530. package/dist/services/git.js.map +1 -1
  531. package/dist/services/graph-maintenance.js +4 -4
  532. package/dist/services/graph-maintenance.js.map +1 -1
  533. package/dist/services/import-service.d.ts +51 -2
  534. package/dist/services/import-service.js +254 -107
  535. package/dist/services/import-service.js.map +1 -1
  536. package/dist/services/lint-service.js +10 -17
  537. package/dist/services/lint-service.js.map +1 -1
  538. package/dist/services/markdown.d.ts +12 -1
  539. package/dist/services/markdown.js +77 -9
  540. package/dist/services/markdown.js.map +1 -1
  541. package/dist/services/mention-detector.d.ts +23 -0
  542. package/dist/services/mention-detector.js +47 -0
  543. package/dist/services/mention-detector.js.map +1 -0
  544. package/dist/services/model-capabilities.d.ts +41 -0
  545. package/dist/services/model-capabilities.js +107 -0
  546. package/dist/services/model-capabilities.js.map +1 -0
  547. package/dist/services/notification-broadcast.d.ts +32 -0
  548. package/dist/services/notification-broadcast.js +38 -0
  549. package/dist/services/notification-broadcast.js.map +1 -0
  550. package/dist/services/notification-service.d.ts +41 -0
  551. package/dist/services/notification-service.js +100 -0
  552. package/dist/services/notification-service.js.map +1 -0
  553. package/dist/services/oauth-server-store.d.ts +147 -0
  554. package/dist/services/oauth-server-store.js +319 -0
  555. package/dist/services/oauth-server-store.js.map +1 -0
  556. package/dist/services/orphan-service.js +2 -2
  557. package/dist/services/orphan-service.js.map +1 -1
  558. package/dist/services/personal-folder.d.ts +40 -0
  559. package/dist/services/personal-folder.js +101 -0
  560. package/dist/services/personal-folder.js.map +1 -0
  561. package/dist/services/scratch-asset-promote.d.ts +57 -0
  562. package/dist/services/scratch-asset-promote.js +95 -0
  563. package/dist/services/scratch-asset-promote.js.map +1 -0
  564. package/dist/services/scratch-attachment-service.d.ts +196 -0
  565. package/dist/services/scratch-attachment-service.js +347 -0
  566. package/dist/services/scratch-attachment-service.js.map +1 -0
  567. package/dist/services/share-link-service.d.ts +57 -0
  568. package/dist/services/share-link-service.js +142 -0
  569. package/dist/services/share-link-service.js.map +1 -0
  570. package/dist/services/user-person-bridge.d.ts +136 -0
  571. package/dist/services/user-person-bridge.js +340 -0
  572. package/dist/services/user-person-bridge.js.map +1 -0
  573. package/dist/services/vector-service.d.ts +282 -5
  574. package/dist/services/vector-service.js +585 -29
  575. package/dist/services/vector-service.js.map +1 -1
  576. package/dist/services/workspace-access.d.ts +108 -0
  577. package/dist/services/workspace-access.js +149 -0
  578. package/dist/services/workspace-access.js.map +1 -0
  579. package/dist/services/workspace-assets-folder.d.ts +46 -0
  580. package/dist/services/workspace-assets-folder.js +75 -0
  581. package/dist/services/workspace-assets-folder.js.map +1 -0
  582. package/dist/utils/git.d.ts +17 -2
  583. package/dist/utils/git.js +23 -7
  584. package/dist/utils/git.js.map +1 -1
  585. package/dist/utils/log.d.ts +42 -0
  586. package/dist/utils/log.js +137 -0
  587. package/dist/utils/log.js.map +1 -0
  588. package/dist/utils/preflight.js +2 -2
  589. package/dist/utils/preflight.js.map +1 -1
  590. package/dist/utils/version-checker.d.ts +12 -19
  591. package/dist/utils/version-checker.js +14 -104
  592. package/dist/utils/version-checker.js.map +1 -1
  593. package/dist/web/_app/immutable/assets/0.Bs_z3Z86.css +2 -0
  594. package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
  595. package/dist/web/_app/immutable/assets/14.7d-Q37wc.css +1 -0
  596. package/dist/web/_app/immutable/assets/15.BwBFdc1D.css +1 -0
  597. package/dist/web/_app/immutable/assets/16.CmLrbzZp.css +1 -0
  598. package/dist/web/_app/immutable/assets/17.DcuK5ZVm.css +1 -0
  599. package/dist/web/_app/immutable/assets/2.DATnR31c.css +1 -0
  600. package/dist/web/_app/immutable/assets/3.Cz4H8n_O.css +1 -0
  601. package/dist/web/_app/immutable/assets/4.aDHteTDy.css +1 -0
  602. package/dist/web/_app/immutable/assets/6.CF1i5Bon.css +1 -0
  603. package/dist/web/_app/immutable/assets/ArtifactEntityView.C4ooklFD.css +1 -0
  604. package/dist/web/_app/immutable/assets/AssetLibraryPicker.BOFW0MvF.css +1 -0
  605. package/dist/web/_app/immutable/assets/BulkActionsBar.cmKvHzRK.css +1 -0
  606. package/dist/web/_app/immutable/assets/CalendarView.lBCvS3X5.css +1 -0
  607. package/dist/web/_app/immutable/assets/CodeMirrorEditor.D6hf2pNJ.css +1 -0
  608. package/dist/web/_app/immutable/assets/CopyField.DVGZtw4U.css +1 -0
  609. package/dist/web/_app/immutable/assets/FolderMembersPanel.kiYnDFHu.css +1 -0
  610. package/dist/web/_app/immutable/assets/FolderMutationDialogs.BMRF6Z3z.css +1 -0
  611. package/dist/web/_app/immutable/assets/FolderPicker.Cp46GHe2.css +1 -0
  612. package/dist/web/_app/immutable/assets/GalleryView.WBGxxUQc.css +1 -0
  613. package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
  614. package/dist/web/_app/immutable/assets/KanbanView.BOaI5KFL.css +1 -0
  615. package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
  616. package/dist/web/_app/immutable/assets/Markdown.BZnsSOSf.css +1 -0
  617. package/dist/web/_app/immutable/assets/Rail.ilusFgD4.css +1 -0
  618. package/dist/web/_app/immutable/assets/SettingsDialog.D7-BO6S_.css +1 -0
  619. package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
  620. package/dist/web/_app/immutable/assets/StopFilledAlt.fNlDN65D.css +1 -0
  621. package/dist/web/_app/immutable/assets/TimelineView.xAZBJhHw.css +1 -0
  622. package/dist/web/_app/immutable/assets/WorkspaceView.C8ErUJAY.css +1 -0
  623. package/dist/web/_app/immutable/assets/button.BlLm4Dg1.css +1 -0
  624. package/dist/web/_app/immutable/assets/history-summary.LpmHXasl.css +1 -0
  625. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
  626. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
  627. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
  628. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
  629. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
  630. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
  631. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
  632. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
  633. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
  634. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
  635. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
  636. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
  637. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
  638. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
  639. package/dist/web/_app/immutable/assets/inline-list.cqga56xT.css +1 -0
  640. package/dist/web/_app/immutable/assets/list-columns.BgnafZ4K.css +1 -0
  641. package/dist/web/_app/immutable/assets/realtime.DDCWxn3B.css +1 -0
  642. package/dist/web/_app/immutable/assets/select.B90KUqR4.css +1 -0
  643. package/dist/web/_app/immutable/assets/sheet.RF9RBmml.css +1 -0
  644. package/dist/web/_app/immutable/chunks/22qYtvr82.js +1 -0
  645. package/dist/web/_app/immutable/chunks/2f1VclTm.js +1 -0
  646. package/dist/web/_app/immutable/chunks/4xgUPoGj2.js +2 -0
  647. package/dist/web/_app/immutable/chunks/5CYQk4xR.js +1 -0
  648. package/dist/web/_app/immutable/chunks/6S9WOky52.js +1 -0
  649. package/dist/web/_app/immutable/chunks/9K8VREGP.js +1 -0
  650. package/dist/web/_app/immutable/chunks/B-n5q6ku.js +1 -0
  651. package/dist/web/_app/immutable/chunks/B0p2fSEV2.js +1 -0
  652. package/dist/web/_app/immutable/chunks/B2oi87jG.js +2 -0
  653. package/dist/web/_app/immutable/chunks/B5Rb52QU.js +1 -0
  654. package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
  655. package/dist/web/_app/immutable/chunks/B6O-q2CN.js +1 -0
  656. package/dist/web/_app/immutable/chunks/B6qeIQZz.js +2 -0
  657. package/dist/web/_app/immutable/chunks/B9KfEsQw2.js +1 -0
  658. package/dist/web/_app/immutable/chunks/BB-RSeXQ.js +1 -0
  659. package/dist/web/_app/immutable/chunks/BCQQzpbj.js +1 -0
  660. package/dist/web/_app/immutable/chunks/BGdzd-Tc.js +1 -0
  661. package/dist/web/_app/immutable/chunks/BLs1h0Rh2.js +1 -0
  662. package/dist/web/_app/immutable/chunks/BPzV_xOS2.js +1 -0
  663. package/dist/web/_app/immutable/chunks/BT2C6q8n.js +1 -0
  664. package/dist/web/_app/immutable/chunks/BUesbLq2.js +1 -0
  665. package/dist/web/_app/immutable/chunks/BUrnwOw4.js +2 -0
  666. package/dist/web/_app/immutable/chunks/BV-iCKqa.js +1 -0
  667. package/dist/web/_app/immutable/chunks/BVCJtXyc.js +1 -0
  668. package/dist/web/_app/immutable/chunks/BY9a3GSt.js +6 -0
  669. package/dist/web/_app/immutable/chunks/BZi3uKF4.js +1 -0
  670. package/dist/web/_app/immutable/chunks/BbfHGU9n2.js +1 -0
  671. package/dist/web/_app/immutable/chunks/Bbqu2-5G2.js +1 -0
  672. package/dist/web/_app/immutable/chunks/BbsX1Slr.js +3 -0
  673. package/dist/web/_app/immutable/chunks/BcwjqHaZ2.js +1 -0
  674. package/dist/web/_app/immutable/chunks/BizeEpTx.js +2 -0
  675. package/dist/web/_app/immutable/chunks/BlgjVmFM2.js +14 -0
  676. package/dist/web/_app/immutable/chunks/BocSRgv12.js +1 -0
  677. package/dist/web/_app/immutable/chunks/BojBYqc3.js +1 -0
  678. package/dist/web/_app/immutable/chunks/BpCG9m962.js +1 -0
  679. package/dist/web/_app/immutable/chunks/BqvnBg_y.js +1 -0
  680. package/dist/web/_app/immutable/chunks/BsT0J1QD.js +1 -0
  681. package/dist/web/_app/immutable/chunks/BsW72fyR2.js +1 -0
  682. package/dist/web/_app/immutable/chunks/Bti_XKwx.js +2692 -0
  683. package/dist/web/_app/immutable/chunks/Bua97Had2.js +2 -0
  684. package/dist/web/_app/immutable/chunks/BuhW5Fr0.js +689 -0
  685. package/dist/web/_app/immutable/chunks/Bx74EEyn2.js +1 -0
  686. package/dist/web/_app/immutable/chunks/BxPN0T61.js +1 -0
  687. package/dist/web/_app/immutable/chunks/Bz9lrgGs.js +1 -0
  688. package/dist/web/_app/immutable/chunks/BzaxZ6j12.js +1 -0
  689. package/dist/web/_app/immutable/chunks/C1B4xDs0.js +1 -0
  690. package/dist/web/_app/immutable/chunks/C1trcC8M.js +7 -0
  691. package/dist/web/_app/immutable/chunks/C9tvkk7Y2.js +22 -0
  692. package/dist/web/_app/immutable/chunks/CBQjdDZf.js +1 -0
  693. package/dist/web/_app/immutable/chunks/CDeazMFW2.js +2 -0
  694. package/dist/web/_app/immutable/chunks/CEahbtnP.js +1 -0
  695. package/dist/web/_app/immutable/chunks/CGjVCd0e.js +8 -0
  696. package/dist/web/_app/immutable/chunks/CICK9maP.js +1 -0
  697. package/dist/web/_app/immutable/chunks/CIoNEHQ82.js +184 -0
  698. package/dist/web/_app/immutable/chunks/CP8_U450.js +1 -0
  699. package/dist/web/_app/immutable/chunks/CQ1eQ93t2.js +6 -0
  700. package/dist/web/_app/immutable/chunks/CUFQMEBn2.js +1 -0
  701. package/dist/web/_app/immutable/chunks/CYEYDNwO2.js +1 -0
  702. package/dist/web/_app/immutable/chunks/CYyIP7kP2.js +66 -0
  703. package/dist/web/_app/immutable/chunks/CZgFaimi2.js +83 -0
  704. package/dist/web/_app/immutable/chunks/CZqvCTCv.js +1 -0
  705. package/dist/web/_app/immutable/chunks/CcI9jYBV.js +1 -0
  706. package/dist/web/_app/immutable/chunks/CcWaWbrI2.js +1 -0
  707. package/dist/web/_app/immutable/chunks/CdtzRVZK.js +1 -0
  708. package/dist/web/_app/immutable/chunks/CfYG72Hc.js +1 -0
  709. package/dist/web/_app/immutable/chunks/Ch1kmm3J2.js +1 -0
  710. package/dist/web/_app/immutable/chunks/CmSSN61R2.js +1 -0
  711. package/dist/web/_app/immutable/chunks/Cqm5wAin.js +1 -0
  712. package/dist/web/_app/immutable/chunks/CuYPXpWU.js +1 -0
  713. package/dist/web/_app/immutable/chunks/CvSEodTA.js +1 -0
  714. package/dist/web/_app/immutable/chunks/CvqqrTrj.js +1 -0
  715. package/dist/web/_app/immutable/chunks/CwAmWt6h.js +1 -0
  716. package/dist/web/_app/immutable/chunks/CwP3Oa7F.js +1 -0
  717. package/dist/web/_app/immutable/chunks/CyTluew1.js +2 -0
  718. package/dist/web/_app/immutable/chunks/CzXdOgVl2.js +7 -0
  719. package/dist/web/_app/immutable/chunks/D0IAituJ.js +1 -0
  720. package/dist/web/_app/immutable/chunks/D0W7c6Sg.js +185 -0
  721. package/dist/web/_app/immutable/chunks/D0rBhnqB2.js +1 -0
  722. package/dist/web/_app/immutable/chunks/D1-GZSN1.js +1 -0
  723. package/dist/web/_app/immutable/chunks/D1yvtriI.js +1 -0
  724. package/dist/web/_app/immutable/chunks/D25NMRpl.js +1 -0
  725. package/dist/web/_app/immutable/chunks/D8wZ2xul.js +4 -0
  726. package/dist/web/_app/immutable/chunks/DA3HEX3X.js +1 -0
  727. package/dist/web/_app/immutable/chunks/DD9wj4ca2.js +1 -0
  728. package/dist/web/_app/immutable/chunks/DJ1YeiJL2.js +1 -0
  729. package/dist/web/_app/immutable/chunks/DKFZnpVC.js +5 -0
  730. package/dist/web/_app/immutable/chunks/DKJl40hl.js +1 -0
  731. package/dist/web/_app/immutable/chunks/DPUVu0T0.js +1 -0
  732. package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
  733. package/dist/web/_app/immutable/chunks/DXsFrDer2.js +1 -0
  734. package/dist/web/_app/immutable/chunks/DYc5KW3F.js +1 -0
  735. package/dist/web/_app/immutable/chunks/DZcTwXBW.js +1 -0
  736. package/dist/web/_app/immutable/chunks/DcPrzUMJ.js +1 -0
  737. package/dist/web/_app/immutable/chunks/DdPO8kRu2.js +2 -0
  738. package/dist/web/_app/immutable/chunks/DeOXyJZw2.js +1 -0
  739. package/dist/web/_app/immutable/chunks/DfufUFR1.js +2 -0
  740. package/dist/web/_app/immutable/chunks/DiQg3ing.js +1 -0
  741. package/dist/web/_app/immutable/chunks/DjIqa1_y.js +2 -0
  742. package/dist/web/_app/immutable/chunks/DkJ1dkxV2.js +1 -0
  743. package/dist/web/_app/immutable/chunks/Dl63IUnH2.js +224 -0
  744. package/dist/web/_app/immutable/chunks/DmFdD6zT.js +1 -0
  745. package/dist/web/_app/immutable/chunks/Dn3R8S-U.js +1 -0
  746. package/dist/web/_app/immutable/chunks/DpNr1GQ2.js +1 -0
  747. package/dist/web/_app/immutable/chunks/DpVNDHXz.js +2 -0
  748. package/dist/web/_app/immutable/chunks/DuxziNnw.js +1 -0
  749. package/dist/web/_app/immutable/chunks/Dv3A3Wcj.js +1 -0
  750. package/dist/web/_app/immutable/chunks/FuiJnZG0.js +1 -0
  751. package/dist/web/_app/immutable/chunks/Izkulod7.js +1 -0
  752. package/dist/web/_app/immutable/chunks/KZY6ongq2.js +2 -0
  753. package/dist/web/_app/immutable/chunks/LYL8znYR2.js +23 -0
  754. package/dist/web/_app/immutable/chunks/PhN6tXuJ2.js +1 -0
  755. package/dist/web/_app/immutable/chunks/PyLyCpuL.js +1 -0
  756. package/dist/web/_app/immutable/chunks/RK4gCWN0.js +2 -0
  757. package/dist/web/_app/immutable/chunks/VsBngTf4.js +2 -0
  758. package/dist/web/_app/immutable/chunks/XcWejFm_.js +5 -0
  759. package/dist/web/_app/immutable/chunks/al_nidE9.js +1 -0
  760. package/dist/web/_app/immutable/chunks/e50-izZO2.js +1 -0
  761. package/dist/web/_app/immutable/chunks/hG-QCarB.js +1 -0
  762. package/dist/web/_app/immutable/chunks/hStvCHkX.js +1 -0
  763. package/dist/web/_app/immutable/chunks/iJVY9p0y.js +3 -0
  764. package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
  765. package/dist/web/_app/immutable/chunks/pIXNe0C1.js +1 -0
  766. package/dist/web/_app/immutable/chunks/pNSRq_1B.js +2 -0
  767. package/dist/web/_app/immutable/chunks/qwr5boV8.js +1 -0
  768. package/dist/web/_app/immutable/chunks/rjjyuGhb.js +1 -0
  769. package/dist/web/_app/immutable/chunks/sg-T-FoN.js +1 -0
  770. package/dist/web/_app/immutable/chunks/uBgoVlsx.js +3 -0
  771. package/dist/web/_app/immutable/chunks/ulshNz6x.js +2 -0
  772. package/dist/web/_app/immutable/chunks/xY0c-UfG.js +3 -0
  773. package/dist/web/_app/immutable/chunks/xeNvx4Bl2.js +1 -0
  774. package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
  775. package/dist/web/_app/immutable/entry/app.pNUW-q4U.js +2 -0
  776. package/dist/web/_app/immutable/entry/start.DxGtIGG_.js +1 -0
  777. package/dist/web/_app/immutable/nodes/0.D6ZCY_R6.js +2 -0
  778. package/dist/web/_app/immutable/nodes/1.BryH3TNr.js +1 -0
  779. package/dist/web/_app/immutable/nodes/10.CMZMvR17.js +1 -0
  780. package/dist/web/_app/immutable/nodes/11.QHx_JShx.js +1 -0
  781. package/dist/web/_app/immutable/nodes/12.CiRWbb4X.js +1 -0
  782. package/dist/web/_app/immutable/nodes/13.CYrHXCA8.js +1 -0
  783. package/dist/web/_app/immutable/nodes/14.K18eIE5Z.js +1 -0
  784. package/dist/web/_app/immutable/nodes/15.DxgnZ61h.js +1 -0
  785. package/dist/web/_app/immutable/nodes/16.Dn6iuWIo.js +1 -0
  786. package/dist/web/_app/immutable/nodes/17.viwS7vTR.js +77 -0
  787. package/dist/web/_app/immutable/nodes/2.BQkQ_uUM.js +122 -0
  788. package/dist/web/_app/immutable/nodes/3.B4pqXsqq.js +6 -0
  789. package/dist/web/_app/immutable/nodes/4.CKXEgIAP.js +11 -0
  790. package/dist/web/_app/immutable/nodes/5.A2TASl4Q.js +1 -0
  791. package/dist/web/_app/immutable/nodes/6.DaIRO3SI.js +6 -0
  792. package/dist/web/_app/immutable/nodes/7.ga2UvFm-.js +1 -0
  793. package/dist/web/_app/immutable/nodes/8.BTEWT81u.js +1 -0
  794. package/dist/web/_app/immutable/nodes/9.BVxo0E0c.js +1 -0
  795. package/dist/web/_app/version.json +1 -1
  796. package/dist/web/favicon-16.png +0 -0
  797. package/dist/web/favicon-180.png +0 -0
  798. package/dist/web/favicon-32.png +0 -0
  799. package/dist/web/favicon-48.png +0 -0
  800. package/dist/web/favicon-512.png +0 -0
  801. package/dist/web/favicon.ico +0 -0
  802. package/dist/web/favicon.svg +8 -0
  803. package/dist/web/index.html +56 -21
  804. package/dist/web/studiograph-logomark.svg +29 -0
  805. package/package.json +35 -14
  806. package/dist/agent/skills/enrich-entities.md +0 -136
  807. package/dist/agent/skills/sync-configuration.md +0 -119
  808. package/dist/agent/skills/sync-setup.md +0 -82
  809. package/dist/agent/tools/message-tools.d.ts +0 -42
  810. package/dist/agent/tools/message-tools.js +0 -106
  811. package/dist/agent/tools/message-tools.js.map +0 -1
  812. package/dist/cli/commands/app.d.ts +0 -7
  813. package/dist/cli/commands/app.js +0 -268
  814. package/dist/cli/commands/app.js.map +0 -1
  815. package/dist/cli/commands/clear.d.ts +0 -5
  816. package/dist/cli/commands/clear.js +0 -36
  817. package/dist/cli/commands/clear.js.map +0 -1
  818. package/dist/cli/commands/collection.d.ts +0 -10
  819. package/dist/cli/commands/collection.js.map +0 -1
  820. package/dist/cli/commands/join.d.ts +0 -9
  821. package/dist/cli/commands/join.js +0 -255
  822. package/dist/cli/commands/join.js.map +0 -1
  823. package/dist/cli/commands/start.d.ts +0 -7
  824. package/dist/cli/commands/start.js +0 -584
  825. package/dist/cli/commands/start.js.map +0 -1
  826. package/dist/cli/commands/update.d.ts +0 -8
  827. package/dist/cli/commands/update.js +0 -155
  828. package/dist/cli/commands/update.js.map +0 -1
  829. package/dist/cli/commands/user.d.ts +0 -7
  830. package/dist/cli/commands/user.js +0 -175
  831. package/dist/cli/commands/user.js.map +0 -1
  832. package/dist/cli/scaffolding.d.ts +0 -12
  833. package/dist/cli/scaffolding.js +0 -397
  834. package/dist/cli/scaffolding.js.map +0 -1
  835. package/dist/integrations/registry.d.ts +0 -8
  836. package/dist/integrations/registry.js +0 -7
  837. package/dist/integrations/registry.js.map +0 -1
  838. package/dist/integrations/types.d.ts +0 -43
  839. package/dist/integrations/types.js +0 -5
  840. package/dist/integrations/types.js.map +0 -1
  841. package/dist/lib/lib/utils.d.ts +0 -2
  842. package/dist/lib/lib/utils.js +0 -6
  843. package/dist/lib/lib/utils.js.map +0 -1
  844. package/dist/server/chrome/chrome.css +0 -691
  845. package/dist/server/chrome/chrome.js +0 -374
  846. package/dist/server/commit-scheduler.d.ts +0 -39
  847. package/dist/server/commit-scheduler.js +0 -113
  848. package/dist/server/commit-scheduler.js.map +0 -1
  849. package/dist/server/plugin-loader.d.ts +0 -53
  850. package/dist/server/plugin-loader.js +0 -155
  851. package/dist/server/plugin-loader.js.map +0 -1
  852. package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
  853. package/dist/server/routes/meeting-ingest-api.js.map +0 -1
  854. package/dist/server/routes/messages-api.d.ts +0 -15
  855. package/dist/server/routes/messages-api.js +0 -385
  856. package/dist/server/routes/messages-api.js.map +0 -1
  857. package/dist/services/batch-processor.d.ts +0 -49
  858. package/dist/services/batch-processor.js +0 -166
  859. package/dist/services/batch-processor.js.map +0 -1
  860. package/dist/services/briefing.d.ts +0 -26
  861. package/dist/services/briefing.js +0 -230
  862. package/dist/services/briefing.js.map +0 -1
  863. package/dist/services/heartbeat.d.ts +0 -28
  864. package/dist/services/heartbeat.js +0 -183
  865. package/dist/services/heartbeat.js.map +0 -1
  866. package/dist/services/image-import-service.d.ts +0 -24
  867. package/dist/services/image-import-service.js +0 -108
  868. package/dist/services/image-import-service.js.map +0 -1
  869. package/dist/services/insights.d.ts +0 -38
  870. package/dist/services/insights.js +0 -269
  871. package/dist/services/insights.js.map +0 -1
  872. package/dist/services/meeting-processor.js.map +0 -1
  873. package/dist/services/message-service.d.ts +0 -68
  874. package/dist/services/message-service.js +0 -220
  875. package/dist/services/message-service.js.map +0 -1
  876. package/dist/utils/workspace-config.d.ts +0 -8
  877. package/dist/utils/workspace-config.js +0 -22
  878. package/dist/utils/workspace-config.js.map +0 -1
  879. package/dist/web/_app/immutable/assets/0.uPSqtsC5.css +0 -1
  880. package/dist/web/_app/immutable/assets/11.2jzI3cZY.css +0 -1
  881. package/dist/web/_app/immutable/assets/12.CT4xL4K3.css +0 -1
  882. package/dist/web/_app/immutable/assets/13.BUrHkYry.css +0 -1
  883. package/dist/web/_app/immutable/assets/2.DpQWr6q6.css +0 -1
  884. package/dist/web/_app/immutable/assets/3.BxdqT7zi.css +0 -1
  885. package/dist/web/_app/immutable/assets/4.DdNqjd0T.css +0 -1
  886. package/dist/web/_app/immutable/assets/5.DFeGxLYf.css +0 -1
  887. package/dist/web/_app/immutable/assets/6.DXZr_rI_.css +0 -1
  888. package/dist/web/_app/immutable/assets/GraphView.D9ePpZez.css +0 -1
  889. package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
  890. package/dist/web/_app/immutable/assets/ViewToolbar.BWE03S64.css +0 -1
  891. package/dist/web/_app/immutable/assets/WorkspaceView.CgGDi_Zb.css +0 -1
  892. package/dist/web/_app/immutable/assets/wikilinks.CzMBkUMB.css +0 -1
  893. package/dist/web/_app/immutable/chunks/-jG4Obyh.js +0 -4
  894. package/dist/web/_app/immutable/chunks/2nrc8f_O.js +0 -1
  895. package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
  896. package/dist/web/_app/immutable/chunks/8Q3ZJIYu.js +0 -1
  897. package/dist/web/_app/immutable/chunks/B8ydT5xX.js +0 -2
  898. package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
  899. package/dist/web/_app/immutable/chunks/BEn6N5c2.js +0 -1
  900. package/dist/web/_app/immutable/chunks/BFNNbCAM.js +0 -1
  901. package/dist/web/_app/immutable/chunks/BFZZEUd5.js +0 -1
  902. package/dist/web/_app/immutable/chunks/BGk8kfOE.js +0 -2
  903. package/dist/web/_app/immutable/chunks/BIBCr278.js +0 -1
  904. package/dist/web/_app/immutable/chunks/BPCkkwqe.js +0 -1
  905. package/dist/web/_app/immutable/chunks/BhlvzGQx.js +0 -1
  906. package/dist/web/_app/immutable/chunks/BlMknQeF.js +0 -1
  907. package/dist/web/_app/immutable/chunks/BpjqrlCg.js +0 -1
  908. package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
  909. package/dist/web/_app/immutable/chunks/ByBZ7JIT.js +0 -1
  910. package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
  911. package/dist/web/_app/immutable/chunks/BzJTZOK2.js +0 -1
  912. package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
  913. package/dist/web/_app/immutable/chunks/C3uBrOS5.js +0 -1
  914. package/dist/web/_app/immutable/chunks/C8R1sDpW.js +0 -1
  915. package/dist/web/_app/immutable/chunks/CDRHrs0g.js +0 -1
  916. package/dist/web/_app/immutable/chunks/CN5_py1I.js +0 -1
  917. package/dist/web/_app/immutable/chunks/CPne482a.js +0 -1
  918. package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
  919. package/dist/web/_app/immutable/chunks/CWyU-seV.js +0 -1
  920. package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
  921. package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
  922. package/dist/web/_app/immutable/chunks/ChsiIm-E.js +0 -1
  923. package/dist/web/_app/immutable/chunks/CojKppbh.js +0 -1
  924. package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
  925. package/dist/web/_app/immutable/chunks/CtYLtD7K.js +0 -1
  926. package/dist/web/_app/immutable/chunks/D-HDy5qS.js +0 -1
  927. package/dist/web/_app/immutable/chunks/D5aIYSkd.js +0 -1
  928. package/dist/web/_app/immutable/chunks/DBBXARVf.js +0 -1
  929. package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
  930. package/dist/web/_app/immutable/chunks/DKaafS50.js +0 -1
  931. package/dist/web/_app/immutable/chunks/DUMOo1Pn.js +0 -1
  932. package/dist/web/_app/immutable/chunks/DWX9f6AF.js +0 -1
  933. package/dist/web/_app/immutable/chunks/DY8-EONP.js +0 -1
  934. package/dist/web/_app/immutable/chunks/DkoHPElM.js +0 -1
  935. package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
  936. package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
  937. package/dist/web/_app/immutable/chunks/DujahU3W.js +0 -1
  938. package/dist/web/_app/immutable/chunks/FBn-ES5k.js +0 -1
  939. package/dist/web/_app/immutable/chunks/HQpwSOb3.js +0 -1
  940. package/dist/web/_app/immutable/chunks/KyjzlWRN.js +0 -2
  941. package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
  942. package/dist/web/_app/immutable/chunks/UwYfmrPx.js +0 -2
  943. package/dist/web/_app/immutable/chunks/W25ZVI8L.js +0 -2
  944. package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
  945. package/dist/web/_app/immutable/chunks/XjsuEnNE.js +0 -5
  946. package/dist/web/_app/immutable/chunks/ZD6ARAtb.js +0 -1
  947. package/dist/web/_app/immutable/chunks/pBTf4stg.js +0 -2
  948. package/dist/web/_app/immutable/chunks/rGIarcnp.js +0 -1
  949. package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
  950. package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
  951. package/dist/web/_app/immutable/entry/app.ZHiTM8WS.js +0 -2
  952. package/dist/web/_app/immutable/entry/start.C9-FfAVc.js +0 -1
  953. package/dist/web/_app/immutable/nodes/0.D92Orz8k.js +0 -2
  954. package/dist/web/_app/immutable/nodes/1.BMdyglM_.js +0 -1
  955. package/dist/web/_app/immutable/nodes/10.BilVDHSL.js +0 -1
  956. package/dist/web/_app/immutable/nodes/11.CS9E0Hic.js +0 -1
  957. package/dist/web/_app/immutable/nodes/12.D3BOxYzG.js +0 -1
  958. package/dist/web/_app/immutable/nodes/13.CClMKYtN.js +0 -1
  959. package/dist/web/_app/immutable/nodes/2.C8KKElPL.js +0 -267
  960. package/dist/web/_app/immutable/nodes/3.C5n5uiWU.js +0 -5
  961. package/dist/web/_app/immutable/nodes/4.DcGVvgiL.js +0 -11
  962. package/dist/web/_app/immutable/nodes/5.DxIjnFQO.js +0 -4
  963. package/dist/web/_app/immutable/nodes/6.lkh6kKLj.js +0 -1
  964. package/dist/web/_app/immutable/nodes/7.Bg7SbfhA.js +0 -1
  965. package/dist/web/_app/immutable/nodes/8.DcXWCNBE.js +0 -1
  966. package/dist/web/_app/immutable/nodes/9.Cefi8Jfm.js +0 -1
@@ -6,10 +6,13 @@
6
6
  */
7
7
  import { GitService, GitUser } from '../services/git.js';
8
8
  import { MarkdownDocument } from '../services/markdown.js';
9
- import { AssetInfo, AssetConfig } from '../services/assets/index.js';
9
+ import type { BodyWriteCoordinator, BodyWriteResult } from '../server/body-write-coordinator.js';
10
+ import { AssetService, AssetInfo, AssetRecord, AssetConfig, type AssetUploadResult } from '../services/assets/index.js';
11
+ import type { AssetIndexService } from '../services/assets/asset-index-service.js';
10
12
  import { EntityType, type EntityData, type DatasetRow } from './validation.js';
11
13
  import { SchemaRegistry } from './schema-registry.js';
12
14
  import { type DatasetFilter } from '../services/csv-service.js';
15
+ import { type HistoryCommitChange } from './history-diff.js';
13
16
  import { type VectorService } from '../services/vector-service.js';
14
17
  export interface GraphConfig {
15
18
  repoPath: string;
@@ -20,14 +23,38 @@ export interface GraphConfig {
20
23
  schemaRegistry?: SchemaRegistry;
21
24
  /** When true, all git operations are skipped. Used for the private/ graph. */
22
25
  noGit?: boolean;
26
+ /** Workspace root path. Used to anchor cross-repo artefacts like the
27
+ * PDF text sidecar at `<workspaceRoot>/.studiograph/assets-text/...`.
28
+ * Optional — when undefined, sidecar cleanup is a no-op. */
29
+ workspaceRoot?: string;
23
30
  }
24
31
  export interface EntityFile {
25
32
  id: string;
26
33
  path: string;
34
+ /** Repo-relative POSIX path of the containing folder. "" for repo root. */
35
+ folder_path: string;
27
36
  entityType: string;
28
37
  data: EntityData;
29
38
  document: MarkdownDocument;
30
39
  }
40
+ export interface FolderEntry {
41
+ /** Repo-relative POSIX path. */
42
+ path: string;
43
+ /** Last segment of the path. */
44
+ name: string;
45
+ /** Optional human-readable label. Set only when an explicit override exists
46
+ * in the folder's `.studiograph-folder.json` sidecar; clients fall back to
47
+ * toDisplayName(name) when undefined. */
48
+ display_name?: string;
49
+ /** Stable folder id from the sidecar, when assigned. Eagerly written on
50
+ * folder creation; absent for folders never mutated through the app (those
51
+ * fall back to a path-based scope key). Reads never generate one. */
52
+ id?: string;
53
+ }
54
+ export interface FolderDeleteResult {
55
+ entriesDeleted: number;
56
+ subfoldersDeleted: number;
57
+ }
31
58
  export interface SearchOptions {
32
59
  entityType?: EntityType;
33
60
  query?: string;
@@ -40,6 +67,12 @@ export interface SearchOptions {
40
67
  };
41
68
  sortBy?: 'created_at' | 'updated_at' | 'relevance';
42
69
  limit?: number;
70
+ /**
71
+ * When true, score only on name match — skip frontmatter field scan and
72
+ * full-body content scan. Used by autosuggest, where scanning every
73
+ * entity's markdown body dominates wall time.
74
+ */
75
+ nameOnly?: boolean;
43
76
  }
44
77
  export interface CreateEntityOptions {
45
78
  entityType: EntityType;
@@ -48,9 +81,39 @@ export interface CreateEntityOptions {
48
81
  content?: string;
49
82
  commitMessage?: string;
50
83
  skipCommit?: boolean;
84
+ /**
85
+ * Repo-relative folder to create the entry in. Empty/undefined = repo root.
86
+ * Parent folders are auto-created (mkdir -p semantics).
87
+ */
88
+ folderPath?: string;
51
89
  /** Override commit author (for per-user attribution in web UI). */
52
90
  user?: GitUser;
91
+ /**
92
+ * Suppress the fire-and-forget vector upsert for THIS create. Used by the
93
+ * asset-upload flow, where the entity is created as a `__pending__` stub
94
+ * (no sidecar, no `indexable`) and then finalized by a follow-up `update`.
95
+ * Indexing the stub is both wasteful (name-only, pre-sidecar) and racy: its
96
+ * async embedding can resolve AFTER the finalizing update's body-inclusive
97
+ * upsert and clobber the good row, leaving the asset searchable by filename
98
+ * only. Skipping it means the single authoritative upsert is the finalizing
99
+ * update, after the sidecar is on disk. Default false (every other path
100
+ * indexes on create as before).
101
+ */
102
+ skipVectorIndex?: boolean;
53
103
  }
104
+ /**
105
+ * Body-write provenance. Every `graph.update` call that passes `content`
106
+ * must declare its `source`.
107
+ *
108
+ * - `'autosave'`: web editor autosave PUT. Content came from a live Y.Text;
109
+ * the live Y.Doc is already authoritative, so we write disk + commit
110
+ * under the per-doc lock but do NOT re-apply to the Y.Doc (that would
111
+ * race in-flight keystrokes typed during the round trip).
112
+ * - `'server-write'`: any server-side caller (MCP `update_entity`, agent
113
+ * tools, event processor). Routes through `applyAgentContent` under the
114
+ * per-doc lock so live editors receive the broadcast post-commit.
115
+ */
116
+ export type BodyWriteSource = 'autosave' | 'server-write';
54
117
  export interface UpdateEntityOptions {
55
118
  entityType: EntityType;
56
119
  entityId: string;
@@ -60,6 +123,98 @@ export interface UpdateEntityOptions {
60
123
  skipCommit?: boolean;
61
124
  /** Override commit author (for per-user attribution in web UI). */
62
125
  user?: GitUser;
126
+ /**
127
+ * Required when `content !== undefined`. See {@link BodyWriteSource}.
128
+ */
129
+ source?: BodyWriteSource;
130
+ /**
131
+ * Optional precondition for body writes. When set, the server compares
132
+ * this hash to `sha256(existing.document.content)` BEFORE mutating
133
+ * anything. Mismatch throws {@link StaleBaseRevisionError} so the caller
134
+ * can refetch + recompute. When omitted, last-writer-wins.
135
+ *
136
+ * Content hash, not `updated_at`, because two `new Date().toISOString()`
137
+ * stamps can alias to the same millisecond on fast hardware.
138
+ */
139
+ baseRevision?: string;
140
+ /**
141
+ * Optional sink for the body-write broadcast disposition. Only fires on
142
+ * the coordinator (body-write) path. Lets a caller (e.g. MCP
143
+ * update_entity) surface `broadcast-failed` in its diagnostics instead
144
+ * of the disposition being discarded after `writeBody` returns.
145
+ */
146
+ onBroadcast?: (disposition: BodyWriteResult['broadcast']) => void;
147
+ }
148
+ /**
149
+ * Thrown by `graph.update` when the git commit fails after the disk write
150
+ * has already landed. The .md is updated and observable to subsequent
151
+ * readers via `graph.get`, but no commit exists — the repo is dirty.
152
+ *
153
+ * The caller MUST surface this typed error so an operator can recover
154
+ * (manual `git add && git commit`, or `git checkout -- <path>` to revert
155
+ * disk). v3-of-the-plan claim of "auto-convergence via sessionManager"
156
+ * was false outside the autosave PUT path; Phase 2 explicitly registers
157
+ * server-side dirty files with sessionManager when available, but the
158
+ * caller still gets the typed error so it knows the write was partial.
159
+ */
160
+ export declare class CommitFailedDirtyError extends Error {
161
+ readonly entityType: string;
162
+ readonly entityId: string;
163
+ readonly path: string;
164
+ readonly code: "COMMIT_FAILED_DIRTY";
165
+ constructor(entityType: string, entityId: string, path: string, cause: unknown);
166
+ }
167
+ /**
168
+ * Thrown by `graph.update` when a body write supplies a `baseRevision`
169
+ * that doesn't match the current body's content hash. Caller (autosave,
170
+ * MCP, agent, event processor) refetches and retries against the new
171
+ * revision.
172
+ */
173
+ export declare class StaleBaseRevisionError extends Error {
174
+ readonly entityType: string;
175
+ readonly entityId: string;
176
+ readonly expected: string;
177
+ readonly actual: string;
178
+ readonly code: "STALE_BASE_REVISION";
179
+ constructor(entityType: string, entityId: string, expected: string, actual: string);
180
+ }
181
+ /**
182
+ * Callbacks that fire AFTER successful structural mutations. Used by the Yjs
183
+ * persistence layer so snapshot files follow the .md file (rename → rename
184
+ * snapshot, delete → delete snapshot, type change → rename across type dirs).
185
+ *
186
+ * Hooked at this layer because the four mutation methods (delete, rename,
187
+ * changeType, plus cross-repo create+delete via /transfer) are the canonical
188
+ * mutation surface — every code path that moves an entity goes through them.
189
+ *
190
+ * Body-write hooks (onBodyWritten, applyAgentContent, withDocLock,
191
+ * assertWritable, onCommitFailedDirty) used to live here too. Phase 4
192
+ * extracted them into {@link BodyWriteCoordinator} — different concurrency
193
+ * profile, single critical section. This interface now covers ONLY the
194
+ * structural-mutation notifications that drive snapshot bookkeeping.
195
+ */
196
+ export interface GraphPersistenceCallbacks {
197
+ onDelete?(repo: string, entityType: string, entityId: string): void | Promise<void>;
198
+ onRename?(repo: string, entityType: string, oldId: string, newId: string): void | Promise<void>;
199
+ onChangeType?(repo: string, entityId: string, fromType: string, toType: string): void | Promise<void>;
200
+ }
201
+ /**
202
+ * Thrown by `restoreFile` when the path the recreate would land at is
203
+ * currently occupied by a different entity. Carries the occupant's
204
+ * coordinates so callers (agent tool, REST endpoint) can surface a
205
+ * useful error to the user.
206
+ */
207
+ export declare class PathConflictError extends Error {
208
+ readonly path: string;
209
+ readonly occupiedBy: {
210
+ entityType: string;
211
+ entityId: string;
212
+ };
213
+ readonly code: "PATH_CONFLICT";
214
+ constructor(path: string, occupiedBy: {
215
+ entityType: string;
216
+ entityId: string;
217
+ });
63
218
  }
64
219
  export declare class BaseGraphManager {
65
220
  private repoPath;
@@ -67,22 +222,177 @@ export declare class BaseGraphManager {
67
222
  private gitService?;
68
223
  private noGit;
69
224
  private markdownService;
225
+ private csvService;
70
226
  private assetService?;
227
+ /** Workspace-global ownership index for immutable-keyed assets. Injected by
228
+ * WorkspaceManager (one per workspace). Undefined in coordinator-less test
229
+ * / CLI graphs — those fall back to the legacy `{type}/{id}` key scheme. */
230
+ private assetIndex?;
71
231
  private gitUser;
72
- private csvService;
73
232
  private vectorService?;
74
233
  private schemaRegistry?;
234
+ private workspaceRoot?;
235
+ /** Cache for history-panel change summaries, keyed by `${relPath}@${hash}`.
236
+ * A commit's diff against its parent is immutable, so this never needs
237
+ * invalidation — entries only accumulate as history is viewed. */
238
+ private historyChangeCache;
239
+ private persistenceCallbacks?;
240
+ private bodyWriteCoordinator?;
75
241
  constructor(config: GraphConfig);
76
- /** Expose git service for deferred commit operations (e.g. CommitScheduler). */
242
+ /**
243
+ * Friendly display label for an entity type — custom-type label when the
244
+ * workspace defines one, otherwise the title-cased key ("deal" → "Deal").
245
+ * Used to build human-readable commit messages.
246
+ */
247
+ private typeLabel;
248
+ /** Build an EntityRef for a commit message from a type, id, and optional title. */
249
+ private commitRef;
250
+ /**
251
+ * Build the friendly "Edited …" message for a deferred (batched) commit,
252
+ * given the "type/id" pairs accumulated by the SessionManager. Each title is
253
+ * resolved from the in-memory index at flush time (cheap lookup); an entity
254
+ * deleted before the flush falls back to its slug id.
255
+ */
256
+ buildEditedBatchMessage(entities: Array<{
257
+ type: string;
258
+ id: string;
259
+ }>): string;
260
+ /**
261
+ * Change summary for one commit in a file's history — which frontmatter
262
+ * fields moved and whether the body changed — by diffing the file at `hash`
263
+ * against its true git parent (`hash^`). Used by the entity History panel.
264
+ *
265
+ * `relPath` is repo-relative. Null parent (root commit, or file absent at the
266
+ * parent) → `created`. Result is immutable per (path, hash), so it's cached.
267
+ * Returns null only when the file isn't present at `hash`.
268
+ */
269
+ getCommitChange(relPath: string, hash: string): HistoryCommitChange | null;
270
+ /** Expose git service for deferred commit operations (SessionManager). */
77
271
  getGitService(): GitService | undefined;
272
+ /** Absolute repo path on disk. Used by callers that need to convert
273
+ * an entity's absolute path to a repo-relative one (e.g. for `git log`). */
274
+ getRepoPath(): string;
275
+ /**
276
+ * Find an entity at a specific commit (existing or deleted) and
277
+ * return its repo-relative path + content. Public surface for the
278
+ * history tools — wraps the private `findEntityInCommit` walker.
279
+ * Returns null when no .md file at that commit matches the
280
+ * (entityType, entityId) pair.
281
+ */
282
+ getEntityAtCommit(entityType: EntityType, entityId: string, commitHash: string): {
283
+ path: string;
284
+ content: string;
285
+ } | null;
286
+ /**
287
+ * `git pull` this repo, then reconcile any live editor Y.Doc whose .md the
288
+ * pull rewrote. Mirrors the restore-reconcile fix (see `restoreFile`): a
289
+ * pull changes files on disk WITHOUT flowing through the coordinator's
290
+ * body-write path, so an open editor still holds the pre-pull content and
291
+ * would sync it back over the pull on its next autosave (silent loss of the
292
+ * pulled-in changes). Routing each changed entity through the coordinator
293
+ * acquires the per-doc lock and smart-merges disk into the live Y.Doc.
294
+ *
295
+ * The wrinkle vs. restore: a pull is repo-wide, so we diff HEAD before/after
296
+ * to find the changed .md files and reconcile EACH one's docName rather than
297
+ * a single known entity. To avoid parsing every changed file on a large pull
298
+ * when nobody is editing, the loop is gated to the entities that actually
299
+ * have a live Y.Doc open (`coordinator.activeDocNames()`).
300
+ *
301
+ * Throws if the pull itself fails (merge conflict, no upstream, etc.) — the
302
+ * caller (POST /api/pull) catches per-repo. Reconcile only runs after a
303
+ * successful pull, so a conflicted/aborted pull never reconciles.
304
+ *
305
+ * Returns the docNames that were reconciled (empty when nothing was open,
306
+ * the repo has no git service, or the pull was a no-op fast-forward to the
307
+ * same HEAD).
308
+ */
309
+ pullAndReconcile(): Promise<{
310
+ reconciled: string[];
311
+ }>;
312
+ /** Workspace root passed in via GraphConfig. Used by the asset upload
313
+ * service to anchor PDF text sidecars at workspace level (so all repos
314
+ * share the same `assets-text/` tree, mirroring the shared
315
+ * `.studiograph/assets/` directory the local backend uses). */
316
+ getWorkspaceRoot(): string | undefined;
317
+ /**
318
+ * Install structural-mutation callbacks. Called once after construction by
319
+ * the server bootstrap (or test setup) so the Yjs persistence layer can
320
+ * react to rename/delete/changeType without route-layer code calling
321
+ * persistence APIs directly.
322
+ */
323
+ setPersistenceCallbacks(callbacks: GraphPersistenceCallbacks | undefined): void;
324
+ /**
325
+ * Install the body-write coordinator. graph.update delegates the body-write
326
+ * critical section (lock, base-hash, atomic disk write, commit, broadcast,
327
+ * mdRevisionHash bookkeeping, assertWritable) to the coordinator. When
328
+ * unset (test fixtures without a Y.Doc layer), body writes fall back to a
329
+ * direct disk-write + commit path with no lock/broadcast — preserves the
330
+ * legacy "no callbacks" behavior some test setups rely on.
331
+ */
332
+ setBodyWriteCoordinator(coordinator: BodyWriteCoordinator | undefined): void;
78
333
  /**
79
334
  * Ensure repository exists
80
335
  */
81
336
  private ensureRepo;
82
337
  /**
83
- * Get entity file path: {repo}/{plural-type}/{entityId}.md
338
+ * Compute the on-disk path for a new entity.
339
+ *
340
+ * - When `folderPath` is provided, the entry lives at {repo}/{folderPath}/{id}.md
341
+ * regardless of type. This is the nested-folders layout.
342
+ * - Without `folderPath` (or empty string), the entry lands at the repo
343
+ * root: {repo}/{id}.md. The historical {repo}/{plural-type}/{id}.md
344
+ * fallback was confusing — entries hidden under a typed directory the
345
+ * list view never showed at repo root, contradicting the agent tool
346
+ * description that says "Omit to land at repo root."
347
+ *
348
+ * Note: this is for *new* paths only. Existing entries living under the
349
+ * legacy {plural-type}/ directories continue to be readable via
350
+ * findEntityFile() — only the create path moved.
84
351
  */
85
352
  private getEntityPath;
353
+ private fileIndex?;
354
+ /**
355
+ * Cache of the parsed `list()` view, keyed by `entityType ?? '*'`. Built
356
+ * lazily on first read; invalidated alongside `fileIndex` on every
357
+ * mutation. Without this, autosuggest walks the entire markdown tree
358
+ * and parses YAML frontmatter for every entry on every keystroke (5–7s
359
+ * on workspaces with a few thousand entries).
360
+ *
361
+ * Staleness contract: identical to `fileIndex` — single-process trust
362
+ * model. Git pulls and out-of-process file edits would equally miss
363
+ * the existing `fileIndex` cache; no regression there.
364
+ */
365
+ private listCache?;
366
+ /** Drop the cached file index so the next read rebuilds it. */
367
+ private invalidateIndex;
368
+ /**
369
+ * Walk every .md file under this repo, calling `visit` with the absolute
370
+ * path. Skips hidden directories (.git, .studiograph, etc.) and files that
371
+ * start with ".".
372
+ */
373
+ private walkMarkdownFiles;
374
+ /**
375
+ * Build (or fetch the cached) "type/id" → absolute path index.
376
+ * Type comes from frontmatter `entity_type`; if missing, falls back to the
377
+ * top-level plural-type directory name (legacy layout). Files without either
378
+ * (e.g. README.md) are skipped — they aren't entities.
379
+ */
380
+ private getFileIndex;
381
+ /**
382
+ * Infer entity type from a file's location for legacy layouts where the
383
+ * file sits directly inside a top-level plural-type directory
384
+ * ({repo}/meetings/foo.md). Returns undefined for any other layout.
385
+ */
386
+ private inferLegacyType;
387
+ /**
388
+ * Resolve an entity's absolute path by (type, id). Returns undefined if not
389
+ * found. Uses the file index — the index keys by `${entityType}/${entityId}`
390
+ * which is type-aware, unlike the on-disk filename. (We previously had a
391
+ * legacy {plural-type}/{id}.md fast path here; once the create path moved
392
+ * to flat repo-root layout, that fast path could return a different
393
+ * type's file at the same id.)
394
+ */
395
+ private findEntityFile;
86
396
  /**
87
397
  * Validate entity data against schema
88
398
  */
@@ -92,13 +402,58 @@ export declare class BaseGraphManager {
92
402
  */
93
403
  create(options: CreateEntityOptions): Promise<EntityFile>;
94
404
  /**
95
- * Get an entity by type and ID
405
+ * Get an entity by type and ID. Searches nested folders if the entry isn't
406
+ * at the legacy {plural-type}/{id}.md path.
96
407
  */
97
408
  get(entityType: EntityType, entityId: string): EntityFile;
98
409
  /**
99
- * Get an entity by ID only (type resolved from frontmatter)
410
+ * The live editor body for an entity when a seeded Y.Doc is open, else
411
+ * null. `get` reads disk, which lags the live Y.Doc by the autosave
412
+ * debounce + commit — so a user's freshly-placed image/asset embed exists
413
+ * in the editor before it reaches disk. Callers that must reflect what the
414
+ * user is actually looking at (the get_entity surfaces, the whole-body
415
+ * asset-drop guard) prefer this and fall back to disk on null.
416
+ *
417
+ * Returns null when no coordinator is wired (CLI / test fixtures) — those
418
+ * setups have no live editor layer, so disk IS the authoritative body.
419
+ */
420
+ getLiveBody(entityType: EntityType, entityId: string): string | null;
421
+ /**
422
+ * Get an entity by ID only (type resolved from the filesystem).
423
+ *
424
+ * Walks the file index to find any entry with this id, regardless of folder
425
+ * depth or type. Used by the agent's `get_entity` tool when the caller
426
+ * doesn't know the entity's type.
100
427
  */
101
428
  getById(entityId: string): EntityFile;
429
+ /**
430
+ * Get an entity by its file path — repo-relative (as returned by the
431
+ * search/list tools) or absolute. The most direct resolver: the caller
432
+ * never needs the canonical type, which closes the search→get_entity
433
+ * round-trip for entries whose frontmatter `type` field differs from
434
+ * `entity_type` (e.g. an `event` carrying `type: meeting`). The path is
435
+ * contained to this repo — a `..` escape or out-of-repo path is rejected
436
+ * as not-found rather than read.
437
+ */
438
+ getByPath(filePath: string): EntityFile;
439
+ /**
440
+ * Merge a caller's `data` onto a base frontmatter, always stamping
441
+ * `updated_at` / `updated_by`, then validate. Even content-only edits
442
+ * (editor autosave, where `data` is undefined) re-stamp the audit fields —
443
+ * otherwise the trail freezes at whatever the last data-change user was,
444
+ * which for scaffolded files is "studiograph".
445
+ *
446
+ * `baseFrontmatter` is the frontmatter to merge onto. The body-write path
447
+ * passes the CURRENT on-disk frontmatter (read inside the per-doc lock) so
448
+ * a concurrent metadata-only edit isn't clobbered; the frontmatter-only
449
+ * path passes `existing.data` (synchronous, no lock window).
450
+ *
451
+ * Validation uses lenient mode + a Date-coercion fallback when no new data
452
+ * is supplied, since the existing entity may have been stored without all
453
+ * required fields, and gray-matter would otherwise serialize Date objects
454
+ * as full ISO timestamps.
455
+ */
456
+ private composeUpdatedFrontmatter;
102
457
  /**
103
458
  * Update an existing entity
104
459
  */
@@ -106,25 +461,193 @@ export declare class BaseGraphManager {
106
461
  /**
107
462
  * Delete an entity
108
463
  */
109
- delete(entityType: EntityType, entityId: string, commitMessage?: string, user?: GitUser): Promise<void>;
464
+ /**
465
+ * Delete multiple entities in a single git transaction. Each entity's
466
+ * file is removed from disk; folder markers (.gitkeep) are added where
467
+ * the deletion left a folder empty. Then everything commits as one
468
+ * atomic operation.
469
+ *
470
+ * Compared to looping `delete()` per entity, this is a real performance
471
+ * primitive: one fork of git, one index update, one commit, one ref
472
+ * advance — instead of N. Bulk delete of a few hundred entities goes
473
+ * from minutes to seconds.
474
+ *
475
+ * Errors per entity (e.g. "not found") don't abort the batch — they're
476
+ * collected in `errors` and the rest still commit. Returns both the
477
+ * successfully-deleted set (for vector cleanup + WS broadcast) and the
478
+ * errors so the caller can surface partial failures.
479
+ */
480
+ bulkDelete(specs: Array<{
481
+ entityType: EntityType;
482
+ entityId: string;
483
+ }>, options?: {
484
+ commitMessage?: string;
485
+ user?: GitUser;
486
+ }): Promise<{
487
+ deleted: Array<{
488
+ entityType: EntityType;
489
+ entityId: string;
490
+ path: string;
491
+ title?: string;
492
+ }>;
493
+ errors: Array<{
494
+ entityType: EntityType;
495
+ entityId: string;
496
+ error: string;
497
+ }>;
498
+ }>;
499
+ /**
500
+ * Commit a set of already-on-disk file changes as a single git
501
+ * operation. Used by callers (e.g. the import route) that perform many
502
+ * `skipCommit: true` writes and want one transaction at the end instead
503
+ * of per-file commits.
504
+ *
505
+ * `entries` describes what each file represents so the transaction can
506
+ * be staged correctly. No-op when nothing is staged or git isn't
507
+ * available.
508
+ */
509
+ commitPending(entries: Array<{
510
+ operation: 'create' | 'update' | 'delete';
511
+ entityType: EntityType;
512
+ entityId: string;
513
+ filePath: string;
514
+ }>, options: {
515
+ commitMessage: string;
516
+ user?: GitUser;
517
+ extraPaths?: string[];
518
+ }): Promise<{
519
+ committed: boolean;
520
+ }>;
521
+ delete(entityType: EntityType, entityId: string, commitMessage?: string, user?: GitUser, opts?: {
522
+ keepAssets?: boolean;
523
+ }): Promise<void>;
110
524
  /**
111
525
  * Rename an entity (change its ID). Preserves all data, content, and source_ref.
112
526
  * Uses git mv for clean history. Updates entity_id in frontmatter.
113
527
  */
114
528
  rename(entityType: EntityType, oldId: string, newId: string, commitMessage?: string, user?: GitUser): Promise<EntityFile>;
115
529
  /**
116
- * Change an entity's type. Moves the file from oldType/ to newType/ directory.
117
- * Preserves all data and content. Updates entity_type in frontmatter.
530
+ * Change an entity's type. Updates frontmatter only the file stays in
531
+ * its current folder. In the type-agnostic folder model, type is a
532
+ * frontmatter property independent of location. (Legacy behavior moved
533
+ * the file between {plural-type}/ dirs; that's no longer correct because
534
+ * those dirs are now ordinary user-visible folders, not type markers.)
535
+ *
536
+ * If the user wants the file to also move (e.g. out of a "meetings/"
537
+ * folder when changed to a note), they invoke move() separately.
118
538
  */
119
539
  changeType(entityId: string, fromType: EntityType, toType: EntityType, commitMessage?: string, user?: GitUser): Promise<EntityFile>;
120
540
  /**
121
- * List entities of a given type
541
+ * Move an entry to a different folder within the same repo. The filename
542
+ * (and therefore the entity id) and type are unchanged. Auto-creates parent
543
+ * folders. Refuses if the target path already has an entry with this id —
544
+ * pass `overwrite: true` to replace it, but only when the occupant is
545
+ * itself a parseable entity (never silently clobber arbitrary files like
546
+ * README.md or .gitkeep).
547
+ */
548
+ move(entityType: EntityType, entityId: string, targetFolderPath: string, commitMessage?: string, user?: GitUser, overwrite?: boolean): Promise<EntityFile>;
549
+ /**
550
+ * Restore an entity to its content at a specific commit. Single-entity
551
+ * scope only — multi-entity rollback (e.g. "undo this commit's effects
552
+ * across all touched files") is a separate, more cautious flow that
553
+ * isn't built yet.
554
+ *
555
+ * Two paths through the method:
556
+ * - **Overwrite**: the entity exists today at path `P`. Read content
557
+ * from `git show <hash>:<P>` and write it back to `P`.
558
+ * - **Recreate**: the entity is gone today. Walk the historical
559
+ * commit's tree to find the .md file whose basename matches
560
+ * `entityId` AND whose frontmatter `entity_type` matches
561
+ * `entityType`. That path is the restore target. The walk only
562
+ * fires when the entity is truly absent — overwrites stay cheap.
563
+ *
564
+ * Throws a `PathConflictError` if the recreate target path is now
565
+ * occupied by a DIFFERENT entity (different type+id) — recreating
566
+ * over it would silently overwrite unrelated work. Caller surfaces
567
+ * the conflict to the user; resolution is "move or delete the
568
+ * occupant first."
569
+ */
570
+ restoreFile(entityType: EntityType, entityId: string, commitHash: string, user?: GitUser): Promise<{
571
+ action: 'recreate' | 'overwrite';
572
+ path: string;
573
+ }>;
574
+ /**
575
+ * Walk a commit's tree looking for a .md file whose basename matches
576
+ * `entityId` AND whose frontmatter `entity_type` matches `entityType`.
577
+ * Returns repo-relative path + content when found, otherwise null.
578
+ * Used by `restoreFile` for the recreate-from-deletion case.
579
+ */
580
+ private findEntityInCommit;
581
+ /**
582
+ * Identify the entity (if any) currently occupying `absPath`. Returns
583
+ * null when the path holds something that isn't an entity (README, etc).
584
+ * Mirrors the inference rules used in `getFileIndex`.
585
+ */
586
+ private identifyEntityAtPath;
587
+ /**
588
+ * Enumerate the distinct entity types present in this repo. Used by
589
+ * /api/repos to let the sidebar render the Views list without a full
590
+ * entity fetch per folder.
591
+ *
592
+ * Derived from the file index (which reads frontmatter), so it works for
593
+ * entries in any folder — not just the legacy {plural-type}/ dirs.
594
+ */
595
+ listEntityTypes(): string[];
596
+ /**
597
+ * Folder lifecycle: a directory is treated as a first-class persistent
598
+ * object. It exists from the moment it's created (createFolder, the destination
599
+ * of a moved entry, etc.) until it's explicitly removed via a folder-level
600
+ * operation (deleteFolder, renameFolder, moveFolderToRepo). Entry-level
601
+ * operations (create, delete, move, transfer) never decide whether a folder
602
+ * lives or dies.
603
+ *
604
+ * `listFolders()` requires either a .md child or a .gitkeep marker for a
605
+ * directory to surface in the API, so the two helpers below are the single
606
+ * place that adds and removes the marker:
607
+ *
608
+ * - `ensureFolderMarker` — call after an op that may have left `dir`
609
+ * without .md children. Writes `.gitkeep` and returns its path so the
610
+ * caller can stage it in the same commit.
611
+ * - `removeFolderMarker` — call after an op that placed an .md into `dir`.
612
+ * Drops a now-redundant `.gitkeep` so the repo stays tidy.
613
+ *
614
+ * Both no-op for the repo root (always implicit) and for paths that don't
615
+ * exist. Both return `null` when nothing changed.
616
+ */
617
+ private ensureFolderMarker;
618
+ private removeFolderMarker;
619
+ /**
620
+ * Walk up from `dir`, removing each directory that became empty after a
621
+ * folder-level removal (deleteFolder, renameFolder, moveFolderToRepo).
622
+ * Stops at the repo root. Silently no-ops if a directory is missing,
623
+ * non-empty, or can't be removed.
624
+ *
625
+ * NOT called by entry-level operations (create/delete/move/transfer) —
626
+ * they preserve folder structure regardless of whether they emptied a
627
+ * directory. Use `ensureFolderMarker` instead for those paths.
628
+ */
629
+ private pruneEmptyAncestors;
630
+ /**
631
+ * List entities of a given type (or all types if not specified).
632
+ *
633
+ * Walks the entire repo tree so entries in nested folders are discovered.
634
+ * The type filter is applied against frontmatter `entity_type`; legacy
635
+ * entries without explicit frontmatter type fall back to the depth-1
636
+ * plural-type directory name (so `meetings/foo.md` still resolves as a
637
+ * meeting). Files with no inferable type (README.md, CONTRIBUTING.md, etc.)
638
+ * are skipped.
122
639
  */
123
640
  list(entityType?: EntityType, limit?: number): EntityFile[];
124
641
  /**
125
642
  * Search entities
126
643
  */
127
644
  search(options: SearchOptions): EntityFile[];
645
+ /**
646
+ * Resolve a markdown file (anywhere under the repo) to its (type, id),
647
+ * tolerating both legacy {plural-type}/{id}.md and nested-folder layouts.
648
+ * Returns undefined for files without a recognizable entity type.
649
+ */
650
+ private resolveFileToEntity;
128
651
  /**
129
652
  * Get entities related to a given entity (via wikilinks)
130
653
  */
@@ -146,14 +669,225 @@ export declare class BaseGraphManager {
146
669
  refactorWikilink(oldId: string, newId: string, commitMessage?: string): Promise<{
147
670
  updated: number;
148
671
  }>;
672
+ /**
673
+ * List every non-empty folder in this repo, plus folders explicitly kept
674
+ * via .gitkeep. Returns repo-relative POSIX paths, sorted, deduplicated.
675
+ * The repo root ("") is intentionally omitted — it's implicit.
676
+ */
677
+ listFolders(): FolderEntry[];
678
+ /**
679
+ * Read the display_name override for a single folder, or null if no sidecar
680
+ * exists / is unreadable. Used by mutation paths that need the current
681
+ * override before deciding whether to rewrite it.
682
+ */
683
+ readFolderDisplayName(folderPath: string): string | null;
684
+ /**
685
+ * Write or remove the per-folder display_name sidecar. Pass `null` /
686
+ * empty-string to remove (returns to slug fallback). Returns the absolute
687
+ * path of the sidecar (for git staging) when one was written or removed,
688
+ * or null when no change was needed (idempotent).
689
+ *
690
+ * Caller is responsible for committing — the helper only touches the
691
+ * filesystem. Folder must already exist; this never creates one.
692
+ */
693
+ writeFolderDisplayName(folderPath: string, displayName: string | null): string | null;
694
+ /**
695
+ * Bulk-write display_name sidecars for many folders at once. Used by the
696
+ * import path to record original-casing overrides for every nested
697
+ * directory it slugified. First-writer-wins: existing sidecars are NOT
698
+ * overwritten, so a second import doesn't clobber a user's manual rename.
699
+ *
700
+ * Returns the list of sidecar paths actually written (for git staging).
701
+ * Skipped paths (folder missing, empty display, display_name override
702
+ * already set) are quietly omitted.
703
+ */
704
+ recordFolderDisplays(entries: Array<{
705
+ path: string;
706
+ display_name: string;
707
+ }>): string[];
708
+ /**
709
+ * Create a folder at the given path (mkdir -p semantics) and drop a
710
+ * .gitkeep so git tracks it even when empty. Validates the path. No-op if
711
+ * the folder already exists; .gitkeep is added if missing.
712
+ */
713
+ createFolder(folderPath: string, commitMessage?: string, user?: GitUser, options?: {
714
+ displayName?: string;
715
+ }): Promise<void>;
716
+ /**
717
+ * Rename / move a folder within the repo. Moves the entire subtree
718
+ * atomically via filesystem rename. Refuses if the target path is already
719
+ * occupied.
720
+ */
721
+ renameFolder(fromPath: string, toPath: string, commitMessage?: string, user?: GitUser, options?: {
722
+ displayName?: string | null;
723
+ }): Promise<void>;
724
+ /**
725
+ * Move a folder (and its full subtree) into a different repo at `targetFolderPath`.
726
+ *
727
+ * The naive way to do this is to iterate the source's entries and call
728
+ * `transfer` per entry — that's what the web UI used to do, and it costs
729
+ * 2 git commits per entry (1600 commits for 800 files), each blocking the
730
+ * Node event loop via `execSync`. This method performs the move as a
731
+ * single FS-level rename + one commit per repo, regardless of how many
732
+ * files are inside.
733
+ *
734
+ * Returns the count of entries + subfolders moved so the caller can
735
+ * surface progress.
736
+ */
737
+ moveFolderToRepo(sourceFolderPath: string, target: BaseGraphManager, targetFolderPath: string, options?: {
738
+ commitMessage?: string;
739
+ user?: GitUser;
740
+ }): Promise<FolderDeleteResult>;
741
+ /**
742
+ * Move a batch of entries (potentially across many source folders) into a
743
+ * single target folder, optionally in a different repo. The web UI's
744
+ * multi-select bulk move used to call /move or /transfer per entry — that
745
+ * was 1-2 sync git commits per entry, blocking the event loop on each one.
746
+ * This collapses the operation to a single FS rename per file plus one
747
+ * commit on each repo touched.
748
+ */
749
+ moveEntitiesToRepo(entries: Array<{
750
+ entityType: EntityType;
751
+ entityId: string;
752
+ }>, target: BaseGraphManager, targetFolderPath: string, options?: {
753
+ commitMessage?: string;
754
+ user?: GitUser;
755
+ }): Promise<{
756
+ moved: number;
757
+ }>;
758
+ /**
759
+ * Delete a folder. Refuses non-empty folders unless `recursive: true`.
760
+ * Returns the count of entries + subfolders removed (for blast-radius UI).
761
+ */
762
+ deleteFolder(folderPath: string, options?: {
763
+ recursive?: boolean;
764
+ commitMessage?: string;
765
+ user?: GitUser;
766
+ }): Promise<FolderDeleteResult>;
767
+ /**
768
+ * Count the entries (.md files with entity_type) and subfolders inside an
769
+ * absolute directory, recursively. Used to surface blast radius in the
770
+ * delete-folder approval UI.
771
+ */
772
+ private countFolderContents;
773
+ /**
774
+ * Return the storage backend the graph is bound to, or `undefined` if
775
+ * no asset service is configured. Used by routes that need to branch
776
+ * between local-stream and R2-redirect behavior.
777
+ */
778
+ getAssetStorage(): 'local' | 'r2' | undefined;
779
+ /** The asset storage service (raw key copy/exists), if configured. Used by
780
+ * the one-time key migration, which operates on raw `{...}/{file}` keys. */
781
+ getAssetService(): AssetService | undefined;
782
+ /**
783
+ * Download the bytes of an asset OWNED by `assetEntityId` in THIS repo.
784
+ * Used by the convert flow to turn a stored .docx/.xlsx into a derived
785
+ * note/dataset. Backend-agnostic (local reads disk, R2 GetObjects).
786
+ *
787
+ * SECURITY: the asset's `asset_url` frontmatter is attacker-influenceable
788
+ * (a folder member can create an `asset` entity whose url points at another
789
+ * folder's storage key). So ownership is NOT taken from the url — it's
790
+ * resolved through the authoritative asset index, scoped to
791
+ * `(this.repoName, 'asset', assetEntityId)`, exactly like the GET
792
+ * /api/assets serve route. The url is used only to disambiguate which of the
793
+ * entity's own files to fetch (by filename). Unindexed legacy assets fall
794
+ * back to the legacy `asset/{entityId}/{file}` key bound to this same entity
795
+ * id; anything else is refused.
796
+ */
797
+ /**
798
+ * Download an immutable-keyed asset's bytes by its assetId + filename. The
799
+ * blob store is workspace-global (the key `{assetId}/{filename}` is
800
+ * independent of repo), so any graph can fetch any asset; the caller — the
801
+ * caption sweep — scopes to the rows it enumerated from assets.db.
802
+ */
803
+ downloadAssetById(assetId: string, filename: string): Promise<Buffer>;
804
+ /** Pre-signed URL for an immutable-key asset ({assetId}/{filename}). */
805
+ getAssetSignedUrlByAssetId(assetId: string, filename: string, method?: 'GET' | 'HEAD', expiresIn?: number): Promise<string>;
806
+ /**
807
+ * Mint a short-lived pre-signed URL for an asset. Only supported by
808
+ * remote backends (R2); the local backend throws. `method` selects
809
+ * the verb the URL is signed against — HEAD callers need a HEAD URL.
810
+ */
811
+ getAssetSignedUrl(entityType: EntityType, entityId: string, filename: string, keyPrefix?: string, expiresIn?: number, method?: 'GET' | 'HEAD'): Promise<string>;
149
812
  /**
150
813
  * Upload asset for an entity
151
814
  */
152
- uploadAsset(entityType: EntityType, entityId: string, filename: string, buffer: Buffer, keyPrefix?: string): Promise<AssetInfo>;
815
+ uploadAsset(entityType: EntityType, entityId: string, filename: string, buffer: Buffer, keyPrefix?: string,
816
+ /** Auth user id of the uploader (web). Recorded in the asset index for
817
+ * the "delete by uploader + workspace owner" rule. Omit for CLI/import/
818
+ * agent uploads — stored as null (unknown → owner-only delete). */
819
+ opts?: {
820
+ uploaderUserId?: string | null;
821
+ /**
822
+ * Override the recorded owner. Default = the `(entityType, entityId)`
823
+ * passed above (the entity that holds the blob — e.g. an image embedded
824
+ * in a note). The asset-as-embed model (see `~/.claude/plans/asset-as-embed.md`)
825
+ * uploads FREE-STANDING assets owned by a folder or the workspace, so the
826
+ * blob survives deletion/move of any entity that merely embeds it. When
827
+ * `owner` is set, `(entityType, entityId)` are ignored for ownership.
828
+ */
829
+ owner?: {
830
+ type: string;
831
+ id: string;
832
+ };
833
+ /** Display name recorded in the index row. Defaults to the filename.
834
+ * Matters for free-standing assets, where the row's name is the manager
835
+ * label (no owning entity to borrow a name from). */
836
+ name?: string;
837
+ }): Promise<AssetUploadResult>;
838
+ /** Inject the workspace-global asset ownership index (WorkspaceManager). */
839
+ setAssetIndex(index: AssetIndexService | undefined): void;
840
+ /** The asset ownership index, if wired. */
841
+ getAssetIndex(): AssetIndexService | undefined;
842
+ /**
843
+ * Remove every immutable-keyed asset owned by (entityType, entityId): the
844
+ * blob + its index row. Used by delete/bulkDelete/deleteFolder. Blob errors
845
+ * are non-fatal (markdown is the system of record). No-op without an index.
846
+ * Owner-scoped, so it only touches THIS entity's assets — a blob another
847
+ * entity also embeds (copied URL) is not enumerated here.
848
+ */
849
+ private cleanupOwnedAssets;
850
+ /** Delete a single index-tracked asset by its immutable id: blob + index row.
851
+ * The asset-manager delete path for free-standing (folder/workspace-owned)
852
+ * assets, which have no owning entity to route an entity-coordinate delete
853
+ * through. Blob errors are non-fatal (the index row is the manager's source
854
+ * of truth, same as cleanupOwnedAssets). No-op without an index/service. */
855
+ deleteAssetById(assetId: string, filename: string): Promise<void>;
856
+ /** Re-point the owning coordinates of every asset owned by an entity, with
857
+ * no blob movement (keys are immutable). Used by rename (ownerId),
858
+ * changeType (ownerType), and cross-repo move/transfer (repo). No-op
859
+ * without an index. */
860
+ private reassignOwnedAssets;
153
861
  /**
154
862
  * List assets for an entity
155
863
  */
156
864
  listAssets(entityType: EntityType, entityId: string, keyPrefix?: string): Promise<AssetInfo[]>;
865
+ /**
866
+ * List every asset in the backend in one round-trip, tagged with
867
+ * (entityType, entityId) origin. Workspace-wide since the asset backend
868
+ * is shared across repos — callers filter by repo via {@link listEntityIds}.
869
+ */
870
+ listAllAssets(): Promise<AssetRecord[]>;
871
+ /**
872
+ * Enumerate (type, id) pairs in this repo. Used by endpoints (like
873
+ * /api/repos/:repo/assets) that need to answer "does entity X belong to
874
+ * this repo?".
875
+ *
876
+ * Backed by the file index, which reads frontmatter — so entries in
877
+ * nested folders are included alongside legacy {plural-type}/ entries.
878
+ */
879
+ listEntityIds(): Array<{
880
+ entityType: EntityType;
881
+ id: string;
882
+ }>;
883
+ /**
884
+ * Resolve the absolute on-disk markdown path for an entity. Goes through
885
+ * the file index so it works for both the flat repo-root layout and
886
+ * arbitrary nested folders. Use this anywhere callers need a path —
887
+ * never reconstruct one from `${plural-type}/${id}.md`, which assumes
888
+ * the legacy typed-folder layout and silently misses everything else.
889
+ */
890
+ getEntityFilePath(entityType: EntityType, entityId: string): string | undefined;
157
891
  /**
158
892
  * Delete an asset
159
893
  */
@@ -163,13 +897,38 @@ export declare class BaseGraphManager {
163
897
  */
164
898
  deleteAllAssets(entityType: EntityType, entityId: string, keyPrefix?: string): Promise<number>;
165
899
  /**
166
- * Get dataset rows, optionally filtered
900
+ * Resolve the authoritative CSV body for a dataset: the live editor body
901
+ * when one exists (the grid may be ahead of disk), else the on-disk body.
902
+ */
903
+ private datasetBody;
904
+ /**
905
+ * Get dataset rows, optionally filtered. Columns come from the CSV header.
167
906
  */
168
907
  getDatasetRows(entityId: string, filter?: DatasetFilter): DatasetRow[];
169
908
  /**
170
- * Append rows to a dataset entity
909
+ * Column names for a dataset, read from the CSV header. Independent of the
910
+ * rows so callers get the real columns even for a header-only dataset or a
911
+ * zero-match filter (where deriving columns from result rows would be empty).
912
+ */
913
+ getDatasetColumns(entityId: string): string[];
914
+ /**
915
+ * Append rows to a dataset entity.
916
+ *
917
+ * The existing CSV body is preserved verbatim and the new rows are appended
918
+ * after it — we do NOT re-parse and re-stringify existing rows. That keeps
919
+ * datasets with duplicate column headers from collapsing (csv-parse's
920
+ * object mode keeps only the last same-named column) and avoids reformatting
921
+ * unrelated cells. New rows are mapped to the existing header columns; keys
922
+ * not in the header are dropped (query the columns first). When the body has
923
+ * no header yet, the columns are taken from the new rows.
924
+ *
925
+ * The write routes through `update()` so it shares the BodyWriteCoordinator
926
+ * contract (per-doc lock, base-hash precondition, applyAgentContent, commit)
927
+ * instead of writing to disk directly — same guarantees the agent's markdown
928
+ * writes get. `baseRevision` makes a concurrent change since our read fail
929
+ * loudly rather than silently back-stomp.
171
930
  */
172
- appendDatasetRows(entityId: string, newRows: DatasetRow[], commitMessage?: string): Promise<EntityFile>;
931
+ appendDatasetRows(entityId: string, newRows: Array<Record<string, unknown>>, commitMessage?: string): Promise<EntityFile>;
173
932
  /**
174
933
  * Get repository status
175
934
  */