p-spore 0.1.3 → 0.1.42

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 (396) hide show
  1. package/README.md +110 -15
  2. package/dist/agents/agent-manager.d.ts +3 -3
  3. package/dist/agents/agent-manager.d.ts.map +1 -1
  4. package/dist/agents/agent-manager.js +3 -2
  5. package/dist/agents/agent-manager.js.map +1 -1
  6. package/dist/application/agent-application.d.ts +29 -5
  7. package/dist/application/agent-application.d.ts.map +1 -1
  8. package/dist/application/agent-application.js +444 -14
  9. package/dist/application/agent-application.js.map +1 -1
  10. package/dist/articles/diff.d.ts +70 -0
  11. package/dist/articles/diff.d.ts.map +1 -0
  12. package/dist/articles/diff.js +330 -0
  13. package/dist/articles/diff.js.map +1 -0
  14. package/dist/articles/docx.d.ts +10 -0
  15. package/dist/articles/docx.d.ts.map +1 -0
  16. package/dist/articles/docx.js +219 -0
  17. package/dist/articles/docx.js.map +1 -0
  18. package/dist/articles/draft.d.ts +18 -0
  19. package/dist/articles/draft.d.ts.map +1 -0
  20. package/dist/articles/draft.js +88 -0
  21. package/dist/articles/draft.js.map +1 -0
  22. package/dist/articles/edits.d.ts +24 -0
  23. package/dist/articles/edits.d.ts.map +1 -0
  24. package/dist/articles/edits.js +54 -0
  25. package/dist/articles/edits.js.map +1 -0
  26. package/dist/articles/html.d.ts +10 -0
  27. package/dist/articles/html.d.ts.map +1 -0
  28. package/dist/articles/html.js +122 -0
  29. package/dist/articles/html.js.map +1 -0
  30. package/dist/articles/plain.d.ts +8 -0
  31. package/dist/articles/plain.d.ts.map +1 -0
  32. package/dist/articles/plain.js +69 -0
  33. package/dist/articles/plain.js.map +1 -0
  34. package/dist/articles/preview.d.ts +43 -0
  35. package/dist/articles/preview.d.ts.map +1 -0
  36. package/dist/articles/preview.js +90 -0
  37. package/dist/articles/preview.js.map +1 -0
  38. package/dist/articles/publish.d.ts +10 -0
  39. package/dist/articles/publish.d.ts.map +1 -0
  40. package/dist/articles/publish.js +54 -0
  41. package/dist/articles/publish.js.map +1 -0
  42. package/dist/articles/receipt.d.ts +16 -0
  43. package/dist/articles/receipt.d.ts.map +1 -0
  44. package/dist/articles/receipt.js +27 -0
  45. package/dist/articles/receipt.js.map +1 -0
  46. package/dist/articles/store.d.ts +78 -0
  47. package/dist/articles/store.d.ts.map +1 -0
  48. package/dist/articles/store.js +308 -0
  49. package/dist/articles/store.js.map +1 -0
  50. package/dist/articles/tool.d.ts +14 -0
  51. package/dist/articles/tool.d.ts.map +1 -0
  52. package/dist/articles/tool.js +175 -0
  53. package/dist/articles/tool.js.map +1 -0
  54. package/dist/articles/writer-context.d.ts +5 -0
  55. package/dist/articles/writer-context.d.ts.map +1 -0
  56. package/dist/articles/writer-context.js +56 -0
  57. package/dist/articles/writer-context.js.map +1 -0
  58. package/dist/articles/writer.d.ts +18 -0
  59. package/dist/articles/writer.d.ts.map +1 -0
  60. package/dist/articles/writer.js +79 -0
  61. package/dist/articles/writer.js.map +1 -0
  62. package/dist/articles/zip-write.d.ts +11 -0
  63. package/dist/articles/zip-write.d.ts.map +1 -0
  64. package/dist/articles/zip-write.js +63 -0
  65. package/dist/articles/zip-write.js.map +1 -0
  66. package/dist/bundled-skills/README.md +17 -0
  67. package/dist/bundled-skills/aegis-search/SKILL.md +59 -0
  68. package/dist/bundled-skills/aegis-search/bin/.gitkeep +0 -0
  69. package/dist/bundled-skills/article-canvas/SKILL.md +28 -0
  70. package/dist/bundled-skills/binaries.json +23 -0
  71. package/dist/bundled-skills/doc-extract/SKILL.md +56 -0
  72. package/dist/cli/main.d.ts.map +1 -1
  73. package/dist/cli/main.js +407 -54
  74. package/dist/cli/main.js.map +1 -1
  75. package/dist/config/config.d.ts +43 -0
  76. package/dist/config/config.d.ts.map +1 -1
  77. package/dist/config/config.js +150 -6
  78. package/dist/config/config.js.map +1 -1
  79. package/dist/daemon/daemon.d.ts.map +1 -1
  80. package/dist/daemon/daemon.js +80 -11
  81. package/dist/daemon/daemon.js.map +1 -1
  82. package/dist/desktop/application.d.ts +4 -0
  83. package/dist/desktop/application.d.ts.map +1 -0
  84. package/dist/desktop/application.js +1688 -0
  85. package/dist/desktop/application.js.map +1 -0
  86. package/dist/desktop/article-export.d.ts +12 -0
  87. package/dist/desktop/article-export.d.ts.map +1 -0
  88. package/dist/desktop/article-export.js +87 -0
  89. package/dist/desktop/article-export.js.map +1 -0
  90. package/dist/desktop/assets/pspore.png +0 -0
  91. package/dist/desktop/assets/pspore.svg +24 -0
  92. package/dist/desktop/conversation-smoke.d.ts +5 -0
  93. package/dist/desktop/conversation-smoke.d.ts.map +1 -0
  94. package/dist/desktop/conversation-smoke.js +93 -0
  95. package/dist/desktop/conversation-smoke.js.map +1 -0
  96. package/dist/desktop/daemon-bridge.d.ts.map +1 -1
  97. package/dist/desktop/daemon-bridge.js +62 -17
  98. package/dist/desktop/daemon-bridge.js.map +1 -1
  99. package/dist/desktop/ipc-contract.d.ts +124 -0
  100. package/dist/desktop/ipc-contract.d.ts.map +1 -1
  101. package/dist/desktop/ipc-contract.js +191 -12
  102. package/dist/desktop/ipc-contract.js.map +1 -1
  103. package/dist/desktop/local-path.d.ts +15 -0
  104. package/dist/desktop/local-path.d.ts.map +1 -0
  105. package/dist/desktop/local-path.js +59 -0
  106. package/dist/desktop/local-path.js.map +1 -0
  107. package/dist/desktop/main.d.ts +10 -1
  108. package/dist/desktop/main.d.ts.map +1 -1
  109. package/dist/desktop/main.js +122 -530
  110. package/dist/desktop/main.js.map +1 -1
  111. package/dist/desktop/native-startup.d.ts +4 -0
  112. package/dist/desktop/native-startup.d.ts.map +1 -0
  113. package/dist/desktop/native-startup.js +57 -0
  114. package/dist/desktop/native-startup.js.map +1 -0
  115. package/dist/desktop/preload.cjs +28 -1
  116. package/dist/desktop/renderer/article-panel.d.ts +45 -0
  117. package/dist/desktop/renderer/article-panel.d.ts.map +1 -0
  118. package/dist/desktop/renderer/article-panel.js +1126 -0
  119. package/dist/desktop/renderer/article-panel.js.map +1 -0
  120. package/dist/desktop/renderer/article-split.d.ts +32 -0
  121. package/dist/desktop/renderer/article-split.d.ts.map +1 -0
  122. package/dist/desktop/renderer/article-split.js +48 -0
  123. package/dist/desktop/renderer/article-split.js.map +1 -0
  124. package/dist/desktop/renderer/composer-file-references.d.ts +23 -0
  125. package/dist/desktop/renderer/composer-file-references.d.ts.map +1 -0
  126. package/dist/desktop/renderer/composer-file-references.js +51 -0
  127. package/dist/desktop/renderer/composer-file-references.js.map +1 -0
  128. package/dist/desktop/renderer/conversation.d.ts +23 -0
  129. package/dist/desktop/renderer/conversation.d.ts.map +1 -0
  130. package/dist/desktop/renderer/conversation.js +66 -0
  131. package/dist/desktop/renderer/conversation.js.map +1 -0
  132. package/dist/desktop/renderer/dom-reconcile.d.ts +15 -0
  133. package/dist/desktop/renderer/dom-reconcile.d.ts.map +1 -0
  134. package/dist/desktop/renderer/dom-reconcile.js +33 -0
  135. package/dist/desktop/renderer/dom-reconcile.js.map +1 -0
  136. package/dist/desktop/renderer/index.html +211 -34
  137. package/dist/desktop/renderer/indexing-view.d.ts +22 -0
  138. package/dist/desktop/renderer/indexing-view.d.ts.map +1 -0
  139. package/dist/desktop/renderer/indexing-view.js +115 -0
  140. package/dist/desktop/renderer/indexing-view.js.map +1 -0
  141. package/dist/desktop/renderer/markdown-view.d.ts +23 -0
  142. package/dist/desktop/renderer/markdown-view.d.ts.map +1 -0
  143. package/dist/desktop/renderer/markdown-view.js +436 -0
  144. package/dist/desktop/renderer/markdown-view.js.map +1 -0
  145. package/dist/desktop/renderer/motion.d.ts +67 -0
  146. package/dist/desktop/renderer/motion.d.ts.map +1 -0
  147. package/dist/desktop/renderer/motion.js +296 -0
  148. package/dist/desktop/renderer/motion.js.map +1 -0
  149. package/dist/desktop/renderer/renderer.js +1793 -155
  150. package/dist/desktop/renderer/renderer.js.map +1 -1
  151. package/dist/desktop/renderer/session-find.d.ts +18 -0
  152. package/dist/desktop/renderer/session-find.d.ts.map +1 -0
  153. package/dist/desktop/renderer/session-find.js +29 -0
  154. package/dist/desktop/renderer/session-find.js.map +1 -0
  155. package/dist/desktop/renderer/session-search.d.ts +30 -0
  156. package/dist/desktop/renderer/session-search.d.ts.map +1 -0
  157. package/dist/desktop/renderer/session-search.js +296 -0
  158. package/dist/desktop/renderer/session-search.js.map +1 -0
  159. package/dist/desktop/renderer/store.d.ts +35 -8
  160. package/dist/desktop/renderer/store.d.ts.map +1 -1
  161. package/dist/desktop/renderer/store.js +95 -78
  162. package/dist/desktop/renderer/store.js.map +1 -1
  163. package/dist/desktop/renderer/styles.css +910 -268
  164. package/dist/desktop/renderer/vendor/gsap.min.js +11 -0
  165. package/dist/desktop/renderer-diagnostics.d.ts +5 -0
  166. package/dist/desktop/renderer-diagnostics.d.ts.map +1 -0
  167. package/dist/desktop/renderer-diagnostics.js +47 -0
  168. package/dist/desktop/renderer-diagnostics.js.map +1 -0
  169. package/dist/desktop/security.d.ts +26 -1
  170. package/dist/desktop/security.d.ts.map +1 -1
  171. package/dist/desktop/security.js +26 -6
  172. package/dist/desktop/security.js.map +1 -1
  173. package/dist/desktop/smoke-fixture.d.ts.map +1 -1
  174. package/dist/desktop/smoke-fixture.js +77 -3
  175. package/dist/desktop/smoke-fixture.js.map +1 -1
  176. package/dist/desktop/splash/index.html +25 -0
  177. package/dist/desktop/splash/splash.d.ts +2 -0
  178. package/dist/desktop/splash/splash.d.ts.map +1 -0
  179. package/dist/desktop/splash/splash.js +8 -0
  180. package/dist/desktop/splash/splash.js.map +1 -0
  181. package/dist/desktop/splash/styles.css +24 -0
  182. package/dist/desktop/system-open.d.ts +16 -0
  183. package/dist/desktop/system-open.d.ts.map +1 -0
  184. package/dist/desktop/system-open.js +90 -0
  185. package/dist/desktop/system-open.js.map +1 -0
  186. package/dist/desktop/validation.d.ts.map +1 -1
  187. package/dist/desktop/validation.js +99 -21
  188. package/dist/desktop/validation.js.map +1 -1
  189. package/dist/desktop/window-security.d.ts +4 -0
  190. package/dist/desktop/window-security.d.ts.map +1 -0
  191. package/dist/desktop/window-security.js +26 -0
  192. package/dist/desktop/window-security.js.map +1 -0
  193. package/dist/documents/errors.d.ts +12 -0
  194. package/dist/documents/errors.d.ts.map +1 -0
  195. package/dist/documents/errors.js +12 -0
  196. package/dist/documents/errors.js.map +1 -0
  197. package/dist/documents/extract.d.ts +37 -0
  198. package/dist/documents/extract.d.ts.map +1 -0
  199. package/dist/documents/extract.js +90 -0
  200. package/dist/documents/extract.js.map +1 -0
  201. package/dist/documents/legacy-office.d.ts +23 -0
  202. package/dist/documents/legacy-office.d.ts.map +1 -0
  203. package/dist/documents/legacy-office.js +439 -0
  204. package/dist/documents/legacy-office.js.map +1 -0
  205. package/dist/documents/ole.d.ts +20 -0
  206. package/dist/documents/ole.d.ts.map +1 -0
  207. package/dist/documents/ole.js +189 -0
  208. package/dist/documents/ole.js.map +1 -0
  209. package/dist/documents/ooxml.d.ts +23 -0
  210. package/dist/documents/ooxml.d.ts.map +1 -0
  211. package/dist/documents/ooxml.js +197 -0
  212. package/dist/documents/ooxml.js.map +1 -0
  213. package/dist/documents/pdf.d.ts +20 -0
  214. package/dist/documents/pdf.d.ts.map +1 -0
  215. package/dist/documents/pdf.js +95 -0
  216. package/dist/documents/pdf.js.map +1 -0
  217. package/dist/documents/plain-text.d.ts +22 -0
  218. package/dist/documents/plain-text.d.ts.map +1 -0
  219. package/dist/documents/plain-text.js +57 -0
  220. package/dist/documents/plain-text.js.map +1 -0
  221. package/dist/documents/zip.d.ts +15 -0
  222. package/dist/documents/zip.d.ts.map +1 -0
  223. package/dist/documents/zip.js +137 -0
  224. package/dist/documents/zip.js.map +1 -0
  225. package/dist/domain/indexing.d.ts +60 -0
  226. package/dist/domain/indexing.d.ts.map +1 -0
  227. package/dist/domain/indexing.js +13 -0
  228. package/dist/domain/indexing.js.map +1 -0
  229. package/dist/domain/runtime.d.ts +133 -5
  230. package/dist/domain/runtime.d.ts.map +1 -1
  231. package/dist/gateway/local-gateway.d.ts +8 -0
  232. package/dist/gateway/local-gateway.d.ts.map +1 -1
  233. package/dist/gateway/local-gateway.js +105 -21
  234. package/dist/gateway/local-gateway.js.map +1 -1
  235. package/dist/indexing/index-service.d.ts +56 -0
  236. package/dist/indexing/index-service.d.ts.map +1 -0
  237. package/dist/indexing/index-service.js +262 -0
  238. package/dist/indexing/index-service.js.map +1 -0
  239. package/dist/kernel/loop.d.ts +10 -0
  240. package/dist/kernel/loop.d.ts.map +1 -1
  241. package/dist/kernel/loop.js +6 -2
  242. package/dist/kernel/loop.js.map +1 -1
  243. package/dist/kernel/reducer.d.ts.map +1 -1
  244. package/dist/kernel/reducer.js +17 -1
  245. package/dist/kernel/reducer.js.map +1 -1
  246. package/dist/kernel/state.d.ts +17 -4
  247. package/dist/kernel/state.d.ts.map +1 -1
  248. package/dist/kernel/state.js +2 -0
  249. package/dist/kernel/state.js.map +1 -1
  250. package/dist/memory/memory-tools.d.ts.map +1 -1
  251. package/dist/memory/memory-tools.js +25 -5
  252. package/dist/memory/memory-tools.js.map +1 -1
  253. package/dist/pi/context-budget.d.ts +8 -0
  254. package/dist/pi/context-budget.d.ts.map +1 -0
  255. package/dist/pi/context-budget.js +62 -0
  256. package/dist/pi/context-budget.js.map +1 -0
  257. package/dist/pi/pi-runtime-adapter.d.ts +38 -3
  258. package/dist/pi/pi-runtime-adapter.d.ts.map +1 -1
  259. package/dist/pi/pi-runtime-adapter.js +551 -56
  260. package/dist/pi/pi-runtime-adapter.js.map +1 -1
  261. package/dist/plugins/bundled-skills.d.ts +56 -0
  262. package/dist/plugins/bundled-skills.d.ts.map +1 -0
  263. package/dist/plugins/bundled-skills.js +243 -0
  264. package/dist/plugins/bundled-skills.js.map +1 -0
  265. package/dist/plugins/extension-manager.d.ts +23 -1
  266. package/dist/plugins/extension-manager.d.ts.map +1 -1
  267. package/dist/plugins/extension-manager.js +117 -0
  268. package/dist/plugins/extension-manager.js.map +1 -1
  269. package/dist/plugins/types.d.ts +29 -0
  270. package/dist/plugins/types.d.ts.map +1 -1
  271. package/dist/plugins/workspace-skills.d.ts +36 -0
  272. package/dist/plugins/workspace-skills.d.ts.map +1 -0
  273. package/dist/plugins/workspace-skills.js +309 -0
  274. package/dist/plugins/workspace-skills.js.map +1 -0
  275. package/dist/policy/policy.d.ts.map +1 -1
  276. package/dist/policy/policy.js +26 -4
  277. package/dist/policy/policy.js.map +1 -1
  278. package/dist/protocol/client.d.ts +1 -0
  279. package/dist/protocol/client.d.ts.map +1 -1
  280. package/dist/protocol/client.js +49 -24
  281. package/dist/protocol/client.js.map +1 -1
  282. package/dist/protocol/limits.d.ts +69 -0
  283. package/dist/protocol/limits.d.ts.map +1 -0
  284. package/dist/protocol/limits.js +166 -0
  285. package/dist/protocol/limits.js.map +1 -0
  286. package/dist/protocol/schema.d.ts +6 -0
  287. package/dist/protocol/schema.d.ts.map +1 -1
  288. package/dist/protocol/schema.js.map +1 -1
  289. package/dist/protocol/server-frame-codec.d.ts +18 -0
  290. package/dist/protocol/server-frame-codec.d.ts.map +1 -0
  291. package/dist/protocol/server-frame-codec.js +211 -0
  292. package/dist/protocol/server-frame-codec.js.map +1 -0
  293. package/dist/service/legacy-daemon.d.ts +6 -0
  294. package/dist/service/legacy-daemon.d.ts.map +1 -0
  295. package/dist/service/legacy-daemon.js +42 -0
  296. package/dist/service/legacy-daemon.js.map +1 -0
  297. package/dist/service/service-launch.d.ts +10 -0
  298. package/dist/service/service-launch.d.ts.map +1 -0
  299. package/dist/service/service-launch.js +56 -0
  300. package/dist/service/service-launch.js.map +1 -0
  301. package/dist/service/system-service.d.ts +57 -0
  302. package/dist/service/system-service.d.ts.map +1 -0
  303. package/dist/service/system-service.js +263 -0
  304. package/dist/service/system-service.js.map +1 -0
  305. package/dist/sessions/session-catalog.d.ts +45 -0
  306. package/dist/sessions/session-catalog.d.ts.map +1 -0
  307. package/dist/sessions/session-catalog.js +270 -0
  308. package/dist/sessions/session-catalog.js.map +1 -0
  309. package/dist/sessions/session-file.d.ts +12 -0
  310. package/dist/sessions/session-file.d.ts.map +1 -0
  311. package/dist/sessions/session-file.js +47 -0
  312. package/dist/sessions/session-file.js.map +1 -0
  313. package/dist/settings/compaction-settings.d.ts +10 -0
  314. package/dist/settings/compaction-settings.d.ts.map +1 -0
  315. package/dist/settings/compaction-settings.js +8 -0
  316. package/dist/settings/compaction-settings.js.map +1 -0
  317. package/dist/settings/indexing-settings-service.d.ts +16 -0
  318. package/dist/settings/indexing-settings-service.d.ts.map +1 -0
  319. package/dist/settings/indexing-settings-service.js +57 -0
  320. package/dist/settings/indexing-settings-service.js.map +1 -0
  321. package/dist/settings/indexing-settings.d.ts +30 -0
  322. package/dist/settings/indexing-settings.d.ts.map +1 -0
  323. package/dist/settings/indexing-settings.js +58 -0
  324. package/dist/settings/indexing-settings.js.map +1 -0
  325. package/dist/settings/llm-settings-service.d.ts +6 -0
  326. package/dist/settings/llm-settings-service.d.ts.map +1 -1
  327. package/dist/settings/llm-settings-service.js +137 -12
  328. package/dist/settings/llm-settings-service.js.map +1 -1
  329. package/dist/settings/llm-settings.d.ts +68 -2
  330. package/dist/settings/llm-settings.d.ts.map +1 -1
  331. package/dist/settings/llm-settings.js +119 -17
  332. package/dist/settings/llm-settings.js.map +1 -1
  333. package/dist/settings/model-api.d.ts +10 -0
  334. package/dist/settings/model-api.d.ts.map +1 -0
  335. package/dist/settings/model-api.js +10 -0
  336. package/dist/settings/model-api.js.map +1 -0
  337. package/dist/storage/home.d.ts +1 -0
  338. package/dist/storage/home.d.ts.map +1 -1
  339. package/dist/storage/home.js +37 -2
  340. package/dist/storage/home.js.map +1 -1
  341. package/dist/tools/core-tools.d.ts +2 -0
  342. package/dist/tools/core-tools.d.ts.map +1 -1
  343. package/dist/tools/core-tools.js +91 -1
  344. package/dist/tools/core-tools.js.map +1 -1
  345. package/dist/ui/shared/activity.d.ts +27 -0
  346. package/dist/ui/shared/activity.d.ts.map +1 -0
  347. package/dist/ui/shared/activity.js +384 -0
  348. package/dist/ui/shared/activity.js.map +1 -0
  349. package/dist/ui/shared/full-message.d.ts +22 -0
  350. package/dist/ui/shared/full-message.d.ts.map +1 -0
  351. package/dist/ui/shared/full-message.js +40 -0
  352. package/dist/ui/shared/full-message.js.map +1 -0
  353. package/dist/ui/shared/local-links.d.ts +7 -0
  354. package/dist/ui/shared/local-links.d.ts.map +1 -0
  355. package/dist/ui/shared/local-links.js +24 -0
  356. package/dist/ui/shared/local-links.js.map +1 -0
  357. package/dist/ui/shared/markdown-stream.d.ts +25 -0
  358. package/dist/ui/shared/markdown-stream.d.ts.map +1 -0
  359. package/dist/ui/shared/markdown-stream.js +35 -0
  360. package/dist/ui/shared/markdown-stream.js.map +1 -0
  361. package/dist/ui/shared/markdown.d.ts +70 -0
  362. package/dist/ui/shared/markdown.d.ts.map +1 -0
  363. package/dist/ui/shared/markdown.js +434 -0
  364. package/dist/ui/shared/markdown.js.map +1 -0
  365. package/dist/ui/shared/presentation.d.ts +10 -2
  366. package/dist/ui/shared/presentation.d.ts.map +1 -1
  367. package/dist/ui/shared/presentation.js +83 -22
  368. package/dist/ui/shared/presentation.js.map +1 -1
  369. package/dist/ui/shared/protocol-state.d.ts +19 -0
  370. package/dist/ui/shared/protocol-state.d.ts.map +1 -1
  371. package/dist/ui/shared/protocol-state.js +188 -26
  372. package/dist/ui/shared/protocol-state.js.map +1 -1
  373. package/dist/ui/shared/virtual-list.d.ts +34 -0
  374. package/dist/ui/shared/virtual-list.d.ts.map +1 -0
  375. package/dist/ui/shared/virtual-list.js +143 -0
  376. package/dist/ui/shared/virtual-list.js.map +1 -0
  377. package/dist/ui/tui/commands.d.ts +1 -1
  378. package/dist/ui/tui/commands.d.ts.map +1 -1
  379. package/dist/ui/tui/commands.js +9 -3
  380. package/dist/ui/tui/commands.js.map +1 -1
  381. package/dist/ui/tui/store.d.ts +26 -0
  382. package/dist/ui/tui/store.d.ts.map +1 -1
  383. package/dist/ui/tui/store.js +67 -3
  384. package/dist/ui/tui/store.js.map +1 -1
  385. package/dist/ui/tui/tui-app.d.ts.map +1 -1
  386. package/dist/ui/tui/tui-app.js +316 -38
  387. package/dist/ui/tui/tui-app.js.map +1 -1
  388. package/dist/ui/tui/view.d.ts +10 -0
  389. package/dist/ui/tui/view.d.ts.map +1 -1
  390. package/dist/ui/tui/view.js +253 -49
  391. package/dist/ui/tui/view.js.map +1 -1
  392. package/dist/version.d.ts +1 -1
  393. package/dist/version.d.ts.map +1 -1
  394. package/dist/version.js +1 -1
  395. package/dist/version.js.map +1 -1
  396. package/package.json +13 -2
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Markdown to a WordprocessingML package.
3
+ *
4
+ * Headings, emphasis, lists, tables, quotes and code keep their roles as
5
+ * styles and runs, so Word and WPS open a formatted document rather than a
6
+ * dump of markdown source. No production dependency: the package is a ZIP of
7
+ * XML, written with the same reader the document extractor already trusts.
8
+ */
9
+ import { parseMarkdown, } from "../ui/shared/markdown.js";
10
+ import { writeZip } from "./zip-write.js";
11
+ const W = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
12
+ const R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
13
+ const REL = "http://schemas.openxmlformats.org/package/2006/relationships";
14
+ const CT = "http://schemas.openxmlformats.org/package/2006/content-types";
15
+ export function markdownToDocx(source, title) {
16
+ const links = [];
17
+ const body = parseMarkdown(source).map((block) => blockToWord(block, links, 0)).join("");
18
+ const document = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
19
+ <w:document xmlns:w="${W}" xmlns:r="${R}">
20
+ <w:body>
21
+ ${body}
22
+ <w:sectPr>
23
+ <w:pgSz w:w="11906" w:h="16838"/>
24
+ <w:pgMar w:top="1134" w:right="1134" w:bottom="1134" w:left="1134"/>
25
+ </w:sectPr>
26
+ </w:body>
27
+ </w:document>`;
28
+ const hyperlinks = links.map((href, index) => {
29
+ const id = index + 3;
30
+ return `<Relationship Id="rId${id}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="${escapeXml(href)}" TargetMode="External"/>`;
31
+ }).join("");
32
+ return writeZip([
33
+ { name: "[Content_Types].xml", data: contentTypes() },
34
+ { name: "_rels/.rels", data: rootRels() },
35
+ { name: "docProps/core.xml", data: coreProps(title) },
36
+ { name: "word/document.xml", data: document },
37
+ { name: "word/styles.xml", data: styles() },
38
+ { name: "word/numbering.xml", data: numbering() },
39
+ {
40
+ name: "word/_rels/document.xml.rels",
41
+ data: `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
42
+ <Relationships xmlns="${REL}">
43
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
44
+ <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/>
45
+ ${hyperlinks}
46
+ </Relationships>`,
47
+ },
48
+ ]);
49
+ }
50
+ function blockToWord(block, links, depth) {
51
+ switch (block.kind) {
52
+ case "paragraph":
53
+ return paragraph(inlineToWord(block.inline, links));
54
+ case "heading":
55
+ return paragraph(inlineToWord(block.inline, links), `Heading${block.level}`);
56
+ case "code":
57
+ return block.value.split("\n").map((line) => paragraph(`<w:r><w:rPr><w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="宋体"/><w:sz w:val="21"/></w:rPr><w:t xml:space="preserve">${escapeXml(line.length === 0 ? " " : line)}</w:t></w:r>`, "Code")).join("");
58
+ case "quote":
59
+ return block.blocks.map((child) => {
60
+ if (child.kind === "paragraph")
61
+ return paragraph(inlineToWord(child.inline, links), "Quote");
62
+ return blockToWord(child, links, depth);
63
+ }).join("");
64
+ case "list":
65
+ return block.items.map((item) => {
66
+ const head = item.blocks[0];
67
+ const runs = head?.kind === "paragraph" ? inlineToWord(head.inline, links) : "";
68
+ const mark = item.checked === undefined ? "" : item.checked ? "☑ " : "☐ ";
69
+ const prefix = mark ? `<w:r><w:t xml:space="preserve">${mark}</w:t></w:r>` : "";
70
+ const numId = block.ordered ? 2 : 1;
71
+ const first = paragraph(`${prefix}${runs}`, undefined, { ilvl: Math.min(depth, LIST_LEVELS - 1), numId });
72
+ const rest = item.blocks.slice(head?.kind === "paragraph" ? 1 : 0).map((child) => blockToWord(child, links, depth + 1)).join("");
73
+ return `${first}${rest}`;
74
+ }).join("");
75
+ case "rule":
76
+ return `<w:p><w:pPr><w:pBdr><w:bottom w:val="single" w:sz="6" w:space="1" w:color="D6D3D1"/></w:pBdr></w:pPr></w:p>`;
77
+ case "table": {
78
+ const rows = [block.head, ...block.rows].map((row, rowIndex) => {
79
+ const cells = row.map((cell) => `<w:tc><w:tcPr><w:tcW w:w="0" w:type="auto"/></w:tcPr>${paragraph(inlineToWord(cell, links), rowIndex === 0 ? "TableHead" : undefined)}</w:tc>`).join("");
80
+ return `<w:tr>${cells}</w:tr>`;
81
+ }).join("");
82
+ return `<w:tbl><w:tblPr><w:tblW w:w="5000" w:type="pct"/><w:tblBorders><w:top w:val="single" w:sz="4" w:color="D6D3D1"/><w:left w:val="single" w:sz="4" w:color="D6D3D1"/><w:bottom w:val="single" w:sz="4" w:color="D6D3D1"/><w:right w:val="single" w:sz="4" w:color="D6D3D1"/><w:insideH w:val="single" w:sz="4" w:color="D6D3D1"/><w:insideV w:val="single" w:sz="4" w:color="D6D3D1"/></w:tblBorders></w:tblPr>${rows}</w:tbl>`;
83
+ }
84
+ }
85
+ }
86
+ function paragraph(runs, style, numbering) {
87
+ const styleXml = style ? `<w:pStyle w:val="${style}"/>` : "";
88
+ const numXml = numbering ? `<w:numPr><w:ilvl w:val="${numbering.ilvl}"/><w:numId w:val="${numbering.numId}"/></w:numPr>` : "";
89
+ const props = styleXml || numXml ? `<w:pPr>${styleXml}${numXml}</w:pPr>` : "";
90
+ return `<w:p>${props}${runs}</w:p>`;
91
+ }
92
+ function inlineToWord(inline, links) {
93
+ return inline.map((part) => inlinePart(part, links)).join("");
94
+ }
95
+ function inlinePart(part, links) {
96
+ switch (part.kind) {
97
+ case "text":
98
+ return run(part.value);
99
+ case "code":
100
+ return run(part.value, "<w:rFonts w:ascii=\"Consolas\" w:hAnsi=\"Consolas\" w:eastAsia=\"宋体\"/><w:shd w:val=\"clear\" w:fill=\"F5F5F4\"/>");
101
+ case "strong":
102
+ return wrap(part.children, links, "<w:b/>");
103
+ case "emphasis":
104
+ return wrap(part.children, links, "<w:i/>");
105
+ case "strike":
106
+ return wrap(part.children, links, "<w:strike/>");
107
+ case "link": {
108
+ const href = /^https?:\/\//i.test(part.href) || /^mailto:/i.test(part.href) ? part.href : undefined;
109
+ const inner = part.children.length > 0 ? wrap(part.children, links, "<w:color w:val=\"1D4E89\"/><w:u w:val=\"single\"/>") : run(part.href, "<w:color w:val=\"1D4E89\"/><w:u w:val=\"single\"/>");
110
+ if (!href)
111
+ return inner;
112
+ links.push(href);
113
+ return `<w:hyperlink r:id="rId${links.length + 2}">${inner}</w:hyperlink>`;
114
+ }
115
+ case "break":
116
+ return "<w:r><w:br/></w:r>";
117
+ }
118
+ }
119
+ function wrap(children, links, props) {
120
+ return children.map((child) => {
121
+ if (child.kind === "text" || child.kind === "code")
122
+ return run(child.value, props);
123
+ if (child.kind === "strong" || child.kind === "emphasis" || child.kind === "strike") {
124
+ const extra = child.kind === "strong" ? "<w:b/>" : child.kind === "emphasis" ? "<w:i/>" : "<w:strike/>";
125
+ return wrap(child.children, links, `${props}${extra}`);
126
+ }
127
+ return inlinePart(child, links);
128
+ }).join("");
129
+ }
130
+ function run(value, props = "") {
131
+ const safe = escapeXml(value);
132
+ if (!safe)
133
+ return "";
134
+ const rPr = props ? `<w:rPr>${props}</w:rPr>` : "";
135
+ return `<w:r>${rPr}<w:t xml:space="preserve">${safe}</w:t></w:r>`;
136
+ }
137
+ function escapeXml(value) {
138
+ return [...value].filter((character) => {
139
+ const code = character.codePointAt(0) ?? 0;
140
+ return code === 0x9 || code === 0xa || code === 0xd || code >= 0x20;
141
+ }).join("")
142
+ .replaceAll("&", "&amp;")
143
+ .replaceAll("<", "&lt;")
144
+ .replaceAll(">", "&gt;")
145
+ .replaceAll('"', "&quot;");
146
+ }
147
+ function contentTypes() {
148
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
149
+ <Types xmlns="${CT}">
150
+ <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
151
+ <Default Extension="xml" ContentType="application/xml"/>
152
+ <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
153
+ <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
154
+ <Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>
155
+ <Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
156
+ </Types>`;
157
+ }
158
+ function rootRels() {
159
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
160
+ <Relationships xmlns="${REL}">
161
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
162
+ <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
163
+ </Relationships>`;
164
+ }
165
+ function coreProps(title) {
166
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
167
+ <cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/">
168
+ <dc:title>${escapeXml(title)}</dc:title>
169
+ <dc:creator>pSpore</dc:creator>
170
+ </cp:coreProperties>`;
171
+ }
172
+ /**
173
+ * Font names travel with the file, not the glyphs. The names picked here are the
174
+ * ones present where these documents are opened: Calibri and Consolas on
175
+ * Windows Word, 宋体 for Chinese on every Windows and WPS install. A Linux
176
+ * reader substitutes through fontconfig, so the document still renders.
177
+ */
178
+ function styles() {
179
+ const heading = (level, size) => `<w:style w:type="paragraph" w:styleId="Heading${level}"><w:name w:val="heading ${level}"/><w:basedOn w:val="Normal"/><w:qFormat/><w:rPr><w:b/><w:sz w:val="${size}"/><w:szCs w:val="${size}"/></w:rPr></w:style>`;
180
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
181
+ <w:styles xmlns:w="${W}">
182
+ <w:docDefaults><w:rPrDefault><w:rPr>
183
+ <w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:eastAsia="宋体" w:cs="Calibri"/>
184
+ <w:sz w:val="22"/><w:szCs w:val="22"/>
185
+ <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
186
+ </w:rPr></w:rPrDefault></w:docDefaults>
187
+ <w:style w:type="paragraph" w:default="1" w:styleId="Normal"><w:name w:val="Normal"/></w:style>
188
+ ${[1, 2, 3, 4, 5, 6].map((level) => heading(level, level === 1 ? 36 : level === 2 ? 32 : level === 3 ? 28 : 24)).join("")}
189
+ <w:style w:type="paragraph" w:styleId="Quote"><w:name w:val="Quote"/><w:basedOn w:val="Normal"/><w:pPr><w:ind w:left="360"/></w:pPr><w:rPr><w:i/></w:rPr></w:style>
190
+ <w:style w:type="paragraph" w:styleId="Code"><w:name w:val="Code"/><w:basedOn w:val="Normal"/><w:pPr><w:shd w:val="clear" w:fill="F5F5F4"/></w:pPr></w:style>
191
+ <w:style w:type="paragraph" w:styleId="TableHead"><w:name w:val="Table heading"/><w:basedOn w:val="Normal"/><w:rPr><w:b/></w:rPr></w:style>
192
+ </w:styles>`;
193
+ }
194
+ /** Nesting depth a list can reach before deeper items reuse the last level. */
195
+ const LIST_LEVELS = 9;
196
+ const BULLET_GLYPHS = ["\u2022", "\u25e6", "\u25aa"];
197
+ const ORDERED_FORMATS = ["decimal", "lowerLetter", "lowerRoman"];
198
+ /**
199
+ * Word draws a list item at the level its `ilvl` names, and an `ilvl` the
200
+ * numbering part never defines gets no indent and no glyph — which is how a
201
+ * nested list ends up flattened to the left margin. Every level a document can
202
+ * reach is therefore declared here, each with its own counter and indent.
203
+ */
204
+ function numbering() {
205
+ const levels = (ordered) => Array.from({ length: LIST_LEVELS }, (_unused, depth) => {
206
+ const format = ordered ? ORDERED_FORMATS[depth % ORDERED_FORMATS.length] : "bullet";
207
+ const text = ordered ? `%${depth + 1}.` : BULLET_GLYPHS[depth % BULLET_GLYPHS.length];
208
+ const indent = 720 * (depth + 1);
209
+ return `<w:lvl w:ilvl="${depth}"><w:start w:val="1"/><w:numFmt w:val="${format}"/><w:lvlText w:val="${escapeXml(text ?? "\u2022")}"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="${indent}" w:hanging="360"/></w:pPr></w:lvl>`;
210
+ }).join("");
211
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
212
+ <w:numbering xmlns:w="${W}">
213
+ <w:abstractNum w:abstractNumId="0"><w:multiLevelType w:val="hybridMultilevel"/>${levels(false)}</w:abstractNum>
214
+ <w:abstractNum w:abstractNumId="1"><w:multiLevelType w:val="hybridMultilevel"/>${levels(true)}</w:abstractNum>
215
+ <w:num w:numId="1"><w:abstractNumId w:val="0"/></w:num>
216
+ <w:num w:numId="2"><w:abstractNumId w:val="1"/></w:num>
217
+ </w:numbering>`;
218
+ }
219
+ //# sourceMappingURL=docx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.js","sourceRoot":"","sources":["../../src/articles/docx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ArticleDraft } from "./preview.js";
2
+ /** Private tool progress from the text writer; body stays in the preview bus. */
3
+ export declare function articleDraftFromToolUpdate(sessionId: string, toolCallId: string, result: unknown): ArticleDraft | undefined;
4
+ /**
5
+ * Pulls the article being written out of a streaming tool-call update.
6
+ *
7
+ * Pi repairs partial JSON as tokens arrive, so the arguments grow while the
8
+ * model is still writing. A call counts as soon as it says it will write —
9
+ * `create` or `update` — so the panel can open before the first word of the
10
+ * body, and an `update` made of edits is followed as the edits arrive. `read`
11
+ * writes nothing and is ignored, as is anything that is not an `article` call.
12
+ */
13
+ export declare function articleDraftFromUpdate(sessionId: string, update: {
14
+ type: string;
15
+ contentIndex?: number;
16
+ partial?: unknown;
17
+ }, message: unknown): ArticleDraft | undefined;
18
+ //# sourceMappingURL=draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/articles/draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAGnE,iFAAiF;AACjF,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAS3H;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAClE,OAAO,EAAE,OAAO,GACf,YAAY,GAAG,SAAS,CA8B1B"}
@@ -0,0 +1,88 @@
1
+ import { ARTICLE_ID_PATTERN } from "./store.js";
2
+ /** Private tool progress from the text writer; body stays in the preview bus. */
3
+ export function articleDraftFromToolUpdate(sessionId, toolCallId, result) {
4
+ const details = isRecord(result) && isRecord(result["details"]) ? result["details"] : undefined;
5
+ const draft = details && isRecord(details["articleDraft"]) ? details["articleDraft"] : undefined;
6
+ if (!draft || (draft["action"] !== "create" && draft["action"] !== "update") || typeof draft["content"] !== "string")
7
+ return undefined;
8
+ return {
9
+ toolCallId, sessionId, action: draft["action"], content: draft["content"],
10
+ ...(typeof draft["title"] === "string" ? { title: draft["title"] } : {}),
11
+ ...(typeof draft["articleId"] === "string" && ARTICLE_ID_PATTERN.test(draft["articleId"]) ? { articleId: draft["articleId"] } : {}),
12
+ };
13
+ }
14
+ /**
15
+ * Pulls the article being written out of a streaming tool-call update.
16
+ *
17
+ * Pi repairs partial JSON as tokens arrive, so the arguments grow while the
18
+ * model is still writing. A call counts as soon as it says it will write —
19
+ * `create` or `update` — so the panel can open before the first word of the
20
+ * body, and an `update` made of edits is followed as the edits arrive. `read`
21
+ * writes nothing and is ignored, as is anything that is not an `article` call.
22
+ */
23
+ export function articleDraftFromUpdate(sessionId, update, message) {
24
+ if (update.type !== "toolcall_delta" && update.type !== "toolcall_end")
25
+ return undefined;
26
+ if (update.contentIndex === undefined)
27
+ return undefined;
28
+ const source = isRecord(update.partial) ? update.partial : isRecord(message) ? message : undefined;
29
+ if (!source)
30
+ return undefined;
31
+ const content = source["content"];
32
+ if (!Array.isArray(content))
33
+ return undefined;
34
+ const block = content[update.contentIndex];
35
+ if (!isRecord(block) || block["type"] !== "toolCall" || block["name"] !== "article")
36
+ return undefined;
37
+ if (typeof block["id"] !== "string" || block["id"].length === 0)
38
+ return undefined;
39
+ const args = isRecord(block["arguments"]) ? block["arguments"] : undefined;
40
+ if (!args || args["action"] === "read" || args["action"] === "open" || args["action"] === "write")
41
+ return undefined;
42
+ const title = typeof args["title"] === "string" && args["title"].trim() ? args["title"].trim() : undefined;
43
+ // The id streams in like everything else; a prefix of one names no article.
44
+ const articleId = typeof args["id"] === "string" && ARTICLE_ID_PATTERN.test(args["id"].trim()) ? args["id"].trim() : undefined;
45
+ const body = typeof args["content"] === "string" ? args["content"] : undefined;
46
+ const written = Array.isArray(args["edits"]) ? writtenEdits(args["edits"], update.type === "toolcall_end") : undefined;
47
+ const action = args["action"] === "create" || args["action"] === "update"
48
+ ? args["action"]
49
+ : body !== undefined || written !== undefined ? (articleId ? "update" : "create") : undefined;
50
+ if (!action)
51
+ return undefined;
52
+ return {
53
+ toolCallId: block["id"],
54
+ sessionId,
55
+ action,
56
+ ...(title ? { title } : {}),
57
+ ...(articleId ? { articleId } : {}),
58
+ ...(body === undefined ? {} : { content: body }),
59
+ ...(written === undefined ? {} : { edits: written.edits, editOpen: written.open }),
60
+ };
61
+ }
62
+ /**
63
+ * The edits whose `find` is whole. Key order is parse order, so once `replace`
64
+ * follows `find` the quote is closed; the last edit's replacement may still be
65
+ * arriving until the call ends.
66
+ */
67
+ function writtenEdits(entries, ended) {
68
+ const edits = [];
69
+ let open = false;
70
+ entries.forEach((entry, position) => {
71
+ if (!isRecord(entry) || typeof entry["find"] !== "string" || entry["find"].length === 0)
72
+ return;
73
+ if (typeof entry["replace"] !== "string")
74
+ return;
75
+ if (position === entries.length - 1 && !ended) {
76
+ const keys = Object.keys(entry);
77
+ if (keys.indexOf("find") > keys.indexOf("replace"))
78
+ return;
79
+ open = true;
80
+ }
81
+ edits.push({ find: entry["find"], replace: entry["replace"] });
82
+ });
83
+ return { edits, open };
84
+ }
85
+ function isRecord(value) {
86
+ return typeof value === "object" && value !== null && !Array.isArray(value);
87
+ }
88
+ //# sourceMappingURL=draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/articles/draft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface ArticleEdit {
2
+ find: string;
3
+ replace: string;
4
+ }
5
+ /**
6
+ * What an `update` with edits commits: each `find` is replaced at its first
7
+ * occurrence, in order, so a later edit sees the text the earlier ones left.
8
+ */
9
+ export declare function applyArticleEdits(content: string, edits: readonly ArticleEdit[]): string;
10
+ /**
11
+ * The document as it will read once the edits written so far land, for a panel
12
+ * that shows the revision while the model is still typing it.
13
+ *
14
+ * Same rules as a commit, except that an edit whose text cannot be found is
15
+ * skipped rather than fatal — the commit will report it — and the last edit's
16
+ * replacement may still be arriving (`open`). A replacement that has not yet
17
+ * departed from the text it replaces leaves that text alone, so a paragraph the
18
+ * model is extending does not vanish and get typed back in.
19
+ */
20
+ export declare function previewArticleEdits(content: string, edits: readonly ArticleEdit[], open: boolean): {
21
+ text: string;
22
+ applied: number;
23
+ };
24
+ //# sourceMappingURL=edits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edits.d.ts","sourceRoot":"","sources":["../../src/articles/edits.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CASxF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,IAAI,EAAE,OAAO,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAYnC"}
@@ -0,0 +1,54 @@
1
+ import { alignArticleDraft } from "./diff.js";
2
+ /**
3
+ * What an `update` with edits commits: each `find` is replaced at its first
4
+ * occurrence, in order, so a later edit sees the text the earlier ones left.
5
+ */
6
+ export function applyArticleEdits(content, edits) {
7
+ let next = content;
8
+ for (const edit of edits) {
9
+ if (!edit.find)
10
+ throw new Error("Article edit is missing the text to find");
11
+ const index = next.indexOf(edit.find);
12
+ if (index < 0)
13
+ throw new Error("Article edit could not find the text to replace. Read the article and quote it exactly.");
14
+ next = `${next.slice(0, index)}${edit.replace}${next.slice(index + edit.find.length)}`;
15
+ }
16
+ return next;
17
+ }
18
+ /**
19
+ * The document as it will read once the edits written so far land, for a panel
20
+ * that shows the revision while the model is still typing it.
21
+ *
22
+ * Same rules as a commit, except that an edit whose text cannot be found is
23
+ * skipped rather than fatal — the commit will report it — and the last edit's
24
+ * replacement may still be arriving (`open`). A replacement that has not yet
25
+ * departed from the text it replaces leaves that text alone, so a paragraph the
26
+ * model is extending does not vanish and get typed back in.
27
+ */
28
+ export function previewArticleEdits(content, edits, open) {
29
+ let next = content;
30
+ let applied = 0;
31
+ edits.forEach((edit, position) => {
32
+ if (!edit.find)
33
+ return;
34
+ const index = next.indexOf(edit.find);
35
+ if (index < 0)
36
+ return;
37
+ const replacement = open && position === edits.length - 1 ? replacementSoFar(edit.find, edit.replace) : edit.replace;
38
+ next = `${next.slice(0, index)}${replacement}${next.slice(index + edit.find.length)}`;
39
+ applied += 1;
40
+ });
41
+ return { text: next, applied };
42
+ }
43
+ /**
44
+ * A replacement cut off mid-stream, shown the way a streaming rewrite of the
45
+ * whole document is: what has been written, then the old blocks it has not
46
+ * reached yet.
47
+ */
48
+ function replacementSoFar(find, written) {
49
+ if (find.startsWith(written))
50
+ return find;
51
+ const { pending } = alignArticleDraft(find, written);
52
+ return pending.length === 0 ? written : `${written}\n\n${pending.join("\n\n")}`;
53
+ }
54
+ //# sourceMappingURL=edits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edits.js","sourceRoot":"","sources":["../../src/articles/edits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAO9C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,KAA6B;IAC9E,IAAI,IAAI,GAAG,OAAO,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;QAC1H,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,KAA6B,EAC7B,IAAa;IAEb,IAAI,IAAI,GAAG,OAAO,CAAC;IACnB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO;QACtB,MAAM,WAAW,GAAG,IAAI,IAAI,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACrH,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,IAAY,EAAE,OAAe;IACrD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAClF,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Markdown to a self-contained HTML document for print-to-PDF.
3
+ *
4
+ * The hidden export window loads this file with JavaScript disabled. Every
5
+ * piece of article text is escaped, and link targets are limited to http(s)
6
+ * and mailto so a model-written document cannot navigate that window.
7
+ */
8
+ export declare function markdownToPdfHtml(source: string, title: string): string;
9
+ export declare function escapeHtml(value: string): string;
10
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/articles/html.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuCvE;AAqED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Markdown to a self-contained HTML document for print-to-PDF.
3
+ *
4
+ * The hidden export window loads this file with JavaScript disabled. Every
5
+ * piece of article text is escaped, and link targets are limited to http(s)
6
+ * and mailto so a model-written document cannot navigate that window.
7
+ */
8
+ import { parseMarkdown, } from "../ui/shared/markdown.js";
9
+ const FONT = `"Noto Sans CJK SC","Noto Sans CJK","Source Han Sans SC","WenQuanYi Micro Hei","Microsoft YaHei","PingFang SC",sans-serif`;
10
+ const MONO = `"Noto Sans Mono CJK SC","Sarasa Mono SC","DejaVu Sans Mono",ui-monospace,monospace`;
11
+ export function markdownToPdfHtml(source, title) {
12
+ const body = parseMarkdown(source).map((block) => blockToHtml(block)).join("\n");
13
+ const safeTitle = escapeHtml(title.trim() || "文稿");
14
+ return `<!doctype html>
15
+ <html lang="zh-CN">
16
+ <head>
17
+ <meta charset="utf-8" />
18
+ <title>${safeTitle}</title>
19
+ <style>
20
+ @page { size: A4; margin: 18mm 16mm; }
21
+ html, body { margin: 0; padding: 0; }
22
+ body { color: #1c1917; background: #fff; font: 15px/1.75 ${FONT}; }
23
+ h1, h2, h3, h4, h5, h6 { font-weight: 700; line-height: 1.35; margin: 1.4em 0 0.45em; }
24
+ h1 { font-size: 26px; }
25
+ h2 { font-size: 21px; }
26
+ h3 { font-size: 18px; }
27
+ h4, h5, h6 { font-size: 16px; }
28
+ p { margin: 0.7em 0; }
29
+ a { color: #1d4e89; }
30
+ blockquote { margin: 0.8em 0; padding: 0.2em 0 0.2em 0.9em; border-left: 3px solid #d6d3d1; color: #44403c; }
31
+ ul, ol { margin: 0.6em 0; padding-left: 1.4em; }
32
+ li { margin: 0.2em 0; }
33
+ li > p:first-child { margin-top: 0; }
34
+ li > p:last-child { margin-bottom: 0; }
35
+ li > ul, li > ol { margin: 0.2em 0; }
36
+ pre { margin: 0.8em 0; padding: 10px 12px; background: #f5f5f4; border-radius: 6px; white-space: pre-wrap; font: 13px/1.6 ${MONO}; }
37
+ code { font-family: ${MONO}; font-size: 0.92em; background: #f5f5f4; padding: 0 0.2em; border-radius: 3px; }
38
+ pre code { background: transparent; padding: 0; }
39
+ table { width: 100%; border-collapse: collapse; margin: 0.8em 0; }
40
+ th, td { border: 1px solid #d6d3d1; padding: 6px 8px; text-align: left; vertical-align: top; }
41
+ th { background: #fafaf9; }
42
+ hr { border: 0; border-top: 1px solid #d6d3d1; margin: 1.4em 0; }
43
+ </style>
44
+ </head>
45
+ <body>
46
+ ${body || "<p></p>"}
47
+ </body>
48
+ </html>
49
+ `;
50
+ }
51
+ function blockToHtml(block) {
52
+ switch (block.kind) {
53
+ case "paragraph":
54
+ return `<p>${inlineToHtml(block.inline)}</p>`;
55
+ case "heading":
56
+ return `<h${block.level}>${inlineToHtml(block.inline)}</h${block.level}>`;
57
+ case "code":
58
+ return `<pre><code>${escapeHtml(block.value)}</code></pre>`;
59
+ case "quote":
60
+ return `<blockquote>${block.blocks.map((child) => blockToHtml(child)).join("\n")}</blockquote>`;
61
+ case "list": {
62
+ const tag = block.ordered ? "ol" : "ul";
63
+ const start = block.ordered && block.start !== 1 ? ` start="${block.start}"` : "";
64
+ const items = block.items.map((item) => {
65
+ const head = item.blocks[0];
66
+ const mark = item.checked === undefined ? "" : item.checked ? "☑ " : "☐ ";
67
+ // An item's own sentence goes straight into the <li>. Wrapping it in a
68
+ // block would put the checkbox on one line and the words on the next,
69
+ // and give every item a paragraph's worth of air around it.
70
+ const lead = head?.kind === "paragraph" ? `${mark}${inlineToHtml(head.inline)}` : mark;
71
+ const rest = item.blocks.slice(head?.kind === "paragraph" ? 1 : 0).map((child) => blockToHtml(child)).join("");
72
+ return `<li>${lead}${rest}</li>`;
73
+ }).join("");
74
+ return `<${tag}${start}>${items}</${tag}>`;
75
+ }
76
+ case "rule":
77
+ return "<hr />";
78
+ case "table": {
79
+ const head = `<tr>${block.head.map((cell) => `<th>${inlineToHtml(cell)}</th>`).join("")}</tr>`;
80
+ const rows = block.rows.map((row) => `<tr>${row.map((cell) => `<td>${inlineToHtml(cell)}</td>`).join("")}</tr>`).join("");
81
+ return `<table><thead>${head}</thead><tbody>${rows}</tbody></table>`;
82
+ }
83
+ }
84
+ }
85
+ function inlineToHtml(inline) {
86
+ return inline.map((part) => inlinePart(part)).join("");
87
+ }
88
+ function inlinePart(part) {
89
+ switch (part.kind) {
90
+ case "text":
91
+ return escapeHtml(part.value);
92
+ case "code":
93
+ return `<code>${escapeHtml(part.value)}</code>`;
94
+ case "strong":
95
+ return `<strong>${inlineToHtml(part.children)}</strong>`;
96
+ case "emphasis":
97
+ return `<em>${inlineToHtml(part.children)}</em>`;
98
+ case "strike":
99
+ return `<s>${inlineToHtml(part.children)}</s>`;
100
+ case "link": {
101
+ const label = inlineToHtml(part.children) || escapeHtml(part.href);
102
+ const href = safeHref(part.href);
103
+ return href ? `<a href="${escapeHtml(href)}">${label}</a>` : label;
104
+ }
105
+ case "break":
106
+ return "<br />";
107
+ }
108
+ }
109
+ function safeHref(value) {
110
+ const href = value.trim();
111
+ if (/^https?:\/\//i.test(href) || /^mailto:/i.test(href))
112
+ return href;
113
+ return undefined;
114
+ }
115
+ export function escapeHtml(value) {
116
+ return value
117
+ .replaceAll("&", "&amp;")
118
+ .replaceAll("<", "&lt;")
119
+ .replaceAll(">", "&gt;")
120
+ .replaceAll('"', "&quot;");
121
+ }
122
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/articles/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Markdown to plain text for the `.txt` export.
3
+ *
4
+ * Markers (`#`, `**`, backticks, table pipes) are dropped. The words stay, in
5
+ * reading order, so the file is something a person can open without a renderer.
6
+ */
7
+ export declare function markdownToPlainText(source: string): string;
8
+ //# sourceMappingURL=plain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plain.d.ts","sourceRoot":"","sources":["../../src/articles/plain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D"}