studiograph 1.3.48-next.26 → 1.3.48-next.261

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 (1640) hide show
  1. package/README.md +27 -17
  2. package/dist/agent/agent-pool.d.ts +120 -4
  3. package/dist/agent/agent-pool.js +358 -18
  4. package/dist/agent/agent-pool.js.map +1 -1
  5. package/dist/agent/context-window.d.ts +113 -0
  6. package/dist/agent/context-window.js +459 -0
  7. package/dist/agent/context-window.js.map +1 -0
  8. package/dist/agent/followups.d.ts +34 -0
  9. package/dist/agent/followups.js +52 -0
  10. package/dist/agent/followups.js.map +1 -0
  11. package/dist/agent/orchestrator.d.ts +110 -11
  12. package/dist/agent/orchestrator.js +547 -75
  13. package/dist/agent/orchestrator.js.map +1 -1
  14. package/dist/agent/prompts/entity-types-section.d.ts +18 -9
  15. package/dist/agent/prompts/entity-types-section.js +42 -18
  16. package/dist/agent/prompts/entity-types-section.js.map +1 -1
  17. package/dist/agent/prompts/system.md +107 -19
  18. package/dist/agent/skill-loader.js +3 -9
  19. package/dist/agent/skill-loader.js.map +1 -1
  20. package/dist/agent/skills/artifact-canvas/skill.md +257 -0
  21. package/dist/agent/skills/create-skill.md +39 -0
  22. package/dist/agent/skills/entity-schema.md +67 -150
  23. package/dist/agent/skills/interview/skill.md +44 -29
  24. package/dist/agent/skills/paged-documents/skill.md +147 -0
  25. package/dist/agent/skills/schema-rules.md +28 -28
  26. package/dist/agent/tools/artifact-tools.d.ts +237 -0
  27. package/dist/agent/tools/artifact-tools.js +407 -0
  28. package/dist/agent/tools/artifact-tools.js.map +1 -0
  29. package/dist/agent/tools/capture-tools.d.ts +31 -0
  30. package/dist/agent/tools/capture-tools.js +40 -0
  31. package/dist/agent/tools/capture-tools.js.map +1 -0
  32. package/dist/agent/tools/folder-tools.d.ts +50 -0
  33. package/dist/agent/tools/folder-tools.js +340 -0
  34. package/dist/agent/tools/folder-tools.js.map +1 -0
  35. package/dist/agent/tools/fs-tools.d.ts +6 -5
  36. package/dist/agent/tools/fs-tools.js +1 -1
  37. package/dist/agent/tools/fs-tools.js.map +1 -1
  38. package/dist/agent/tools/graph-tools.d.ts +45 -73
  39. package/dist/agent/tools/graph-tools.js +765 -239
  40. package/dist/agent/tools/graph-tools.js.map +1 -1
  41. package/dist/agent/tools/history-tools.d.ts +95 -0
  42. package/dist/agent/tools/history-tools.js +465 -0
  43. package/dist/agent/tools/history-tools.js.map +1 -0
  44. package/dist/agent/tools/load-skill.d.ts +4 -3
  45. package/dist/agent/tools/load-skill.js +1 -1
  46. package/dist/agent/tools/load-skill.js.map +1 -1
  47. package/dist/agent/tools/ops-tools.d.ts +2 -1
  48. package/dist/agent/tools/ops-tools.js +125 -25
  49. package/dist/agent/tools/ops-tools.js.map +1 -1
  50. package/dist/agent/tools/permission-tools.d.ts +69 -21
  51. package/dist/agent/tools/permission-tools.js +183 -18
  52. package/dist/agent/tools/permission-tools.js.map +1 -1
  53. package/dist/agent/tools/tool-loader.js +5 -4
  54. package/dist/agent/tools/tool-loader.js.map +1 -1
  55. package/dist/agent/tools/web-tools.js +58 -9
  56. package/dist/agent/tools/web-tools.js.map +1 -1
  57. package/dist/cli/commands/about.d.ts +1 -0
  58. package/dist/cli/commands/about.js +55 -3
  59. package/dist/cli/commands/about.js.map +1 -1
  60. package/dist/cli/commands/admin/audit-workspace.d.ts +23 -0
  61. package/dist/cli/commands/admin/audit-workspace.js +133 -0
  62. package/dist/cli/commands/admin/audit-workspace.js.map +1 -0
  63. package/dist/cli/commands/admin/audit.d.ts +21 -0
  64. package/dist/cli/commands/admin/audit.js +174 -0
  65. package/dist/cli/commands/admin/audit.js.map +1 -0
  66. package/dist/cli/commands/admin/backup.d.ts +54 -0
  67. package/dist/cli/commands/admin/backup.js +207 -0
  68. package/dist/cli/commands/admin/backup.js.map +1 -0
  69. package/dist/cli/commands/admin/folder.d.ts +11 -0
  70. package/dist/cli/commands/admin/folder.js +187 -0
  71. package/dist/cli/commands/admin/folder.js.map +1 -0
  72. package/dist/cli/commands/admin/index.d.ts +16 -0
  73. package/dist/cli/commands/admin/index.js +48 -0
  74. package/dist/cli/commands/admin/index.js.map +1 -0
  75. package/dist/cli/commands/admin/migrate-asset-owners.d.ts +56 -0
  76. package/dist/cli/commands/admin/migrate-asset-owners.js +86 -0
  77. package/dist/cli/commands/admin/migrate-asset-owners.js.map +1 -0
  78. package/dist/cli/commands/admin/migrate-assets.d.ts +62 -0
  79. package/dist/cli/commands/admin/migrate-assets.js +237 -0
  80. package/dist/cli/commands/admin/migrate-assets.js.map +1 -0
  81. package/dist/cli/commands/admin/migrate.d.ts +56 -0
  82. package/dist/cli/commands/admin/migrate.js +263 -0
  83. package/dist/cli/commands/admin/migrate.js.map +1 -0
  84. package/dist/cli/commands/admin/restore.d.ts +24 -0
  85. package/dist/cli/commands/admin/restore.js +228 -0
  86. package/dist/cli/commands/admin/restore.js.map +1 -0
  87. package/dist/cli/commands/admin/secrets.d.ts +23 -0
  88. package/dist/cli/commands/admin/secrets.js +256 -0
  89. package/dist/cli/commands/admin/secrets.js.map +1 -0
  90. package/dist/cli/commands/admin/settings.d.ts +28 -0
  91. package/dist/cli/commands/admin/settings.js +284 -0
  92. package/dist/cli/commands/admin/settings.js.map +1 -0
  93. package/dist/cli/commands/admin/token.d.ts +42 -0
  94. package/dist/cli/commands/admin/token.js +126 -0
  95. package/dist/cli/commands/admin/token.js.map +1 -0
  96. package/dist/cli/commands/admin/transfer-ownership.d.ts +15 -0
  97. package/dist/cli/commands/admin/transfer-ownership.js +106 -0
  98. package/dist/cli/commands/admin/transfer-ownership.js.map +1 -0
  99. package/dist/cli/commands/admin/user.d.ts +11 -0
  100. package/dist/cli/commands/admin/user.js +187 -0
  101. package/dist/cli/commands/admin/user.js.map +1 -0
  102. package/dist/cli/commands/clone.d.ts +23 -3
  103. package/dist/cli/commands/clone.js +140 -36
  104. package/dist/cli/commands/clone.js.map +1 -1
  105. package/dist/cli/commands/config.d.ts +23 -107
  106. package/dist/cli/commands/config.js +52 -260
  107. package/dist/cli/commands/config.js.map +1 -1
  108. package/dist/cli/commands/connector.d.ts +10 -13
  109. package/dist/cli/commands/connector.js +16 -58
  110. package/dist/cli/commands/connector.js.map +1 -1
  111. package/dist/cli/commands/deploy.js +215 -68
  112. package/dist/cli/commands/deploy.js.map +1 -1
  113. package/dist/cli/commands/index.js +7 -4
  114. package/dist/cli/commands/index.js.map +1 -1
  115. package/dist/cli/commands/init.js +10 -30
  116. package/dist/cli/commands/init.js.map +1 -1
  117. package/dist/cli/commands/mcp.js +54 -6
  118. package/dist/cli/commands/mcp.js.map +1 -1
  119. package/dist/cli/commands/r2.d.ts +3 -0
  120. package/dist/cli/commands/r2.js +223 -204
  121. package/dist/cli/commands/r2.js.map +1 -1
  122. package/dist/cli/commands/redeploy.js +65 -12
  123. package/dist/cli/commands/redeploy.js.map +1 -1
  124. package/dist/cli/commands/reset.d.ts +22 -6
  125. package/dist/cli/commands/reset.js +132 -34
  126. package/dist/cli/commands/reset.js.map +1 -1
  127. package/dist/cli/commands/serve.js +242 -24
  128. package/dist/cli/commands/serve.js.map +1 -1
  129. package/dist/cli/commands/sync.d.ts +1 -1
  130. package/dist/cli/commands/sync.js +230 -227
  131. package/dist/cli/commands/sync.js.map +1 -1
  132. package/dist/cli/crypto-bundle.d.ts +39 -0
  133. package/dist/cli/crypto-bundle.js +94 -0
  134. package/dist/cli/crypto-bundle.js.map +1 -0
  135. package/dist/cli/index.js +24 -23
  136. package/dist/cli/index.js.map +1 -1
  137. package/dist/cli/railway-pin.d.ts +68 -0
  138. package/dist/cli/railway-pin.js +96 -0
  139. package/dist/cli/railway-pin.js.map +1 -0
  140. package/dist/cli/railway-provisioning.d.ts +53 -0
  141. package/dist/cli/railway-provisioning.js +85 -0
  142. package/dist/cli/railway-provisioning.js.map +1 -0
  143. package/dist/cli/setup-wizard.d.ts +30 -49
  144. package/dist/cli/setup-wizard.js +39 -40
  145. package/dist/cli/setup-wizard.js.map +1 -1
  146. package/dist/cli/theme.d.ts +1 -1
  147. package/dist/core/accent-palette.d.ts +7 -18
  148. package/dist/core/accent-palette.js +27 -38
  149. package/dist/core/accent-palette.js.map +1 -1
  150. package/dist/core/artifact-asset-resolution.d.ts +90 -0
  151. package/dist/core/artifact-asset-resolution.js +138 -0
  152. package/dist/core/artifact-asset-resolution.js.map +1 -0
  153. package/dist/core/artifact-asset-urls.d.ts +111 -0
  154. package/dist/core/artifact-asset-urls.js +174 -0
  155. package/dist/core/artifact-asset-urls.js.map +1 -0
  156. package/dist/core/artifact-bundle.d.ts +69 -0
  157. package/dist/core/artifact-bundle.js +305 -0
  158. package/dist/core/artifact-bundle.js.map +1 -0
  159. package/dist/core/artifact-escape.d.ts +5 -0
  160. package/dist/core/artifact-escape.js +26 -0
  161. package/dist/core/artifact-escape.js.map +1 -0
  162. package/dist/core/artifact-export.d.ts +83 -0
  163. package/dist/core/artifact-export.js +1567 -0
  164. package/dist/core/artifact-export.js.map +1 -0
  165. package/dist/core/artifact-frame-document.d.ts +105 -0
  166. package/dist/core/artifact-frame-document.js +1427 -0
  167. package/dist/core/artifact-frame-document.js.map +1 -0
  168. package/dist/core/artifact-frame-layout.d.ts +79 -0
  169. package/dist/core/artifact-frame-layout.js +94 -0
  170. package/dist/core/artifact-frame-layout.js.map +1 -0
  171. package/dist/core/artifact-frame-model.d.ts +198 -0
  172. package/dist/core/artifact-frame-model.js +603 -0
  173. package/dist/core/artifact-frame-model.js.map +1 -0
  174. package/dist/core/artifact-frame-selectors.d.ts +42 -0
  175. package/dist/core/artifact-frame-selectors.js +65 -0
  176. package/dist/core/artifact-frame-selectors.js.map +1 -0
  177. package/dist/core/artifact-libraries.d.ts +23 -0
  178. package/dist/core/artifact-libraries.js +229 -0
  179. package/dist/core/artifact-libraries.js.map +1 -0
  180. package/dist/core/artifact-manifest.d.ts +64 -0
  181. package/dist/core/artifact-manifest.js +88 -0
  182. package/dist/core/artifact-manifest.js.map +1 -0
  183. package/dist/core/artifact-paged-css.d.ts +64 -0
  184. package/dist/core/artifact-paged-css.js +253 -0
  185. package/dist/core/artifact-paged-css.js.map +1 -0
  186. package/dist/core/artifact-patch.d.ts +58 -0
  187. package/dist/core/artifact-patch.js +309 -0
  188. package/dist/core/artifact-patch.js.map +1 -0
  189. package/dist/core/artifact-warnings.d.ts +51 -0
  190. package/dist/core/artifact-warnings.js +165 -0
  191. package/dist/core/artifact-warnings.js.map +1 -0
  192. package/dist/core/breakpoints.d.ts +27 -0
  193. package/dist/core/breakpoints.js +28 -0
  194. package/dist/core/breakpoints.js.map +1 -0
  195. package/dist/core/cell-anchor.d.ts +29 -0
  196. package/dist/core/cell-anchor.js +53 -0
  197. package/dist/core/cell-anchor.js.map +1 -0
  198. package/dist/core/comment-anchor.d.ts +41 -0
  199. package/dist/core/comment-anchor.js +147 -0
  200. package/dist/core/comment-anchor.js.map +1 -0
  201. package/dist/core/commit-messages.d.ts +57 -0
  202. package/dist/core/commit-messages.js +85 -0
  203. package/dist/core/commit-messages.js.map +1 -0
  204. package/dist/core/embeds.d.ts +108 -0
  205. package/dist/core/embeds.js +226 -0
  206. package/dist/core/embeds.js.map +1 -0
  207. package/dist/core/entity-body-templates.d.ts +21 -0
  208. package/dist/core/entity-body-templates.js +66 -0
  209. package/dist/core/entity-body-templates.js.map +1 -0
  210. package/dist/core/entity-types-catalog.d.ts +65 -0
  211. package/dist/core/entity-types-catalog.js +142 -0
  212. package/dist/core/entity-types-catalog.js.map +1 -0
  213. package/dist/core/field-library.d.ts +62 -0
  214. package/dist/core/field-library.js +129 -0
  215. package/dist/core/field-library.js.map +1 -0
  216. package/dist/core/folder-paths.d.ts +41 -0
  217. package/dist/core/folder-paths.js +95 -0
  218. package/dist/core/folder-paths.js.map +1 -0
  219. package/dist/core/folder-sidecar.d.ts +36 -0
  220. package/dist/core/folder-sidecar.js +91 -0
  221. package/dist/core/folder-sidecar.js.map +1 -0
  222. package/dist/core/font-family.d.ts +62 -0
  223. package/dist/core/font-family.js +84 -0
  224. package/dist/core/font-family.js.map +1 -0
  225. package/dist/core/format-registry.d.ts +187 -0
  226. package/dist/core/format-registry.js +411 -0
  227. package/dist/core/format-registry.js.map +1 -0
  228. package/dist/core/graph.d.ts +770 -30
  229. package/dist/core/graph.js +2282 -386
  230. package/dist/core/graph.js.map +1 -1
  231. package/dist/core/history-diff.d.ts +35 -0
  232. package/dist/core/history-diff.js +114 -0
  233. package/dist/core/history-diff.js.map +1 -0
  234. package/dist/core/markdown-strip.d.ts +22 -0
  235. package/dist/core/markdown-strip.js +51 -0
  236. package/dist/core/markdown-strip.js.map +1 -0
  237. package/dist/core/refs.d.ts +41 -0
  238. package/dist/core/refs.js +80 -0
  239. package/dist/core/refs.js.map +1 -0
  240. package/dist/core/schema-registry.d.ts +66 -0
  241. package/dist/core/schema-registry.js +198 -37
  242. package/dist/core/schema-registry.js.map +1 -1
  243. package/dist/core/schemas/connector.d.ts +67 -0
  244. package/dist/core/schemas/connector.js +100 -0
  245. package/dist/core/schemas/connector.js.map +1 -0
  246. package/dist/core/schemas/workspace.d.ts +122 -0
  247. package/dist/core/schemas/workspace.js +211 -0
  248. package/dist/core/schemas/workspace.js.map +1 -0
  249. package/dist/core/secrets/SecretStore.d.ts +77 -0
  250. package/dist/core/secrets/SecretStore.js +13 -0
  251. package/dist/core/secrets/SecretStore.js.map +1 -0
  252. package/dist/core/secrets/SettingsResolver.d.ts +54 -0
  253. package/dist/core/secrets/SettingsResolver.js +80 -0
  254. package/dist/core/secrets/SettingsResolver.js.map +1 -0
  255. package/dist/core/secrets/SettingsStore.d.ts +30 -0
  256. package/dist/core/secrets/SettingsStore.js +9 -0
  257. package/dist/core/secrets/SettingsStore.js.map +1 -0
  258. package/dist/core/secrets/SqliteEncryptedStore.d.ts +90 -0
  259. package/dist/core/secrets/SqliteEncryptedStore.js +598 -0
  260. package/dist/core/secrets/SqliteEncryptedStore.js.map +1 -0
  261. package/dist/core/secrets/audit.d.ts +36 -0
  262. package/dist/core/secrets/audit.js +60 -0
  263. package/dist/core/secrets/audit.js.map +1 -0
  264. package/dist/core/secrets/auth-db-migration.d.ts +129 -0
  265. package/dist/core/secrets/auth-db-migration.js +653 -0
  266. package/dist/core/secrets/auth-db-migration.js.map +1 -0
  267. package/dist/core/secrets/bundle.d.ts +141 -0
  268. package/dist/core/secrets/bundle.js +435 -0
  269. package/dist/core/secrets/bundle.js.map +1 -0
  270. package/dist/core/secrets/dual-write.d.ts +81 -0
  271. package/dist/core/secrets/dual-write.js +247 -0
  272. package/dist/core/secrets/dual-write.js.map +1 -0
  273. package/dist/core/secrets/encryption.d.ts +44 -0
  274. package/dist/core/secrets/encryption.js +97 -0
  275. package/dist/core/secrets/encryption.js.map +1 -0
  276. package/dist/core/secrets/index.d.ts +49 -0
  277. package/dist/core/secrets/index.js +74 -0
  278. package/dist/core/secrets/index.js.map +1 -0
  279. package/dist/core/secrets/master-key.d.ts +38 -0
  280. package/dist/core/secrets/master-key.js +122 -0
  281. package/dist/core/secrets/master-key.js.map +1 -0
  282. package/dist/core/secrets/probes/anthropic.d.ts +98 -0
  283. package/dist/core/secrets/probes/anthropic.js +300 -0
  284. package/dist/core/secrets/probes/anthropic.js.map +1 -0
  285. package/dist/core/secrets/probes/brave.d.ts +9 -0
  286. package/dist/core/secrets/probes/brave.js +15 -0
  287. package/dist/core/secrets/probes/brave.js.map +1 -0
  288. package/dist/core/secrets/probes/r2.d.ts +15 -0
  289. package/dist/core/secrets/probes/r2.js +14 -0
  290. package/dist/core/secrets/probes/r2.js.map +1 -0
  291. package/dist/core/secrets/probes/tavily.d.ts +18 -0
  292. package/dist/core/secrets/probes/tavily.js +58 -0
  293. package/dist/core/secrets/probes/tavily.js.map +1 -0
  294. package/dist/core/secrets/probes/voyage.d.ts +13 -0
  295. package/dist/core/secrets/probes/voyage.js +52 -0
  296. package/dist/core/secrets/probes/voyage.js.map +1 -0
  297. package/dist/core/secrets/r2-structural-migration.d.ts +39 -0
  298. package/dist/core/secrets/r2-structural-migration.js +109 -0
  299. package/dist/core/secrets/r2-structural-migration.js.map +1 -0
  300. package/dist/core/secrets/read-flip.d.ts +59 -0
  301. package/dist/core/secrets/read-flip.js +87 -0
  302. package/dist/core/secrets/read-flip.js.map +1 -0
  303. package/dist/core/secrets/registry.d.ts +237 -0
  304. package/dist/core/secrets/registry.js +710 -0
  305. package/dist/core/secrets/registry.js.map +1 -0
  306. package/dist/core/seed-folder.d.ts +59 -0
  307. package/dist/core/seed-folder.js +76 -0
  308. package/dist/core/seed-folder.js.map +1 -0
  309. package/dist/core/types.d.ts +88 -480
  310. package/dist/core/types.js +53 -6
  311. package/dist/core/types.js.map +1 -1
  312. package/dist/core/user-config.d.ts +81 -14
  313. package/dist/core/user-config.js +147 -17
  314. package/dist/core/user-config.js.map +1 -1
  315. package/dist/core/validation.d.ts +828 -1472
  316. package/dist/core/validation.js +475 -163
  317. package/dist/core/validation.js.map +1 -1
  318. package/dist/core/view-scope.d.ts +88 -0
  319. package/dist/core/view-scope.js +71 -0
  320. package/dist/core/view-scope.js.map +1 -0
  321. package/dist/core/workspace-manager.d.ts +156 -11
  322. package/dist/core/workspace-manager.js +364 -92
  323. package/dist/core/workspace-manager.js.map +1 -1
  324. package/dist/core/workspace.d.ts +19 -5
  325. package/dist/core/workspace.js +72 -56
  326. package/dist/core/workspace.js.map +1 -1
  327. package/dist/mcp/comment-virtual-entity.d.ts +36 -0
  328. package/dist/mcp/comment-virtual-entity.js +71 -0
  329. package/dist/mcp/comment-virtual-entity.js.map +1 -0
  330. package/dist/mcp/connector-manager.d.ts +72 -2
  331. package/dist/mcp/connector-manager.js +211 -32
  332. package/dist/mcp/connector-manager.js.map +1 -1
  333. package/dist/mcp/oauth-provider.d.ts +0 -5
  334. package/dist/mcp/oauth-provider.js +31 -25
  335. package/dist/mcp/oauth-provider.js.map +1 -1
  336. package/dist/mcp/oauth-registry.d.ts +46 -8
  337. package/dist/mcp/oauth-registry.js +52 -13
  338. package/dist/mcp/oauth-registry.js.map +1 -1
  339. package/dist/mcp/server-discovery.d.ts +73 -0
  340. package/dist/mcp/server-discovery.js +164 -0
  341. package/dist/mcp/server-discovery.js.map +1 -0
  342. package/dist/mcp/server.d.ts +24 -3
  343. package/dist/mcp/server.js +53 -10
  344. package/dist/mcp/server.js.map +1 -1
  345. package/dist/mcp/state-signer.d.ts +62 -0
  346. package/dist/mcp/state-signer.js +205 -0
  347. package/dist/mcp/state-signer.js.map +1 -0
  348. package/dist/mcp/stdio-proxy.d.ts +67 -0
  349. package/dist/mcp/stdio-proxy.js +149 -0
  350. package/dist/mcp/stdio-proxy.js.map +1 -0
  351. package/dist/mcp/tools.d.ts +73 -2
  352. package/dist/mcp/tools.js +2289 -115
  353. package/dist/mcp/tools.js.map +1 -1
  354. package/dist/server/__tests__/helpers/graph-api.d.ts +17 -0
  355. package/dist/server/__tests__/helpers/graph-api.js +17 -0
  356. package/dist/server/__tests__/helpers/graph-api.js.map +1 -0
  357. package/dist/server/__tests__/helpers/multipart.d.ts +9 -0
  358. package/dist/server/__tests__/helpers/multipart.js +14 -0
  359. package/dist/server/__tests__/helpers/multipart.js.map +1 -0
  360. package/dist/server/artifact-asset-mint.d.ts +59 -0
  361. package/dist/server/artifact-asset-mint.js +127 -0
  362. package/dist/server/artifact-asset-mint.js.map +1 -0
  363. package/dist/server/asset-index-queue.d.ts +98 -0
  364. package/dist/server/asset-index-queue.js +193 -0
  365. package/dist/server/asset-index-queue.js.map +1 -0
  366. package/dist/server/body-write-coordinator.d.ts +161 -0
  367. package/dist/server/body-write-coordinator.js +182 -0
  368. package/dist/server/body-write-coordinator.js.map +1 -0
  369. package/dist/server/cloud-billing-flow.d.ts +32 -0
  370. package/dist/server/cloud-billing-flow.js +75 -0
  371. package/dist/server/cloud-billing-flow.js.map +1 -0
  372. package/dist/server/commit-audit.d.ts +26 -0
  373. package/dist/server/commit-audit.js +30 -0
  374. package/dist/server/commit-audit.js.map +1 -0
  375. package/dist/server/index.d.ts +50 -1
  376. package/dist/server/index.js +811 -229
  377. package/dist/server/index.js.map +1 -1
  378. package/dist/server/middleware/sanitize.d.ts +46 -0
  379. package/dist/server/middleware/sanitize.js +195 -0
  380. package/dist/server/middleware/sanitize.js.map +1 -0
  381. package/dist/server/process-guards.d.ts +37 -0
  382. package/dist/server/process-guards.js +44 -0
  383. package/dist/server/process-guards.js.map +1 -0
  384. package/dist/server/routes/ai-usage-api.d.ts +24 -0
  385. package/dist/server/routes/ai-usage-api.js +68 -0
  386. package/dist/server/routes/ai-usage-api.js.map +1 -0
  387. package/dist/server/routes/artifact-export-api.d.ts +11 -0
  388. package/dist/server/routes/artifact-export-api.js +180 -0
  389. package/dist/server/routes/artifact-export-api.js.map +1 -0
  390. package/dist/server/routes/artifact-patch-api.d.ts +19 -0
  391. package/dist/server/routes/artifact-patch-api.js +114 -0
  392. package/dist/server/routes/artifact-patch-api.js.map +1 -0
  393. package/dist/server/routes/artifact-selection-api.d.ts +15 -0
  394. package/dist/server/routes/artifact-selection-api.js +90 -0
  395. package/dist/server/routes/artifact-selection-api.js.map +1 -0
  396. package/dist/server/routes/asset-api.d.ts +88 -2
  397. package/dist/server/routes/asset-api.js +858 -112
  398. package/dist/server/routes/asset-api.js.map +1 -1
  399. package/dist/server/routes/audit-api.d.ts +24 -0
  400. package/dist/server/routes/audit-api.js +113 -0
  401. package/dist/server/routes/audit-api.js.map +1 -0
  402. package/dist/server/routes/auth-api.js +536 -44
  403. package/dist/server/routes/auth-api.js.map +1 -1
  404. package/dist/server/routes/capture-api.js +81 -9
  405. package/dist/server/routes/capture-api.js.map +1 -1
  406. package/dist/server/routes/chat-sessions-api.d.ts +13 -0
  407. package/dist/server/routes/chat-sessions-api.js +462 -0
  408. package/dist/server/routes/chat-sessions-api.js.map +1 -0
  409. package/dist/server/routes/chat.d.ts +35 -1
  410. package/dist/server/routes/chat.js +858 -68
  411. package/dist/server/routes/chat.js.map +1 -1
  412. package/dist/server/routes/comments-api.d.ts +15 -0
  413. package/dist/server/routes/comments-api.js +444 -0
  414. package/dist/server/routes/comments-api.js.map +1 -0
  415. package/dist/server/routes/config-api.d.ts +3 -2
  416. package/dist/server/routes/config-api.js +183 -57
  417. package/dist/server/routes/config-api.js.map +1 -1
  418. package/dist/server/routes/connectors-api.js +178 -45
  419. package/dist/server/routes/connectors-api.js.map +1 -1
  420. package/dist/server/routes/event-ingest-api.d.ts +15 -0
  421. package/dist/server/routes/event-ingest-api.js +125 -0
  422. package/dist/server/routes/event-ingest-api.js.map +1 -0
  423. package/dist/server/routes/field-library-api.d.ts +28 -0
  424. package/dist/server/routes/field-library-api.js +126 -0
  425. package/dist/server/routes/field-library-api.js.map +1 -0
  426. package/dist/server/routes/git-http.d.ts +3 -3
  427. package/dist/server/routes/git-http.js +90 -30
  428. package/dist/server/routes/git-http.js.map +1 -1
  429. package/dist/server/routes/graph-api-access.d.ts +63 -0
  430. package/dist/server/routes/graph-api-access.js +115 -0
  431. package/dist/server/routes/graph-api-access.js.map +1 -0
  432. package/dist/server/routes/graph-api.d.ts +2 -3
  433. package/dist/server/routes/graph-api.js +1341 -423
  434. package/dist/server/routes/graph-api.js.map +1 -1
  435. package/dist/server/routes/health.d.ts +18 -0
  436. package/dist/server/routes/health.js +116 -0
  437. package/dist/server/routes/health.js.map +1 -0
  438. package/dist/server/routes/import-batch.d.ts +24 -0
  439. package/dist/server/routes/import-batch.js +33 -0
  440. package/dist/server/routes/import-batch.js.map +1 -0
  441. package/dist/server/routes/insights-api.d.ts +9 -2
  442. package/dist/server/routes/insights-api.js +352 -66
  443. package/dist/server/routes/insights-api.js.map +1 -1
  444. package/dist/server/routes/mcp.d.ts +8 -3
  445. package/dist/server/routes/mcp.js +24 -8
  446. package/dist/server/routes/mcp.js.map +1 -1
  447. package/dist/server/routes/oauth-api.d.ts +67 -0
  448. package/dist/server/routes/oauth-api.js +421 -0
  449. package/dist/server/routes/oauth-api.js.map +1 -0
  450. package/dist/server/routes/permissions-api.d.ts +8 -3
  451. package/dist/server/routes/permissions-api.js +43 -12
  452. package/dist/server/routes/permissions-api.js.map +1 -1
  453. package/dist/server/routes/r2-api.d.ts +25 -0
  454. package/dist/server/routes/r2-api.js +273 -0
  455. package/dist/server/routes/r2-api.js.map +1 -0
  456. package/dist/server/routes/secrets-api.d.ts +36 -0
  457. package/dist/server/routes/secrets-api.js +305 -0
  458. package/dist/server/routes/secrets-api.js.map +1 -0
  459. package/dist/server/routes/settings-api.d.ts +29 -0
  460. package/dist/server/routes/settings-api.js +177 -0
  461. package/dist/server/routes/settings-api.js.map +1 -0
  462. package/dist/server/routes/share-api.d.ts +30 -6
  463. package/dist/server/routes/share-api.js +240 -31
  464. package/dist/server/routes/share-api.js.map +1 -1
  465. package/dist/server/routes/views-api.d.ts +11 -2
  466. package/dist/server/routes/views-api.js +123 -22
  467. package/dist/server/routes/views-api.js.map +1 -1
  468. package/dist/server/routes/workspace-api.d.ts +2 -1
  469. package/dist/server/routes/workspace-api.js +150 -23
  470. package/dist/server/routes/workspace-api.js.map +1 -1
  471. package/dist/server/routes/ws.d.ts +2 -1
  472. package/dist/server/routes/ws.js +73 -20
  473. package/dist/server/routes/ws.js.map +1 -1
  474. package/dist/server/session-manager.d.ts +48 -5
  475. package/dist/server/session-manager.js +182 -14
  476. package/dist/server/session-manager.js.map +1 -1
  477. package/dist/server/ws-hub.d.ts +135 -56
  478. package/dist/server/ws-hub.js +0 -0
  479. package/dist/server/ws-hub.js.map +1 -1
  480. package/dist/server/yjs-manager.d.ts +275 -18
  481. package/dist/server/yjs-manager.js +819 -70
  482. package/dist/server/yjs-manager.js.map +1 -1
  483. package/dist/server/yjs-persistence.d.ts +165 -0
  484. package/dist/server/yjs-persistence.js +557 -0
  485. package/dist/server/yjs-persistence.js.map +1 -0
  486. package/dist/server/yjs-text-diff.d.ts +32 -0
  487. package/dist/server/yjs-text-diff.js +61 -0
  488. package/dist/server/yjs-text-diff.js.map +1 -0
  489. package/dist/services/access-control.d.ts +121 -0
  490. package/dist/services/access-control.js +194 -0
  491. package/dist/services/access-control.js.map +1 -0
  492. package/dist/services/ai-usage-ledger.d.ts +75 -0
  493. package/dist/services/ai-usage-ledger.js +250 -0
  494. package/dist/services/ai-usage-ledger.js.map +1 -0
  495. package/dist/services/artifact-asset-token.d.ts +69 -0
  496. package/dist/services/artifact-asset-token.js +94 -0
  497. package/dist/services/artifact-asset-token.js.map +1 -0
  498. package/dist/services/artifact-inspect-metadata.d.ts +21 -0
  499. package/dist/services/artifact-inspect-metadata.js +66 -0
  500. package/dist/services/artifact-inspect-metadata.js.map +1 -0
  501. package/dist/services/artifact-library-sources.d.ts +33 -0
  502. package/dist/services/artifact-library-sources.js +91 -0
  503. package/dist/services/artifact-library-sources.js.map +1 -0
  504. package/dist/services/artifact-patch-runner.d.ts +52 -0
  505. package/dist/services/artifact-patch-runner.js +74 -0
  506. package/dist/services/artifact-patch-runner.js.map +1 -0
  507. package/dist/services/artifact-render-export.d.ts +230 -0
  508. package/dist/services/artifact-render-export.js +1003 -0
  509. package/dist/services/artifact-render-export.js.map +1 -0
  510. package/dist/services/artifact-selection-store.d.ts +68 -0
  511. package/dist/services/artifact-selection-store.js +90 -0
  512. package/dist/services/artifact-selection-store.js.map +1 -0
  513. package/dist/services/artifact-store.d.ts +118 -0
  514. package/dist/services/artifact-store.js +234 -0
  515. package/dist/services/artifact-store.js.map +1 -0
  516. package/dist/services/asset-caption-service.d.ts +103 -0
  517. package/dist/services/asset-caption-service.js +200 -0
  518. package/dist/services/asset-caption-service.js.map +1 -0
  519. package/dist/services/asset-delete-authz.d.ts +32 -0
  520. package/dist/services/asset-delete-authz.js +62 -0
  521. package/dist/services/asset-delete-authz.js.map +1 -0
  522. package/dist/services/asset-delete-impact.d.ts +63 -0
  523. package/dist/services/asset-delete-impact.js +96 -0
  524. package/dist/services/asset-delete-impact.js.map +1 -0
  525. package/dist/services/asset-finalize-service.d.ts +58 -0
  526. package/dist/services/asset-finalize-service.js +216 -0
  527. package/dist/services/asset-finalize-service.js.map +1 -0
  528. package/dist/services/asset-import-service.d.ts +116 -0
  529. package/dist/services/asset-import-service.js +436 -0
  530. package/dist/services/asset-import-service.js.map +1 -0
  531. package/dist/services/asset-index-sweep.d.ts +95 -0
  532. package/dist/services/asset-index-sweep.js +271 -0
  533. package/dist/services/asset-index-sweep.js.map +1 -0
  534. package/dist/services/asset-lifecycle-check.d.ts +22 -0
  535. package/dist/services/asset-lifecycle-check.js +80 -0
  536. package/dist/services/asset-lifecycle-check.js.map +1 -0
  537. package/dist/services/asset-listing.d.ts +63 -0
  538. package/dist/services/asset-listing.js +124 -0
  539. package/dist/services/asset-listing.js.map +1 -0
  540. package/dist/services/asset-move-impact.d.ts +49 -0
  541. package/dist/services/asset-move-impact.js +62 -0
  542. package/dist/services/asset-move-impact.js.map +1 -0
  543. package/dist/services/asset-presign-service.d.ts +62 -0
  544. package/dist/services/asset-presign-service.js +126 -0
  545. package/dist/services/asset-presign-service.js.map +1 -0
  546. package/dist/services/asset-reference-index.d.ts +39 -0
  547. package/dist/services/asset-reference-index.js +33 -0
  548. package/dist/services/asset-reference-index.js.map +1 -0
  549. package/dist/services/asset-reference-scan.d.ts +57 -0
  550. package/dist/services/asset-reference-scan.js +150 -0
  551. package/dist/services/asset-reference-scan.js.map +1 -0
  552. package/dist/services/asset-sidecar-service.d.ts +28 -0
  553. package/dist/services/asset-sidecar-service.js +79 -0
  554. package/dist/services/asset-sidecar-service.js.map +1 -0
  555. package/dist/services/asset-upload-errors.d.ts +41 -0
  556. package/dist/services/asset-upload-errors.js +45 -0
  557. package/dist/services/asset-upload-errors.js.map +1 -0
  558. package/dist/services/asset-upload-service.d.ts +56 -0
  559. package/dist/services/asset-upload-service.js +200 -0
  560. package/dist/services/asset-upload-service.js.map +1 -0
  561. package/dist/services/asset-upload-token.d.ts +58 -0
  562. package/dist/services/asset-upload-token.js +75 -0
  563. package/dist/services/asset-upload-token.js.map +1 -0
  564. package/dist/services/assets/asset-index-service.d.ts +158 -0
  565. package/dist/services/assets/asset-index-service.js +293 -0
  566. package/dist/services/assets/asset-index-service.js.map +1 -0
  567. package/dist/services/assets/base.d.ts +119 -4
  568. package/dist/services/assets/base.js +148 -3
  569. package/dist/services/assets/base.js.map +1 -1
  570. package/dist/services/assets/index.d.ts +90 -0
  571. package/dist/services/assets/index.js +202 -0
  572. package/dist/services/assets/index.js.map +1 -1
  573. package/dist/services/assets/local.d.ts +9 -0
  574. package/dist/services/assets/local.js +30 -4
  575. package/dist/services/assets/local.js.map +1 -1
  576. package/dist/services/assets/r2-sync.d.ts +88 -0
  577. package/dist/services/assets/r2-sync.js +412 -0
  578. package/dist/services/assets/r2-sync.js.map +1 -0
  579. package/dist/services/assets/r2.d.ts +80 -0
  580. package/dist/services/assets/r2.js +159 -4
  581. package/dist/services/assets/r2.js.map +1 -1
  582. package/dist/services/auth-service.d.ts +278 -51
  583. package/dist/services/auth-service.js +995 -272
  584. package/dist/services/auth-service.js.map +1 -1
  585. package/dist/services/chat-session-service.d.ts +189 -0
  586. package/dist/services/chat-session-service.js +544 -0
  587. package/dist/services/chat-session-service.js.map +1 -0
  588. package/dist/services/cloud-inference-billing.d.ts +64 -0
  589. package/dist/services/cloud-inference-billing.js +321 -0
  590. package/dist/services/cloud-inference-billing.js.map +1 -0
  591. package/dist/services/comment-service.d.ts +97 -0
  592. package/dist/services/comment-service.js +341 -0
  593. package/dist/services/comment-service.js.map +1 -0
  594. package/dist/services/comment-virtual-entity.d.ts +36 -0
  595. package/dist/services/comment-virtual-entity.js +71 -0
  596. package/dist/services/comment-virtual-entity.js.map +1 -0
  597. package/dist/services/convert-service.d.ts +64 -0
  598. package/dist/services/convert-service.js +68 -0
  599. package/dist/services/convert-service.js.map +1 -0
  600. package/dist/services/csv-service.d.ts +22 -17
  601. package/dist/services/csv-service.js +55 -92
  602. package/dist/services/csv-service.js.map +1 -1
  603. package/dist/services/entity-mutations.d.ts +313 -0
  604. package/dist/services/entity-mutations.js +531 -0
  605. package/dist/services/entity-mutations.js.map +1 -0
  606. package/dist/services/event-processor.d.ts +104 -0
  607. package/dist/services/event-processor.js +451 -0
  608. package/dist/services/event-processor.js.map +1 -0
  609. package/dist/services/extract/docx.d.ts +1 -0
  610. package/dist/services/extract/docx.js +233 -0
  611. package/dist/services/extract/docx.js.map +1 -0
  612. package/dist/services/extract/index.d.ts +9 -0
  613. package/dist/services/extract/index.js +10 -0
  614. package/dist/services/extract/index.js.map +1 -0
  615. package/dist/services/extract/pdf.d.ts +13 -0
  616. package/dist/services/extract/pdf.js +69 -0
  617. package/dist/services/extract/pdf.js.map +1 -0
  618. package/dist/services/folder-creation.d.ts +33 -0
  619. package/dist/services/folder-creation.js +103 -0
  620. package/dist/services/folder-creation.js.map +1 -0
  621. package/dist/services/fonts/font-metadata.d.ts +42 -0
  622. package/dist/services/fonts/font-metadata.js +126 -0
  623. package/dist/services/fonts/font-metadata.js.map +1 -0
  624. package/dist/services/fonts/font-skill-service.d.ts +66 -0
  625. package/dist/services/fonts/font-skill-service.js +137 -0
  626. package/dist/services/fonts/font-skill-service.js.map +1 -0
  627. package/dist/services/git.d.ts +58 -0
  628. package/dist/services/git.js +194 -55
  629. package/dist/services/git.js.map +1 -1
  630. package/dist/services/graph-maintenance.js +4 -4
  631. package/dist/services/graph-maintenance.js.map +1 -1
  632. package/dist/services/import-service.d.ts +51 -2
  633. package/dist/services/import-service.js +254 -107
  634. package/dist/services/import-service.js.map +1 -1
  635. package/dist/services/lint-service.js +10 -17
  636. package/dist/services/lint-service.js.map +1 -1
  637. package/dist/services/markdown.d.ts +12 -1
  638. package/dist/services/markdown.js +77 -9
  639. package/dist/services/markdown.js.map +1 -1
  640. package/dist/services/mention-detector.d.ts +23 -0
  641. package/dist/services/mention-detector.js +47 -0
  642. package/dist/services/mention-detector.js.map +1 -0
  643. package/dist/services/model-capabilities.d.ts +41 -0
  644. package/dist/services/model-capabilities.js +107 -0
  645. package/dist/services/model-capabilities.js.map +1 -0
  646. package/dist/services/notification-broadcast.d.ts +32 -0
  647. package/dist/services/notification-broadcast.js +38 -0
  648. package/dist/services/notification-broadcast.js.map +1 -0
  649. package/dist/services/notification-service.d.ts +41 -0
  650. package/dist/services/notification-service.js +100 -0
  651. package/dist/services/notification-service.js.map +1 -0
  652. package/dist/services/oauth-server-store.d.ts +147 -0
  653. package/dist/services/oauth-server-store.js +319 -0
  654. package/dist/services/oauth-server-store.js.map +1 -0
  655. package/dist/services/orphan-service.js +2 -2
  656. package/dist/services/orphan-service.js.map +1 -1
  657. package/dist/services/personal-folder.d.ts +49 -0
  658. package/dist/services/personal-folder.js +122 -0
  659. package/dist/services/personal-folder.js.map +1 -0
  660. package/dist/services/playwright-bootstrap.d.ts +78 -0
  661. package/dist/services/playwright-bootstrap.js +219 -0
  662. package/dist/services/playwright-bootstrap.js.map +1 -0
  663. package/dist/services/scratch-asset-promote.d.ts +57 -0
  664. package/dist/services/scratch-asset-promote.js +95 -0
  665. package/dist/services/scratch-asset-promote.js.map +1 -0
  666. package/dist/services/scratch-attachment-service.d.ts +201 -0
  667. package/dist/services/scratch-attachment-service.js +354 -0
  668. package/dist/services/scratch-attachment-service.js.map +1 -0
  669. package/dist/services/share-link-service.d.ts +57 -0
  670. package/dist/services/share-link-service.js +142 -0
  671. package/dist/services/share-link-service.js.map +1 -0
  672. package/dist/services/user-person-bridge.d.ts +136 -0
  673. package/dist/services/user-person-bridge.js +341 -0
  674. package/dist/services/user-person-bridge.js.map +1 -0
  675. package/dist/services/utility-model-resolver.d.ts +37 -0
  676. package/dist/services/utility-model-resolver.js +67 -0
  677. package/dist/services/utility-model-resolver.js.map +1 -0
  678. package/dist/services/vector-service.d.ts +282 -5
  679. package/dist/services/vector-service.js +594 -39
  680. package/dist/services/vector-service.js.map +1 -1
  681. package/dist/services/workspace-access.d.ts +115 -0
  682. package/dist/services/workspace-access.js +154 -0
  683. package/dist/services/workspace-access.js.map +1 -0
  684. package/dist/services/workspace-assets-folder.d.ts +46 -0
  685. package/dist/services/workspace-assets-folder.js +75 -0
  686. package/dist/services/workspace-assets-folder.js.map +1 -0
  687. package/dist/utils/git.d.ts +17 -2
  688. package/dist/utils/git.js +23 -7
  689. package/dist/utils/git.js.map +1 -1
  690. package/dist/utils/log.d.ts +42 -0
  691. package/dist/utils/log.js +137 -0
  692. package/dist/utils/log.js.map +1 -0
  693. package/dist/utils/preflight.js +2 -2
  694. package/dist/utils/preflight.js.map +1 -1
  695. package/dist/utils/version-checker.d.ts +12 -19
  696. package/dist/utils/version-checker.js +14 -104
  697. package/dist/utils/version-checker.js.map +1 -1
  698. package/dist/web/_app/immutable/assets/0.B8rPC4xg.css +2 -0
  699. package/dist/web/_app/immutable/assets/12.DlIf1mKh.css +1 -0
  700. package/dist/web/_app/immutable/assets/13.WUaKJbVc.css +1 -0
  701. package/dist/web/_app/immutable/assets/15.CItnu3nw.css +1 -0
  702. package/dist/web/_app/immutable/assets/16.C3czeWWx.css +1 -0
  703. package/dist/web/_app/immutable/assets/17.CHiwoAMO.css +1 -0
  704. package/dist/web/_app/immutable/assets/18.fUGuXQ0K.css +1 -0
  705. package/dist/web/_app/immutable/assets/19.DcuK5ZVm.css +1 -0
  706. package/dist/web/_app/immutable/assets/2.bJqlVFXX.css +1 -0
  707. package/dist/web/_app/immutable/assets/3.DDfEAhbB.css +1 -0
  708. package/dist/web/_app/immutable/assets/4.Dtodt1Fe.css +1 -0
  709. package/dist/web/_app/immutable/assets/6.JPVpkzLZ.css +1 -0
  710. package/dist/web/_app/immutable/assets/AssetLibraryPicker.BWH260L8.css +1 -0
  711. package/dist/web/_app/immutable/assets/BulkActionsBar.CXSM7tO7.css +1 -0
  712. package/dist/web/_app/immutable/assets/CalendarView.Cch9MMQW.css +1 -0
  713. package/dist/web/_app/immutable/assets/CodeMirrorEditor.D6hf2pNJ.css +1 -0
  714. package/dist/web/_app/immutable/assets/CopyField.DVGZtw4U.css +1 -0
  715. package/dist/web/_app/immutable/assets/FolderMembersPanel.BvV1lBCg.css +1 -0
  716. package/dist/web/_app/immutable/assets/FolderMutationDialogs.De2NQ55E.css +1 -0
  717. package/dist/web/_app/immutable/assets/FolderPicker.Cq1tMnu_.css +1 -0
  718. package/dist/web/_app/immutable/assets/FolderTreeField.DTSzn15s.css +1 -0
  719. package/dist/web/_app/immutable/assets/FrameCanvas.Clh5Xdr7.css +1 -0
  720. package/dist/web/_app/immutable/assets/GalleryView.Cqu3-wtr.css +1 -0
  721. package/dist/web/_app/immutable/assets/GraphView.BJtGL9py.css +1 -0
  722. package/dist/web/_app/immutable/assets/GridCell.czY6eDb_.css +1 -0
  723. package/dist/web/_app/immutable/assets/KanbanView.C5X8TbQk.css +1 -0
  724. package/dist/web/_app/immutable/assets/Link.vV0ne105.css +1 -0
  725. package/dist/web/_app/immutable/assets/Markdown.CSYKSAm0.css +1 -0
  726. package/dist/web/_app/immutable/assets/Rail.Dyxy_E0O.css +1 -0
  727. package/dist/web/_app/immutable/assets/RepoCheckList.BLeJ79Eg.css +1 -0
  728. package/dist/web/_app/immutable/assets/SaveViewDialog.Bb9E81xd.css +1 -0
  729. package/dist/web/_app/immutable/assets/SearchInput.DTB6W35f.css +1 -0
  730. package/dist/web/_app/immutable/assets/SettingsDialog.CHzfQoo_.css +1 -0
  731. package/dist/web/_app/immutable/assets/Spinner.UBfl0pab.css +1 -0
  732. package/dist/web/_app/immutable/assets/StopFilledAlt.CjuwgVxu.css +1 -0
  733. package/dist/web/_app/immutable/assets/TimelineView.u4YqiztR.css +1 -0
  734. package/dist/web/_app/immutable/assets/Version.BQq1Fihu.css +1 -0
  735. package/dist/web/_app/immutable/assets/ViewBanner.DWswnFdi.css +1 -0
  736. package/dist/web/_app/immutable/assets/WorkspaceView.Cd6TS6oo.css +1 -0
  737. package/dist/web/_app/immutable/assets/button.DOg1smbV.css +1 -0
  738. package/dist/web/_app/immutable/assets/checkbox.CAcHq8G6.css +1 -0
  739. package/dist/web/_app/immutable/assets/download-with-progress.BZlFTn09.css +1 -0
  740. package/dist/web/_app/immutable/assets/filters.RgfXKVpA.css +1 -0
  741. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
  742. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
  743. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
  744. package/dist/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
  745. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CZTNEAuW.woff2 +0 -0
  746. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-italic.CsGl1sm0.woff +0 -0
  747. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2 +0 -0
  748. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff +0 -0
  749. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.BNK2_mGO.woff2 +0 -0
  750. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-italic.DpEwFAQM.woff +0 -0
  751. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.6ng42L7E.woff2 +0 -0
  752. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-500-normal.BgVn5rGT.woff +0 -0
  753. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.Cu4Hd6ag.woff +0 -0
  754. package/dist/web/_app/immutable/assets/ibm-plex-sans-latin-600-normal.CuJfVYMP.woff2 +0 -0
  755. package/dist/web/_app/immutable/assets/list-columns.BgnafZ4K.css +1 -0
  756. package/dist/web/_app/immutable/chunks/-MYqXlc3.js +185 -0
  757. package/dist/web/_app/immutable/chunks/-Tbr-96c2.js +1 -0
  758. package/dist/web/_app/immutable/chunks/1QRy7-wo.js +1 -0
  759. package/dist/web/_app/immutable/chunks/1_BWKAKA2.js +23 -0
  760. package/dist/web/_app/immutable/chunks/2z2ekE6D2.js +2 -0
  761. package/dist/web/_app/immutable/chunks/6guf_P8c.js +1 -0
  762. package/dist/web/_app/immutable/chunks/7l950wkn.js +1 -0
  763. package/dist/web/_app/immutable/chunks/9Sn2PwSn2.js +1025 -0
  764. package/dist/web/_app/immutable/chunks/AFZSy-Vk.js +2 -0
  765. package/dist/web/_app/immutable/chunks/B06uE1qJ.js +1 -0
  766. package/dist/web/_app/immutable/chunks/B2cjR0rG.js +83 -0
  767. package/dist/web/_app/immutable/chunks/B3u4QMoU.js +1 -0
  768. package/dist/web/_app/immutable/chunks/B4PrlkmE.js +1 -0
  769. package/dist/web/_app/immutable/chunks/B5UH1FNe.js +3 -0
  770. package/dist/web/_app/immutable/chunks/B5sxjq1L2.js +1 -0
  771. package/dist/web/_app/immutable/chunks/B6Lt-qaJ.js +1 -0
  772. package/dist/web/_app/immutable/chunks/B6wo7Stk2.js +1 -0
  773. package/dist/web/_app/immutable/chunks/B9KfEsQw2.js +1 -0
  774. package/dist/web/_app/immutable/chunks/B9MY422N.js +1 -0
  775. package/dist/web/_app/immutable/chunks/B9VQbssY.js +3 -0
  776. package/dist/web/_app/immutable/chunks/BBrP9GiZ.js +1 -0
  777. package/dist/web/_app/immutable/chunks/BEGTD2EL2.js +1 -0
  778. package/dist/web/_app/immutable/chunks/BEyPhM3C.js +1 -0
  779. package/dist/web/_app/immutable/chunks/BIeOkmiV.js +1 -0
  780. package/dist/web/_app/immutable/chunks/BIwe25Lk.js +1 -0
  781. package/dist/web/_app/immutable/chunks/BO6-nRV9.js +1 -0
  782. package/dist/web/_app/immutable/chunks/BPILs-6H.js +1 -0
  783. package/dist/web/_app/immutable/chunks/BPRQzMGs.js +1 -0
  784. package/dist/web/_app/immutable/chunks/BQE7bWgF.js +1 -0
  785. package/dist/web/_app/immutable/chunks/BU5TCj7m.js +12 -0
  786. package/dist/web/_app/immutable/chunks/BZDKT2Qw2.js +2 -0
  787. package/dist/web/_app/immutable/chunks/B_y9A6Kg.js +4 -0
  788. package/dist/web/_app/immutable/chunks/BdR7t2GN.js +3 -0
  789. package/dist/web/_app/immutable/chunks/BnYohOts2.js +1 -0
  790. package/dist/web/_app/immutable/chunks/Bpmx7Umc.js +1 -0
  791. package/dist/web/_app/immutable/chunks/BqButnP4.js +1 -0
  792. package/dist/web/_app/immutable/chunks/BtDSRU36.js +1 -0
  793. package/dist/web/_app/immutable/chunks/Bvr6nSm92.js +1 -0
  794. package/dist/web/_app/immutable/chunks/BvyVm7-j.js +184 -0
  795. package/dist/web/_app/immutable/chunks/Bx6T8G5n2.js +1 -0
  796. package/dist/web/_app/immutable/chunks/BxeOdaUQ.js +1 -0
  797. package/dist/web/_app/immutable/chunks/C1B4xDs0.js +1 -0
  798. package/dist/web/_app/immutable/chunks/C2yz630b.js +2 -0
  799. package/dist/web/_app/immutable/chunks/C5YoDj-e.js +1 -0
  800. package/dist/web/_app/immutable/chunks/C6d9nn3k.js +1 -0
  801. package/dist/web/_app/immutable/chunks/C85NG5lS.js +1 -0
  802. package/dist/web/_app/immutable/chunks/C8ZiSqQm.js +1 -0
  803. package/dist/web/_app/immutable/chunks/CB-t1Bv-.js +1 -0
  804. package/dist/web/_app/immutable/chunks/CG8YKaqc.js +5 -0
  805. package/dist/web/_app/immutable/chunks/CJbr-v9X.js +1 -0
  806. package/dist/web/_app/immutable/chunks/CKGHeJzq.js +1 -0
  807. package/dist/web/_app/immutable/chunks/CKwV6HKc.js +1 -0
  808. package/dist/web/_app/immutable/chunks/CLninaDG2.js +2 -0
  809. package/dist/web/_app/immutable/chunks/CM400nLL.js +7 -0
  810. package/dist/web/_app/immutable/chunks/CPvxN2G62.js +1 -0
  811. package/dist/web/_app/immutable/chunks/CQW66fYJ.js +1 -0
  812. package/dist/web/_app/immutable/chunks/CQl_RUVN2.js +1 -0
  813. package/dist/web/_app/immutable/chunks/CR1JY_cb.js +6 -0
  814. package/dist/web/_app/immutable/chunks/CT35tdLp.js +1 -0
  815. package/dist/web/_app/immutable/chunks/CVKrGJ6C.js +1 -0
  816. package/dist/web/_app/immutable/chunks/CWIHttTH.js +1 -0
  817. package/dist/web/_app/immutable/chunks/CWZSexLW.js +1 -0
  818. package/dist/web/_app/immutable/chunks/CXPMb3zd.js +1 -0
  819. package/dist/web/_app/immutable/chunks/CZBW5wi82.js +1 -0
  820. package/dist/web/_app/immutable/chunks/CaimSvvF.js +5 -0
  821. package/dist/web/_app/immutable/chunks/CcWaWbrI2.js +1 -0
  822. package/dist/web/_app/immutable/chunks/CcgYvk_3.js +1 -0
  823. package/dist/web/_app/immutable/chunks/Cg7m1gqN.js +1 -0
  824. package/dist/web/_app/immutable/chunks/CgCz4Fj6.js +1 -0
  825. package/dist/web/_app/immutable/chunks/CgOgBK5j.js +1 -0
  826. package/dist/web/_app/immutable/chunks/ChS3kWO-.js +2 -0
  827. package/dist/web/_app/immutable/chunks/CkivrILi.js +1 -0
  828. package/dist/web/_app/immutable/chunks/CmWflMFc.js +1 -0
  829. package/dist/web/_app/immutable/chunks/Cm_yhEon2.js +1 -0
  830. package/dist/web/_app/immutable/chunks/CnoUnj6-2.js +1 -0
  831. package/dist/web/_app/immutable/chunks/CqyFdLMa.js +1 -0
  832. package/dist/web/_app/immutable/chunks/CsIWxmio2.js +22 -0
  833. package/dist/web/_app/immutable/chunks/CtgdtZ0G2.js +1 -0
  834. package/dist/web/_app/immutable/chunks/CuYL65Bn.js +2 -0
  835. package/dist/web/_app/immutable/chunks/CuatNdzp.js +2 -0
  836. package/dist/web/_app/immutable/chunks/Cx5IiiDO2.js +2 -0
  837. package/dist/web/_app/immutable/chunks/Cxdio_Al.js +2692 -0
  838. package/dist/web/_app/immutable/chunks/CyTgggiM2.js +1 -0
  839. package/dist/web/_app/immutable/chunks/D-vvXTU3.js +2 -0
  840. package/dist/web/_app/immutable/chunks/D0_Iu3Uj.js +2 -0
  841. package/dist/web/_app/immutable/chunks/D4vfNy_f.js +1 -0
  842. package/dist/web/_app/immutable/chunks/D6toh9Mr.js +1 -0
  843. package/dist/web/_app/immutable/chunks/DAsarOLg2.js +1 -0
  844. package/dist/web/_app/immutable/chunks/DBGaXAP8.js +1 -0
  845. package/dist/web/_app/immutable/chunks/DCgKWtld.js +1 -0
  846. package/dist/web/_app/immutable/chunks/DG7uGoZb2.js +58 -0
  847. package/dist/web/_app/immutable/chunks/DIsSxB_C.js +1 -0
  848. package/dist/web/_app/immutable/chunks/DJTvBXur.js +2 -0
  849. package/dist/web/_app/immutable/chunks/DLuIHCPq.js +1 -0
  850. package/dist/web/_app/immutable/chunks/DMFH9Cnt2.js +1 -0
  851. package/dist/web/_app/immutable/chunks/DNLoQniz.js +1 -0
  852. package/dist/web/_app/immutable/chunks/DPLkAijI2.js +1 -0
  853. package/dist/web/_app/immutable/chunks/DQMWa2t7.js +1 -0
  854. package/dist/web/_app/immutable/chunks/DTOO9nUj.js +1 -0
  855. package/dist/web/_app/immutable/chunks/DaB0hU8_.js +1 -0
  856. package/dist/web/_app/immutable/chunks/Dav8Lgyy2.js +5 -0
  857. package/dist/web/_app/immutable/chunks/Ddgu2Sjp.js +1 -0
  858. package/dist/web/_app/immutable/chunks/DfUXQOZ92.js +1 -0
  859. package/dist/web/_app/immutable/chunks/DgP0Pxes.js +224 -0
  860. package/dist/web/_app/immutable/chunks/DhD1HF7R.js +1 -0
  861. package/dist/web/_app/immutable/chunks/Dhmw5GUH.js +1 -0
  862. package/dist/web/_app/immutable/chunks/DiBVOY752.js +1 -0
  863. package/dist/web/_app/immutable/chunks/DiMsLIh3.js +1 -0
  864. package/dist/web/_app/immutable/chunks/DiiXREv7.js +1 -0
  865. package/dist/web/_app/immutable/chunks/DjXtgWTP.js +1 -0
  866. package/dist/web/_app/immutable/chunks/Dk2-JtmU2.js +1 -0
  867. package/dist/web/_app/immutable/chunks/Dl0bYyV_.js +1 -0
  868. package/dist/web/_app/immutable/chunks/DqKYbIld2.js +1 -0
  869. package/dist/web/_app/immutable/chunks/DtXJCaQc2.js +1 -0
  870. package/dist/web/_app/immutable/chunks/DwuBUEvU.js +1 -0
  871. package/dist/web/_app/immutable/chunks/F5xZdLlB.js +2 -0
  872. package/dist/web/_app/immutable/chunks/F92HmKX8.js +1 -0
  873. package/dist/web/_app/immutable/chunks/FISIvbqq.js +3 -0
  874. package/dist/web/_app/immutable/chunks/GC5Izn9E2.js +1 -0
  875. package/dist/web/_app/immutable/chunks/IMJutqSu2.js +1 -0
  876. package/dist/web/_app/immutable/chunks/K5YHt1WL2.js +1 -0
  877. package/dist/web/_app/immutable/chunks/MAYbL-xn2.js +6 -0
  878. package/dist/web/_app/immutable/chunks/MMtHlrry.js +1 -0
  879. package/dist/web/_app/immutable/chunks/MtN4vJa02.js +1 -0
  880. package/dist/web/_app/immutable/chunks/Oglnp7sm.js +14 -0
  881. package/dist/web/_app/immutable/chunks/PwUOTfSv.js +2 -0
  882. package/dist/web/_app/immutable/chunks/QsO256-z.js +1 -0
  883. package/dist/web/_app/immutable/chunks/RA-JwTzo.js +1 -0
  884. package/dist/web/_app/immutable/chunks/atFSAfcd2.js +2 -0
  885. package/dist/web/_app/immutable/chunks/j_uHTBnD.js +1 -0
  886. package/dist/web/_app/immutable/chunks/joKsoiFC.js +1 -0
  887. package/dist/web/_app/immutable/chunks/kNaey6uv.js +1 -0
  888. package/dist/web/_app/immutable/chunks/nqo2e2Yv.js +1 -0
  889. package/dist/web/_app/immutable/chunks/oIZupUnz.js +1 -0
  890. package/dist/web/_app/immutable/chunks/pPsy4008.js +1 -0
  891. package/dist/web/_app/immutable/chunks/qevfNcid.js +1 -0
  892. package/dist/web/_app/immutable/chunks/rjjyuGhb.js +1 -0
  893. package/dist/web/_app/immutable/chunks/sUAtda6y2.js +2 -0
  894. package/dist/web/_app/immutable/chunks/snCOoD78.js +1 -0
  895. package/dist/web/_app/immutable/chunks/uHaS74te.js +1 -0
  896. package/dist/web/_app/immutable/chunks/w5tsuIav.js +5 -0
  897. package/dist/web/_app/immutable/chunks/xihTtKlq.js +1 -0
  898. package/dist/web/_app/immutable/entry/app.1tcNTKI-.js +2 -0
  899. package/dist/web/_app/immutable/entry/start.BJMsySI1.js +1 -0
  900. package/dist/web/_app/immutable/nodes/0.v0W5DL7W.js +2 -0
  901. package/dist/web/_app/immutable/nodes/1.81Rb3Ith.js +1 -0
  902. package/dist/web/_app/immutable/nodes/10.CAlZNFOq.js +1 -0
  903. package/dist/web/_app/immutable/nodes/11.CCfUginI.js +1 -0
  904. package/dist/web/_app/immutable/nodes/12.BJLboAyk.js +1 -0
  905. package/dist/web/_app/immutable/nodes/13.Cz4UTl2G.js +1 -0
  906. package/dist/web/_app/immutable/nodes/14.DJwakC0o.js +1 -0
  907. package/dist/web/_app/immutable/nodes/15.D2mNE6C-.js +1 -0
  908. package/dist/web/_app/immutable/nodes/16.BjohAUt9.js +1 -0
  909. package/dist/web/_app/immutable/nodes/17.BI2F37bS.js +1 -0
  910. package/dist/web/_app/immutable/nodes/18.DsOT0tDo.js +1 -0
  911. package/dist/web/_app/immutable/nodes/19.BiJWLOUT.js +77 -0
  912. package/dist/web/_app/immutable/nodes/2.Cd72nG2V.js +124 -0
  913. package/dist/web/_app/immutable/nodes/3.BIT9mm9r.js +6 -0
  914. package/dist/web/_app/immutable/nodes/4.Cn7r0Poe.js +16 -0
  915. package/dist/web/_app/immutable/nodes/5.CkJNdCZG.js +1 -0
  916. package/dist/web/_app/immutable/nodes/6.1rbIRQgQ.js +6 -0
  917. package/dist/web/_app/immutable/nodes/7.w17Zl36i.js +1 -0
  918. package/dist/web/_app/immutable/nodes/8.DqTsYuU-.js +1 -0
  919. package/dist/web/_app/immutable/nodes/9.BJhYZPfc.js +1 -0
  920. package/dist/web/_app/version.json +1 -1
  921. package/dist/web/favicon-16.png +0 -0
  922. package/dist/web/favicon-180.png +0 -0
  923. package/dist/web/favicon-32.png +0 -0
  924. package/dist/web/favicon-48.png +0 -0
  925. package/dist/web/favicon-512.png +0 -0
  926. package/dist/web/favicon.ico +0 -0
  927. package/dist/web/favicon.svg +8 -0
  928. package/dist/web/index.html +59 -20
  929. package/dist/web/studiograph-logomark.svg +29 -0
  930. package/package.json +44 -15
  931. package/dist/agent/role-loader.d.ts +0 -24
  932. package/dist/agent/role-loader.js +0 -67
  933. package/dist/agent/role-loader.js.map +0 -1
  934. package/dist/agent/skills/create-deck/content-guide.md +0 -238
  935. package/dist/agent/skills/create-deck/deck-cadence.md +0 -105
  936. package/dist/agent/skills/create-deck/diagrams.md +0 -431
  937. package/dist/agent/skills/create-deck/skill.md +0 -89
  938. package/dist/agent/skills/create-deck/slide-selection.md +0 -115
  939. package/dist/agent/skills/create-deck/slide-types.md +0 -638
  940. package/dist/agent/skills/create-document/skill.md +0 -229
  941. package/dist/agent/skills/enrich-entities.md +0 -136
  942. package/dist/agent/skills/obsidian-source-setup.md +0 -246
  943. package/dist/agent/skills/skill-loader.d.ts +0 -48
  944. package/dist/agent/skills/skill-loader.js +0 -166
  945. package/dist/agent/skills/skill-loader.js.map +0 -1
  946. package/dist/agent/skills/sync-configuration.md +0 -119
  947. package/dist/agent/skills/sync-setup.md +0 -82
  948. package/dist/agent/tools/message-tools.d.ts +0 -42
  949. package/dist/agent/tools/message-tools.js +0 -96
  950. package/dist/agent/tools/message-tools.js.map +0 -1
  951. package/dist/agent/tools/sync-tools.d.ts +0 -35
  952. package/dist/agent/tools/sync-tools.js +0 -992
  953. package/dist/agent/tools/sync-tools.js.map +0 -1
  954. package/dist/auth/github.d.ts +0 -56
  955. package/dist/auth/github.js +0 -169
  956. package/dist/auth/github.js.map +0 -1
  957. package/dist/cli/commands/access.d.ts +0 -11
  958. package/dist/cli/commands/access.js +0 -156
  959. package/dist/cli/commands/access.js.map +0 -1
  960. package/dist/cli/commands/app.d.ts +0 -7
  961. package/dist/cli/commands/app.js +0 -268
  962. package/dist/cli/commands/app.js.map +0 -1
  963. package/dist/cli/commands/auth.d.ts +0 -10
  964. package/dist/cli/commands/auth.js +0 -79
  965. package/dist/cli/commands/auth.js.map +0 -1
  966. package/dist/cli/commands/clear.d.ts +0 -5
  967. package/dist/cli/commands/clear.js +0 -36
  968. package/dist/cli/commands/clear.js.map +0 -1
  969. package/dist/cli/commands/collection.d.ts +0 -10
  970. package/dist/cli/commands/collection.js +0 -185
  971. package/dist/cli/commands/collection.js.map +0 -1
  972. package/dist/cli/commands/enrich.d.ts +0 -11
  973. package/dist/cli/commands/enrich.js +0 -135
  974. package/dist/cli/commands/enrich.js.map +0 -1
  975. package/dist/cli/commands/graphrag.d.ts +0 -12
  976. package/dist/cli/commands/graphrag.js +0 -122
  977. package/dist/cli/commands/graphrag.js.map +0 -1
  978. package/dist/cli/commands/join.d.ts +0 -9
  979. package/dist/cli/commands/join.js +0 -255
  980. package/dist/cli/commands/join.js.map +0 -1
  981. package/dist/cli/commands/members.d.ts +0 -11
  982. package/dist/cli/commands/members.js +0 -230
  983. package/dist/cli/commands/members.js.map +0 -1
  984. package/dist/cli/commands/org.d.ts +0 -10
  985. package/dist/cli/commands/org.js +0 -132
  986. package/dist/cli/commands/org.js.map +0 -1
  987. package/dist/cli/commands/provision.d.ts +0 -8
  988. package/dist/cli/commands/provision.js +0 -116
  989. package/dist/cli/commands/provision.js.map +0 -1
  990. package/dist/cli/commands/resolve.d.ts +0 -8
  991. package/dist/cli/commands/resolve.js +0 -85
  992. package/dist/cli/commands/resolve.js.map +0 -1
  993. package/dist/cli/commands/review.d.ts +0 -19
  994. package/dist/cli/commands/review.js +0 -128
  995. package/dist/cli/commands/review.js.map +0 -1
  996. package/dist/cli/commands/source.d.ts +0 -16
  997. package/dist/cli/commands/source.js +0 -159
  998. package/dist/cli/commands/source.js.map +0 -1
  999. package/dist/cli/commands/start.d.ts +0 -7
  1000. package/dist/cli/commands/start.js +0 -576
  1001. package/dist/cli/commands/start.js.map +0 -1
  1002. package/dist/cli/commands/sync-collection.d.ts +0 -14
  1003. package/dist/cli/commands/sync-collection.js +0 -355
  1004. package/dist/cli/commands/sync-collection.js.map +0 -1
  1005. package/dist/cli/commands/sync-entities.d.ts +0 -13
  1006. package/dist/cli/commands/sync-entities.js +0 -242
  1007. package/dist/cli/commands/sync-entities.js.map +0 -1
  1008. package/dist/cli/commands/team.d.ts +0 -12
  1009. package/dist/cli/commands/team.js +0 -185
  1010. package/dist/cli/commands/team.js.map +0 -1
  1011. package/dist/cli/commands/update.d.ts +0 -8
  1012. package/dist/cli/commands/update.js +0 -155
  1013. package/dist/cli/commands/update.js.map +0 -1
  1014. package/dist/cli/commands/user.d.ts +0 -7
  1015. package/dist/cli/commands/user.js +0 -169
  1016. package/dist/cli/commands/user.js.map +0 -1
  1017. package/dist/cli/scaffolding.d.ts +0 -12
  1018. package/dist/cli/scaffolding.js +0 -397
  1019. package/dist/cli/scaffolding.js.map +0 -1
  1020. package/dist/cli/sync-review-interactive.d.ts +0 -31
  1021. package/dist/cli/sync-review-interactive.js +0 -393
  1022. package/dist/cli/sync-review-interactive.js.map +0 -1
  1023. package/dist/core/feature-flags.d.ts +0 -17
  1024. package/dist/core/feature-flags.js +0 -15
  1025. package/dist/core/feature-flags.js.map +0 -1
  1026. package/dist/core/features.d.ts +0 -16
  1027. package/dist/core/features.js +0 -48
  1028. package/dist/core/features.js.map +0 -1
  1029. package/dist/core/launch-entity-types.d.ts +0 -23
  1030. package/dist/core/launch-entity-types.js +0 -48
  1031. package/dist/core/launch-entity-types.js.map +0 -1
  1032. package/dist/core/migration-runner.d.ts +0 -42
  1033. package/dist/core/migration-runner.js +0 -232
  1034. package/dist/core/migration-runner.js.map +0 -1
  1035. package/dist/core/migration-types.d.ts +0 -101
  1036. package/dist/core/migration-types.js +0 -21
  1037. package/dist/core/migration-types.js.map +0 -1
  1038. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +0 -2
  1039. package/dist/core/migrations/20260219-formalize-memory-location.js +0 -35
  1040. package/dist/core/migrations/20260219-formalize-memory-location.js.map +0 -1
  1041. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +0 -12
  1042. package/dist/core/migrations/20260220-add-workspace-metadata.js +0 -65
  1043. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +0 -1
  1044. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +0 -11
  1045. package/dist/core/migrations/20260220-add-workspace-readme.js +0 -82
  1046. package/dist/core/migrations/20260220-add-workspace-readme.js.map +0 -1
  1047. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +0 -9
  1048. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +0 -64
  1049. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +0 -1
  1050. package/dist/core/migrations/index.d.ts +0 -11
  1051. package/dist/core/migrations/index.js +0 -23
  1052. package/dist/core/migrations/index.js.map +0 -1
  1053. package/dist/integrations/asana.d.ts +0 -26
  1054. package/dist/integrations/asana.js +0 -78
  1055. package/dist/integrations/asana.js.map +0 -1
  1056. package/dist/integrations/figma-local.d.ts +0 -16
  1057. package/dist/integrations/figma-local.js +0 -10
  1058. package/dist/integrations/figma-local.js.map +0 -1
  1059. package/dist/integrations/figma.d.ts +0 -17
  1060. package/dist/integrations/figma.js +0 -17
  1061. package/dist/integrations/figma.js.map +0 -1
  1062. package/dist/integrations/granola.d.ts +0 -24
  1063. package/dist/integrations/granola.js +0 -60
  1064. package/dist/integrations/granola.js.map +0 -1
  1065. package/dist/integrations/linear.d.ts +0 -14
  1066. package/dist/integrations/linear.js +0 -80
  1067. package/dist/integrations/linear.js.map +0 -1
  1068. package/dist/integrations/paper-local.d.ts +0 -14
  1069. package/dist/integrations/paper-local.js +0 -10
  1070. package/dist/integrations/paper-local.js.map +0 -1
  1071. package/dist/integrations/paper.d.ts +0 -2
  1072. package/dist/integrations/paper.js +0 -10
  1073. package/dist/integrations/paper.js.map +0 -1
  1074. package/dist/integrations/pipedrive.d.ts +0 -26
  1075. package/dist/integrations/pipedrive.js +0 -97
  1076. package/dist/integrations/pipedrive.js.map +0 -1
  1077. package/dist/integrations/registry.d.ts +0 -8
  1078. package/dist/integrations/registry.js +0 -7
  1079. package/dist/integrations/registry.js.map +0 -1
  1080. package/dist/integrations/types.d.ts +0 -43
  1081. package/dist/integrations/types.js +0 -5
  1082. package/dist/integrations/types.js.map +0 -1
  1083. package/dist/lib/lib/utils.d.ts +0 -2
  1084. package/dist/lib/lib/utils.js +0 -6
  1085. package/dist/lib/lib/utils.js.map +0 -1
  1086. package/dist/mcp/connectors/asana.d.ts +0 -2
  1087. package/dist/mcp/connectors/asana.js +0 -20
  1088. package/dist/mcp/connectors/asana.js.map +0 -1
  1089. package/dist/mcp/connectors/definitions.d.ts +0 -45
  1090. package/dist/mcp/connectors/definitions.js +0 -32
  1091. package/dist/mcp/connectors/definitions.js.map +0 -1
  1092. package/dist/mcp/connectors/figma.d.ts +0 -5
  1093. package/dist/mcp/connectors/figma.js +0 -21
  1094. package/dist/mcp/connectors/figma.js.map +0 -1
  1095. package/dist/mcp/connectors/gdrive.d.ts +0 -2
  1096. package/dist/mcp/connectors/gdrive.js +0 -20
  1097. package/dist/mcp/connectors/gdrive.js.map +0 -1
  1098. package/dist/mcp/connectors/granola.d.ts +0 -2
  1099. package/dist/mcp/connectors/granola.js +0 -12
  1100. package/dist/mcp/connectors/granola.js.map +0 -1
  1101. package/dist/mcp/connectors/linear.d.ts +0 -2
  1102. package/dist/mcp/connectors/linear.js +0 -19
  1103. package/dist/mcp/connectors/linear.js.map +0 -1
  1104. package/dist/mcp/connectors/obsidian.d.ts +0 -2
  1105. package/dist/mcp/connectors/obsidian.js +0 -19
  1106. package/dist/mcp/connectors/obsidian.js.map +0 -1
  1107. package/dist/mcp/connectors/pipedrive.d.ts +0 -2
  1108. package/dist/mcp/connectors/pipedrive.js +0 -20
  1109. package/dist/mcp/connectors/pipedrive.js.map +0 -1
  1110. package/dist/mcp/connectors/slack.d.ts +0 -2
  1111. package/dist/mcp/connectors/slack.js +0 -21
  1112. package/dist/mcp/connectors/slack.js.map +0 -1
  1113. package/dist/mcp/server-oauth-provider.d.ts +0 -56
  1114. package/dist/mcp/server-oauth-provider.js +0 -142
  1115. package/dist/mcp/server-oauth-provider.js.map +0 -1
  1116. package/dist/renderers/documents/branding.d.ts +0 -2
  1117. package/dist/renderers/documents/branding.js +0 -42
  1118. package/dist/renderers/documents/branding.js.map +0 -1
  1119. package/dist/renderers/documents/entity-types.json +0 -14
  1120. package/dist/renderers/documents/parser/frontmatter.d.ts +0 -5
  1121. package/dist/renderers/documents/parser/frontmatter.js +0 -90
  1122. package/dist/renderers/documents/parser/frontmatter.js.map +0 -1
  1123. package/dist/renderers/documents/parser/index.d.ts +0 -5
  1124. package/dist/renderers/documents/parser/index.js +0 -142
  1125. package/dist/renderers/documents/parser/index.js.map +0 -1
  1126. package/dist/renderers/documents/parser/sections.d.ts +0 -18
  1127. package/dist/renderers/documents/parser/sections.js +0 -131
  1128. package/dist/renderers/documents/parser/sections.js.map +0 -1
  1129. package/dist/renderers/documents/pdf/generator.d.ts +0 -13
  1130. package/dist/renderers/documents/pdf/generator.js +0 -79
  1131. package/dist/renderers/documents/pdf/generator.js.map +0 -1
  1132. package/dist/renderers/documents/plugin.d.ts +0 -2
  1133. package/dist/renderers/documents/plugin.js +0 -63
  1134. package/dist/renderers/documents/plugin.js.map +0 -1
  1135. package/dist/renderers/documents/public/branding/logo.svg +0 -3
  1136. package/dist/renderers/documents/public/editor/chrome.css +0 -461
  1137. package/dist/renderers/documents/public/editor/chrome.js +0 -524
  1138. package/dist/renderers/documents/public/editor/editor.css +0 -751
  1139. package/dist/renderers/documents/public/editor/editor.html +0 -140
  1140. package/dist/renderers/documents/public/editor/editor.js +0 -953
  1141. package/dist/renderers/documents/public/fonts/fonts.css +0 -145
  1142. package/dist/renderers/documents/public/viewer/viewer.css +0 -1
  1143. package/dist/renderers/documents/public/viewer/viewer.js +0 -4
  1144. package/dist/renderers/documents/renderer/back.d.ts +0 -8
  1145. package/dist/renderers/documents/renderer/back.js +0 -28
  1146. package/dist/renderers/documents/renderer/back.js.map +0 -1
  1147. package/dist/renderers/documents/renderer/content.d.ts +0 -7
  1148. package/dist/renderers/documents/renderer/content.js +0 -25
  1149. package/dist/renderers/documents/renderer/content.js.map +0 -1
  1150. package/dist/renderers/documents/renderer/cover.d.ts +0 -15
  1151. package/dist/renderers/documents/renderer/cover.js +0 -43
  1152. package/dist/renderers/documents/renderer/cover.js.map +0 -1
  1153. package/dist/renderers/documents/renderer/helpers.d.ts +0 -1
  1154. package/dist/renderers/documents/renderer/helpers.js +0 -11
  1155. package/dist/renderers/documents/renderer/helpers.js.map +0 -1
  1156. package/dist/renderers/documents/renderer/index.d.ts +0 -32
  1157. package/dist/renderers/documents/renderer/index.js +0 -80
  1158. package/dist/renderers/documents/renderer/index.js.map +0 -1
  1159. package/dist/renderers/documents/renderer/styles.d.ts +0 -16
  1160. package/dist/renderers/documents/renderer/styles.js +0 -546
  1161. package/dist/renderers/documents/renderer/styles.js.map +0 -1
  1162. package/dist/renderers/documents/routes/api.d.ts +0 -2
  1163. package/dist/renderers/documents/routes/api.js +0 -587
  1164. package/dist/renderers/documents/routes/api.js.map +0 -1
  1165. package/dist/renderers/documents/routes/editor.d.ts +0 -2
  1166. package/dist/renderers/documents/routes/editor.js +0 -31
  1167. package/dist/renderers/documents/routes/editor.js.map +0 -1
  1168. package/dist/renderers/documents/routes/viewer.d.ts +0 -2
  1169. package/dist/renderers/documents/routes/viewer.js +0 -67
  1170. package/dist/renderers/documents/routes/viewer.js.map +0 -1
  1171. package/dist/renderers/documents/types.d.ts +0 -61
  1172. package/dist/renderers/documents/types.js +0 -2
  1173. package/dist/renderers/documents/types.js.map +0 -1
  1174. package/dist/renderers/index.d.ts +0 -24
  1175. package/dist/renderers/index.js +0 -66
  1176. package/dist/renderers/index.js.map +0 -1
  1177. package/dist/renderers/slides/design-system/tokens.d.ts +0 -108
  1178. package/dist/renderers/slides/design-system/tokens.js +0 -44
  1179. package/dist/renderers/slides/design-system/tokens.js.map +0 -1
  1180. package/dist/renderers/slides/entity-types.json +0 -14
  1181. package/dist/renderers/slides/parser/comment-parser.d.ts +0 -10
  1182. package/dist/renderers/slides/parser/comment-parser.js +0 -89
  1183. package/dist/renderers/slides/parser/comment-parser.js.map +0 -1
  1184. package/dist/renderers/slides/parser/frontmatter.d.ts +0 -10
  1185. package/dist/renderers/slides/parser/frontmatter.js +0 -93
  1186. package/dist/renderers/slides/parser/frontmatter.js.map +0 -1
  1187. package/dist/renderers/slides/parser/index.d.ts +0 -7
  1188. package/dist/renderers/slides/parser/index.js +0 -569
  1189. package/dist/renderers/slides/parser/index.js.map +0 -1
  1190. package/dist/renderers/slides/parser/slide-splitter.d.ts +0 -6
  1191. package/dist/renderers/slides/parser/slide-splitter.js +0 -54
  1192. package/dist/renderers/slides/parser/slide-splitter.js.map +0 -1
  1193. package/dist/renderers/slides/parser/type-detector.d.ts +0 -6
  1194. package/dist/renderers/slides/parser/type-detector.js +0 -70
  1195. package/dist/renderers/slides/parser/type-detector.js.map +0 -1
  1196. package/dist/renderers/slides/pdf/generator.d.ts +0 -11
  1197. package/dist/renderers/slides/pdf/generator.js +0 -105
  1198. package/dist/renderers/slides/pdf/generator.js.map +0 -1
  1199. package/dist/renderers/slides/plugin.d.ts +0 -2
  1200. package/dist/renderers/slides/plugin.js +0 -70
  1201. package/dist/renderers/slides/plugin.js.map +0 -1
  1202. package/dist/renderers/slides/public/editor/.gitkeep +0 -0
  1203. package/dist/renderers/slides/public/editor/chrome.css +0 -461
  1204. package/dist/renderers/slides/public/editor/chrome.js +0 -519
  1205. package/dist/renderers/slides/public/editor/editor.css +0 -896
  1206. package/dist/renderers/slides/public/editor/editor.html +0 -131
  1207. package/dist/renderers/slides/public/editor/editor.js +0 -1038
  1208. package/dist/renderers/slides/public/fonts/fonts.css +0 -145
  1209. package/dist/renderers/slides/public/viewer/.gitkeep +0 -0
  1210. package/dist/renderers/slides/public/viewer/chrome.css +0 -62
  1211. package/dist/renderers/slides/public/viewer/transitions.css +0 -1
  1212. package/dist/renderers/slides/public/viewer/viewer.css +0 -2145
  1213. package/dist/renderers/slides/public/viewer/viewer.js +0 -303
  1214. package/dist/renderers/slides/renderer/chrome/browser-frame.d.ts +0 -5
  1215. package/dist/renderers/slides/renderer/chrome/browser-frame.js +0 -22
  1216. package/dist/renderers/slides/renderer/chrome/browser-frame.js.map +0 -1
  1217. package/dist/renderers/slides/renderer/chrome/mobile-frame.d.ts +0 -6
  1218. package/dist/renderers/slides/renderer/chrome/mobile-frame.js +0 -18
  1219. package/dist/renderers/slides/renderer/chrome/mobile-frame.js.map +0 -1
  1220. package/dist/renderers/slides/renderer/helpers.d.ts +0 -13
  1221. package/dist/renderers/slides/renderer/helpers.js +0 -33
  1222. package/dist/renderers/slides/renderer/helpers.js.map +0 -1
  1223. package/dist/renderers/slides/renderer/index.d.ts +0 -16
  1224. package/dist/renderers/slides/renderer/index.js +0 -160
  1225. package/dist/renderers/slides/renderer/index.js.map +0 -1
  1226. package/dist/renderers/slides/renderer/layouts/agenda.d.ts +0 -2
  1227. package/dist/renderers/slides/renderer/layouts/agenda.js +0 -18
  1228. package/dist/renderers/slides/renderer/layouts/agenda.js.map +0 -1
  1229. package/dist/renderers/slides/renderer/layouts/blank.d.ts +0 -2
  1230. package/dist/renderers/slides/renderer/layouts/blank.js +0 -4
  1231. package/dist/renderers/slides/renderer/layouts/blank.js.map +0 -1
  1232. package/dist/renderers/slides/renderer/layouts/columns.d.ts +0 -2
  1233. package/dist/renderers/slides/renderer/layouts/columns.js +0 -32
  1234. package/dist/renderers/slides/renderer/layouts/columns.js.map +0 -1
  1235. package/dist/renderers/slides/renderer/layouts/cover.d.ts +0 -2
  1236. package/dist/renderers/slides/renderer/layouts/cover.js +0 -18
  1237. package/dist/renderers/slides/renderer/layouts/cover.js.map +0 -1
  1238. package/dist/renderers/slides/renderer/layouts/diagram-concentric.d.ts +0 -2
  1239. package/dist/renderers/slides/renderer/layouts/diagram-concentric.js +0 -120
  1240. package/dist/renderers/slides/renderer/layouts/diagram-concentric.js.map +0 -1
  1241. package/dist/renderers/slides/renderer/layouts/diagram-matrix.d.ts +0 -2
  1242. package/dist/renderers/slides/renderer/layouts/diagram-matrix.js +0 -158
  1243. package/dist/renderers/slides/renderer/layouts/diagram-matrix.js.map +0 -1
  1244. package/dist/renderers/slides/renderer/layouts/diagram-pyramid.d.ts +0 -2
  1245. package/dist/renderers/slides/renderer/layouts/diagram-pyramid.js +0 -86
  1246. package/dist/renderers/slides/renderer/layouts/diagram-pyramid.js.map +0 -1
  1247. package/dist/renderers/slides/renderer/layouts/diagram-sitemap.d.ts +0 -2
  1248. package/dist/renderers/slides/renderer/layouts/diagram-sitemap.js +0 -146
  1249. package/dist/renderers/slides/renderer/layouts/diagram-sitemap.js.map +0 -1
  1250. package/dist/renderers/slides/renderer/layouts/diagram-venn.d.ts +0 -2
  1251. package/dist/renderers/slides/renderer/layouts/diagram-venn.js +0 -100
  1252. package/dist/renderers/slides/renderer/layouts/diagram-venn.js.map +0 -1
  1253. package/dist/renderers/slides/renderer/layouts/diagram.d.ts +0 -2
  1254. package/dist/renderers/slides/renderer/layouts/diagram.js +0 -21
  1255. package/dist/renderers/slides/renderer/layouts/diagram.js.map +0 -1
  1256. package/dist/renderers/slides/renderer/layouts/divider.d.ts +0 -2
  1257. package/dist/renderers/slides/renderer/layouts/divider.js +0 -4
  1258. package/dist/renderers/slides/renderer/layouts/divider.js.map +0 -1
  1259. package/dist/renderers/slides/renderer/layouts/end.d.ts +0 -2
  1260. package/dist/renderers/slides/renderer/layouts/end.js +0 -8
  1261. package/dist/renderers/slides/renderer/layouts/end.js.map +0 -1
  1262. package/dist/renderers/slides/renderer/layouts/framework.d.ts +0 -2
  1263. package/dist/renderers/slides/renderer/layouts/framework.js +0 -47
  1264. package/dist/renderers/slides/renderer/layouts/framework.js.map +0 -1
  1265. package/dist/renderers/slides/renderer/layouts/image-browser-2up.d.ts +0 -2
  1266. package/dist/renderers/slides/renderer/layouts/image-browser-2up.js +0 -38
  1267. package/dist/renderers/slides/renderer/layouts/image-browser-2up.js.map +0 -1
  1268. package/dist/renderers/slides/renderer/layouts/image-browser-6up.d.ts +0 -2
  1269. package/dist/renderers/slides/renderer/layouts/image-browser-6up.js +0 -30
  1270. package/dist/renderers/slides/renderer/layouts/image-browser-6up.js.map +0 -1
  1271. package/dist/renderers/slides/renderer/layouts/image-browser.d.ts +0 -2
  1272. package/dist/renderers/slides/renderer/layouts/image-browser.js +0 -18
  1273. package/dist/renderers/slides/renderer/layouts/image-browser.js.map +0 -1
  1274. package/dist/renderers/slides/renderer/layouts/image-bullets.d.ts +0 -2
  1275. package/dist/renderers/slides/renderer/layouts/image-bullets.js +0 -26
  1276. package/dist/renderers/slides/renderer/layouts/image-bullets.js.map +0 -1
  1277. package/dist/renderers/slides/renderer/layouts/image-device-pair.d.ts +0 -2
  1278. package/dist/renderers/slides/renderer/layouts/image-device-pair.js +0 -34
  1279. package/dist/renderers/slides/renderer/layouts/image-device-pair.js.map +0 -1
  1280. package/dist/renderers/slides/renderer/layouts/image-full.d.ts +0 -2
  1281. package/dist/renderers/slides/renderer/layouts/image-full.js +0 -36
  1282. package/dist/renderers/slides/renderer/layouts/image-full.js.map +0 -1
  1283. package/dist/renderers/slides/renderer/layouts/image-grid-2x2.d.ts +0 -2
  1284. package/dist/renderers/slides/renderer/layouts/image-grid-2x2.js +0 -23
  1285. package/dist/renderers/slides/renderer/layouts/image-grid-2x2.js.map +0 -1
  1286. package/dist/renderers/slides/renderer/layouts/image-keywords.d.ts +0 -2
  1287. package/dist/renderers/slides/renderer/layouts/image-keywords.js +0 -31
  1288. package/dist/renderers/slides/renderer/layouts/image-keywords.js.map +0 -1
  1289. package/dist/renderers/slides/renderer/layouts/image-mobile-3up.d.ts +0 -2
  1290. package/dist/renderers/slides/renderer/layouts/image-mobile-3up.js +0 -22
  1291. package/dist/renderers/slides/renderer/layouts/image-mobile-3up.js.map +0 -1
  1292. package/dist/renderers/slides/renderer/layouts/image-mobile.d.ts +0 -2
  1293. package/dist/renderers/slides/renderer/layouts/image-mobile.js +0 -17
  1294. package/dist/renderers/slides/renderer/layouts/image-mobile.js.map +0 -1
  1295. package/dist/renderers/slides/renderer/layouts/image-split-right.d.ts +0 -2
  1296. package/dist/renderers/slides/renderer/layouts/image-split-right.js +0 -19
  1297. package/dist/renderers/slides/renderer/layouts/image-split-right.js.map +0 -1
  1298. package/dist/renderers/slides/renderer/layouts/image-split.d.ts +0 -2
  1299. package/dist/renderers/slides/renderer/layouts/image-split.js +0 -19
  1300. package/dist/renderers/slides/renderer/layouts/image-split.js.map +0 -1
  1301. package/dist/renderers/slides/renderer/layouts/introductions.d.ts +0 -2
  1302. package/dist/renderers/slides/renderer/layouts/introductions.js +0 -41
  1303. package/dist/renderers/slides/renderer/layouts/introductions.js.map +0 -1
  1304. package/dist/renderers/slides/renderer/layouts/moodboard.d.ts +0 -15
  1305. package/dist/renderers/slides/renderer/layouts/moodboard.js +0 -63
  1306. package/dist/renderers/slides/renderer/layouts/moodboard.js.map +0 -1
  1307. package/dist/renderers/slides/renderer/layouts/next-steps.d.ts +0 -2
  1308. package/dist/renderers/slides/renderer/layouts/next-steps.js +0 -13
  1309. package/dist/renderers/slides/renderer/layouts/next-steps.js.map +0 -1
  1310. package/dist/renderers/slides/renderer/layouts/pullquote.d.ts +0 -2
  1311. package/dist/renderers/slides/renderer/layouts/pullquote.js +0 -17
  1312. package/dist/renderers/slides/renderer/layouts/pullquote.js.map +0 -1
  1313. package/dist/renderers/slides/renderer/layouts/schedule.d.ts +0 -2
  1314. package/dist/renderers/slides/renderer/layouts/schedule.js +0 -58
  1315. package/dist/renderers/slides/renderer/layouts/schedule.js.map +0 -1
  1316. package/dist/renderers/slides/renderer/layouts/section.d.ts +0 -2
  1317. package/dist/renderers/slides/renderer/layouts/section.js +0 -18
  1318. package/dist/renderers/slides/renderer/layouts/section.js.map +0 -1
  1319. package/dist/renderers/slides/renderer/layouts/statement.d.ts +0 -2
  1320. package/dist/renderers/slides/renderer/layouts/statement.js +0 -13
  1321. package/dist/renderers/slides/renderer/layouts/statement.js.map +0 -1
  1322. package/dist/renderers/slides/renderer/layouts/stats.d.ts +0 -2
  1323. package/dist/renderers/slides/renderer/layouts/stats.js +0 -26
  1324. package/dist/renderers/slides/renderer/layouts/stats.js.map +0 -1
  1325. package/dist/renderers/slides/renderer/layouts/table.d.ts +0 -2
  1326. package/dist/renderers/slides/renderer/layouts/table.js +0 -23
  1327. package/dist/renderers/slides/renderer/layouts/table.js.map +0 -1
  1328. package/dist/renderers/slides/renderer/layouts/text-body.d.ts +0 -2
  1329. package/dist/renderers/slides/renderer/layouts/text-body.js +0 -14
  1330. package/dist/renderers/slides/renderer/layouts/text-body.js.map +0 -1
  1331. package/dist/renderers/slides/renderer/placeholder.d.ts +0 -5
  1332. package/dist/renderers/slides/renderer/placeholder.js +0 -12
  1333. package/dist/renderers/slides/renderer/placeholder.js.map +0 -1
  1334. package/dist/renderers/slides/routes/api.d.ts +0 -2
  1335. package/dist/renderers/slides/routes/api.js +0 -568
  1336. package/dist/renderers/slides/routes/api.js.map +0 -1
  1337. package/dist/renderers/slides/routes/editor.d.ts +0 -2
  1338. package/dist/renderers/slides/routes/editor.js +0 -32
  1339. package/dist/renderers/slides/routes/editor.js.map +0 -1
  1340. package/dist/renderers/slides/routes/viewer.d.ts +0 -2
  1341. package/dist/renderers/slides/routes/viewer.js +0 -67
  1342. package/dist/renderers/slides/routes/viewer.js.map +0 -1
  1343. package/dist/renderers/slides/types.d.ts +0 -111
  1344. package/dist/renderers/slides/types.js +0 -2
  1345. package/dist/renderers/slides/types.js.map +0 -1
  1346. package/dist/server/agents/agent-loader.d.ts +0 -16
  1347. package/dist/server/agents/agent-loader.js +0 -175
  1348. package/dist/server/agents/agent-loader.js.map +0 -1
  1349. package/dist/server/agents/agent-runner.d.ts +0 -33
  1350. package/dist/server/agents/agent-runner.js +0 -187
  1351. package/dist/server/agents/agent-runner.js.map +0 -1
  1352. package/dist/server/agents/agent-runtime.d.ts +0 -39
  1353. package/dist/server/agents/agent-runtime.js +0 -214
  1354. package/dist/server/agents/agent-runtime.js.map +0 -1
  1355. package/dist/server/agents/base-agent.d.ts +0 -30
  1356. package/dist/server/agents/base-agent.js +0 -88
  1357. package/dist/server/agents/base-agent.js.map +0 -1
  1358. package/dist/server/agents/executive-digest.d.ts +0 -16
  1359. package/dist/server/agents/executive-digest.js +0 -115
  1360. package/dist/server/agents/executive-digest.js.map +0 -1
  1361. package/dist/server/agents/graph-steward.d.ts +0 -16
  1362. package/dist/server/agents/graph-steward.js +0 -59
  1363. package/dist/server/agents/graph-steward.js.map +0 -1
  1364. package/dist/server/agents/meeting-followup.d.ts +0 -16
  1365. package/dist/server/agents/meeting-followup.js +0 -88
  1366. package/dist/server/agents/meeting-followup.js.map +0 -1
  1367. package/dist/server/agents/pipeline-monitor.d.ts +0 -15
  1368. package/dist/server/agents/pipeline-monitor.js +0 -86
  1369. package/dist/server/agents/pipeline-monitor.js.map +0 -1
  1370. package/dist/server/agents/types.d.ts +0 -81
  1371. package/dist/server/agents/types.js +0 -41
  1372. package/dist/server/agents/types.js.map +0 -1
  1373. package/dist/server/chrome/chrome.css +0 -701
  1374. package/dist/server/chrome/chrome.js +0 -374
  1375. package/dist/server/collab-authority.d.ts +0 -70
  1376. package/dist/server/collab-authority.js +0 -218
  1377. package/dist/server/collab-authority.js.map +0 -1
  1378. package/dist/server/collab.d.ts +0 -29
  1379. package/dist/server/collab.js +0 -195
  1380. package/dist/server/collab.js.map +0 -1
  1381. package/dist/server/commit-scheduler.d.ts +0 -39
  1382. package/dist/server/commit-scheduler.js +0 -113
  1383. package/dist/server/commit-scheduler.js.map +0 -1
  1384. package/dist/server/plugin-loader.d.ts +0 -53
  1385. package/dist/server/plugin-loader.js +0 -155
  1386. package/dist/server/plugin-loader.js.map +0 -1
  1387. package/dist/server/routes/agents-api.d.ts +0 -10
  1388. package/dist/server/routes/agents-api.js +0 -25
  1389. package/dist/server/routes/agents-api.js.map +0 -1
  1390. package/dist/server/routes/collab.d.ts +0 -6
  1391. package/dist/server/routes/collab.js +0 -10
  1392. package/dist/server/routes/collab.js.map +0 -1
  1393. package/dist/server/routes/features-api.d.ts +0 -10
  1394. package/dist/server/routes/features-api.js +0 -15
  1395. package/dist/server/routes/features-api.js.map +0 -1
  1396. package/dist/server/routes/git-api.d.ts +0 -9
  1397. package/dist/server/routes/git-api.js +0 -82
  1398. package/dist/server/routes/git-api.js.map +0 -1
  1399. package/dist/server/routes/meeting-ingest-api.d.ts +0 -14
  1400. package/dist/server/routes/meeting-ingest-api.js +0 -117
  1401. package/dist/server/routes/meeting-ingest-api.js.map +0 -1
  1402. package/dist/server/routes/messages-api.d.ts +0 -15
  1403. package/dist/server/routes/messages-api.js +0 -569
  1404. package/dist/server/routes/messages-api.js.map +0 -1
  1405. package/dist/server/routes/sync-api.d.ts +0 -26
  1406. package/dist/server/routes/sync-api.js +0 -848
  1407. package/dist/server/routes/sync-api.js.map +0 -1
  1408. package/dist/server/routes/view-public.d.ts +0 -10
  1409. package/dist/server/routes/view-public.js +0 -107
  1410. package/dist/server/routes/view-public.js.map +0 -1
  1411. package/dist/server/routes/webhook.d.ts +0 -14
  1412. package/dist/server/routes/webhook.js +0 -102
  1413. package/dist/server/routes/webhook.js.map +0 -1
  1414. package/dist/services/batch-processor.d.ts +0 -49
  1415. package/dist/services/batch-processor.js +0 -166
  1416. package/dist/services/batch-processor.js.map +0 -1
  1417. package/dist/services/briefing.d.ts +0 -26
  1418. package/dist/services/briefing.js +0 -206
  1419. package/dist/services/briefing.js.map +0 -1
  1420. package/dist/services/github-provisioner.d.ts +0 -36
  1421. package/dist/services/github-provisioner.js +0 -126
  1422. package/dist/services/github-provisioner.js.map +0 -1
  1423. package/dist/services/github-service.d.ts +0 -99
  1424. package/dist/services/github-service.js +0 -310
  1425. package/dist/services/github-service.js.map +0 -1
  1426. package/dist/services/heartbeat.d.ts +0 -35
  1427. package/dist/services/heartbeat.js +0 -236
  1428. package/dist/services/heartbeat.js.map +0 -1
  1429. package/dist/services/image-import-service.d.ts +0 -24
  1430. package/dist/services/image-import-service.js +0 -108
  1431. package/dist/services/image-import-service.js.map +0 -1
  1432. package/dist/services/insights.d.ts +0 -38
  1433. package/dist/services/insights.js +0 -269
  1434. package/dist/services/insights.js.map +0 -1
  1435. package/dist/services/meeting-processor.d.ts +0 -97
  1436. package/dist/services/meeting-processor.js +0 -382
  1437. package/dist/services/meeting-processor.js.map +0 -1
  1438. package/dist/services/message-service.d.ts +0 -117
  1439. package/dist/services/message-service.js +0 -414
  1440. package/dist/services/message-service.js.map +0 -1
  1441. package/dist/services/sync/collection-sync.d.ts +0 -60
  1442. package/dist/services/sync/collection-sync.js +0 -509
  1443. package/dist/services/sync/collection-sync.js.map +0 -1
  1444. package/dist/services/sync/commit.d.ts +0 -60
  1445. package/dist/services/sync/commit.js +0 -354
  1446. package/dist/services/sync/commit.js.map +0 -1
  1447. package/dist/services/sync/context-index.d.ts +0 -69
  1448. package/dist/services/sync/context-index.js +0 -280
  1449. package/dist/services/sync/context-index.js.map +0 -1
  1450. package/dist/services/sync/data-fetcher.d.ts +0 -31
  1451. package/dist/services/sync/data-fetcher.js +0 -12
  1452. package/dist/services/sync/data-fetcher.js.map +0 -1
  1453. package/dist/services/sync/derive.d.ts +0 -34
  1454. package/dist/services/sync/derive.js +0 -164
  1455. package/dist/services/sync/derive.js.map +0 -1
  1456. package/dist/services/sync/enrichment-state.d.ts +0 -31
  1457. package/dist/services/sync/enrichment-state.js +0 -63
  1458. package/dist/services/sync/enrichment-state.js.map +0 -1
  1459. package/dist/services/sync/enrichment.d.ts +0 -25
  1460. package/dist/services/sync/enrichment.js +0 -121
  1461. package/dist/services/sync/enrichment.js.map +0 -1
  1462. package/dist/services/sync/entity-refresh.d.ts +0 -30
  1463. package/dist/services/sync/entity-refresh.js +0 -275
  1464. package/dist/services/sync/entity-refresh.js.map +0 -1
  1465. package/dist/services/sync/frontmatter-extractor.d.ts +0 -40
  1466. package/dist/services/sync/frontmatter-extractor.js +0 -279
  1467. package/dist/services/sync/frontmatter-extractor.js.map +0 -1
  1468. package/dist/services/sync/graph-match-state.d.ts +0 -33
  1469. package/dist/services/sync/graph-match-state.js +0 -61
  1470. package/dist/services/sync/graph-match-state.js.map +0 -1
  1471. package/dist/services/sync/graph-match.d.ts +0 -53
  1472. package/dist/services/sync/graph-match.js +0 -316
  1473. package/dist/services/sync/graph-match.js.map +0 -1
  1474. package/dist/services/sync/graphrag-client.d.ts +0 -43
  1475. package/dist/services/sync/graphrag-client.js +0 -94
  1476. package/dist/services/sync/graphrag-client.js.map +0 -1
  1477. package/dist/services/sync/graphrag-config.d.ts +0 -16
  1478. package/dist/services/sync/graphrag-config.js +0 -39
  1479. package/dist/services/sync/graphrag-config.js.map +0 -1
  1480. package/dist/services/sync/graphrag-context.d.ts +0 -14
  1481. package/dist/services/sync/graphrag-context.js +0 -109
  1482. package/dist/services/sync/graphrag-context.js.map +0 -1
  1483. package/dist/services/sync/graphrag-indexer.d.ts +0 -30
  1484. package/dist/services/sync/graphrag-indexer.js +0 -358
  1485. package/dist/services/sync/graphrag-indexer.js.map +0 -1
  1486. package/dist/services/sync/llm.d.ts +0 -32
  1487. package/dist/services/sync/llm.js +0 -115
  1488. package/dist/services/sync/llm.js.map +0 -1
  1489. package/dist/services/sync/mcp-client.d.ts +0 -71
  1490. package/dist/services/sync/mcp-client.js +0 -299
  1491. package/dist/services/sync/mcp-client.js.map +0 -1
  1492. package/dist/services/sync/model-factory.d.ts +0 -13
  1493. package/dist/services/sync/model-factory.js +0 -38
  1494. package/dist/services/sync/model-factory.js.map +0 -1
  1495. package/dist/services/sync/name-quality.d.ts +0 -31
  1496. package/dist/services/sync/name-quality.js +0 -60
  1497. package/dist/services/sync/name-quality.js.map +0 -1
  1498. package/dist/services/sync/output-schemas.d.ts +0 -92
  1499. package/dist/services/sync/output-schemas.js +0 -43
  1500. package/dist/services/sync/output-schemas.js.map +0 -1
  1501. package/dist/services/sync/prompts.d.ts +0 -19
  1502. package/dist/services/sync/prompts.js +0 -128
  1503. package/dist/services/sync/prompts.js.map +0 -1
  1504. package/dist/services/sync/reconciler.d.ts +0 -48
  1505. package/dist/services/sync/reconciler.js +0 -294
  1506. package/dist/services/sync/reconciler.js.map +0 -1
  1507. package/dist/services/sync/rest-client.d.ts +0 -40
  1508. package/dist/services/sync/rest-client.js +0 -100
  1509. package/dist/services/sync/rest-client.js.map +0 -1
  1510. package/dist/services/sync/source-config.d.ts +0 -67
  1511. package/dist/services/sync/source-config.js +0 -304
  1512. package/dist/services/sync/source-config.js.map +0 -1
  1513. package/dist/services/sync/source-definitions/asana.d.ts +0 -14
  1514. package/dist/services/sync/source-definitions/asana.js +0 -42
  1515. package/dist/services/sync/source-definitions/asana.js.map +0 -1
  1516. package/dist/services/sync/source-definitions/definitions.d.ts +0 -8
  1517. package/dist/services/sync/source-definitions/definitions.js +0 -8
  1518. package/dist/services/sync/source-definitions/definitions.js.map +0 -1
  1519. package/dist/services/sync/source-definitions/gdrive.d.ts +0 -16
  1520. package/dist/services/sync/source-definitions/gdrive.js +0 -68
  1521. package/dist/services/sync/source-definitions/gdrive.js.map +0 -1
  1522. package/dist/services/sync/source-definitions/granola.d.ts +0 -2
  1523. package/dist/services/sync/source-definitions/granola.js +0 -21
  1524. package/dist/services/sync/source-definitions/granola.js.map +0 -1
  1525. package/dist/services/sync/source-definitions/linear.d.ts +0 -2
  1526. package/dist/services/sync/source-definitions/linear.js +0 -62
  1527. package/dist/services/sync/source-definitions/linear.js.map +0 -1
  1528. package/dist/services/sync/source-definitions/obsidian.d.ts +0 -2
  1529. package/dist/services/sync/source-definitions/obsidian.js +0 -55
  1530. package/dist/services/sync/source-definitions/obsidian.js.map +0 -1
  1531. package/dist/services/sync/source-definitions/pipedrive.d.ts +0 -2
  1532. package/dist/services/sync/source-definitions/pipedrive.js +0 -43
  1533. package/dist/services/sync/source-definitions/pipedrive.js.map +0 -1
  1534. package/dist/services/sync/staging.d.ts +0 -53
  1535. package/dist/services/sync/staging.js +0 -130
  1536. package/dist/services/sync/staging.js.map +0 -1
  1537. package/dist/services/sync/structured-extractor.d.ts +0 -57
  1538. package/dist/services/sync/structured-extractor.js +0 -584
  1539. package/dist/services/sync/structured-extractor.js.map +0 -1
  1540. package/dist/services/sync/sync-runner.d.ts +0 -32
  1541. package/dist/services/sync/sync-runner.js +0 -195
  1542. package/dist/services/sync/sync-runner.js.map +0 -1
  1543. package/dist/services/sync/sync-state.d.ts +0 -43
  1544. package/dist/services/sync/sync-state.js +0 -154
  1545. package/dist/services/sync/sync-state.js.map +0 -1
  1546. package/dist/services/sync/types.d.ts +0 -381
  1547. package/dist/services/sync/types.js +0 -8
  1548. package/dist/services/sync/types.js.map +0 -1
  1549. package/dist/services/sync/unstructured-extractor.d.ts +0 -27
  1550. package/dist/services/sync/unstructured-extractor.js +0 -185
  1551. package/dist/services/sync/unstructured-extractor.js.map +0 -1
  1552. package/dist/utils/merge-resolver.d.ts +0 -59
  1553. package/dist/utils/merge-resolver.js +0 -303
  1554. package/dist/utils/merge-resolver.js.map +0 -1
  1555. package/dist/utils/workspace-config.d.ts +0 -8
  1556. package/dist/utils/workspace-config.js +0 -22
  1557. package/dist/utils/workspace-config.js.map +0 -1
  1558. package/dist/web/_app/immutable/assets/0.B3eM5J6m.css +0 -1
  1559. package/dist/web/_app/immutable/assets/10.2jzI3cZY.css +0 -1
  1560. package/dist/web/_app/immutable/assets/11.BbBNo8jg.css +0 -1
  1561. package/dist/web/_app/immutable/assets/12.vV-8Nqud.css +0 -1
  1562. package/dist/web/_app/immutable/assets/2.CDsrnCq3.css +0 -1
  1563. package/dist/web/_app/immutable/assets/3.Ih7su2rl.css +0 -1
  1564. package/dist/web/_app/immutable/assets/4.CwXIQz3p.css +0 -1
  1565. package/dist/web/_app/immutable/assets/ChevronLeft.BwM9mwS4.css +0 -1
  1566. package/dist/web/_app/immutable/assets/GraphView.CRV5cekT.css +0 -1
  1567. package/dist/web/_app/immutable/assets/Toaster.rN8r_Hzv.css +0 -1
  1568. package/dist/web/_app/immutable/assets/ViewToolbar.CsWTe0yn.css +0 -1
  1569. package/dist/web/_app/immutable/assets/WorkspaceView.iWtzksrr.css +0 -1
  1570. package/dist/web/_app/immutable/chunks/0kuZ2gtb.js +0 -1
  1571. package/dist/web/_app/immutable/chunks/1Ea1UXwM.js +0 -2
  1572. package/dist/web/_app/immutable/chunks/284Zhbif.js +0 -1
  1573. package/dist/web/_app/immutable/chunks/7S2LGqoP.js +0 -2
  1574. package/dist/web/_app/immutable/chunks/7WZENMwt.js +0 -1
  1575. package/dist/web/_app/immutable/chunks/B0qHb2ee.js +0 -1
  1576. package/dist/web/_app/immutable/chunks/B45od9dM.js +0 -2
  1577. package/dist/web/_app/immutable/chunks/B4hXkypI.js +0 -1
  1578. package/dist/web/_app/immutable/chunks/BB_5th5W.js +0 -3383
  1579. package/dist/web/_app/immutable/chunks/BDvg8O5k.js +0 -5
  1580. package/dist/web/_app/immutable/chunks/BGiCmAMQ.js +0 -4
  1581. package/dist/web/_app/immutable/chunks/BHgT2Ede.js +0 -1
  1582. package/dist/web/_app/immutable/chunks/BQ1nK9ru.js +0 -1
  1583. package/dist/web/_app/immutable/chunks/BS0-13V2.js +0 -1
  1584. package/dist/web/_app/immutable/chunks/BSiC7hSS.js +0 -1
  1585. package/dist/web/_app/immutable/chunks/BkxW0BJZ.js +0 -1
  1586. package/dist/web/_app/immutable/chunks/Bp7FKkGt.js +0 -1
  1587. package/dist/web/_app/immutable/chunks/BrebtJNG.js +0 -18
  1588. package/dist/web/_app/immutable/chunks/Bz0ZjVQE.js +0 -2
  1589. package/dist/web/_app/immutable/chunks/C0LVZhvn.js +0 -1
  1590. package/dist/web/_app/immutable/chunks/C0Zx4tMe.js +0 -1
  1591. package/dist/web/_app/immutable/chunks/CHJcPZZK.js +0 -2
  1592. package/dist/web/_app/immutable/chunks/CRpK3grw.js +0 -2
  1593. package/dist/web/_app/immutable/chunks/CSVbGg_b.js +0 -5
  1594. package/dist/web/_app/immutable/chunks/CX_61fY8.js +0 -5
  1595. package/dist/web/_app/immutable/chunks/CYrVHOHA.js +0 -1
  1596. package/dist/web/_app/immutable/chunks/CdIKiXW6.js +0 -1
  1597. package/dist/web/_app/immutable/chunks/CqkleIqs.js +0 -1
  1598. package/dist/web/_app/immutable/chunks/D14M5KlG.js +0 -1
  1599. package/dist/web/_app/immutable/chunks/D71c9o7J.js +0 -2
  1600. package/dist/web/_app/immutable/chunks/DFYOFE3o.js +0 -1
  1601. package/dist/web/_app/immutable/chunks/DHJAqtPb.js +0 -1
  1602. package/dist/web/_app/immutable/chunks/DOqcDZIJ.js +0 -1
  1603. package/dist/web/_app/immutable/chunks/DQNtFKv6.js +0 -1
  1604. package/dist/web/_app/immutable/chunks/DZHWps9n.js +0 -1
  1605. package/dist/web/_app/immutable/chunks/DjLrjK2H.js +0 -1
  1606. package/dist/web/_app/immutable/chunks/DjvJRtva.js +0 -1
  1607. package/dist/web/_app/immutable/chunks/DnL9f0lc.js +0 -7
  1608. package/dist/web/_app/immutable/chunks/Dqq8gyOz.js +0 -1
  1609. package/dist/web/_app/immutable/chunks/DsnmJJEf.js +0 -1
  1610. package/dist/web/_app/immutable/chunks/DtG1tx2A.js +0 -1
  1611. package/dist/web/_app/immutable/chunks/Dxmmz-Kc.js +0 -1
  1612. package/dist/web/_app/immutable/chunks/DzVOENkg.js +0 -1
  1613. package/dist/web/_app/immutable/chunks/Ee5s0qSS.js +0 -5
  1614. package/dist/web/_app/immutable/chunks/KlRV1tKP.js +0 -1
  1615. package/dist/web/_app/immutable/chunks/L7dfS1-w.js +0 -1
  1616. package/dist/web/_app/immutable/chunks/MaQouOBH.js +0 -2
  1617. package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +0 -1
  1618. package/dist/web/_app/immutable/chunks/WSUKABI_.js +0 -1
  1619. package/dist/web/_app/immutable/chunks/_7ZfIgbM.js +0 -1
  1620. package/dist/web/_app/immutable/chunks/pNJmbo_B.js +0 -1
  1621. package/dist/web/_app/immutable/chunks/q4I7EnCp.js +0 -1
  1622. package/dist/web/_app/immutable/chunks/qE6Hm01v.js +0 -1
  1623. package/dist/web/_app/immutable/chunks/vxEtkL8z.js +0 -1
  1624. package/dist/web/_app/immutable/chunks/wDIGUaoU.js +0 -3
  1625. package/dist/web/_app/immutable/chunks/wZWzupWT.js +0 -1
  1626. package/dist/web/_app/immutable/entry/app.Dc6h105F.js +0 -2
  1627. package/dist/web/_app/immutable/entry/start.D4codAU1.js +0 -1
  1628. package/dist/web/_app/immutable/nodes/0.BM3j5xaK.js +0 -2
  1629. package/dist/web/_app/immutable/nodes/1.CZ2dT63B.js +0 -1
  1630. package/dist/web/_app/immutable/nodes/10.AJJtsnPU.js +0 -1
  1631. package/dist/web/_app/immutable/nodes/11.B7SEgGLF.js +0 -1
  1632. package/dist/web/_app/immutable/nodes/12.BcJKl4UQ.js +0 -1
  1633. package/dist/web/_app/immutable/nodes/2.jp27tyTq.js +0 -269
  1634. package/dist/web/_app/immutable/nodes/3.I7SH_06w.js +0 -5
  1635. package/dist/web/_app/immutable/nodes/4.Bdphc-UJ.js +0 -11
  1636. package/dist/web/_app/immutable/nodes/5.CXpOErnP.js +0 -1
  1637. package/dist/web/_app/immutable/nodes/6.1wcSxmEA.js +0 -1
  1638. package/dist/web/_app/immutable/nodes/7.D0b7WYTp.js +0 -1
  1639. package/dist/web/_app/immutable/nodes/8.D0Gxvy3F.js +0 -1
  1640. package/dist/web/_app/immutable/nodes/9.B5Nr92OR.js +0 -1
