@seqyuan/annodex 0.1.11 → 0.1.12

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 (519) hide show
  1. package/app/api/agent/[id]/events/route.ts +94 -0
  2. package/app/api/agent/[id]/route.ts +83 -0
  3. package/app/api/agent/new/route.ts +53 -0
  4. package/app/api/auth/all-providers/route.ts +21 -0
  5. package/app/api/auth/api-key/[provider]/route.ts +7 -0
  6. package/app/api/auth/login/[provider]/route.ts +7 -0
  7. package/app/api/auth/login/route.ts +22 -0
  8. package/app/api/auth/logout/[provider]/route.ts +7 -0
  9. package/app/api/auth/providers/route.ts +15 -0
  10. package/app/api/auth/status/route.ts +6 -0
  11. package/app/api/default-cwd/route.ts +22 -0
  12. package/app/api/files/[...path]/route.ts +621 -0
  13. package/app/api/harness/route.ts +47 -0
  14. package/app/api/home/route.ts +6 -0
  15. package/app/api/internal/runtime/route.ts +26 -0
  16. package/app/api/models/route.ts +67 -0
  17. package/app/api/models-config/discover/route.ts +42 -0
  18. package/app/api/models-config/route.ts +152 -0
  19. package/app/api/models-config/test/route.ts +154 -0
  20. package/app/api/projects/browse/route.ts +51 -0
  21. package/app/api/projects/route.ts +83 -0
  22. package/app/api/reports/[id]/route.ts +108 -0
  23. package/app/api/search/route.ts +122 -0
  24. package/app/api/sessions/[id]/context/route.ts +23 -0
  25. package/app/api/sessions/[id]/route.ts +124 -0
  26. package/app/api/sessions/new/route.ts +5 -0
  27. package/app/api/sessions/route.ts +16 -0
  28. package/app/api/settings/route.ts +51 -0
  29. package/app/api/skills/install/route.ts +249 -0
  30. package/app/api/skills/route.ts +161 -0
  31. package/app/api/skills/search/route.ts +121 -0
  32. package/app/api/soul/route.ts +47 -0
  33. package/app/api/version/route.ts +55 -0
  34. package/app/globals.css +736 -0
  35. package/app/layout.tsx +40 -0
  36. package/app/login/page.tsx +133 -0
  37. package/app/page.tsx +10 -0
  38. package/components/AppShell.tsx +1058 -0
  39. package/components/ChatInput.tsx +1103 -0
  40. package/components/ChatMinimap.tsx +381 -0
  41. package/components/ChatWindow.tsx +576 -0
  42. package/components/CodeMirrorEditor.tsx +137 -0
  43. package/components/ConversationSearch.tsx +369 -0
  44. package/components/DataTableViewer.tsx +248 -0
  45. package/components/FileExplorer.tsx +758 -0
  46. package/components/FileIcons.tsx +241 -0
  47. package/components/FileViewer.tsx +1273 -0
  48. package/components/GlobalFileEditor.tsx +98 -0
  49. package/components/MarkdownRenderer.tsx +331 -0
  50. package/components/MermaidDiagram.tsx +80 -0
  51. package/components/MessageView.tsx +1141 -0
  52. package/components/ModelsConfig.tsx +1991 -0
  53. package/components/ProjectContext.tsx +252 -0
  54. package/components/ProjectFolderPicker.tsx +202 -0
  55. package/components/ProjectsConfig.tsx +288 -0
  56. package/components/ProviderIcons.tsx +91 -0
  57. package/components/ReportPanel.tsx +237 -0
  58. package/components/ResizeHandle.tsx +105 -0
  59. package/components/SessionSidebar.tsx +1464 -0
  60. package/components/SettingsDialog.tsx +287 -0
  61. package/components/SkillsConfig.tsx +1093 -0
  62. package/components/SubagentPanel.tsx +191 -0
  63. package/components/TabBar.tsx +115 -0
  64. package/components/ToolPanel.tsx +131 -0
  65. package/components/WidgetRenderer.tsx +505 -0
  66. package/components/viewers/DocumentToolbar.tsx +78 -0
  67. package/components/viewers/DocxViewer.tsx +97 -0
  68. package/components/viewers/PdfViewer.tsx +206 -0
  69. package/components/viewers/PptxViewer.tsx +240 -0
  70. package/components/viewers/XlsxViewer.tsx +143 -0
  71. package/hooks/useAgentSession.ts +710 -0
  72. package/hooks/useAudio.ts +50 -0
  73. package/hooks/useDragDrop.ts +52 -0
  74. package/hooks/useResizable.ts +60 -0
  75. package/hooks/useTheme.ts +85 -0
  76. package/lib/agent-client.ts +39 -0
  77. package/lib/annodex-config.ts +556 -0
  78. package/lib/auth-token.ts +74 -0
  79. package/lib/auth.ts +90 -0
  80. package/lib/brand.ts +5 -0
  81. package/lib/code-theme.ts +32 -0
  82. package/lib/codex-compat-proxy.ts +1603 -0
  83. package/lib/codex-home.ts +6 -0
  84. package/lib/codex-server.ts +796 -0
  85. package/lib/codex-session.ts +590 -0
  86. package/lib/codex-usage.ts +213 -0
  87. package/lib/file-paths.ts +34 -0
  88. package/lib/model-discovery.ts +379 -0
  89. package/lib/normalize.ts +30 -0
  90. package/lib/npx.ts +87 -0
  91. package/lib/pi-types.ts +49 -0
  92. package/lib/projects.ts +269 -0
  93. package/lib/provider-api.ts +88 -0
  94. package/lib/report-prompt.ts +61 -0
  95. package/lib/report-store.ts +597 -0
  96. package/lib/report-update-parser.ts +66 -0
  97. package/lib/rpc-manager.ts +668 -0
  98. package/lib/runtime-state.ts +117 -0
  99. package/lib/session-reader.ts +903 -0
  100. package/lib/session-runtime.ts +105 -0
  101. package/lib/subagent-progress.ts +279 -0
  102. package/lib/types.ts +241 -0
  103. package/lib/widget-export.ts +318 -0
  104. package/lib/widget-guidelines.ts +288 -0
  105. package/lib/widget-prompt.ts +76 -0
  106. package/lib/widget-utils.ts +523 -0
  107. package/package.json +23 -18
  108. package/postcss.config.mjs +8 -0
  109. package/proxy.ts +64 -0
  110. package/scripts/postinstall.cjs +25 -0
  111. package/tsconfig.json +41 -0
  112. package/.next/BUILD_ID +0 -1
  113. package/.next/app-path-routes-manifest.json +0 -39
  114. package/.next/build-manifest.json +0 -20
  115. package/.next/diagnostics/build-diagnostics.json +0 -6
  116. package/.next/diagnostics/framework.json +0 -1
  117. package/.next/export-marker.json +0 -6
  118. package/.next/images-manifest.json +0 -68
  119. package/.next/next-minimal-server.js.nft.json +0 -1
  120. package/.next/next-server.js.nft.json +0 -1
  121. package/.next/package.json +0 -1
  122. package/.next/prerender-manifest.json +0 -109
  123. package/.next/react-loadable-manifest.json +0 -2320
  124. package/.next/required-server-files.js +0 -343
  125. package/.next/required-server-files.json +0 -343
  126. package/.next/routes-manifest.json +0 -286
  127. package/.next/server/app/_global-error/page.js +0 -32
  128. package/.next/server/app/_global-error/page.js.nft.json +0 -1
  129. package/.next/server/app/_global-error/page_client-reference-manifest.js +0 -1
  130. package/.next/server/app/_global-error.html +0 -1
  131. package/.next/server/app/_global-error.meta +0 -16
  132. package/.next/server/app/_global-error.rsc +0 -14
  133. package/.next/server/app/_global-error.segments/_full.segment.rsc +0 -14
  134. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +0 -5
  135. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +0 -5
  136. package/.next/server/app/_global-error.segments/_head.segment.rsc +0 -5
  137. package/.next/server/app/_global-error.segments/_index.segment.rsc +0 -5
  138. package/.next/server/app/_global-error.segments/_tree.segment.rsc +0 -1
  139. package/.next/server/app/_not-found/page.js +0 -2
  140. package/.next/server/app/_not-found/page.js.nft.json +0 -1
  141. package/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  142. package/.next/server/app/_not-found.html +0 -1
  143. package/.next/server/app/_not-found.meta +0 -16
  144. package/.next/server/app/_not-found.rsc +0 -18
  145. package/.next/server/app/_not-found.segments/_full.segment.rsc +0 -18
  146. package/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
  147. package/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
  148. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
  149. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
  150. package/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -4
  151. package/.next/server/app/api/agent/[id]/events/route.js +0 -3
  152. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +0 -1
  153. package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +0 -1
  154. package/.next/server/app/api/agent/[id]/route.js +0 -1
  155. package/.next/server/app/api/agent/[id]/route.js.nft.json +0 -1
  156. package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +0 -1
  157. package/.next/server/app/api/agent/new/route.js +0 -1
  158. package/.next/server/app/api/agent/new/route.js.nft.json +0 -1
  159. package/.next/server/app/api/agent/new/route_client-reference-manifest.js +0 -1
  160. package/.next/server/app/api/auth/all-providers/route.js +0 -1
  161. package/.next/server/app/api/auth/all-providers/route.js.nft.json +0 -1
  162. package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +0 -1
  163. package/.next/server/app/api/auth/api-key/[provider]/route.js +0 -1
  164. package/.next/server/app/api/auth/api-key/[provider]/route.js.nft.json +0 -1
  165. package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +0 -1
  166. package/.next/server/app/api/auth/login/[provider]/route.js +0 -1
  167. package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +0 -1
  168. package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +0 -1
  169. package/.next/server/app/api/auth/login/route.js +0 -1
  170. package/.next/server/app/api/auth/login/route.js.nft.json +0 -1
  171. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +0 -1
  172. package/.next/server/app/api/auth/logout/[provider]/route.js +0 -1
  173. package/.next/server/app/api/auth/logout/[provider]/route.js.nft.json +0 -1
  174. package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +0 -1
  175. package/.next/server/app/api/auth/providers/route.js +0 -1
  176. package/.next/server/app/api/auth/providers/route.js.nft.json +0 -1
  177. package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +0 -1
  178. package/.next/server/app/api/auth/status/route.js +0 -1
  179. package/.next/server/app/api/auth/status/route.js.nft.json +0 -1
  180. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +0 -1
  181. package/.next/server/app/api/default-cwd/route.js +0 -1
  182. package/.next/server/app/api/default-cwd/route.js.nft.json +0 -1
  183. package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +0 -1
  184. package/.next/server/app/api/files/[...path]/route.js +0 -4
  185. package/.next/server/app/api/files/[...path]/route.js.nft.json +0 -1
  186. package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +0 -1
  187. package/.next/server/app/api/harness/route.js +0 -1
  188. package/.next/server/app/api/harness/route.js.nft.json +0 -1
  189. package/.next/server/app/api/harness/route_client-reference-manifest.js +0 -1
  190. package/.next/server/app/api/home/route.js +0 -1
  191. package/.next/server/app/api/home/route.js.nft.json +0 -1
  192. package/.next/server/app/api/home/route_client-reference-manifest.js +0 -1
  193. package/.next/server/app/api/internal/runtime/route.js +0 -1
  194. package/.next/server/app/api/internal/runtime/route.js.nft.json +0 -1
  195. package/.next/server/app/api/internal/runtime/route_client-reference-manifest.js +0 -1
  196. package/.next/server/app/api/models/route.js +0 -1
  197. package/.next/server/app/api/models/route.js.nft.json +0 -1
  198. package/.next/server/app/api/models/route_client-reference-manifest.js +0 -1
  199. package/.next/server/app/api/models-config/discover/route.js +0 -1
  200. package/.next/server/app/api/models-config/discover/route.js.nft.json +0 -1
  201. package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +0 -1
  202. package/.next/server/app/api/models-config/route.js +0 -1
  203. package/.next/server/app/api/models-config/route.js.nft.json +0 -1
  204. package/.next/server/app/api/models-config/route_client-reference-manifest.js +0 -1
  205. package/.next/server/app/api/models-config/test/route.js +0 -1
  206. package/.next/server/app/api/models-config/test/route.js.nft.json +0 -1
  207. package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +0 -1
  208. package/.next/server/app/api/projects/browse/route.js +0 -1
  209. package/.next/server/app/api/projects/browse/route.js.nft.json +0 -1
  210. package/.next/server/app/api/projects/browse/route_client-reference-manifest.js +0 -1
  211. package/.next/server/app/api/projects/route.js +0 -1
  212. package/.next/server/app/api/projects/route.js.nft.json +0 -1
  213. package/.next/server/app/api/projects/route_client-reference-manifest.js +0 -1
  214. package/.next/server/app/api/reports/[id]/route.js +0 -10
  215. package/.next/server/app/api/reports/[id]/route.js.nft.json +0 -1
  216. package/.next/server/app/api/reports/[id]/route_client-reference-manifest.js +0 -1
  217. package/.next/server/app/api/search/route.js +0 -1
  218. package/.next/server/app/api/search/route.js.nft.json +0 -1
  219. package/.next/server/app/api/search/route_client-reference-manifest.js +0 -1
  220. package/.next/server/app/api/sessions/[id]/context/route.js +0 -1
  221. package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +0 -1
  222. package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +0 -1
  223. package/.next/server/app/api/sessions/[id]/route.js +0 -1
  224. package/.next/server/app/api/sessions/[id]/route.js.nft.json +0 -1
  225. package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +0 -1
  226. package/.next/server/app/api/sessions/new/route.js +0 -1
  227. package/.next/server/app/api/sessions/new/route.js.nft.json +0 -1
  228. package/.next/server/app/api/sessions/new/route_client-reference-manifest.js +0 -1
  229. package/.next/server/app/api/sessions/route.js +0 -1
  230. package/.next/server/app/api/sessions/route.js.nft.json +0 -1
  231. package/.next/server/app/api/sessions/route_client-reference-manifest.js +0 -1
  232. package/.next/server/app/api/settings/route.js +0 -1
  233. package/.next/server/app/api/settings/route.js.nft.json +0 -1
  234. package/.next/server/app/api/settings/route_client-reference-manifest.js +0 -1
  235. package/.next/server/app/api/skills/install/route.js +0 -5
  236. package/.next/server/app/api/skills/install/route.js.nft.json +0 -1
  237. package/.next/server/app/api/skills/install/route_client-reference-manifest.js +0 -1
  238. package/.next/server/app/api/skills/route.js +0 -6
  239. package/.next/server/app/api/skills/route.js.nft.json +0 -1
  240. package/.next/server/app/api/skills/route_client-reference-manifest.js +0 -1
  241. package/.next/server/app/api/skills/search/route.js +0 -1
  242. package/.next/server/app/api/skills/search/route.js.nft.json +0 -1
  243. package/.next/server/app/api/skills/search/route_client-reference-manifest.js +0 -1
  244. package/.next/server/app/api/soul/route.js +0 -1
  245. package/.next/server/app/api/soul/route.js.nft.json +0 -1
  246. package/.next/server/app/api/soul/route_client-reference-manifest.js +0 -1
  247. package/.next/server/app/api/version/route.js +0 -1
  248. package/.next/server/app/api/version/route.js.nft.json +0 -1
  249. package/.next/server/app/api/version/route_client-reference-manifest.js +0 -1
  250. package/.next/server/app/index.html +0 -1
  251. package/.next/server/app/index.meta +0 -14
  252. package/.next/server/app/index.rsc +0 -17
  253. package/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -6
  254. package/.next/server/app/index.segments/_full.segment.rsc +0 -17
  255. package/.next/server/app/index.segments/_head.segment.rsc +0 -6
  256. package/.next/server/app/index.segments/_index.segment.rsc +0 -5
  257. package/.next/server/app/index.segments/_tree.segment.rsc +0 -4
  258. package/.next/server/app/login/page.js +0 -2
  259. package/.next/server/app/login/page.js.nft.json +0 -1
  260. package/.next/server/app/login/page_client-reference-manifest.js +0 -1
  261. package/.next/server/app/login.html +0 -1
  262. package/.next/server/app/login.meta +0 -15
  263. package/.next/server/app/login.rsc +0 -22
  264. package/.next/server/app/login.segments/_full.segment.rsc +0 -22
  265. package/.next/server/app/login.segments/_head.segment.rsc +0 -6
  266. package/.next/server/app/login.segments/_index.segment.rsc +0 -5
  267. package/.next/server/app/login.segments/_tree.segment.rsc +0 -4
  268. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +0 -9
  269. package/.next/server/app/login.segments/login.segment.rsc +0 -5
  270. package/.next/server/app/page.js +0 -261
  271. package/.next/server/app/page.js.nft.json +0 -1
  272. package/.next/server/app/page_client-reference-manifest.js +0 -1
  273. package/.next/server/app-paths-manifest.json +0 -39
  274. package/.next/server/chunks/1048.js +0 -1
  275. package/.next/server/chunks/1367.js +0 -77
  276. package/.next/server/chunks/1381.js +0 -1
  277. package/.next/server/chunks/165.js +0 -1
  278. package/.next/server/chunks/1681.js +0 -215
  279. package/.next/server/chunks/1688.js +0 -45
  280. package/.next/server/chunks/1703.js +0 -79
  281. package/.next/server/chunks/1712.js +0 -43
  282. package/.next/server/chunks/1813.js +0 -1
  283. package/.next/server/chunks/2325.js +0 -80
  284. package/.next/server/chunks/258.js +0 -1
  285. package/.next/server/chunks/2671.js +0 -287
  286. package/.next/server/chunks/2778.js +0 -1
  287. package/.next/server/chunks/2943.js +0 -1
  288. package/.next/server/chunks/3031.js +0 -226
  289. package/.next/server/chunks/3181.js +0 -1
  290. package/.next/server/chunks/3493.js +0 -1
  291. package/.next/server/chunks/3672.js +0 -1
  292. package/.next/server/chunks/3701.js +0 -104
  293. package/.next/server/chunks/4013.js +0 -1
  294. package/.next/server/chunks/402.js +0 -2
  295. package/.next/server/chunks/4035.js +0 -80
  296. package/.next/server/chunks/4248.js +0 -153
  297. package/.next/server/chunks/4367.js +0 -1
  298. package/.next/server/chunks/4406.js +0 -141
  299. package/.next/server/chunks/4741.js +0 -18
  300. package/.next/server/chunks/4768.js +0 -1
  301. package/.next/server/chunks/4858.js +0 -148
  302. package/.next/server/chunks/4980.js +0 -1
  303. package/.next/server/chunks/5155.js +0 -5
  304. package/.next/server/chunks/5293.js +0 -166
  305. package/.next/server/chunks/5399.js +0 -8
  306. package/.next/server/chunks/5409.js +0 -1
  307. package/.next/server/chunks/5797.js +0 -93
  308. package/.next/server/chunks/5851.js +0 -36
  309. package/.next/server/chunks/6206.js +0 -1
  310. package/.next/server/chunks/6296.js +0 -1
  311. package/.next/server/chunks/63.js +0 -45
  312. package/.next/server/chunks/6346.js +0 -1
  313. package/.next/server/chunks/6406.js +0 -23
  314. package/.next/server/chunks/642.js +0 -1
  315. package/.next/server/chunks/6429.js +0 -50
  316. package/.next/server/chunks/6729.js +0 -64
  317. package/.next/server/chunks/6907.js +0 -115
  318. package/.next/server/chunks/6980.js +0 -1
  319. package/.next/server/chunks/7073.js +0 -24
  320. package/.next/server/chunks/7233.js +0 -24
  321. package/.next/server/chunks/7307.js +0 -1
  322. package/.next/server/chunks/7362.js +0 -9
  323. package/.next/server/chunks/7567.js +0 -29
  324. package/.next/server/chunks/7765.js +0 -1
  325. package/.next/server/chunks/7890.js +0 -1
  326. package/.next/server/chunks/8065.js +0 -1
  327. package/.next/server/chunks/8238.js +0 -34
  328. package/.next/server/chunks/8276.js +0 -1
  329. package/.next/server/chunks/8336.js +0 -1
  330. package/.next/server/chunks/8477.js +0 -3
  331. package/.next/server/chunks/8490.js +0 -1
  332. package/.next/server/chunks/8916.js +0 -1
  333. package/.next/server/chunks/9280.js +0 -252
  334. package/.next/server/chunks/9315.js +0 -1
  335. package/.next/server/chunks/9537.js +0 -90
  336. package/.next/server/chunks/966.js +0 -1
  337. package/.next/server/chunks/9818.js +0 -21
  338. package/.next/server/chunks/static/media/pdf.worker.min.c476e1a0.mjs +0 -6
  339. package/.next/server/functions-config-manifest.json +0 -16
  340. package/.next/server/interception-route-rewrite-manifest.js +0 -1
  341. package/.next/server/middleware-build-manifest.js +0 -1
  342. package/.next/server/middleware-manifest.json +0 -6
  343. package/.next/server/middleware-react-loadable-manifest.js +0 -1
  344. package/.next/server/middleware.js +0 -18
  345. package/.next/server/middleware.js.nft.json +0 -1
  346. package/.next/server/next-font-manifest.js +0 -1
  347. package/.next/server/next-font-manifest.json +0 -1
  348. package/.next/server/pages/404.html +0 -1
  349. package/.next/server/pages/500.html +0 -1
  350. package/.next/server/pages-manifest.json +0 -4
  351. package/.next/server/prefetch-hints.json +0 -1
  352. package/.next/server/server-reference-manifest.js +0 -1
  353. package/.next/server/server-reference-manifest.json +0 -1
  354. package/.next/server/webpack-runtime.js +0 -1
  355. package/.next/static/chunks/0b9a0da7.9075af772487e743.js +0 -62
  356. package/.next/static/chunks/1413.922d232de90c0c41.js +0 -115
  357. package/.next/static/chunks/1643.467a526a1f24f54d.js +0 -24
  358. package/.next/static/chunks/1852.5543122f11aa7fed.js +0 -1
  359. package/.next/static/chunks/1960.b1e26436d7a5f586.js +0 -1
  360. package/.next/static/chunks/2170a4aa.4213bb2183c9cdf9.js +0 -1
  361. package/.next/static/chunks/2274.6cd173f80a1405a2.js +0 -21
  362. package/.next/static/chunks/2419.347fdfe3c170854d.js +0 -166
  363. package/.next/static/chunks/2619.9aac8983f30c7c8a.js +0 -1
  364. package/.next/static/chunks/2623.d20fabd8e18197c6.js +0 -287
  365. package/.next/static/chunks/2729.f5365061a849d659.js +0 -34
  366. package/.next/static/chunks/2821.934bcf60fbdc28c6.js +0 -1
  367. package/.next/static/chunks/2918becc.abff2ece1de37bc1.js +0 -153
  368. package/.next/static/chunks/2947.114e51cb06d1c01a.js +0 -23
  369. package/.next/static/chunks/3079.4c511fa1144e3adf.js +0 -79
  370. package/.next/static/chunks/3274.208ca44844cd7d95.js +0 -148
  371. package/.next/static/chunks/3308.465a94263d04bfea.js +0 -73
  372. package/.next/static/chunks/3325.e4bfe1ca657f3b5b.js +0 -80
  373. package/.next/static/chunks/3506.2a7eaa08b9f55337.js +0 -90
  374. package/.next/static/chunks/363642f4-043c1475ab9af70e.js +0 -1
  375. package/.next/static/chunks/3794-123fdf632563f469.js +0 -32
  376. package/.next/static/chunks/3837.a755ccfe6f9c1c1c.js +0 -5
  377. package/.next/static/chunks/394.91597771688df6d0.js +0 -1
  378. package/.next/static/chunks/3997.1009c06025691712.js +0 -1
  379. package/.next/static/chunks/4453.91a357dc43c21745.js +0 -1
  380. package/.next/static/chunks/4491.44fdf20580ac72bd.js +0 -24
  381. package/.next/static/chunks/4829.cf1d50e43e6d9db5.js +0 -1
  382. package/.next/static/chunks/498.fe1d9da9ecad6c36.js +0 -1
  383. package/.next/static/chunks/4bd1b696-e356ca5ba0218e27.js +0 -1
  384. package/.next/static/chunks/5019.b5a1a2b8daf17525.js +0 -1
  385. package/.next/static/chunks/5034.8f16c3fa3ce75411.js +0 -1
  386. package/.next/static/chunks/5074.d16651da01ec4e02.js +0 -1
  387. package/.next/static/chunks/51fb665c.0950e1b79671348d.js +0 -45
  388. package/.next/static/chunks/532.5956ed631aff722b.js +0 -9
  389. package/.next/static/chunks/5326.69460442bdcd6cd3.js +0 -1
  390. package/.next/static/chunks/5403.ff110bf5bf600758.js +0 -64
  391. package/.next/static/chunks/547.902a733488cfe3f7.js +0 -77
  392. package/.next/static/chunks/5567.540d7fc108ad6ee5.js +0 -215
  393. package/.next/static/chunks/5590.ef62922166d308b4.js +0 -1
  394. package/.next/static/chunks/5690.9d6eb1edb1399995.js +0 -1
  395. package/.next/static/chunks/5749.25faee4a1e55b854.js +0 -226
  396. package/.next/static/chunks/58bb9007.1ccb6bba34b4c635.js +0 -80
  397. package/.next/static/chunks/6121.f3f43f1896ea0cd9.js +0 -1
  398. package/.next/static/chunks/6600.583c88eef37aa524.js +0 -1
  399. package/.next/static/chunks/6696.a41aec266e657d54.js +0 -141
  400. package/.next/static/chunks/6922.42148793782d2fe7.js +0 -1
  401. package/.next/static/chunks/7006.e191611ffc2b9528.js +0 -43
  402. package/.next/static/chunks/7343.9fbb58204d8ac681.js +0 -1
  403. package/.next/static/chunks/73972abe.25a4cffa03b2bcef.js +0 -119
  404. package/.next/static/chunks/7547.58bda8a2aabba0d4.js +0 -93
  405. package/.next/static/chunks/7648.4ae2f183b4db0353.js +0 -1
  406. package/.next/static/chunks/7874.8db6929b94cdf697.js +0 -1
  407. package/.next/static/chunks/7959.1f20a35df316216a.js +0 -104
  408. package/.next/static/chunks/83.85d62d7fc9850b75.js +0 -29
  409. package/.next/static/chunks/8436.cab94b59cca0a8ff.js +0 -1
  410. package/.next/static/chunks/8451.ff6ff72b57dc52e1.js +0 -1
  411. package/.next/static/chunks/8489.45f22859734f514f.js +0 -36
  412. package/.next/static/chunks/8568.f85d8b36fc9a9037.js +0 -1
  413. package/.next/static/chunks/8771-3e14b6810486df1f.js +0 -1
  414. package/.next/static/chunks/8863.be51033a67436277.js +0 -1
  415. package/.next/static/chunks/90542734.dc1a2723e4f6affb.js +0 -1
  416. package/.next/static/chunks/9500.1488aec06ee78127.js +0 -1
  417. package/.next/static/chunks/9633.155548b5fca6e580.js +0 -1
  418. package/.next/static/chunks/9779.673004a62d70e36a.js +0 -1
  419. package/.next/static/chunks/app/_global-error/page-cc518af6b1ffb191.js +0 -1
  420. package/.next/static/chunks/app/_not-found/page-c72daab99269beff.js +0 -1
  421. package/.next/static/chunks/app/api/agent/[id]/events/route-cc518af6b1ffb191.js +0 -1
  422. package/.next/static/chunks/app/api/agent/[id]/route-cc518af6b1ffb191.js +0 -1
  423. package/.next/static/chunks/app/api/agent/new/route-cc518af6b1ffb191.js +0 -1
  424. package/.next/static/chunks/app/api/auth/all-providers/route-cc518af6b1ffb191.js +0 -1
  425. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-cc518af6b1ffb191.js +0 -1
  426. package/.next/static/chunks/app/api/auth/login/[provider]/route-cc518af6b1ffb191.js +0 -1
  427. package/.next/static/chunks/app/api/auth/login/route-cc518af6b1ffb191.js +0 -1
  428. package/.next/static/chunks/app/api/auth/logout/[provider]/route-cc518af6b1ffb191.js +0 -1
  429. package/.next/static/chunks/app/api/auth/providers/route-cc518af6b1ffb191.js +0 -1
  430. package/.next/static/chunks/app/api/auth/status/route-cc518af6b1ffb191.js +0 -1
  431. package/.next/static/chunks/app/api/default-cwd/route-cc518af6b1ffb191.js +0 -1
  432. package/.next/static/chunks/app/api/files/[...path]/route-cc518af6b1ffb191.js +0 -1
  433. package/.next/static/chunks/app/api/harness/route-cc518af6b1ffb191.js +0 -1
  434. package/.next/static/chunks/app/api/home/route-cc518af6b1ffb191.js +0 -1
  435. package/.next/static/chunks/app/api/internal/runtime/route-cc518af6b1ffb191.js +0 -1
  436. package/.next/static/chunks/app/api/models/route-cc518af6b1ffb191.js +0 -1
  437. package/.next/static/chunks/app/api/models-config/discover/route-cc518af6b1ffb191.js +0 -1
  438. package/.next/static/chunks/app/api/models-config/route-cc518af6b1ffb191.js +0 -1
  439. package/.next/static/chunks/app/api/models-config/test/route-cc518af6b1ffb191.js +0 -1
  440. package/.next/static/chunks/app/api/projects/browse/route-cc518af6b1ffb191.js +0 -1
  441. package/.next/static/chunks/app/api/projects/route-cc518af6b1ffb191.js +0 -1
  442. package/.next/static/chunks/app/api/reports/[id]/route-cc518af6b1ffb191.js +0 -1
  443. package/.next/static/chunks/app/api/search/route-cc518af6b1ffb191.js +0 -1
  444. package/.next/static/chunks/app/api/sessions/[id]/context/route-cc518af6b1ffb191.js +0 -1
  445. package/.next/static/chunks/app/api/sessions/[id]/route-cc518af6b1ffb191.js +0 -1
  446. package/.next/static/chunks/app/api/sessions/new/route-cc518af6b1ffb191.js +0 -1
  447. package/.next/static/chunks/app/api/sessions/route-cc518af6b1ffb191.js +0 -1
  448. package/.next/static/chunks/app/api/settings/route-cc518af6b1ffb191.js +0 -1
  449. package/.next/static/chunks/app/api/skills/install/route-cc518af6b1ffb191.js +0 -1
  450. package/.next/static/chunks/app/api/skills/route-cc518af6b1ffb191.js +0 -1
  451. package/.next/static/chunks/app/api/skills/search/route-cc518af6b1ffb191.js +0 -1
  452. package/.next/static/chunks/app/api/soul/route-cc518af6b1ffb191.js +0 -1
  453. package/.next/static/chunks/app/api/version/route-cc518af6b1ffb191.js +0 -1
  454. package/.next/static/chunks/app/layout-be148b7ae915b22a.js +0 -1
  455. package/.next/static/chunks/app/login/page-ebf0e6de99062783.js +0 -1
  456. package/.next/static/chunks/app/page-a4bfb7d711561cb3.js +0 -260
  457. package/.next/static/chunks/d3ac728e.7964f816a1ca64e5.js +0 -1
  458. package/.next/static/chunks/framework-711ef29bc66f648c.js +0 -1
  459. package/.next/static/chunks/main-app-45a0f19af99d61b6.js +0 -1
  460. package/.next/static/chunks/main-f74964b7ae52493e.js +0 -5
  461. package/.next/static/chunks/next/dist/client/components/builtin/app-error-cc518af6b1ffb191.js +0 -1
  462. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-cc518af6b1ffb191.js +0 -1
  463. package/.next/static/chunks/next/dist/client/components/builtin/global-error-9bfa08b9491621f2.js +0 -1
  464. package/.next/static/chunks/next/dist/client/components/builtin/not-found-cc518af6b1ffb191.js +0 -1
  465. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-cc518af6b1ffb191.js +0 -1
  466. package/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  467. package/.next/static/chunks/webpack-fcf4a889ecbd753c.js +0 -1
  468. package/.next/static/css/45029451a1d7255d.css +0 -3
  469. package/.next/static/lFCcFmLd1ThQXTFUP6olh/_buildManifest.js +0 -1
  470. package/.next/static/lFCcFmLd1ThQXTFUP6olh/_ssgManifest.js +0 -1
  471. package/.next/static/media/15605e25b523335c-s.woff2 +0 -0
  472. package/.next/static/media/1a3dce5cfb5f7760-s.woff2 +0 -0
  473. package/.next/static/media/1cdd02902f937a18-s.woff2 +0 -0
  474. package/.next/static/media/4c4b3b30b6bcb2be-s.woff2 +0 -0
  475. package/.next/static/media/641a7b8a5800ee0e-s.woff2 +0 -0
  476. package/.next/static/media/7deddc85b7ffd1dc-s.p.woff2 +0 -0
  477. package/.next/static/media/ec14413c594b3356-s.p.woff2 +0 -0
  478. package/.next/static/media/pdf.worker.min.29aaf158.mjs +0 -6
  479. package/.next/trace +0 -74
  480. package/.next/trace-build +0 -1
  481. package/.next/types/app/api/agent/[id]/events/route.ts +0 -351
  482. package/.next/types/app/api/agent/[id]/route.ts +0 -351
  483. package/.next/types/app/api/agent/new/route.ts +0 -351
  484. package/.next/types/app/api/auth/all-providers/route.ts +0 -351
  485. package/.next/types/app/api/auth/api-key/[provider]/route.ts +0 -351
  486. package/.next/types/app/api/auth/login/[provider]/route.ts +0 -351
  487. package/.next/types/app/api/auth/login/route.ts +0 -351
  488. package/.next/types/app/api/auth/logout/[provider]/route.ts +0 -351
  489. package/.next/types/app/api/auth/providers/route.ts +0 -351
  490. package/.next/types/app/api/auth/status/route.ts +0 -351
  491. package/.next/types/app/api/default-cwd/route.ts +0 -351
  492. package/.next/types/app/api/files/[...path]/route.ts +0 -351
  493. package/.next/types/app/api/harness/route.ts +0 -351
  494. package/.next/types/app/api/home/route.ts +0 -351
  495. package/.next/types/app/api/internal/runtime/route.ts +0 -351
  496. package/.next/types/app/api/models/route.ts +0 -351
  497. package/.next/types/app/api/models-config/discover/route.ts +0 -351
  498. package/.next/types/app/api/models-config/route.ts +0 -351
  499. package/.next/types/app/api/models-config/test/route.ts +0 -351
  500. package/.next/types/app/api/projects/browse/route.ts +0 -351
  501. package/.next/types/app/api/projects/route.ts +0 -351
  502. package/.next/types/app/api/reports/[id]/route.ts +0 -351
  503. package/.next/types/app/api/search/route.ts +0 -351
  504. package/.next/types/app/api/sessions/[id]/context/route.ts +0 -351
  505. package/.next/types/app/api/sessions/[id]/route.ts +0 -351
  506. package/.next/types/app/api/sessions/new/route.ts +0 -351
  507. package/.next/types/app/api/sessions/route.ts +0 -351
  508. package/.next/types/app/api/settings/route.ts +0 -351
  509. package/.next/types/app/api/skills/install/route.ts +0 -351
  510. package/.next/types/app/api/skills/route.ts +0 -351
  511. package/.next/types/app/api/skills/search/route.ts +0 -351
  512. package/.next/types/app/api/soul/route.ts +0 -351
  513. package/.next/types/app/api/version/route.ts +0 -351
  514. package/.next/types/app/layout.ts +0 -87
  515. package/.next/types/app/login/page.ts +0 -87
  516. package/.next/types/app/page.ts +0 -87
  517. package/.next/types/package.json +0 -1
  518. package/.next/types/routes.d.ts +0 -106
  519. package/.next/types/validator.ts +0 -376