@@ -4,50 +4,320 @@
4
4
  * POST /api/repos/:repo/entities/:type/:id/assets — multipart image upload
5
5
  * GET /api/assets/* — serve local assets
6
6
  */
7
- import { SINGULAR_TO_PLURAL } from '../../core/validation.js';
8
- import { existsSync, createReadStream, readFileSync, statSync } from 'fs';
7
+ import { reqGitUser } from './graph-api-access.js';
8
+ import * as access from '../../services/access-control.js';
9
+ import { listRepoAssets, listWorkspaceAssets } from '../../services/asset-listing.js';
10
+ import { createEntityFromAsset } from '../../services/asset-import-service.js';
11
+ import { computeAssetDeleteImpact } from '../../services/asset-delete-impact.js';
12
+ import { computeAssetMoveImpact } from '../../services/asset-move-impact.js';
13
+ import { computeAssetReferenceIndex } from '../../services/asset-reference-index.js';
14
+ import { assetDeleteDenialByAssetId } from '../../services/asset-delete-authz.js';
15
+ import { resolveWorkspaceAssetsRepo } from '../../services/workspace-assets-folder.js';
16
+ import { Workspace } from '../../core/workspace.js';
17
+ import { existsSync, createReadStream, statSync } from 'fs';
9
18
  import { join, extname } from 'path';
10
- /**
11
- * Read the `name:` field from a markdown file's YAML frontmatter without a
12
- * full YAML parse. Returns null if the file can't be read or has no name.
13
- * Used by the asset manager to label assets by entity name without paying
14
- * the cost of a full markdownService.parseFile() per entity.
15
- */
16
- function extractEntityName(mdPath) {
17
- try {
18
- const raw = readFileSync(mdPath, 'utf-8');
19
- // Frontmatter is always at the top; don't read past ~2KB.
20
- const head = raw.slice(0, 2048);
21
- if (!head.startsWith('---'))
22
- return null;
23
- const end = head.indexOf('\n---', 3);
24
- const block = end === -1 ? head : head.slice(0, end);
25
- // Match `name: value` or `name: "value"` or `name: 'value'`.
26
- const match = block.match(/^name:\s*(?:'([^']*)'|"([^"]*)"|(.+?))\s*$/m);
27
- if (!match)
28
- return null;
29
- return (match[1] ?? match[2] ?? match[3]).trim() || null;
30
- }
31
- catch {
32
- return null;
33
- }
19
+ import { artifactAssetKey } from '../../services/artifact-asset-token.js';
20
+ import { mintArtifactAssetTokenForText } from '../artifact-asset-mint.js';
21
+ import { encodeAssetFilename } from '../../core/artifact-asset-urls.js';
22
+ /** Max bytes proxied same-origin through the artifact-asset token path.
23
+ * `downloadAssetById` buffers, so this guard (checked BEFORE download against
24
+ * the index size) bounds memory. Images well under this; refuse unknown size. */
25
+ const ARTIFACT_PROXY_MAX_BYTES = 25 * 1024 * 1024;
26
+ /** Extensions the artifact-asset token proxy will serve — images + fonts only.
27
+ * An artifact embeds these; a same-repo doc/dataset/binary referenced in text
28
+ * must NOT become a 12h bearer URL. */
29
+ const PROXYABLE_ASSET_EXTS = new Set([
30
+ '.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.ico', '.avif',
31
+ '.woff', '.woff2', '.ttf', '.otf',
32
+ ]);
33
+ /** Whether the same-origin proxy transport serves this file type (images +
34
+ * fonts the subresources a CSP-pinned sandboxed iframe loads). The share
35
+ * asset route uses this to pick proxy vs the default serve for other types
36
+ * (e.g. a PDF download link on a shared doc keeps the cached R2 302). */
37
+ export function isProxyableAssetFilename(filename) {
38
+ return PROXYABLE_ASSET_EXTS.has(extname(filename).toLowerCase());
34
39
  }
35
40
  const MIME_TYPES = {
36
41
  '.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',
37
42
  '.gif': 'image/gif', '.webp': 'image/webp', '.svg': 'image/svg+xml',
38
43
  '.ico': 'image/x-icon', '.avif': 'image/avif',
44
+ '.woff': 'font/woff', '.woff2': 'font/woff2',
45
+ '.ttf': 'font/ttf', '.otf': 'font/otf',
39
46
  };
40
- function hasRepoAccess(req, repoName, authService) {
47
+ function isFontExtension(filename) {
48
+ return ['.woff', '.woff2', '.ttf', '.otf'].includes(extname(filename).toLowerCase());
49
+ }
50
+ function addFontResourceHeaders(reply, filename) {
51
+ if (!isFontExtension(filename))
52
+ return;
53
+ reply.header('Access-Control-Allow-Origin', '*');
54
+ reply.header('Cross-Origin-Resource-Policy', 'cross-origin');
55
+ }
56
+ function hasRepoAccess(req, repoName, workspaceManager, authService) {
41
57
  const user = req.user;
42
- if (!user)
43
- return true; // API key / open mode
44
- return authService.getUserFolders(user.id).includes(repoName);
58
+ return access.hasRepoAccess(user, repoName, workspaceManager, authService);
45
59
  }
46
- export async function registerAssetApiRoutes(fastify, workspaceManager, authService) {
60
+ /**
61
+ * Serve an immutable-key asset's bytes once authorization has already been
62
+ * decided by the caller. This is the shared serving entry behind BOTH the
63
+ * authed `/api/assets/:assetId/:filename` route (authz = hasRepoAccess) and the
64
+ * public `/api/share/:token/asset/...` route (authz = valid token + repo scope).
65
+ *
66
+ * It does serving ONLY — R2 302-redirect vs local stream, path-segment
67
+ * hardening, and cache headers. The index lookup, filename match, and the
68
+ * access decision stay in each route so neither surface can drift into serving
69
+ * a file the other wouldn't authorize.
70
+ *
71
+ * Mechanically this is a THIN WRAPPER over the generic `serveBackendObject`
72
+ * primitive (the same primitive that backs conversation-scratch images), so
73
+ * both surfaces share one serving codepath. Two asset-specific concerns stay
74
+ * here as pre-steps rather than leaking into the generic primitive:
75
+ * 1. The R2 FONT branch — fonts are proxied through the app origin (not 302'd)
76
+ * with cross-origin CORS headers, and HEAD is answered from the indexed
77
+ * size WITHOUT downloading the bytes. This is unique to the catalog.
78
+ * 2. The catalog's stricter local segment hardening (rejects a `.`-prefixed
79
+ * filename, `/` or `\` in either segment), preserved verbatim.
80
+ *
81
+ * The owning `repo` must be resolved by the caller (from the asset index) so the
82
+ * correct graph/backend is selected. Always fail-closed with 404 — never leak
83
+ * existence.
84
+ */
85
+ export async function serveIndexedAsset(workspaceManager, reply, opts) {
86
+ const { assetId, filename, repo, isHead, size } = opts;
87
+ let graph;
88
+ try {
89
+ graph = workspaceManager.getGraph(repo);
90
+ }
91
+ catch {
92
+ return reply.status(404).send({ error: 'Asset not found' });
93
+ }
94
+ const storage = graph.getAssetStorage();
95
+ // Artifact-asset token path: uniform same-origin serve for BOTH backends,
96
+ // with private/no-cache + a strong (content-immutable) ETag so revocation is
97
+ // enforced on every revalidation while a 304 avoids re-download. Restricted
98
+ // to images + fonts (no Range/video this pass).
99
+ if (opts.proxyR2) {
100
+ const ext = extname(filename).toLowerCase();
101
+ // Token proxy is restricted to images + fonts (the only types an artifact
102
+ // legitimately embeds). Refuse anything else so a same-repo doc/dataset/etc.
103
+ // referenced in artifact text can't be turned into a bearer URL.
104
+ if (!PROXYABLE_ASSET_EXTS.has(ext)) {
105
+ reply.log?.warn?.({ assetId, filename, ext }, 'artifact-asset proxy refused (non-image/font)');
106
+ return reply.status(404).send({ error: 'Asset not found' });
107
+ }
108
+ // ETag content must be ASCII-safe: the RAW stored filename can carry
109
+ // non-ASCII (e.g. `Söhne-Halbfett.woff2`), and an invalid char in a header
110
+ // value makes Node throw ERR_INVALID_CHAR at send time — which surfaced as
111
+ // an unhandledRejection that took the whole server down the first time a
112
+ // share-page iframe requested such a font. Use the percent-encoded segment
113
+ // (same encoder as asset URLs); the If-None-Match comparison below sees the
114
+ // client echo our own emitted string, so the round-trip is unaffected.
115
+ const etag = `"${assetId}/${encodeAssetFilename(filename)}"`;
116
+ reply.header('ETag', etag);
117
+ reply.header('Cache-Control', 'private, no-cache');
118
+ reply.header('X-Content-Type-Options', 'nosniff');
119
+ // Neutralize active content (legacy/migrated SVGs) served same-origin.
120
+ reply.header('Content-Security-Policy', "default-src 'none'; style-src 'unsafe-inline'; sandbox");
121
+ reply.header('Content-Type', MIME_TYPES[ext] || 'application/octet-stream');
122
+ addFontResourceHeaders(reply, filename);
123
+ if (opts.ifNoneMatch === etag)
124
+ return reply.status(304).send();
125
+ try {
126
+ if (graph.getAssetStorage() === 'r2') {
127
+ // The index `size` is advisory and often null (migrate-assets/sweep
128
+ // never set it), so DON'T fail-closed on unknown size — the normal
129
+ // serve path doesn't either. Pre-reject only a KNOWN-oversize asset;
130
+ // for HEAD with a known size, answer without downloading.
131
+ if (typeof size === 'number' && size > ARTIFACT_PROXY_MAX_BYTES) {
132
+ reply.log?.warn?.({ assetId, filename, size }, 'artifact-asset proxy refused (oversized)');
133
+ return reply.status(404).send({ error: 'Asset not found' });
134
+ }
135
+ if (isHead) {
136
+ if (typeof size === 'number' && size > 0)
137
+ reply.header('Content-Length', size);
138
+ return reply.send();
139
+ }
140
+ const bytes = await graph.downloadAssetById(assetId, filename);
141
+ // Post-download cap bounds what we serve when size was unknown.
142
+ if (bytes.length > ARTIFACT_PROXY_MAX_BYTES) {
143
+ reply.log?.warn?.({ assetId, filename, len: bytes.length }, 'artifact-asset proxy refused (oversized after download)');
144
+ return reply.status(404).send({ error: 'Asset not found' });
145
+ }
146
+ reply.header('Content-Length', bytes.length);
147
+ return reply.send(bytes);
148
+ }
149
+ // Local backend: stream from disk (same path-hardening as below).
150
+ if (filename.includes('..') || filename.includes('/') || filename.includes('\\') || filename.startsWith('.') ||
151
+ assetId.includes('..') || assetId.includes('/') || assetId.includes('\\')) {
152
+ return reply.status(404).send({ error: 'Asset not found' });
153
+ }
154
+ const base = workspaceManager.workspacePath ?? process.cwd();
155
+ const fp = join(base, '.studiograph', 'assets', assetId, filename);
156
+ if (!existsSync(fp))
157
+ return reply.status(404).send({ error: 'Asset not found' });
158
+ reply.header('Content-Length', statSync(fp).size);
159
+ if (isHead)
160
+ return reply.send();
161
+ return reply.send(createReadStream(fp));
162
+ }
163
+ catch (err) {
164
+ reply.log?.warn?.({ err, assetId, filename }, 'artifact-asset proxy serve failed');
165
+ return reply.status(404).send({ error: 'Asset not found' });
166
+ }
167
+ }
168
+ // (1) R2 font pre-step — catalog-only CORS proxy + HEAD-from-size optimization.
169
+ if (storage === 'r2' && isFontExtension(filename)) {
170
+ try {
171
+ const ext = extname(filename).toLowerCase();
172
+ if (isHead && typeof size === 'number') {
173
+ reply.header('Content-Type', MIME_TYPES[ext] || 'application/octet-stream');
174
+ reply.header('Content-Length', size);
175
+ reply.header('Cache-Control', 'private, max-age=14400');
176
+ reply.header('X-Content-Type-Options', 'nosniff');
177
+ addFontResourceHeaders(reply, filename);
178
+ return reply.send();
179
+ }
180
+ const bytes = await graph.downloadAssetById(assetId, filename);
181
+ reply.header('Content-Type', MIME_TYPES[ext] || 'application/octet-stream');
182
+ reply.header('Content-Length', bytes.length);
183
+ reply.header('Cache-Control', 'private, max-age=14400');
184
+ reply.header('X-Content-Type-Options', 'nosniff');
185
+ addFontResourceHeaders(reply, filename);
186
+ if (isHead)
187
+ return reply.send();
188
+ return reply.send(bytes);
189
+ }
190
+ catch (err) {
191
+ reply.log?.warn?.({ err, assetId, filename }, 'asset r2 signed-url generation failed');
192
+ return reply.status(404).send({ error: 'Asset not found' });
193
+ }
194
+ }
195
+ // (2) Local-backend catalog segment hardening (stricter than the generic
196
+ // primitive: also rejects a `.`-prefixed filename). Applied before delegation
197
+ // so observable behavior is identical to the pre-unification serve path.
198
+ if (storage !== 'r2') {
199
+ if (filename.includes('..') || filename.includes('/') || filename.includes('\\') || filename.startsWith('.') ||
200
+ assetId.includes('..') || assetId.includes('/') || assetId.includes('\\')) {
201
+ return reply.status(404).send({ error: 'Asset not found' });
202
+ }
203
+ }
204
+ // Delegate to the shared primitive. The catalog key is `{assetId}/{filename}`.
205
+ // LOCAL serves with no-cache + a strong ETag: bytes never change at a key,
206
+ // so every revisit is a free 304 — but a DELETED asset 404s on the next
207
+ // render instead of ghosting from a year-long immutable cache (the founder
208
+ // QA case: delete in the Library, the embed must flip to the unavailable
209
+ // note everywhere). R2 keeps the 4h-cached 302 (the signed URL varies per
210
+ // mint, so revalidating the redirect would force full re-downloads —
211
+ // bounded staleness is the cheaper trade there).
212
+ return serveBackendObject(workspaceManager, reply, {
213
+ repo,
214
+ key: `${assetId}/${filename}`,
215
+ filename,
216
+ isHead,
217
+ cacheControl: { r2: 'private, max-age=14400', local: 'private, no-cache' },
218
+ fontHeaders: true,
219
+ notFoundError: 'Asset not found',
220
+ ifNoneMatch: opts.ifNoneMatch,
221
+ signR2Url: (method) => graph.getAssetSignedUrlByAssetId(assetId, filename, method),
222
+ });
223
+ }
224
+ /**
225
+ * Generic backend-object serving primitive (composer-vision-attach / E2a). Serves
226
+ * bytes for a RAW backend key once the caller has decided authorization: R2 → 302
227
+ * to a method-bound signed URL; local → stream from `.studiograph/assets/{key}`
228
+ * with a sandbox CSP + nosniff. The R2 signer is INJECTED so the caller controls
229
+ * which keyspace is signed (catalog asset vs conversation-scratch image), and the
230
+ * cache header may be a single value or a per-backend pair. Always fail-closed 404.
231
+ *
232
+ * This is the single serving codepath behind BOTH `serveIndexedAsset` (the
233
+ * catalog, which layers an R2 font pre-step + stricter segment hardening on top)
234
+ * and the conversation-scratch image route.
235
+ */
236
+ export async function serveBackendObject(workspaceManager, reply, opts) {
237
+ const { repo, key, filename, contentType, isHead, cacheControl, fontHeaders, signR2Url } = opts;
238
+ const notFound = opts.notFoundError ?? 'Not found';
239
+ const r2Cache = typeof cacheControl === 'string' ? cacheControl : cacheControl.r2;
240
+ const localCache = typeof cacheControl === 'string' ? cacheControl : cacheControl.local;
241
+ let graph;
242
+ try {
243
+ graph = workspaceManager.getGraph(repo);
244
+ }
245
+ catch {
246
+ return reply.status(404).send({ error: notFound });
247
+ }
248
+ if (graph.getAssetStorage() === 'r2') {
249
+ try {
250
+ const signed = await signR2Url(isHead ? 'HEAD' : 'GET');
251
+ reply.header('Cache-Control', r2Cache);
252
+ return reply.redirect(signed, 302);
253
+ }
254
+ catch (err) {
255
+ reply.log?.warn?.({ err, key }, 'backend object r2 signed-url generation failed');
256
+ return reply.status(404).send({ error: notFound });
257
+ }
258
+ }
259
+ // Local backend: stream from .studiograph/assets/{key}. Defense-in-depth
260
+ // segment validation (the key is stored server-side, but never trust it).
261
+ for (const seg of key.split('/')) {
262
+ if (seg === '' || seg === '.' || seg === '..' || seg.includes('\\')) {
263
+ return reply.status(404).send({ error: notFound });
264
+ }
265
+ }
266
+ const localBase = workspaceManager.workspacePath ?? process.cwd();
267
+ const filePath = join(localBase, '.studiograph', 'assets', key);
268
+ if (!existsSync(filePath)) {
269
+ return reply.status(404).send({ error: notFound });
270
+ }
271
+ // Strong ETag = the immutable key (percent-encoded: header values must be
272
+ // ASCII-safe — the raw filename can carry non-ASCII, and an invalid header
273
+ // char throws at send time; see the artifact-proxy incident). Bytes at a
274
+ // key never change, so a match is always a valid 304.
275
+ const etag = `"${encodeURIComponent(key)}"`;
276
+ reply.header('ETag', etag);
277
+ reply.header('Cache-Control', localCache);
278
+ if (opts.ifNoneMatch === etag) {
279
+ if (fontHeaders)
280
+ addFontResourceHeaders(reply, filename);
281
+ return reply.status(304).send();
282
+ }
283
+ const ext = extname(filename).toLowerCase();
284
+ reply.header('Content-Type', contentType || MIME_TYPES[ext] || 'application/octet-stream');
285
+ reply.header('Content-Length', statSync(filePath).size);
286
+ if (fontHeaders)
287
+ addFontResourceHeaders(reply, filename);
288
+ // Neutralize active content served from the app origin. SVG uploads are
289
+ // blocked, but legacy/migrated/indexed SVGs would otherwise run script when
290
+ // opened directly as image/svg+xml — now reachable anonymously via the share
291
+ // route. A sandbox CSP blocks script + plugins on direct navigation (img
292
+ // embeds still render, since <img> never executes SVG script), and nosniff
293
+ // stops a mislabeled asset from being re-interpreted as HTML.
294
+ reply.header('Content-Security-Policy', "default-src 'none'; style-src 'unsafe-inline'; sandbox");
295
+ reply.header('X-Content-Type-Options', 'nosniff');
296
+ if (isHead)
297
+ return reply.send();
298
+ return reply.send(createReadStream(filePath));
299
+ }
300
+ export async function registerAssetApiRoutes(fastify, workspaceManager, authService, wsHub) {
301
+ // Peers' Library views refresh on repo_sync (the same event uploads
302
+ // broadcast from graph-api) — every asset mutation here must emit it or a
303
+ // move/delete stays invisible to other connected members until reload.
304
+ // `summary` is the human verb-phrase the toast renders ("{actor} {summary}
305
+ // in {folder}"); omit it and the client falls back to a generic "updated".
306
+ const broadcastAssetChange = (repo, req, summary) => {
307
+ wsHub?.broadcast({
308
+ type: 'repo_sync',
309
+ repo,
310
+ actor: req?.user?.displayName ?? 'API',
311
+ source: 'api',
312
+ summary,
313
+ workspaceWide: access.isWorkspaceWide(repo, workspaceManager),
314
+ timestamp: new Date().toISOString(),
315
+ });
316
+ };
47
317
  // POST /api/repos/:repo/entities/:type/:id/assets — upload an image
48
318
  fastify.post('/api/repos/:repo/entities/:type/:id/assets', async (req, reply) => {
49
319
  const { repo, type, id } = req.params;
50
- if (!hasRepoAccess(req, repo, authService)) {
320
+ if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
51
321
  return reply.status(404).send({ error: `Folder "${repo}" not found` });
52
322
  }
53
323
  let graph;
@@ -63,15 +333,29 @@ export async function registerAssetApiRoutes(fastify, workspaceManager, authServ
63
333
  if (!file.mimetype.startsWith('image/')) {
64
334
  return reply.status(400).send({ error: 'Only image files are supported' });
65
335
  }
336
+ // Block SVG: stored XSS — SVG can contain <script> and the GET route
337
+ // serves it inline as image/svg+xml, executing in the app origin.
338
+ if (file.mimetype === 'image/svg+xml' || file.filename?.toLowerCase().endsWith('.svg')) {
339
+ return reply.status(415).send({ error: 'SVG uploads are not supported (stored XSS risk).' });
340
+ }
66
341
  const buffer = await file.toBuffer();
67
342
  const filename = `${Date.now()}-${file.filename.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
343
+ const uploader = req.user;
68
344
  try {
69
- const asset = await graph.uploadAsset(type, id, filename, buffer);
70
- // For local storage, return an HTTP-servable URL instead of the filesystem path
71
- const url = asset.url.startsWith('file://') || !asset.url.startsWith('http')
72
- ? `/api/assets/${type}/${id}/${asset.filename}`
73
- : asset.path; // R2 returns a full public URL
74
- return reply.send({ url, filename: asset.filename, size: asset.size });
345
+ // Assets-referenced-not-owned (P1, D2): an image pasted/uploaded into
346
+ // an entry is homed to the ENTRY'S OWN FOLDER (owner_type='folder',
347
+ // owner_id=repo), inheriting the folder's permission boundary — never
348
+ // owned by the entity. The entry merely references it via the returned
349
+ // immutable URL (the editor inserts the embed), so deleting or moving
350
+ // the entry never destroys or strands the image. (type, id) are kept
351
+ // for the route shape but ignored for ownership.
352
+ const asset = await graph.uploadAsset(type, id, filename, buffer, undefined, {
353
+ owner: { type: 'folder', id: repo },
354
+ uploaderUserId: uploader?.id != null ? String(uploader.id) : null,
355
+ });
356
+ // uploadAsset returns the canonical public URL (immutable-key scheme
357
+ // when the index is wired, legacy otherwise) — don't re-derive it.
358
+ return reply.send({ url: asset.publicUrl, filename: asset.filename, size: asset.size });
75
359
  }
76
360
  catch (err) {
77
361
  if (err.message?.includes('not configured')) {
@@ -80,102 +364,445 @@ export async function registerAssetApiRoutes(fastify, workspaceManager, authServ
80
364
  return reply.status(400).send({ error: err.message });
81
365
  }
82
366
  });
83
- // GET /api/assets/:type/:id/:filenameserve local assets
84
- fastify.get('/api/assets/:type/:id/:filename', async (req, reply) => {
85
- const { type, id, filename } = req.params;
86
- const workspacePath = workspaceManager.workspacePath ?? process.cwd();
87
- const filePath = join(workspacePath, '.studiograph', 'assets', type, id, filename);
88
- if (!existsSync(filePath)) {
89
- return reply.status(404).send({ error: 'Asset not found' });
367
+ // POST /api/repos/:repo/entities/artifact/:id/asset-tokenmint a short-lived
368
+ // (12h), ARTIFACT-SCOPED capability token so a sandboxed iframe (opaque origin,
369
+ // no cookie) can load the exact images this artifact embeds. Authz: a normal
370
+ // session with repo access. The allowlist is the set of indexed assets the
371
+ // bundle references that actually live in THIS repo — cross-repo / unknown /
372
+ // filename-mismatched refs are dropped (fail-closed).
373
+ fastify.post('/api/repos/:repo/entities/artifact/:id/asset-token', async (req, reply) => {
374
+ const { repo, id } = req.params;
375
+ const user = req.user;
376
+ if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
377
+ return reply.status(404).send({ error: `Folder "${repo}" not found` });
90
378
  }
91
- const ext = extname(filename).toLowerCase();
92
- const contentType = MIME_TYPES[ext] || 'application/octet-stream';
93
- const stats = statSync(filePath);
94
- reply.header('Content-Type', contentType);
95
- reply.header('Content-Length', stats.size);
96
- reply.header('Cache-Control', 'public, max-age=31536000, immutable');
97
- return reply.send(createReadStream(filePath));
379
+ let graph;
380
+ try {
381
+ graph = workspaceManager.getGraph(repo);
382
+ }
383
+ catch (err) {
384
+ return reply.status(404).send({ error: err.message });
385
+ }
386
+ // Allowlist source = the EXACT version being rendered. For a history
387
+ // preview the client passes the version's commit; we derive the allowlist
388
+ // from the artifact body AT THAT COMMIT (server-trusted, not client refs),
389
+ // so a preview token authorizes the previewed version's assets — not the
390
+ // current ones. Otherwise use the live body.
391
+ const commit = typeof req.query.commit === 'string' && /^[0-9a-f]{7,40}$/i.test(req.query.commit)
392
+ ? req.query.commit : null;
393
+ let text;
394
+ if (commit) {
395
+ const atCommit = graph.getEntityAtCommit('artifact', id, commit);
396
+ if (!atCommit)
397
+ return reply.status(404).send({ error: 'Artifact version not found' });
398
+ text = atCommit.content;
399
+ }
400
+ else {
401
+ let entity;
402
+ try {
403
+ entity = graph.get('artifact', id);
404
+ }
405
+ catch {
406
+ return reply.status(404).send({ error: 'Artifact not found' });
407
+ }
408
+ if (!entity)
409
+ return reply.status(404).send({ error: 'Artifact not found' });
410
+ text = entity.document?.content ?? '';
411
+ }
412
+ return reply.send(mintArtifactAssetTokenForText(workspaceManager, authService, repo, id, text, user ? String(user.id) : '0'));
98
413
  });
99
- // GET /api/repos/:repo/assetslist all assets in a folder.
414
+ // GET / HEAD /api/assets/:assetId/:filenameIMMUTABLE-KEY serve route.
100
415
  //
101
- // Algorithm (works for both local and R2 backends):
102
- // 1. One listAll() call into the asset backend single filesystem
103
- // walk or single paginated S3 ListObjectsV2 request. No HEAD
104
- // round-trips, no markdown parsing.
105
- // 2. Build the set of (type, id) pairs that belong to *this* repo via
106
- // a cheap directory scan — no frontmatter parse.
107
- // 3. Filter the asset list by that set and look up display names by
108
- // reading just the matching entities' frontmatter name line.
416
+ // New scheme: assets are keyed `{assetId}/{filename}` (assetId = UUIDv4) and
417
+ // ownership/authz lives in the AssetIndexService, not in the URL. Two path
418
+ // segments after /api/assets/ vs three for the legacy route below — Fastify
419
+ // disambiguates by arity, so both coexist during the migration cutover.
109
420
  //
110
- // For a repo like "analogous-experiences" with 800 assets this collapses
111
- // hundreds of awaited round-trips into ~1 + a handful of small file reads.
421
+ // Authz: index.get(assetId) repo hasRepoAccess. Fail-closed on a miss.
422
+ // The filename in the URL MUST match the indexed filename, otherwise a valid
423
+ // assetId would authorize arbitrary keys under that UUID directory.
424
+ fastify.route({
425
+ method: ['GET', 'HEAD'],
426
+ url: '/api/assets/:assetId/:filename',
427
+ handler: async (req, reply) => {
428
+ const { assetId, filename } = req.params;
429
+ const isHead = req.method === 'HEAD';
430
+ const ifNoneMatch = req.headers['if-none-match'];
431
+ const row = workspaceManager.getAssetIndex().get(assetId);
432
+ // Fail-closed: unknown id, or a filename that doesn't match the indexed
433
+ // one, both 404 (never leak existence; never authorize a sibling key).
434
+ if (!row || row.filename !== filename) {
435
+ return reply.status(404).send({ error: 'Asset not found' });
436
+ }
437
+ // (No anonymous public-fonts exception here anymore: fonts resolve
438
+ // through the same contract as images — token allowlist below, the
439
+ // share-token route, or export bundling. Fail closed without one.)
440
+ const user = req.user;
441
+ if (!user && authService.hasUsers()) {
442
+ // No session cookie/Bearer (e.g. a sandboxed artifact iframe). Try the
443
+ // artifact-asset capability token before failing. The preHandler only
444
+ // verified the signature + 2-seg shape and stashed the payload as a
445
+ // CANDIDATE — the authoritative checks happen HERE against the resolved
446
+ // row: repo match + exact-asset allowlist + the token's user STILL has
447
+ // repo access (revocation enforced per-serve). Serve same-origin.
448
+ const tok = req.artifactAssetToken;
449
+ if (tok) {
450
+ const tokenUser = authService.findUserById(Number(tok.userId));
451
+ // Token is minted for ONE artifact (in tok.repo). It may load assets
452
+ // owned by that repo, OR assets in a workspace-wide shared store
453
+ // (workspace-assets) — those are cross-repo by design and readable by
454
+ // every member, so an artifact in repo A may embed a shared-store
455
+ // image. The exact-asset allowlist still scopes what THIS token unlocks,
456
+ // and hasRepoAccess re-checks the token user against the owning repo.
457
+ const repoMatch = tok.repo === row.repo || access.isWorkspaceWide(row.repo, workspaceManager);
458
+ if (repoMatch &&
459
+ tok.assets.includes(artifactAssetKey(assetId, filename)) &&
460
+ tokenUser &&
461
+ access.hasRepoAccess(tokenUser, row.repo, workspaceManager, authService)) {
462
+ return serveIndexedAsset(workspaceManager, reply, {
463
+ assetId, filename, repo: row.repo, isHead, size: row.size, proxyR2: true, ifNoneMatch,
464
+ });
465
+ }
466
+ }
467
+ return reply.status(404).send({ error: 'Asset not found' });
468
+ }
469
+ if (!hasRepoAccess(req, row.repo, workspaceManager, authService)) {
470
+ return reply.status(404).send({ error: 'Asset not found' });
471
+ }
472
+ // Authz decided above (folder access); shared helper does the serving.
473
+ //
474
+ // TRANSPORT exception: WebKit sends the session cookie from sandboxed
475
+ // (opaque-origin) artifact iframes — Chromium doesn't — so a Safari/iOS
476
+ // iframe image request lands HERE on session authz even though it also
477
+ // carries a verified `?at=` candidate. The session stays the authz
478
+ // authority (the token never overrides it), but the default R2 serve
479
+ // answers 302-to-bucket-origin, which the iframe's CSP rightly blocks
480
+ // ("Redirect was not allowed" — images broken in Safari, fine in
481
+ // Chrome). A verified token candidate is the fingerprint of that
482
+ // sandboxed caller, so serve it same-origin via the token proxy path
483
+ // (image/font-only + size caps + revalidate ETag) instead of redirecting.
484
+ // Grants nothing new: this session could fetch the same bytes through
485
+ // the redirect; only the transport changes. Scoped to the R2 backend —
486
+ // local storage streams directly (no redirect to block), and routing it
487
+ // through the proxy would impose the token path's image/font-only gate
488
+ // on session-authorized types it previously served (e.g. video).
489
+ let r2Backed = false;
490
+ if (req.artifactAssetToken) {
491
+ try {
492
+ r2Backed = workspaceManager.getGraph(row.repo).getAssetStorage() === 'r2';
493
+ }
494
+ catch { /* served 404 below */ }
495
+ }
496
+ return serveIndexedAsset(workspaceManager, reply, {
497
+ assetId, filename, repo: row.repo, isHead, size: row.size, ifNoneMatch,
498
+ ...(r2Backed ? { proxyR2: true } : {}),
499
+ });
500
+ },
501
+ });
502
+ // The legacy 3-segment serve route (GET/HEAD /api/assets/:type/:id/:filename)
503
+ // was removed once every body referenced immutable /api/assets/{assetId}/...
504
+ // URLs (served by the by-assetId route above) and the legacy-hit logs drained
505
+ // to zero. Un-indexed legacy blobs no longer exist; nothing requests this.
506
+ // GET /api/repos/:repo/assets — list all assets in a folder. The listing
507
+ // logic (ownership-index scan) lives in listRepoAssets() so the MCP
508
+ // `list_assets` tool returns an identical shape.
112
509
  fastify.get('/api/repos/:repo/assets', async (req, reply) => {
113
510
  const { repo } = req.params;
114
- if (!hasRepoAccess(req, repo, authService)) {
511
+ if (!hasRepoAccess(req, repo, workspaceManager, authService)) {
512
+ return reply.status(404).send({ error: `Folder "${repo}" not found` });
513
+ }
514
+ // Verify the repo exists before delegating; listRepoAssets swallows
515
+ // missing-graph errors as [], which is right for the bulk endpoint but
516
+ // wrong for the single-repo one (we want a 404).
517
+ try {
518
+ workspaceManager.getGraph(repo);
519
+ }
520
+ catch (err) {
521
+ return reply.status(404).send({ error: err.message });
522
+ }
523
+ return { assets: await listRepoAssets(repo, workspaceManager) };
524
+ });
525
+ // GET /api/workspace/assets — bulk asset lists for ALL accessible repos in
526
+ // one round-trip. Replaces 15+ parallel /api/repos/:repo/assets calls so
527
+ // GalleryView's thumbnail effect doesn't saturate the browser HTTP/1.1
528
+ // 6-slot queue and block other navigation fetches.
529
+ // Response shape: `{ [repoName]: RepoAsset[] }`.
530
+ fastify.get('/api/workspace/assets', async (req, reply) => {
531
+ const user = req.user;
532
+ // Use the shared access-control helper so personal-folder restrictions
533
+ // and workspace-owner-on-shared-folder semantics apply consistently.
534
+ const accessible = access.getAccessibleRepos(user, workspaceManager, authService).map(r => r.name);
535
+ // One bucket walk for the whole workspace (see listWorkspaceAssets) rather
536
+ // than a per-repo listAll fan-out. Seed every accessible repo so folders
537
+ // with no assets still appear as empty arrays (shape-stable for callers).
538
+ const result = {};
539
+ for (const repo of accessible)
540
+ result[repo] = [];
541
+ const flat = await listWorkspaceAssets(accessible, workspaceManager);
542
+ for (const { repo, ...asset } of flat)
543
+ (result[repo] ??= []).push(asset);
544
+ return reply.send(result);
545
+ });
546
+ // GET /api/workspace/assets/manager — the dedicated asset-manager view.
547
+ //
548
+ // Distinct from /api/workspace/assets (kept shape-stable for GalleryView's
549
+ // thumbnail effect). This composes the SAME primitives (getAccessibleRepos +
550
+ // listRepoAssets + assetDeleteDenialByAssetId) into the shape the /assets UI needs:
551
+ // - `folders`: every accessible folder's metadata (display name +
552
+ // workspace_wide + system flags) so the client can render the folder
553
+ // filter, group headers, the Workspace/folder-scoped visibility badge,
554
+ // and pin the shared store first — the system store is excluded from
555
+ // /api/repos so the client can't get this elsewhere.
556
+ // - `assets`: a FLAT list annotated with the owning `repo` and a per-asset
557
+ // `canDelete` decision (uploader/owner gate, via the same authz primitive
558
+ // the DELETE route enforces) so the UI can disable delete with a reason
559
+ // instead of letting the user hit a 403.
560
+ fastify.get('/api/workspace/assets/manager', async (req, reply) => {
561
+ const user = req.user;
562
+ workspaceManager.reloadConfig();
563
+ const accessible = access.getAccessibleRepos(user, workspaceManager, authService);
564
+ const index = workspaceManager.getAssetIndex?.();
565
+ const folders = accessible.map(r => ({
566
+ repo: r.name,
567
+ displayName: r.display_name ?? null,
568
+ workspaceWide: r.workspace_wide === true,
569
+ system: r.system === true,
570
+ }));
571
+ const configByRepo = new Map(accessible.map(r => [r.name, r]));
572
+ // listWorkspaceAssets reads the ownership index per accessible repo. Here we
573
+ // layer on the per-asset delete decision (gated on the immutable assetId
574
+ // every asset now carries) so the UI can disable delete with a reason
575
+ // instead of letting the user hit a 403.
576
+ const flat = await listWorkspaceAssets(accessible.map(r => r.name), workspaceManager);
577
+ const assets = flat.map((a) => {
578
+ const r = configByRepo.get(a.repo);
579
+ const denial = assetDeleteDenialByAssetId(index, r, user, a.assetId);
580
+ return { ...a, canDelete: denial === null, denialReason: denial };
581
+ });
582
+ return reply.send({ folders, assets });
583
+ });
584
+ // GET /api/workspace/assets/reference-index — the Library "loose /
585
+ // unreferenced" filter's data (assets-referenced-not-owned P3). One
586
+ // live-reconciled, budgeted workspace walk → { assetId: referencing-entry
587
+ // count }. The client fetches this LAZILY (only on the first loose-filter
588
+ // toggle) so the scan never taxes users who don't filter, and marks an asset
589
+ // loose only when its count is 0 AND the scan completed (partial=false).
590
+ //
591
+ // Counts are computed from a workspace-wide scan (an asset referenced only by
592
+ // an entry in a folder the caller can't read is still NOT loose), but the
593
+ // RESPONSE is scoped to the assets the caller can actually see — the same
594
+ // least-disclosure posture as /manager and /references, so it never reveals
595
+ // even a UUID→count for a folder the caller has no access to. The scoped ids
596
+ // are exactly the manager listing's keys; a referenced-but-unindexed asset is
597
+ // never shown there, so dropping it costs the client nothing.
598
+ fastify.get('/api/workspace/assets/reference-index', async (req, reply) => {
599
+ try {
600
+ const user = req.user;
601
+ const index = workspaceManager.getAssetIndex?.();
602
+ if (!index) {
603
+ // No index → can't scope without leaking, and looseness is unknowable.
604
+ // Fail safe (like a partial scan): the client marks nothing loose.
605
+ return reply.send({ index: {}, partial: true });
606
+ }
607
+ const visibleIds = new Set();
608
+ for (const r of access.getAccessibleRepos(user, workspaceManager, authService)) {
609
+ for (const row of index.listByRepo(r.name))
610
+ visibleIds.add(row.assetId);
611
+ }
612
+ const { index: counts, partial } = await computeAssetReferenceIndex({ workspaceManager });
613
+ const scoped = {};
614
+ for (const id of visibleIds) {
615
+ const c = counts[id];
616
+ if (c != null)
617
+ scoped[id] = c;
618
+ }
619
+ return reply.send({ index: scoped, partial });
620
+ }
621
+ catch (err) {
622
+ req.log?.error?.({ err }, '[reference-index] scan failed');
623
+ return reply.status(500).send({ error: 'Could not compute the reference index' });
624
+ }
625
+ });
626
+ // GET /api/workspace/assets/:assetId/references — entries whose markdown
627
+ // body (or frontmatter) references this asset's URL. Scans accessible
628
+ // repos via graph.search, which already includes body-content scanning,
629
+ // so no schema change is needed. Filters self-reference: a STANDALONE
630
+ // asset's own wrapper entity has the URL in its `asset_url` frontmatter
631
+ // and would self-match — drop it. Embedded assets keep their parent
632
+ // entity in results (the parent IS the only "use", and clicking it is
633
+ // the user's path to managing the image's context).
634
+ fastify.get('/api/workspace/assets/:assetId/references', async (req, reply) => {
635
+ const { assetId } = req.params;
636
+ const user = req.user;
637
+ const index = workspaceManager.getAssetIndex?.();
638
+ const owner = index?.get(assetId) ?? null;
639
+ const accessible = access.getAccessibleRepos(user, workspaceManager, authService);
640
+ // The immutable-asset URL pattern. assetId is a UUID so this string
641
+ // is unique enough that a substring match across markdown bodies is
642
+ // a reliable "this entry references the asset" signal.
643
+ const pattern = `/api/assets/${assetId}/`;
644
+ const references = [];
645
+ for (const repo of accessible) {
646
+ let graph;
647
+ try {
648
+ graph = workspaceManager.getGraph(repo.name);
649
+ }
650
+ catch {
651
+ continue;
652
+ }
653
+ const matches = graph.search({ query: pattern });
654
+ for (const e of matches) {
655
+ // Skip self: a standalone asset's own entity holds the URL in
656
+ // its `asset_url` frontmatter so it always matches its own
657
+ // search. Embedded assets fall through (their owner is the
658
+ // parent entry, which IS a legitimate reference to show).
659
+ if (owner &&
660
+ owner.ownerType === 'asset' &&
661
+ owner.repo === repo.name &&
662
+ e.id === owner.ownerId)
663
+ continue;
664
+ const data = e.data;
665
+ const title = typeof data.name === 'string' && data.name.trim() !== ''
666
+ ? data.name
667
+ : e.id;
668
+ references.push({
669
+ repo: repo.name,
670
+ entityType: e.entityType,
671
+ entityId: e.id,
672
+ title,
673
+ });
674
+ }
675
+ }
676
+ return reply.send({ references });
677
+ });
678
+ // GET /api/repos/:repo/entities/:type/:id/delete-impact — the delete-time
679
+ // asset prompt's data (assets-referenced-not-owned P2). Read-only: which
680
+ // assets does this entry embed, which are referenced SOLELY by it
681
+ // (live-reconciled workspace scan), and which the caller may delete. The
682
+ // client offers exactly the solely-referenced + deletable ones; deletion
683
+ // itself runs through the existing by-id route per asset.
684
+ fastify.get('/api/repos/:repo/entities/:type/:id/delete-impact', async (req, reply) => {
685
+ const { repo, type, id } = req.params;
686
+ const user = req.user;
687
+ // Deleting requires write access to the entry's folder; the impact
688
+ // report shares that gate (no-leak 404, mirroring the delete route).
689
+ if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
115
690
  return reply.status(404).send({ error: `Folder "${repo}" not found` });
116
691
  }
117
692
  let graph;
118
693
  try {
119
694
  graph = workspaceManager.getGraph(repo);
120
695
  }
696
+ catch {
697
+ return reply.status(404).send({ error: 'Entry not found' });
698
+ }
699
+ try {
700
+ graph.get(type, id);
701
+ }
702
+ catch {
703
+ return reply.status(404).send({ error: 'Entry not found' });
704
+ }
705
+ try {
706
+ const impact = await computeAssetDeleteImpact({
707
+ workspaceManager, authService, user,
708
+ repo, entityType: type, entityId: id,
709
+ });
710
+ return reply.send(impact);
711
+ }
121
712
  catch (err) {
122
- return reply.status(404).send({ error: err.message });
713
+ // The entry exists — an exception here is a scan bug, not a miss.
714
+ // Log it (ops signal) and fail kept-everything on the client side.
715
+ req.log?.error?.({ err, repo, type, id }, '[delete-impact] scan failed');
716
+ return reply.status(500).send({ error: 'Could not compute the asset impact' });
123
717
  }
124
- // 1. Cheap repo membership set: `${type}/${id}` → md path. The
125
- // listEntityIds() call above already walked the actual on-disk
126
- // directories, so we can reconstruct the path via SINGULAR_TO_PLURAL
127
- // without any extra filesystem checks.
128
- const workspacePath = workspaceManager.workspacePath ?? process.cwd();
129
- const repoPath = join(workspacePath, repo);
130
- const entityIds = graph.listEntityIds();
131
- const idToMdPath = new Map();
132
- const nameCache = new Map();
133
- for (const { entityType, id } of entityIds) {
134
- const plural = SINGULAR_TO_PLURAL[entityType] ?? entityType;
135
- idToMdPath.set(`${entityType}/${id}`, join(repoPath, plural, `${id}.md`));
718
+ });
719
+ // GET /api/repos/:repo/entities/:type/:id/move-impact?target=<repo> the
720
+ // cross-folder move heads-up (assets-referenced-not-owned P4 Option A).
721
+ // Read-only: which images this entry embeds would NOT be visible to everyone in
722
+ // the destination repo after a cross-repo move (their home folder stays put).
723
+ // Cheap scans only this entry's embeds. The move itself is never blocked; the
724
+ // client shows a non-blocking notice. Fail-soft: on any error return no at-risk
725
+ // assets (a heads-up failing should never break or block the move).
726
+ fastify.get('/api/repos/:repo/entities/:type/:id/move-impact', async (req, reply) => {
727
+ const { repo, type, id } = req.params;
728
+ const target = req.query.target?.trim();
729
+ const user = req.user;
730
+ // Same gate as the move/delete-impact routes: write access to the entry's
731
+ // folder, no-leak 404 otherwise.
732
+ if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
733
+ return reply.status(404).send({ error: `Folder "${repo}" not found` });
136
734
  }
137
- // 2. One listAll() round-trip.
138
- let allAssets;
735
+ // Validate the entry exists first (consistent with delete-impact), then
736
+ // handle the no-destination-yet case as an empty heads-up.
737
+ let graph;
139
738
  try {
140
- allAssets = await graph.listAllAssets();
739
+ graph = workspaceManager.getGraph(repo);
141
740
  }
142
741
  catch {
143
- return { assets: [] };
144
- }
145
- // 3. Filter to this repo, look up display names on demand.
146
- const result = [];
147
- for (const asset of allAssets) {
148
- const key = `${asset.entityType}/${asset.entityId}`;
149
- const mdPath = idToMdPath.get(key);
150
- if (!mdPath)
151
- continue;
152
- let entityName = nameCache.get(key);
153
- if (entityName === undefined) {
154
- entityName = extractEntityName(mdPath) ?? asset.entityId;
155
- nameCache.set(key, entityName);
156
- }
157
- const url = asset.url.startsWith('file://') || !asset.url.startsWith('http')
158
- ? `/api/assets/${asset.entityType}/${asset.entityId}/${asset.filename}`
159
- : asset.path;
160
- result.push({
161
- filename: asset.filename,
162
- size: asset.size,
163
- contentType: asset.contentType,
164
- url,
165
- entityType: asset.entityType,
166
- entityId: asset.entityId,
167
- entityName,
168
- mediaType: asset.mediaType,
742
+ return reply.status(404).send({ error: 'Entry not found' });
743
+ }
744
+ try {
745
+ graph.get(type, id);
746
+ }
747
+ catch {
748
+ return reply.status(404).send({ error: 'Entry not found' });
749
+ }
750
+ if (!target)
751
+ return reply.send({ atRisk: [] });
752
+ try {
753
+ const impact = computeAssetMoveImpact({
754
+ workspaceManager, authService, user,
755
+ repo, entityType: type, entityId: id, targetRepo: target,
169
756
  });
757
+ return reply.send(impact);
758
+ }
759
+ catch (err) {
760
+ // A heads-up must never break the move flow — log + return empty.
761
+ req.log?.error?.({ err, repo, type, id, target }, '[move-impact] failed');
762
+ return reply.send({ atRisk: [] });
170
763
  }
171
- return { assets: result };
172
764
  });
173
- // DELETE /api/repos/:repo/entities/:type/:id/assets/:filenamedelete an asset
174
- fastify.delete('/api/repos/:repo/entities/:type/:id/assets/:filename', async (req, reply) => {
175
- const { repo, type, id, filename } = req.params;
176
- if (!hasRepoAccess(req, repo, authService)) {
765
+ // GET /api/workspace/assets/storeresolve (lazy-create) the reserved
766
+ // Workspace Assets store and return its repo name. The manager's upload
767
+ // affordance calls this, then POSTs the file to /api/repos/<repo>/assets.
768
+ // This is how an existing workspace backfills the store on first use (D3 /
769
+ // resolveWorkspaceAssetsRepo) — never a boot sweep. Authed users only; the
770
+ // store is workspace_wide so any member can upload once it exists.
771
+ fastify.get('/api/workspace/assets/store', async (_req, reply) => {
772
+ // Match the upload route's auth posture: open-mode (no user) is allowed.
773
+ const workspace = new Workspace(workspaceManager.getWorkspacePath());
774
+ const repo = await resolveWorkspaceAssetsRepo(workspace, workspaceManager);
775
+ return reply.send({ repo });
776
+ });
777
+ // The entity-coordinate DELETE route (DELETE
778
+ // /api/repos/:repo/entities/:type/:id/assets/:filename) was removed with the
779
+ // legacy 3-segment scheme — every asset is now deleted by its immutable id
780
+ // via the by-assetId route below.
781
+ // DELETE /api/repos/:repo/assets/:assetId/:filename — delete ANY indexed
782
+ // asset by its immutable id (the manager's delete; assets are library
783
+ // citizens, so this serves every owner shape including legacy entity-owned
784
+ // stragglers). Removes the blob + index row in one step.
785
+ fastify.delete('/api/repos/:repo/assets/:assetId/:filename', async (req, reply) => {
786
+ const { repo, assetId, filename } = req.params;
787
+ // WRITE gate — see the filename route above.
788
+ if (!access.canWriteRepo(req.user, repo, workspaceManager, authService)) {
177
789
  return reply.status(404).send({ error: `Folder "${repo}" not found` });
178
790
  }
791
+ // Confirm the asset exists and actually belongs to this folder — don't let
792
+ // access to one folder delete another folder's asset by id.
793
+ const index = workspaceManager.getAssetIndex?.();
794
+ const row = index?.get(assetId);
795
+ if (!row || row.repo !== repo) {
796
+ return reply.status(404).send({ error: 'Asset not found' });
797
+ }
798
+ // Same uploader/owner gate as the filename route, keyed on the asset row.
799
+ const denial = assetDeleteDenialByAssetId(index, workspaceManager.getRepoConfig(repo), req.user, assetId);
800
+ if (denial)
801
+ return reply.status(403).send({ error: denial });
802
+ // Filename must match the stored row — the key is `{assetId}/{filename}`.
803
+ if (row.filename !== filename) {
804
+ return reply.status(404).send({ error: 'Asset not found' });
805
+ }
179
806
  let graph;
180
807
  try {
181
808
  graph = workspaceManager.getGraph(repo);
@@ -184,12 +811,131 @@ export async function registerAssetApiRoutes(fastify, workspaceManager, authServ
184
811
  return reply.status(404).send({ error: err.message });
185
812
  }
186
813
  try {
187
- await graph.deleteAsset(type, id, filename);
814
+ await graph.deleteAssetById(assetId, filename);
815
+ broadcastAssetChange(repo, req, 'deleted an asset');
188
816
  return { success: true };
189
817
  }
190
818
  catch (err) {
191
819
  return reply.status(404).send({ error: err.message });
192
820
  }
193
821
  });
822
+ // POST /api/repos/:repo/assets/:assetId/create-entry — the second import
823
+ // "door": create a typed entity (auto-derived type, re-extracted body) that
824
+ // embeds an EXISTING free-standing asset. Makes deletion reversible — a
825
+ // surviving asset can be re-embedded into a new entry.
826
+ //
827
+ // Destination rule (mirrors the UI's single-click vs picker split):
828
+ // - A FOLDER-OWNED asset's entry is FORCED into the asset's own folder, so
829
+ // the entry's audience matches the asset's auth scope and the embedded URL
830
+ // can never resolve for a reader who can't see the asset. Any `targetRepo`
831
+ // is ignored for these.
832
+ // - A WORKSPACE-WIDE asset is readable by every member and lives in a system
833
+ // store that can't hold entries, so the caller picks a real content folder
834
+ // via `targetRepo` (no cross-folder embed risk — it's globally readable).
835
+ fastify.post('/api/repos/:repo/assets/:assetId/create-entry', async (req, reply) => {
836
+ const { repo, assetId } = req.params;
837
+ const user = req.user;
838
+ // Resolve the destination folder. Only a globally-readable (workspace-wide)
839
+ // asset may target a folder other than its own — that's the one case with
840
+ // no broken-embed risk and no real "own folder" to fall back to. The
841
+ // subfolder is honored only on that same (picked) path. (isWorkspaceWide
842
+ // keys on the URL `repo`, not the asset row, so it's safe to resolve before
843
+ // the row lookup.)
844
+ const picked = req.body?.targetRepo?.trim();
845
+ const assetGlobal = access.isWorkspaceWide(repo, workspaceManager);
846
+ const destRepo = (picked && assetGlobal) ? picked : repo;
847
+ const destFolderPath = (picked && assetGlobal) ? (req.body?.targetFolderPath?.trim() || undefined) : undefined;
848
+ // Never create an entry inside a system store (it's excluded from every
849
+ // knowledge surface — sidebar, agent inventory, lint — so the entry would
850
+ // be orphaned). A workspace-wide asset MUST pick a real content folder.
851
+ // (System stores aren't secret, so a 400 here leaks nothing.)
852
+ if (workspaceManager.getRepoConfig(destRepo)?.system) {
853
+ return reply.status(400).send({ error: 'Choose a folder to create the entry in.' });
854
+ }
855
+ // Access gate FIRST — before any asset existence / owner-type response —
856
+ // so a non-member can't distinguish an existing private asset from a
857
+ // missing one (mirrors the move route's gate-before-lookup order). The
858
+ // asset's own folder uses the no-leak 404; an explicitly-chosen target
859
+ // folder uses 403 (the user picked it from a list they can already see).
860
+ if (destRepo === repo) {
861
+ if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
862
+ return reply.status(404).send({ error: `Folder "${repo}" not found` });
863
+ }
864
+ }
865
+ else if (!access.canWriteRepo(user, destRepo, workspaceManager, authService)) {
866
+ return reply.status(403).send({ error: `Editor access required to create an entry in "${destRepo}".` });
867
+ }
868
+ const index = workspaceManager.getAssetIndex?.();
869
+ const row = index?.get(assetId);
870
+ if (!row || row.repo !== repo) {
871
+ return reply.status(404).send({ error: 'Asset not found' });
872
+ }
873
+ // Any indexed asset can become an entry — assets are library citizens
874
+ // and entry deletion never cascades, so re-embedding is always safe.
875
+ // (The old free-standing-only guard existed to dodge cleanupOwnedAssets,
876
+ // which is gone.) Legacy entity-owned rows simply work here.
877
+ let graph;
878
+ try {
879
+ graph = workspaceManager.getGraph(destRepo);
880
+ }
881
+ catch (err) {
882
+ return reply.status(404).send({ error: err.message });
883
+ }
884
+ try {
885
+ const result = await createEntityFromAsset({
886
+ graph,
887
+ assetId,
888
+ folderPath: destFolderPath,
889
+ name: req.body?.name,
890
+ user: reqGitUser(req),
891
+ });
892
+ broadcastAssetChange(destRepo, req, 'created an entry from an asset');
893
+ return { entities: result.entities, assetId: result.assetId, asset_url: result.asset_url, repo: destRepo };
894
+ }
895
+ catch (err) {
896
+ return reply.status(400).send({ error: err.message ?? 'Could not create entry from asset' });
897
+ }
898
+ });
899
+ // POST /api/repos/:repo/assets/:assetId/move — relocate an asset to another
900
+ // folder. Index-only (the blob key is repo-independent). Requires write
901
+ // access to BOTH the source and target folders. Any indexed row is movable;
902
+ // moveByAssetId normalizes the row to folder ownership of the target, so a
903
+ // legacy entity-owned straggler is repaired by the very move that touches it.
904
+ fastify.post('/api/repos/:repo/assets/:assetId/move', async (req, reply) => {
905
+ const { repo, assetId } = req.params;
906
+ const targetRepo = req.body?.targetRepo;
907
+ const user = req.user;
908
+ if (!targetRepo)
909
+ return reply.status(400).send({ error: 'targetRepo is required' });
910
+ if (!access.canWriteRepo(user, repo, workspaceManager, authService)) {
911
+ return reply.status(404).send({ error: `Folder "${repo}" not found` });
912
+ }
913
+ if (!access.canWriteRepo(user, targetRepo, workspaceManager, authService)) {
914
+ return reply.status(403).send({ error: `Editor access required to move into "${targetRepo}".` });
915
+ }
916
+ const index = workspaceManager.getAssetIndex?.();
917
+ const row = index?.get(assetId);
918
+ if (!index || !row || row.repo !== repo) {
919
+ return reply.status(404).send({ error: 'Asset not found' });
920
+ }
921
+ // Moving OUT of a workspace_wide store reassigns the asset's repo, after
922
+ // which the tighter uploader/owner delete rule no longer applies — so the
923
+ // move itself must honor that rule (mirrors the entity-move guard in
924
+ // graph-api). A no-op for non-workspace_wide sources, so normal
925
+ // folder→folder moves are unaffected.
926
+ const denial = assetDeleteDenialByAssetId(index, workspaceManager.getRepoConfig(repo), user, assetId);
927
+ if (denial)
928
+ return reply.status(403).send({ error: denial });
929
+ if (targetRepo === repo)
930
+ return { success: true }; // no-op
931
+ // Honor the result — a concurrent delete/move could have removed the row
932
+ // between the get() above and here; reporting success then would make the
933
+ // asset appear moved when it wasn't.
934
+ if (!index.moveByAssetId(assetId, targetRepo)) {
935
+ return reply.status(404).send({ error: 'Asset not found' });
936
+ }
937
+ broadcastAssetChange(repo, req, 'moved an asset');
938
+ return { success: true };
939
+ });
194
940
  }
195
941
  //# sourceMappingURL=asset-api.js.map