@@ -0,0 +1,76 @@
1
+ export const WIDGET_SYSTEM_PROMPT = `<widget-capability>
2
+ You can create interactive visualizations using the \`show-widget\` code fence.
3
+
4
+ Use \`show-widget\` by default when visual output is the primary answer. This includes charts, diagrams, flowcharts, dashboards, UI prototypes, mockups, SVG illustrations, icons, logos, infographics, timelines, hierarchies, comparison views, and visual explanations.
5
+
6
+ For diagrams, flowcharts, architecture maps, sequence-style explanations, and Markdown-to-diagram requests, prefer \`show-widget\` with SVG/HTML over Mermaid. Widgets stream more reliably in this UI. Use Mermaid only when the user explicitly asks for Mermaid source, raw Mermaid, raw Markdown, or a saved Mermaid/Markdown file.
7
+
8
+ Format:
9
+ \`\`\`show-widget
10
+ {"title":"Human-readable title","widget_code":"<raw HTML/SVG string>"}
11
+ \`\`\`
12
+
13
+ Detailed specs:
14
+ When a \`<widget-guidelines>\` block is present, follow it. It contains the module-specific design rules for the current request.
15
+
16
+ Required rules:
17
+ 1. \`widget_code\` is a JSON string: escape quotes and newlines. Always close the JSON object and fence.
18
+ 2. Do not include DOCTYPE, html, head, body, iframe, object, embed, form, link, base, or meta tags.
19
+ 3. Keep outer backgrounds transparent. The host supplies theme variables.
20
+ 4. Use a single concise widget per fence. For multiple widgets, interleave prose and use a separate \`show-widget\` fence for each widget.
21
+ 5. Streaming order: SVG puts \`<defs>\` before visible shapes; HTML uses \`<style>\`, then visible markup, then \`<script>\` last.
22
+ 6. Prefer responsive SVG for static visuals and small HTML widgets for controls.
23
+ 7. SVG widgets use \`<svg width="100%" viewBox="0 0 680 H">\` and keep all content inside the viewBox.
24
+ 8. Interactive controls must visibly update the output. For Chart.js, call \`chart.update()\` after changes.
25
+ 9. Clickable drill-down actions call \`window.__widgetSendMessage("short request")\`.
26
+ 10. Cross-widget filters publish with \`window.__widgetPublish("topic", { key: "value" })\`; other widgets listen for \`widget-filter\`.
27
+ 11. Allowed CDN hosts: \`cdnjs.cloudflare.com\`, \`cdn.jsdelivr.net\`, \`unpkg.com\`, \`esm.sh\`.
28
+ 12. CDN scripts must use an \`onload\` initializer plus an \`if (window.Lib) init();\` fallback.
29
+ 13. Use \`min-height\` instead of fixed outer \`height\` to prevent clipping.
30
+ 14. Title should be human-readable in the user's language.
31
+ 15. Put explanatory prose outside the code fence.
32
+ 16. Do not output raw \`\`\`svg, \`\`\`html, or plain Mermaid for visual answers unless the user explicitly asks for source code, raw Markdown, raw Mermaid, or a saved file.
33
+ 17. Do not convert Markdown outlines into Mermaid by default. Render them as a \`show-widget\` diagram unless Mermaid/source text is explicitly requested.
34
+ </widget-capability>`;
35
+
36
+ const WIDGET_BLOCK_PATTERN = /\n?\s*<widget-capability>[\s\S]*?<\/widget-capability>\s*/g;
37
+ const HARNESS_BLOCK_PATTERN = /\n?\s*<visualization_harness>[\s\S]*?<\/visualization_harness>\s*/g;
38
+ const GUIDELINES_BLOCK_PATTERN = /\n?\s*<widget-guidelines\b[^>]*>[\s\S]*?<\/widget-guidelines>\s*/g;
39
+
40
+ export function isVisualizationHarness(content: string): boolean {
41
+ const normalized = content.toLowerCase();
42
+ return normalized.includes("show-widget")
43
+ && (normalized.includes("# visualization harness")
44
+ || normalized.includes("## when to visualize")
45
+ || normalized.includes("widget format"));
46
+ }
47
+
48
+ export function hasVisualizationIntent(message: string): boolean {
49
+ const normalized = message.toLowerCase();
50
+ return /\b(chart|plot|graph|visuali[sz]e|diagram|flowchart|timeline|dashboard|prototype|mockup|wireframe|heatmap|scatter|histogram|tree map|treemap|svg|icon|logo|infographic|comparison|hierarchy|interactive ui|generative ui)\b/.test(normalized)
51
+ || /图表|画图|绘图|可视化|流程图|架构图|时序图|原型图|交互式|仪表盘|看板|热图|散点图|折线图|柱状图|饼图|雷达图|网络图|桑基图|甘特图|图标|标志|logo|信息图|对比|层级|单细胞.*流程/.test(message);
52
+ }
53
+
54
+ export function stripWidgetPromptBlocks(systemPrompt: string): string {
55
+ return systemPrompt
56
+ .replace(WIDGET_BLOCK_PATTERN, "\n")
57
+ .replace(HARNESS_BLOCK_PATTERN, "\n")
58
+ .replace(GUIDELINES_BLOCK_PATTERN, "\n")
59
+ .replace(/\n{3,}/g, "\n\n")
60
+ .trim();
61
+ }
62
+
63
+ export function withWidgetCapabilityPrompt(systemPrompt: string): string {
64
+ if (systemPrompt.includes("<widget-capability>")) return systemPrompt;
65
+ return systemPrompt.trim()
66
+ ? `${WIDGET_SYSTEM_PROMPT}\n\n${systemPrompt}`
67
+ : WIDGET_SYSTEM_PROMPT;
68
+ }
69
+
70
+ export function withVisualizationHarness(systemPrompt: string, harness: string): string {
71
+ const content = harness.trim();
72
+ if (!content || systemPrompt.includes("<visualization_harness>")) return systemPrompt;
73
+ return systemPrompt.trim()
74
+ ? `${systemPrompt.trimEnd()}\n\n<visualization_harness>\n${content}\n</visualization_harness>`
75
+ : `<visualization_harness>\n${content}\n</visualization_harness>`;
76
+ }
@@ -0,0 +1,523 @@
1
+ export interface TextSegment {
2
+ type: "text";
3
+ content: string;
4
+ }
5
+
6
+ export interface WidgetSegment {
7
+ type: "widget";
8
+ title?: string;
9
+ code: string;
10
+ partial?: boolean;
11
+ showOverlay?: boolean;
12
+ }
13
+
14
+ export type ContentSegment = TextSegment | WidgetSegment;
15
+
16
+ /**
17
+ * Parse show-widget fences from markdown text. The parser is deliberately
18
+ * tolerant because streamed model output often contains incomplete fences or
19
+ * partial JSON while the widget is still being generated.
20
+ */
21
+ export function parseShowWidgets(text: string): ContentSegment[] {
22
+ const segments: ContentSegment[] = [];
23
+ const markerRegex = /`{1,3}show-widget`{0,3}\s*(?:\n\s*`{3}(?:json|html)?\s*)?\n?/g;
24
+ let lastIndex = 0;
25
+ let match: RegExpExecArray | null;
26
+ let sawMarker = false;
27
+
28
+ while ((match = markerRegex.exec(text)) !== null) {
29
+ sawMarker = true;
30
+ const before = text.slice(lastIndex, match.index).trim();
31
+ if (before) segments.push({ type: "text", content: before });
32
+
33
+ const afterMarker = match.index + match[0].length;
34
+ const fenceClose = text.indexOf("```", afterMarker);
35
+ const jsonStart = text.indexOf("{", afterMarker);
36
+ const hasNearbyJson =
37
+ jsonStart !== -1 &&
38
+ jsonStart <= afterMarker + 200 &&
39
+ (fenceClose === -1 || jsonStart < fenceClose);
40
+
41
+ if (hasNearbyJson) {
42
+ const jsonEnd = findJsonEnd(text, jsonStart);
43
+ if (jsonEnd === -1) {
44
+ const partial = extractTruncatedWidget(text.slice(jsonStart));
45
+ if (partial) segments.push({ type: "widget", ...partial, partial: true });
46
+ lastIndex = text.length;
47
+ break;
48
+ }
49
+
50
+ const parsed = parseWidgetContent(text.slice(jsonStart, jsonEnd + 1).trim());
51
+ if (parsed) segments.push({ type: "widget", ...parsed });
52
+
53
+ let endPos = jsonEnd + 1;
54
+ const trailingFence = text.slice(endPos, endPos + 16).match(/^\s*\n?`{1,3}\s*/);
55
+ if (trailingFence) endPos += trailingFence[0].length;
56
+ lastIndex = endPos;
57
+ markerRegex.lastIndex = endPos;
58
+ continue;
59
+ }
60
+
61
+ if (fenceClose !== -1) {
62
+ const raw = text.slice(afterMarker, fenceClose).trim();
63
+ const parsed = parseWidgetContent(raw);
64
+ if (parsed) {
65
+ segments.push({ type: "widget", ...parsed });
66
+ } else if (raw) {
67
+ segments.push({ type: "text", content: raw });
68
+ }
69
+ lastIndex = fenceClose + 3;
70
+ markerRegex.lastIndex = lastIndex;
71
+ } else {
72
+ const raw = text.slice(afterMarker).trim();
73
+ const parsed = parseWidgetContent(raw);
74
+ if (parsed) {
75
+ const truncated = truncateUnclosedScript(parsed.code);
76
+ segments.push({
77
+ type: "widget",
78
+ title: parsed.title,
79
+ code: truncated.code,
80
+ partial: true,
81
+ showOverlay: truncated.truncated,
82
+ });
83
+ }
84
+ lastIndex = text.length;
85
+ break;
86
+ }
87
+ }
88
+
89
+ const after = text.slice(lastIndex).trim();
90
+ if (after) segments.push({ type: "text", content: after });
91
+
92
+ if (!sawMarker && segments.length === 0 && text.trim()) {
93
+ segments.push({ type: "text", content: text });
94
+ }
95
+
96
+ return segments;
97
+ }
98
+
99
+ function parseWidgetContent(raw: string): { title?: string; code: string } | null {
100
+ if (raw.startsWith("{")) {
101
+ if (!raw.endsWith("}")) return null;
102
+ try {
103
+ const obj = JSON.parse(raw) as { title?: string; widget_code?: string; code?: string };
104
+ const code = obj.widget_code ?? obj.code;
105
+ if (code) {
106
+ return { title: obj.title, code };
107
+ }
108
+ } catch {
109
+ return null;
110
+ }
111
+ }
112
+
113
+ if (/<(!DOCTYPE|html|svg|canvas|script|style|div)/i.test(raw)) {
114
+ return { code: raw };
115
+ }
116
+
117
+ return null;
118
+ }
119
+
120
+ function findJsonEnd(text: string, start: number): number {
121
+ let depth = 0;
122
+ let inString = false;
123
+ let escaped = false;
124
+ for (let i = start; i < text.length; i++) {
125
+ const ch = text[i];
126
+ if (escaped) {
127
+ escaped = false;
128
+ continue;
129
+ }
130
+ if (ch === "\\" && inString) {
131
+ escaped = true;
132
+ continue;
133
+ }
134
+ if (ch === "\"") {
135
+ inString = !inString;
136
+ continue;
137
+ }
138
+ if (inString) continue;
139
+ if (ch === "{") depth++;
140
+ if (ch === "}") {
141
+ depth--;
142
+ if (depth === 0) return i;
143
+ }
144
+ }
145
+ return -1;
146
+ }
147
+
148
+ function extractTruncatedWidget(fenceBody: string): { title?: string; code: string; showOverlay?: boolean } | null {
149
+ try {
150
+ const parsed = parseWidgetContent(fenceBody);
151
+ if (parsed) return parsed;
152
+ } catch {
153
+ // Expected for partial JSON.
154
+ }
155
+
156
+ const keyIdx = fenceBody.indexOf("\"widget_code\"");
157
+ if (keyIdx === -1) return null;
158
+ const colonIdx = fenceBody.indexOf(":", keyIdx + 13);
159
+ if (colonIdx === -1) return null;
160
+ const quoteIdx = fenceBody.indexOf("\"", colonIdx + 1);
161
+ if (quoteIdx === -1) return null;
162
+
163
+ let raw = fenceBody.slice(quoteIdx + 1);
164
+ raw = raw.replace(/"\s*\}\s*$/, "");
165
+ if (raw.endsWith("\\")) raw = raw.slice(0, -1);
166
+
167
+ const title = fenceBody.match(/"title"\s*:\s*"([^"]*?)"/)?.[1];
168
+ const code = raw
169
+ .replace(/\\\\/g, "\x00BACKSLASH\x00")
170
+ .replace(/\\n/g, "\n")
171
+ .replace(/\\t/g, "\t")
172
+ .replace(/\\r/g, "\r")
173
+ .replace(/\\"/g, "\"")
174
+ .replace(/\\u([0-9a-fA-F]{4})/g, (_m, hex: string) => String.fromCharCode(parseInt(hex, 16)))
175
+ .replace(/\x00BACKSLASH\x00/g, "\\");
176
+
177
+ const truncated = truncateUnclosedScript(code);
178
+ if (!truncated.code.trim()) return null;
179
+ return { title, code: truncated.code, showOverlay: truncated.truncated };
180
+ }
181
+
182
+ function truncateUnclosedScript(code: string): { code: string; truncated: boolean } {
183
+ const lastScript = code.lastIndexOf("<script");
184
+ if (lastScript === -1) return { code, truncated: false };
185
+ const afterScript = code.slice(lastScript);
186
+ if (/<script[\s\S]*?<\/script>/i.test(afterScript)) {
187
+ return { code, truncated: false };
188
+ }
189
+ return { code: code.slice(0, lastScript).trim(), truncated: true };
190
+ }
191
+
192
+ /**
193
+ * Check if text contains any show-widget fences (including partial ones during streaming).
194
+ */
195
+ export function hasWidgetFence(text: string): boolean {
196
+ return /`{1,3}show-widget/.test(text);
197
+ }
198
+
199
+ /**
200
+ * Sanitize widget HTML for streaming preview. Preview mode intentionally
201
+ * removes scripts and event handlers so partial JS is never shown as text.
202
+ */
203
+ export function sanitizeForIframe(code: string): string {
204
+ return stripDangerousEmbeds(code);
205
+ }
206
+
207
+ export function sanitizeForStreaming(code: string): string {
208
+ return stripDangerousEmbeds(code)
209
+ .replace(/\s+on[a-z]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>"']*)/gi, "")
210
+ .replace(/<script[\s\S]*?<\/script>/gi, "")
211
+ .replace(/<script\b[^>]*\/?>/gi, "")
212
+ .replace(/\s+(href|src|action)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>"']*))/gi, (match, _attr: string, dq?: string, sq?: string, uq?: string) => {
213
+ const url = (dq ?? sq ?? uq ?? "").trim();
214
+ return /^\s*(javascript|data)\s*:/i.test(url) ? "" : match;
215
+ });
216
+ }
217
+
218
+ const DANGEROUS_TAGS = /<(iframe|object|embed|meta|link|base|form)[\s>][\s\S]*?<\/\1>/gi;
219
+ const DANGEROUS_VOID = /<(iframe|object|embed|meta|link|base)\b[^>]*\/?>/gi;
220
+
221
+ function stripDangerousEmbeds(code: string): string {
222
+ return code.replace(DANGEROUS_TAGS, "").replace(DANGEROUS_VOID, "");
223
+ }
224
+
225
+ const THEME_VAR_NAMES = [
226
+ "--bg",
227
+ "--bg-panel",
228
+ "--bg-hover",
229
+ "--bg-selected",
230
+ "--border",
231
+ "--text",
232
+ "--text-muted",
233
+ "--text-dim",
234
+ "--accent",
235
+ "--accent-hover",
236
+ ];
237
+
238
+ export function resolveWidgetThemeVars(): Record<string, string> {
239
+ if (typeof document === "undefined") return {};
240
+ const computed = getComputedStyle(document.documentElement);
241
+ const vars: Record<string, string> = {};
242
+ for (const name of THEME_VAR_NAMES) {
243
+ const value = computed.getPropertyValue(name).trim();
244
+ if (value) vars[name] = value;
245
+ }
246
+ return vars;
247
+ }
248
+
249
+ export function getWidgetIframeStyleBlock(vars: Record<string, string>): string {
250
+ const mergedVars = {
251
+ "--bg": "#ffffff",
252
+ "--bg-panel": "#f5f5f5",
253
+ "--bg-hover": "#eeeeee",
254
+ "--bg-selected": "#e8e8e8",
255
+ "--border": "#e0e0e0",
256
+ "--text": "#1a1a1a",
257
+ "--text-muted": "#6b7280",
258
+ "--text-dim": "#9ca3af",
259
+ "--accent": "#2563eb",
260
+ "--accent-hover": "#1d4ed8",
261
+ ...vars,
262
+ "--font-mono": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
263
+ };
264
+ const rootVars = Object.entries(mergedVars)
265
+ .map(([key, value]) => ` ${key}: ${value};`)
266
+ .join("\n");
267
+
268
+ return `
269
+ :root {
270
+ ${rootVars}
271
+ }
272
+ .dark { color-scheme: dark; }
273
+ body {
274
+ --color-background-primary: var(--bg, #fff);
275
+ --color-background-secondary: var(--bg-panel, #f5f5f5);
276
+ --color-background-tertiary: var(--bg-hover, #eee);
277
+ --color-text-primary: var(--text, #1a1a1a);
278
+ --color-text-secondary: var(--text-muted, #6b7280);
279
+ --color-text-tertiary: var(--text-dim, #9ca3af);
280
+ --color-border-tertiary: var(--border, #e0e0e0);
281
+ --color-border-secondary: var(--border, #e0e0e0);
282
+ --color-border-primary: var(--accent, #2563eb);
283
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
284
+ --border-radius-md: 8px;
285
+ --border-radius-lg: 12px;
286
+ margin: 0;
287
+ padding: 0;
288
+ font-family: var(--font-sans);
289
+ font-size: 14px;
290
+ line-height: 1.6;
291
+ color: var(--color-text-primary);
292
+ background: transparent;
293
+ }
294
+ * { box-sizing: border-box; }
295
+ svg { max-width: 100%; height: auto; display: block; }
296
+ a { color: var(--accent, #2563eb); }
297
+ button, input, select, textarea { font: inherit; }
298
+ button {
299
+ border: 1px solid var(--color-border-tertiary);
300
+ border-radius: var(--border-radius-md);
301
+ background: var(--color-background-secondary);
302
+ color: var(--color-text-primary);
303
+ padding: 5px 10px;
304
+ cursor: pointer;
305
+ }
306
+ button:hover { background: var(--color-background-tertiary); }
307
+ input[type="range"] { accent-color: var(--accent, #2563eb); }
308
+ `;
309
+ }
310
+
311
+ export function buildReceiverSrcdoc(styleBlock = "", isDark = false): string {
312
+ const csp = [
313
+ "default-src 'none'",
314
+ "script-src 'unsafe-inline' https://cdnjs.cloudflare.com https://cdn.jsdelivr.net https://unpkg.com https://esm.sh",
315
+ "style-src 'unsafe-inline'",
316
+ "img-src * data: blob:",
317
+ "font-src * data:",
318
+ "connect-src 'none'",
319
+ ].join("; ");
320
+
321
+ return `<!DOCTYPE html>
322
+ <html class="${isDark ? "dark" : ""}">
323
+ <head>
324
+ <meta charset="utf-8">
325
+ <meta name="viewport" content="width=device-width,initial-scale=1">
326
+ <meta http-equiv="Content-Security-Policy" content="${csp}">
327
+ <style>
328
+ ${styleBlock}
329
+ </style>
330
+ </head>
331
+ <body>
332
+ <div id="__root" style="height:fit-content;"></div>
333
+ <script>
334
+ (function() {
335
+ var root = document.getElementById("__root");
336
+ var timer = null;
337
+ var first = true;
338
+ var lastHeight = 0;
339
+
340
+ function notifyReady() {
341
+ parent.postMessage({ type: "widget:ready" }, "*");
342
+ }
343
+
344
+ function reportHeight() {
345
+ if (timer) clearTimeout(timer);
346
+ timer = setTimeout(function() {
347
+ var rect = root.getBoundingClientRect();
348
+ var h = Math.ceil(Math.max(rect.height, document.body.scrollHeight, document.documentElement.scrollHeight));
349
+ if (h > 0 && h !== lastHeight) {
350
+ lastHeight = h;
351
+ parent.postMessage({ type: "widget:resize", height: h, first: first }, "*");
352
+ }
353
+ first = false;
354
+ }, 60);
355
+ }
356
+
357
+ function handleUpdate(html) {
358
+ root.innerHTML = html;
359
+ reportHeight();
360
+ }
361
+
362
+ function handleFinalize(html) {
363
+ var tmp = document.createElement("div");
364
+ tmp.innerHTML = html;
365
+ var nodes = tmp.querySelectorAll("script");
366
+ var scripts = [];
367
+ for (var i = 0; i < nodes.length; i++) {
368
+ var item = { src: nodes[i].src || "", text: nodes[i].textContent || "", attrs: [] };
369
+ for (var j = 0; j < nodes[i].attributes.length; j++) {
370
+ var attr = nodes[i].attributes[j];
371
+ if (attr.name !== "src" && attr.name !== "onload") item.attrs.push({ name: attr.name, value: attr.value });
372
+ }
373
+ scripts.push(item);
374
+ nodes[i].remove();
375
+ }
376
+ var visualHtml = tmp.innerHTML;
377
+ if (root.innerHTML !== visualHtml) root.innerHTML = visualHtml;
378
+
379
+ var cdnScripts = scripts.filter(function(s) { return !!s.src; });
380
+ var inlineScripts = scripts.filter(function(s) { return !s.src && s.text; });
381
+ function appendInline() {
382
+ for (var k = 0; k < inlineScripts.length; k++) {
383
+ var s = document.createElement("script");
384
+ s.textContent = inlineScripts[k].text;
385
+ for (var a = 0; a < inlineScripts[k].attrs.length; a++) {
386
+ s.setAttribute(inlineScripts[k].attrs[a].name, inlineScripts[k].attrs[a].value);
387
+ }
388
+ root.appendChild(s);
389
+ }
390
+ reportHeight();
391
+ setTimeout(function() { parent.postMessage({ type: "widget:scriptsReady" }, "*"); }, 50);
392
+ }
393
+ if (cdnScripts.length === 0) {
394
+ appendInline();
395
+ } else {
396
+ var pending = cdnScripts.length;
397
+ function done() { pending--; if (pending <= 0) appendInline(); }
398
+ for (var c = 0; c < cdnScripts.length; c++) {
399
+ var n = document.createElement("script");
400
+ n.src = cdnScripts[c].src;
401
+ n.onload = done;
402
+ n.onerror = done;
403
+ for (var d = 0; d < cdnScripts[c].attrs.length; d++) {
404
+ n.setAttribute(cdnScripts[c].attrs[d].name, cdnScripts[c].attrs[d].value);
405
+ }
406
+ root.appendChild(n);
407
+ }
408
+ }
409
+ reportHeight();
410
+ setTimeout(reportHeight, 150);
411
+ setTimeout(reportHeight, 600);
412
+ }
413
+
414
+ function handleTheme(vars) {
415
+ Object.entries(vars || {}).forEach(function(_a) {
416
+ var key = _a[0], val = _a[1];
417
+ document.documentElement.style.setProperty(key, val);
418
+ });
419
+ if (typeof arguments[1] === "boolean") {
420
+ document.documentElement.className = arguments[1] ? "dark" : "";
421
+ }
422
+ reportHeight();
423
+ }
424
+
425
+ function captureRenderedWidget(requestId) {
426
+ try {
427
+ var html = root.innerHTML;
428
+ var styles = "";
429
+ var styleEls = document.querySelectorAll("style");
430
+ for (var si = 0; si < styleEls.length; si++) {
431
+ styles += styleEls[si].textContent || "";
432
+ }
433
+
434
+ var canvases = document.querySelectorAll("canvas");
435
+ var snapshots = [];
436
+ var placeholders = [];
437
+ var hidden = [];
438
+ for (var ci = 0; ci < canvases.length; ci++) {
439
+ try {
440
+ var canvas = canvases[ci];
441
+ var placeholder = document.createElement("img");
442
+ placeholder.setAttribute("data-canvas-export", String(ci));
443
+ placeholder.style.cssText = "width:" + canvas.offsetWidth + "px;height:" + canvas.offsetHeight + "px;display:block;";
444
+ canvas.parentNode.insertBefore(placeholder, canvas);
445
+ placeholders.push(placeholder);
446
+ hidden.push({ node: canvas, display: canvas.style.display });
447
+ canvas.style.display = "none";
448
+ snapshots.push({
449
+ dataUrl: canvas.toDataURL("image/png"),
450
+ width: canvas.offsetWidth,
451
+ height: canvas.offsetHeight,
452
+ });
453
+ } catch (_err) {
454
+ snapshots.push(null);
455
+ }
456
+ }
457
+
458
+ html = root.innerHTML;
459
+
460
+ for (var pi = 0; pi < placeholders.length; pi++) {
461
+ placeholders[pi].remove();
462
+ }
463
+ for (var hi = 0; hi < hidden.length; hi++) {
464
+ hidden[hi].node.style.display = hidden[hi].display;
465
+ }
466
+
467
+ parent.postMessage({
468
+ type: "widget:captured",
469
+ requestId: requestId,
470
+ html: html,
471
+ styles: styles,
472
+ canvases: snapshots,
473
+ bodyWidth: document.body.scrollWidth,
474
+ bodyHeight: document.body.scrollHeight,
475
+ }, "*");
476
+ } catch (_err) {
477
+ parent.postMessage({ type: "widget:captured", requestId: requestId, html: null }, "*");
478
+ }
479
+ }
480
+
481
+ var ro = new ResizeObserver(reportHeight);
482
+ ro.observe(root);
483
+
484
+ window.addEventListener("message", function(e) {
485
+ if (!e.data || typeof e.data.type !== "string") return;
486
+ switch (e.data.type) {
487
+ case "widget:update": handleUpdate(e.data.html || ""); break;
488
+ case "widget:finalize": handleFinalize(e.data.html || ""); break;
489
+ case "widget:theme": handleTheme(e.data.vars, e.data.isDark); break;
490
+ case "widget:capture": captureRenderedWidget(e.data.requestId); break;
491
+ case "widget:crossFilter":
492
+ window.dispatchEvent(new CustomEvent("widget-filter", { detail: e.data.payload }));
493
+ break;
494
+ }
495
+ });
496
+
497
+ document.addEventListener("click", function(e) {
498
+ var a = e.target && e.target.closest ? e.target.closest("a[href]") : null;
499
+ if (!a) return;
500
+ var href = a.getAttribute("href");
501
+ if (!href || href.charAt(0) === "#") return;
502
+ e.preventDefault();
503
+ parent.postMessage({ type: "widget:link", href: href }, "*");
504
+ });
505
+
506
+ window.__widgetSendMessage = function(text) {
507
+ if (typeof text === "string" && text.length <= 500) {
508
+ parent.postMessage({ type: "widget:sendMessage", text: text }, "*");
509
+ }
510
+ };
511
+
512
+ window.__widgetPublish = function(topic, data) {
513
+ if (typeof topic === "string") {
514
+ parent.postMessage({ type: "widget:publish", topic: topic, data: data }, "*");
515
+ }
516
+ };
517
+
518
+ notifyReady();
519
+ })();
520
+ </script>
521
+ </body>
522
+ </html>`;
523
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seqyuan/annodex",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "AI-native bioinformatics workspace by Annoroad",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -8,14 +8,16 @@
8
8
  },
9
9
  "files": [
10
10
  "bin",
11
- ".next",
12
- "!.next/cache",
13
- "!.next/dev",
14
- "!.next/**/*.js.map",
15
- "lib/default-SOUL.md",
16
- "lib/default-HARNESS.md",
11
+ "app",
12
+ "components",
13
+ "hooks",
14
+ "lib",
17
15
  "public",
16
+ "scripts/postinstall.cjs",
17
+ "proxy.ts",
18
18
  "next.config.ts",
19
+ "postcss.config.mjs",
20
+ "tsconfig.json",
19
21
  "package.json"
20
22
  ],
21
23
  "scripts": {
@@ -24,7 +26,10 @@
24
26
  "start": "next start -p 30121",
25
27
  "lint": "eslint .",
26
28
  "test:compat": "node --test tests/compat-proxy.test.mjs",
27
- "release": "npm version patch --no-git-tag-version && npm run build && npm publish --access public"
29
+ "pack:check": "node scripts/check-npm-pack.mjs",
30
+ "prepublishOnly": "node scripts/check-npm-pack.mjs",
31
+ "release": "npm version patch --no-git-tag-version && npm publish --access public",
32
+ "postinstall": "node scripts/postinstall.cjs"
28
33
  },
29
34
  "dependencies": {
30
35
  "@codemirror/autocomplete": "^6.20.2",
@@ -45,7 +50,13 @@
45
50
  "@codemirror/theme-one-dark": "^6.1.3",
46
51
  "@codemirror/view": "^6.43.0",
47
52
  "@openai/codex": "^0.118.0",
53
+ "@tailwindcss/postcss": "^4.2.2",
54
+ "@types/bcryptjs": "^2.4.6",
55
+ "@types/node": "^25",
56
+ "@types/react": "^19",
57
+ "@types/react-dom": "^19",
48
58
  "@types/react-syntax-highlighter": "^15.5.13",
59
+ "@types/ws": "^8.18.1",
49
60
  "bcryptjs": "^3.0.3",
50
61
  "codemirror": "^6.0.2",
51
62
  "docx-preview": "^0.3.7",
@@ -53,26 +64,20 @@
53
64
  "mermaid": "^11.15.0",
54
65
  "next": "16.2.1",
55
66
  "pdfjs-dist": "^5.7.284",
67
+ "postcss": "^8",
56
68
  "react": "^19.2.4",
57
69
  "react-dom": "^19.2.4",
58
70
  "react-markdown": "^10.1.0",
59
71
  "react-syntax-highlighter": "^16.1.1",
60
72
  "remark-gfm": "^4.0.1",
61
73
  "smol-toml": "^1.6.1",
74
+ "tailwindcss": "^4.2.2",
75
+ "typescript": "^5",
62
76
  "ws": "^8.18.0",
63
77
  "xlsx": "^0.18.5"
64
78
  },
65
79
  "devDependencies": {
66
- "@tailwindcss/postcss": "^4.2.2",
67
- "@types/bcryptjs": "^2.4.6",
68
- "@types/node": "^25",
69
- "@types/react": "^19",
70
- "@types/react-dom": "^19",
71
- "@types/ws": "^8.18.1",
72
80
  "eslint": "^9",
73
- "eslint-config-next": "16.2.1",
74
- "postcss": "^8",
75
- "tailwindcss": "^4.2.2",
76
- "typescript": "^5"
81
+ "eslint-config-next": "16.2.1"
77
82
  }
78
83
  }
@@ -0,0 +1,8 @@
1
+ /** @type {import('postcss').Config} */
2
+ const config = {
3
+ plugins: {
4
+ "@tailwindcss/postcss": {},
5
+ },
6
+ };
7
+
8
+ export default config;