p-spore 0.1.4 → 0.1.43

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 (394) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -67
  3. package/dist/agents/agent-manager.d.ts +3 -3
  4. package/dist/agents/agent-manager.d.ts.map +1 -1
  5. package/dist/agents/agent-manager.js +3 -2
  6. package/dist/agents/agent-manager.js.map +1 -1
  7. package/dist/application/agent-application.d.ts +29 -5
  8. package/dist/application/agent-application.d.ts.map +1 -1
  9. package/dist/application/agent-application.js +444 -14
  10. package/dist/application/agent-application.js.map +1 -1
  11. package/dist/articles/diff.d.ts +70 -0
  12. package/dist/articles/diff.d.ts.map +1 -0
  13. package/dist/articles/diff.js +330 -0
  14. package/dist/articles/diff.js.map +1 -0
  15. package/dist/articles/docx.d.ts +10 -0
  16. package/dist/articles/docx.d.ts.map +1 -0
  17. package/dist/articles/docx.js +219 -0
  18. package/dist/articles/docx.js.map +1 -0
  19. package/dist/articles/draft.d.ts +18 -0
  20. package/dist/articles/draft.d.ts.map +1 -0
  21. package/dist/articles/draft.js +88 -0
  22. package/dist/articles/draft.js.map +1 -0
  23. package/dist/articles/edits.d.ts +24 -0
  24. package/dist/articles/edits.d.ts.map +1 -0
  25. package/dist/articles/edits.js +54 -0
  26. package/dist/articles/edits.js.map +1 -0
  27. package/dist/articles/html.d.ts +10 -0
  28. package/dist/articles/html.d.ts.map +1 -0
  29. package/dist/articles/html.js +122 -0
  30. package/dist/articles/html.js.map +1 -0
  31. package/dist/articles/plain.d.ts +8 -0
  32. package/dist/articles/plain.d.ts.map +1 -0
  33. package/dist/articles/plain.js +69 -0
  34. package/dist/articles/plain.js.map +1 -0
  35. package/dist/articles/preview.d.ts +43 -0
  36. package/dist/articles/preview.d.ts.map +1 -0
  37. package/dist/articles/preview.js +90 -0
  38. package/dist/articles/preview.js.map +1 -0
  39. package/dist/articles/publish.d.ts +10 -0
  40. package/dist/articles/publish.d.ts.map +1 -0
  41. package/dist/articles/publish.js +54 -0
  42. package/dist/articles/publish.js.map +1 -0
  43. package/dist/articles/receipt.d.ts +16 -0
  44. package/dist/articles/receipt.d.ts.map +1 -0
  45. package/dist/articles/receipt.js +27 -0
  46. package/dist/articles/receipt.js.map +1 -0
  47. package/dist/articles/store.d.ts +78 -0
  48. package/dist/articles/store.d.ts.map +1 -0
  49. package/dist/articles/store.js +308 -0
  50. package/dist/articles/store.js.map +1 -0
  51. package/dist/articles/tool.d.ts +14 -0
  52. package/dist/articles/tool.d.ts.map +1 -0
  53. package/dist/articles/tool.js +175 -0
  54. package/dist/articles/tool.js.map +1 -0
  55. package/dist/articles/writer-context.d.ts +5 -0
  56. package/dist/articles/writer-context.d.ts.map +1 -0
  57. package/dist/articles/writer-context.js +56 -0
  58. package/dist/articles/writer-context.js.map +1 -0
  59. package/dist/articles/writer.d.ts +18 -0
  60. package/dist/articles/writer.d.ts.map +1 -0
  61. package/dist/articles/writer.js +79 -0
  62. package/dist/articles/writer.js.map +1 -0
  63. package/dist/articles/zip-write.d.ts +11 -0
  64. package/dist/articles/zip-write.d.ts.map +1 -0
  65. package/dist/articles/zip-write.js +63 -0
  66. package/dist/articles/zip-write.js.map +1 -0
  67. package/dist/bundled-skills/README.md +17 -0
  68. package/dist/bundled-skills/aegis-search/SKILL.md +59 -0
  69. package/dist/bundled-skills/aegis-search/bin/.gitkeep +0 -0
  70. package/dist/bundled-skills/article-canvas/SKILL.md +28 -0
  71. package/dist/bundled-skills/binaries.json +23 -0
  72. package/dist/bundled-skills/doc-extract/SKILL.md +56 -0
  73. package/dist/cli/main.d.ts.map +1 -1
  74. package/dist/cli/main.js +407 -54
  75. package/dist/cli/main.js.map +1 -1
  76. package/dist/config/config.d.ts +43 -0
  77. package/dist/config/config.d.ts.map +1 -1
  78. package/dist/config/config.js +150 -6
  79. package/dist/config/config.js.map +1 -1
  80. package/dist/daemon/daemon.d.ts.map +1 -1
  81. package/dist/daemon/daemon.js +80 -11
  82. package/dist/daemon/daemon.js.map +1 -1
  83. package/dist/desktop/application.d.ts +4 -0
  84. package/dist/desktop/application.d.ts.map +1 -0
  85. package/dist/desktop/application.js +1688 -0
  86. package/dist/desktop/application.js.map +1 -0
  87. package/dist/desktop/article-export.d.ts +12 -0
  88. package/dist/desktop/article-export.d.ts.map +1 -0
  89. package/dist/desktop/article-export.js +87 -0
  90. package/dist/desktop/article-export.js.map +1 -0
  91. package/dist/desktop/assets/pspore.png +0 -0
  92. package/dist/desktop/assets/pspore.svg +24 -0
  93. package/dist/desktop/conversation-smoke.d.ts +5 -0
  94. package/dist/desktop/conversation-smoke.d.ts.map +1 -0
  95. package/dist/desktop/conversation-smoke.js +107 -0
  96. package/dist/desktop/conversation-smoke.js.map +1 -0
  97. package/dist/desktop/daemon-bridge.d.ts.map +1 -1
  98. package/dist/desktop/daemon-bridge.js +62 -17
  99. package/dist/desktop/daemon-bridge.js.map +1 -1
  100. package/dist/desktop/ipc-contract.d.ts +124 -0
  101. package/dist/desktop/ipc-contract.d.ts.map +1 -1
  102. package/dist/desktop/ipc-contract.js +191 -12
  103. package/dist/desktop/ipc-contract.js.map +1 -1
  104. package/dist/desktop/local-path.d.ts +15 -0
  105. package/dist/desktop/local-path.d.ts.map +1 -0
  106. package/dist/desktop/local-path.js +59 -0
  107. package/dist/desktop/local-path.js.map +1 -0
  108. package/dist/desktop/main.d.ts +10 -1
  109. package/dist/desktop/main.d.ts.map +1 -1
  110. package/dist/desktop/main.js +122 -530
  111. package/dist/desktop/main.js.map +1 -1
  112. package/dist/desktop/native-startup.d.ts +4 -0
  113. package/dist/desktop/native-startup.d.ts.map +1 -0
  114. package/dist/desktop/native-startup.js +57 -0
  115. package/dist/desktop/native-startup.js.map +1 -0
  116. package/dist/desktop/preload.cjs +28 -1
  117. package/dist/desktop/renderer/article-panel.d.ts +45 -0
  118. package/dist/desktop/renderer/article-panel.d.ts.map +1 -0
  119. package/dist/desktop/renderer/article-panel.js +1126 -0
  120. package/dist/desktop/renderer/article-panel.js.map +1 -0
  121. package/dist/desktop/renderer/article-split.d.ts +32 -0
  122. package/dist/desktop/renderer/article-split.d.ts.map +1 -0
  123. package/dist/desktop/renderer/article-split.js +48 -0
  124. package/dist/desktop/renderer/article-split.js.map +1 -0
  125. package/dist/desktop/renderer/composer-file-references.d.ts +23 -0
  126. package/dist/desktop/renderer/composer-file-references.d.ts.map +1 -0
  127. package/dist/desktop/renderer/composer-file-references.js +51 -0
  128. package/dist/desktop/renderer/composer-file-references.js.map +1 -0
  129. package/dist/desktop/renderer/conversation.d.ts +23 -0
  130. package/dist/desktop/renderer/conversation.d.ts.map +1 -0
  131. package/dist/desktop/renderer/conversation.js +66 -0
  132. package/dist/desktop/renderer/conversation.js.map +1 -0
  133. package/dist/desktop/renderer/dom-reconcile.d.ts +15 -0
  134. package/dist/desktop/renderer/dom-reconcile.d.ts.map +1 -0
  135. package/dist/desktop/renderer/dom-reconcile.js +33 -0
  136. package/dist/desktop/renderer/dom-reconcile.js.map +1 -0
  137. package/dist/desktop/renderer/index.html +211 -34
  138. package/dist/desktop/renderer/indexing-view.d.ts +22 -0
  139. package/dist/desktop/renderer/indexing-view.d.ts.map +1 -0
  140. package/dist/desktop/renderer/indexing-view.js +115 -0
  141. package/dist/desktop/renderer/indexing-view.js.map +1 -0
  142. package/dist/desktop/renderer/markdown-view.d.ts +23 -0
  143. package/dist/desktop/renderer/markdown-view.d.ts.map +1 -0
  144. package/dist/desktop/renderer/markdown-view.js +436 -0
  145. package/dist/desktop/renderer/markdown-view.js.map +1 -0
  146. package/dist/desktop/renderer/motion.d.ts +67 -0
  147. package/dist/desktop/renderer/motion.d.ts.map +1 -0
  148. package/dist/desktop/renderer/motion.js +296 -0
  149. package/dist/desktop/renderer/motion.js.map +1 -0
  150. package/dist/desktop/renderer/renderer.js +1799 -152
  151. package/dist/desktop/renderer/renderer.js.map +1 -1
  152. package/dist/desktop/renderer/session-find.d.ts +18 -0
  153. package/dist/desktop/renderer/session-find.d.ts.map +1 -0
  154. package/dist/desktop/renderer/session-find.js +29 -0
  155. package/dist/desktop/renderer/session-find.js.map +1 -0
  156. package/dist/desktop/renderer/session-search.d.ts +30 -0
  157. package/dist/desktop/renderer/session-search.d.ts.map +1 -0
  158. package/dist/desktop/renderer/session-search.js +296 -0
  159. package/dist/desktop/renderer/session-search.js.map +1 -0
  160. package/dist/desktop/renderer/store.d.ts +33 -0
  161. package/dist/desktop/renderer/store.d.ts.map +1 -1
  162. package/dist/desktop/renderer/store.js +92 -19
  163. package/dist/desktop/renderer/store.js.map +1 -1
  164. package/dist/desktop/renderer/styles.css +928 -268
  165. package/dist/desktop/renderer/vendor/gsap.min.js +11 -0
  166. package/dist/desktop/renderer-diagnostics.d.ts +5 -0
  167. package/dist/desktop/renderer-diagnostics.d.ts.map +1 -0
  168. package/dist/desktop/renderer-diagnostics.js +47 -0
  169. package/dist/desktop/renderer-diagnostics.js.map +1 -0
  170. package/dist/desktop/security.d.ts +26 -1
  171. package/dist/desktop/security.d.ts.map +1 -1
  172. package/dist/desktop/security.js +26 -6
  173. package/dist/desktop/security.js.map +1 -1
  174. package/dist/desktop/smoke-fixture.d.ts.map +1 -1
  175. package/dist/desktop/smoke-fixture.js +77 -3
  176. package/dist/desktop/smoke-fixture.js.map +1 -1
  177. package/dist/desktop/splash/index.html +25 -0
  178. package/dist/desktop/splash/splash.d.ts +2 -0
  179. package/dist/desktop/splash/splash.d.ts.map +1 -0
  180. package/dist/desktop/splash/splash.js +8 -0
  181. package/dist/desktop/splash/splash.js.map +1 -0
  182. package/dist/desktop/splash/styles.css +24 -0
  183. package/dist/desktop/system-open.d.ts +16 -0
  184. package/dist/desktop/system-open.d.ts.map +1 -0
  185. package/dist/desktop/system-open.js +90 -0
  186. package/dist/desktop/system-open.js.map +1 -0
  187. package/dist/desktop/validation.d.ts.map +1 -1
  188. package/dist/desktop/validation.js +99 -21
  189. package/dist/desktop/validation.js.map +1 -1
  190. package/dist/desktop/window-security.d.ts +4 -0
  191. package/dist/desktop/window-security.d.ts.map +1 -0
  192. package/dist/desktop/window-security.js +26 -0
  193. package/dist/desktop/window-security.js.map +1 -0
  194. package/dist/documents/errors.d.ts +12 -0
  195. package/dist/documents/errors.d.ts.map +1 -0
  196. package/dist/documents/errors.js +12 -0
  197. package/dist/documents/errors.js.map +1 -0
  198. package/dist/documents/extract.d.ts +37 -0
  199. package/dist/documents/extract.d.ts.map +1 -0
  200. package/dist/documents/extract.js +90 -0
  201. package/dist/documents/extract.js.map +1 -0
  202. package/dist/documents/legacy-office.d.ts +23 -0
  203. package/dist/documents/legacy-office.d.ts.map +1 -0
  204. package/dist/documents/legacy-office.js +439 -0
  205. package/dist/documents/legacy-office.js.map +1 -0
  206. package/dist/documents/ole.d.ts +20 -0
  207. package/dist/documents/ole.d.ts.map +1 -0
  208. package/dist/documents/ole.js +189 -0
  209. package/dist/documents/ole.js.map +1 -0
  210. package/dist/documents/ooxml.d.ts +23 -0
  211. package/dist/documents/ooxml.d.ts.map +1 -0
  212. package/dist/documents/ooxml.js +197 -0
  213. package/dist/documents/ooxml.js.map +1 -0
  214. package/dist/documents/pdf.d.ts +20 -0
  215. package/dist/documents/pdf.d.ts.map +1 -0
  216. package/dist/documents/pdf.js +95 -0
  217. package/dist/documents/pdf.js.map +1 -0
  218. package/dist/documents/plain-text.d.ts +22 -0
  219. package/dist/documents/plain-text.d.ts.map +1 -0
  220. package/dist/documents/plain-text.js +57 -0
  221. package/dist/documents/plain-text.js.map +1 -0
  222. package/dist/documents/zip.d.ts +15 -0
  223. package/dist/documents/zip.d.ts.map +1 -0
  224. package/dist/documents/zip.js +137 -0
  225. package/dist/documents/zip.js.map +1 -0
  226. package/dist/domain/indexing.d.ts +60 -0
  227. package/dist/domain/indexing.d.ts.map +1 -0
  228. package/dist/domain/indexing.js +13 -0
  229. package/dist/domain/indexing.js.map +1 -0
  230. package/dist/domain/runtime.d.ts +133 -5
  231. package/dist/domain/runtime.d.ts.map +1 -1
  232. package/dist/gateway/local-gateway.d.ts +8 -0
  233. package/dist/gateway/local-gateway.d.ts.map +1 -1
  234. package/dist/gateway/local-gateway.js +105 -21
  235. package/dist/gateway/local-gateway.js.map +1 -1
  236. package/dist/indexing/index-service.d.ts +56 -0
  237. package/dist/indexing/index-service.d.ts.map +1 -0
  238. package/dist/indexing/index-service.js +262 -0
  239. package/dist/indexing/index-service.js.map +1 -0
  240. package/dist/kernel/loop.d.ts +10 -0
  241. package/dist/kernel/loop.d.ts.map +1 -1
  242. package/dist/kernel/loop.js +6 -2
  243. package/dist/kernel/loop.js.map +1 -1
  244. package/dist/kernel/reducer.d.ts.map +1 -1
  245. package/dist/kernel/reducer.js +17 -1
  246. package/dist/kernel/reducer.js.map +1 -1
  247. package/dist/kernel/state.d.ts +17 -4
  248. package/dist/kernel/state.d.ts.map +1 -1
  249. package/dist/kernel/state.js +2 -0
  250. package/dist/kernel/state.js.map +1 -1
  251. package/dist/pi/context-budget.d.ts +8 -0
  252. package/dist/pi/context-budget.d.ts.map +1 -0
  253. package/dist/pi/context-budget.js +62 -0
  254. package/dist/pi/context-budget.js.map +1 -0
  255. package/dist/pi/pi-runtime-adapter.d.ts +38 -3
  256. package/dist/pi/pi-runtime-adapter.d.ts.map +1 -1
  257. package/dist/pi/pi-runtime-adapter.js +551 -56
  258. package/dist/pi/pi-runtime-adapter.js.map +1 -1
  259. package/dist/plugins/bundled-skills.d.ts +56 -0
  260. package/dist/plugins/bundled-skills.d.ts.map +1 -0
  261. package/dist/plugins/bundled-skills.js +243 -0
  262. package/dist/plugins/bundled-skills.js.map +1 -0
  263. package/dist/plugins/extension-manager.d.ts +23 -1
  264. package/dist/plugins/extension-manager.d.ts.map +1 -1
  265. package/dist/plugins/extension-manager.js +117 -0
  266. package/dist/plugins/extension-manager.js.map +1 -1
  267. package/dist/plugins/types.d.ts +29 -0
  268. package/dist/plugins/types.d.ts.map +1 -1
  269. package/dist/plugins/workspace-skills.d.ts +36 -0
  270. package/dist/plugins/workspace-skills.d.ts.map +1 -0
  271. package/dist/plugins/workspace-skills.js +309 -0
  272. package/dist/plugins/workspace-skills.js.map +1 -0
  273. package/dist/policy/policy.d.ts.map +1 -1
  274. package/dist/policy/policy.js +22 -3
  275. package/dist/policy/policy.js.map +1 -1
  276. package/dist/protocol/client.d.ts +1 -0
  277. package/dist/protocol/client.d.ts.map +1 -1
  278. package/dist/protocol/client.js +49 -24
  279. package/dist/protocol/client.js.map +1 -1
  280. package/dist/protocol/limits.d.ts +69 -0
  281. package/dist/protocol/limits.d.ts.map +1 -0
  282. package/dist/protocol/limits.js +166 -0
  283. package/dist/protocol/limits.js.map +1 -0
  284. package/dist/protocol/schema.d.ts +6 -0
  285. package/dist/protocol/schema.d.ts.map +1 -1
  286. package/dist/protocol/schema.js.map +1 -1
  287. package/dist/protocol/server-frame-codec.d.ts +18 -0
  288. package/dist/protocol/server-frame-codec.d.ts.map +1 -0
  289. package/dist/protocol/server-frame-codec.js +211 -0
  290. package/dist/protocol/server-frame-codec.js.map +1 -0
  291. package/dist/service/legacy-daemon.d.ts +6 -0
  292. package/dist/service/legacy-daemon.d.ts.map +1 -0
  293. package/dist/service/legacy-daemon.js +42 -0
  294. package/dist/service/legacy-daemon.js.map +1 -0
  295. package/dist/service/service-launch.d.ts +10 -0
  296. package/dist/service/service-launch.d.ts.map +1 -0
  297. package/dist/service/service-launch.js +56 -0
  298. package/dist/service/service-launch.js.map +1 -0
  299. package/dist/service/system-service.d.ts +57 -0
  300. package/dist/service/system-service.d.ts.map +1 -0
  301. package/dist/service/system-service.js +263 -0
  302. package/dist/service/system-service.js.map +1 -0
  303. package/dist/sessions/session-catalog.d.ts +45 -0
  304. package/dist/sessions/session-catalog.d.ts.map +1 -0
  305. package/dist/sessions/session-catalog.js +270 -0
  306. package/dist/sessions/session-catalog.js.map +1 -0
  307. package/dist/sessions/session-file.d.ts +12 -0
  308. package/dist/sessions/session-file.d.ts.map +1 -0
  309. package/dist/sessions/session-file.js +47 -0
  310. package/dist/sessions/session-file.js.map +1 -0
  311. package/dist/settings/compaction-settings.d.ts +10 -0
  312. package/dist/settings/compaction-settings.d.ts.map +1 -0
  313. package/dist/settings/compaction-settings.js +8 -0
  314. package/dist/settings/compaction-settings.js.map +1 -0
  315. package/dist/settings/indexing-settings-service.d.ts +16 -0
  316. package/dist/settings/indexing-settings-service.d.ts.map +1 -0
  317. package/dist/settings/indexing-settings-service.js +57 -0
  318. package/dist/settings/indexing-settings-service.js.map +1 -0
  319. package/dist/settings/indexing-settings.d.ts +30 -0
  320. package/dist/settings/indexing-settings.d.ts.map +1 -0
  321. package/dist/settings/indexing-settings.js +58 -0
  322. package/dist/settings/indexing-settings.js.map +1 -0
  323. package/dist/settings/llm-settings-service.d.ts +6 -0
  324. package/dist/settings/llm-settings-service.d.ts.map +1 -1
  325. package/dist/settings/llm-settings-service.js +137 -12
  326. package/dist/settings/llm-settings-service.js.map +1 -1
  327. package/dist/settings/llm-settings.d.ts +68 -2
  328. package/dist/settings/llm-settings.d.ts.map +1 -1
  329. package/dist/settings/llm-settings.js +119 -17
  330. package/dist/settings/llm-settings.js.map +1 -1
  331. package/dist/settings/model-api.d.ts +10 -0
  332. package/dist/settings/model-api.d.ts.map +1 -0
  333. package/dist/settings/model-api.js +10 -0
  334. package/dist/settings/model-api.js.map +1 -0
  335. package/dist/storage/home.d.ts +1 -0
  336. package/dist/storage/home.d.ts.map +1 -1
  337. package/dist/storage/home.js +37 -2
  338. package/dist/storage/home.js.map +1 -1
  339. package/dist/tools/core-tools.d.ts +2 -0
  340. package/dist/tools/core-tools.d.ts.map +1 -1
  341. package/dist/tools/core-tools.js +91 -1
  342. package/dist/tools/core-tools.js.map +1 -1
  343. package/dist/ui/shared/activity.d.ts +2 -0
  344. package/dist/ui/shared/activity.d.ts.map +1 -1
  345. package/dist/ui/shared/activity.js +18 -4
  346. package/dist/ui/shared/activity.js.map +1 -1
  347. package/dist/ui/shared/full-message.d.ts +22 -0
  348. package/dist/ui/shared/full-message.d.ts.map +1 -0
  349. package/dist/ui/shared/full-message.js +40 -0
  350. package/dist/ui/shared/full-message.js.map +1 -0
  351. package/dist/ui/shared/local-links.d.ts +7 -0
  352. package/dist/ui/shared/local-links.d.ts.map +1 -0
  353. package/dist/ui/shared/local-links.js +24 -0
  354. package/dist/ui/shared/local-links.js.map +1 -0
  355. package/dist/ui/shared/markdown-stream.d.ts +25 -0
  356. package/dist/ui/shared/markdown-stream.d.ts.map +1 -0
  357. package/dist/ui/shared/markdown-stream.js +35 -0
  358. package/dist/ui/shared/markdown-stream.js.map +1 -0
  359. package/dist/ui/shared/markdown.d.ts +70 -0
  360. package/dist/ui/shared/markdown.d.ts.map +1 -0
  361. package/dist/ui/shared/markdown.js +434 -0
  362. package/dist/ui/shared/markdown.js.map +1 -0
  363. package/dist/ui/shared/presentation.d.ts +10 -2
  364. package/dist/ui/shared/presentation.d.ts.map +1 -1
  365. package/dist/ui/shared/presentation.js +83 -22
  366. package/dist/ui/shared/presentation.js.map +1 -1
  367. package/dist/ui/shared/protocol-state.d.ts +19 -0
  368. package/dist/ui/shared/protocol-state.d.ts.map +1 -1
  369. package/dist/ui/shared/protocol-state.js +188 -26
  370. package/dist/ui/shared/protocol-state.js.map +1 -1
  371. package/dist/ui/shared/virtual-list.d.ts +34 -0
  372. package/dist/ui/shared/virtual-list.d.ts.map +1 -0
  373. package/dist/ui/shared/virtual-list.js +143 -0
  374. package/dist/ui/shared/virtual-list.js.map +1 -0
  375. package/dist/ui/tui/commands.d.ts +1 -1
  376. package/dist/ui/tui/commands.d.ts.map +1 -1
  377. package/dist/ui/tui/commands.js +8 -3
  378. package/dist/ui/tui/commands.js.map +1 -1
  379. package/dist/ui/tui/store.d.ts +22 -1
  380. package/dist/ui/tui/store.d.ts.map +1 -1
  381. package/dist/ui/tui/store.js +50 -3
  382. package/dist/ui/tui/store.js.map +1 -1
  383. package/dist/ui/tui/tui-app.d.ts.map +1 -1
  384. package/dist/ui/tui/tui-app.js +231 -31
  385. package/dist/ui/tui/tui-app.js.map +1 -1
  386. package/dist/ui/tui/view.d.ts +7 -0
  387. package/dist/ui/tui/view.d.ts.map +1 -1
  388. package/dist/ui/tui/view.js +161 -57
  389. package/dist/ui/tui/view.js.map +1 -1
  390. package/dist/version.d.ts +1 -1
  391. package/dist/version.d.ts.map +1 -1
  392. package/dist/version.js +1 -1
  393. package/dist/version.js.map +1 -1
  394. package/package.json +13 -2
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="zh-CN" data-theme="dark">
2
+ <html lang="zh-CN" data-theme="light">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta
@@ -7,8 +7,9 @@
7
7
  content="default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'; frame-src 'none'"
8
8
  />
9
9
  <meta name="viewport" content="width=device-width, initial-scale=1" />
10
- <meta id="theme-color" name="theme-color" content="#0d100e" />
10
+ <meta id="theme-color" name="theme-color" content="#f4f7fb" />
11
11
  <title>pSpore</title>
12
+ <link rel="icon" type="image/svg+xml" href="../assets/pspore.svg" />
12
13
  <link rel="stylesheet" href="./styles.css" />
13
14
  </head>
14
15
  <body>
@@ -20,10 +21,10 @@
20
21
  <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 5h16M4 12h10M4 19h16"></path></svg>
21
22
  </button>
22
23
  <div class="brand-lockup" aria-label="pSpore local agent">
23
- <span class="brand-mark" aria-hidden="true"><i></i><i></i><i></i></span>
24
+ <img class="brand-mark" src="../assets/pspore.svg" alt="" width="34" height="34" />
24
25
  <div>
25
26
  <h1>pSpore</h1>
26
- <span>LOCAL AGENT</span>
27
+ <span>LOCAL COWORK AGENT</span>
27
28
  </div>
28
29
  </div>
29
30
  </div>
@@ -35,6 +36,7 @@
35
36
  <div class="topbar-metrics" aria-label="运行指标">
36
37
  <span><small>修订</small><b id="revision-value">0</b></span>
37
38
  <span><small>上下文</small><b id="usage-value">0</b></span>
39
+ <span title="所有模型请求的累计用量,包含反复发送的历史内容"><small>累计用量</small><b id="total-usage-value">0</b></span>
38
40
  <span><small>缓存</small><b id="cache-value">0</b></span>
39
41
  </div>
40
42
  <button id="inspector-toggle" class="icon-button" type="button" title="收起检查器" aria-label="收起检查器" aria-controls="inspector-panel" aria-expanded="true">
@@ -62,15 +64,28 @@
62
64
  <aside id="navigation-panel" class="left-rail panel" aria-label="会话与 Agent">
63
65
  <header class="panel-header navigation-header">
64
66
  <div class="section-heading">
65
- <div><span class="eyebrow">CONTEXT</span><h2>会话</h2></div>
66
- <span id="session-count" class="count-pill">0</span>
67
+ <div><h2>会话</h2></div>
68
+ <div class="section-heading-actions">
69
+ <span id="session-count" class="count-pill">0</span>
70
+ <button id="new-session-button" class="quiet-icon-button" type="button" title="新建会话" aria-label="新建会话">+</button>
71
+ </div>
67
72
  </div>
68
- <p>主会话与有界子任务共享同一上下文视图。</p>
73
+ <p>根会话独立保存历史;有界子任务挂在所属会话下。</p>
69
74
  </header>
70
75
  <section class="sessions-section">
71
76
  <nav id="session-list" class="session-list" aria-label="会话列表"></nav>
72
77
  </section>
73
78
 
79
+ <section class="rail-summary" aria-label="工作区状态">
80
+ <div class="subsection-heading"><span>工作区</span></div>
81
+ <dl class="rail-metrics">
82
+ <div><dt>运行中任务</dt><dd id="rail-runs">0/0</dd></div>
83
+ <div><dt>MCP 就绪</dt><dd id="rail-mcp">0/0</dd></div>
84
+ <div><dt>受信资源</dt><dd id="rail-resources">0/0</dd></div>
85
+ <div><dt>待批准</dt><dd id="rail-approvals">0</dd></div>
86
+ </dl>
87
+ </section>
88
+
74
89
  <div class="navigation-actions">
75
90
  <button id="agent-compose-toggle" class="secondary-button wide-button" type="button" aria-controls="agent-compose" aria-expanded="false">
76
91
  <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"></path></svg>
@@ -78,7 +93,7 @@
78
93
  </button>
79
94
  <section id="agent-compose" class="inline-editor" hidden>
80
95
  <div class="inline-editor-heading">
81
- <div><span class="eyebrow">DELEGATE</span><h3>委派一个有界任务</h3></div>
96
+ <div><h3>委派一个有界任务</h3></div>
82
97
  <button id="agent-compose-close" class="quiet-icon-button" type="button" aria-label="关闭新建子 Agent">×</button>
83
98
  </div>
84
99
  <form id="spawn-form" class="compact-form" autocomplete="off">
@@ -101,43 +116,112 @@
101
116
 
102
117
  <section class="conversation panel" aria-label="Conversation">
103
118
  <header class="conversation-header">
104
- <div>
105
- <span class="eyebrow">ACTIVE SESSION</span>
106
- <h2 id="session-title">main</h2>
107
- </div>
108
- <div class="session-health">
119
+ <div class="conversation-heading">
120
+ <div>
121
+ <span class="eyebrow">ACTIVE SESSION</span>
122
+ <h2 id="session-title">main</h2>
123
+ </div>
124
+ <div class="session-health">
125
+ <button id="session-search-button" class="icon-button" type="button" title="搜索当前会话(Ctrl+F)" aria-label="搜索当前会话" aria-keyshortcuts="Control+F" aria-expanded="false" aria-controls="session-search">
126
+ <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="6"></circle><path d="m20 20-3.5-3.5"></path></svg>
127
+ </button>
128
+ <button id="open-article-button" class="ghost-button article-reopen" type="button" hidden>文稿</button>
109
129
  <span id="session-status" class="status-chip idle">IDLE</span>
110
130
  <span id="model-name" class="muted">未配置模型</span>
131
+ </div>
132
+ </div>
133
+ <div id="session-search" class="session-search" role="search" hidden>
134
+ <label class="session-search-field">
135
+ <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="6"></circle><path d="m20 20-3.5-3.5"></path></svg>
136
+ <input id="session-search-input" type="text" placeholder="搜索当前会话" aria-label="搜索当前会话" autocomplete="off" spellcheck="false" maxlength="200" />
137
+ </label>
138
+ <span id="session-search-count" class="session-search-count" aria-live="polite"></span>
139
+ <div class="session-search-nav">
140
+ <button id="session-search-prev" class="icon-button" type="button" title="上一处(Shift+Enter)" aria-label="上一处" disabled>
141
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 14.5 12 8.5l6 6"></path></svg>
142
+ </button>
143
+ <button id="session-search-next" class="icon-button" type="button" title="下一处(Enter)" aria-label="下一处" disabled>
144
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9.5 12 15.5l6-6"></path></svg>
145
+ </button>
146
+ <button id="session-search-close" class="icon-button" type="button" title="关闭(Esc)" aria-label="关闭搜索">
147
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M7 7l10 10M17 7 7 17"></path></svg>
148
+ </button>
149
+ </div>
111
150
  </div>
112
151
  </header>
113
152
 
114
- <div id="transcript" class="transcript" tabindex="0" aria-live="polite"></div>
153
+ <div id="transcript" class="transcript" tabindex="0" role="feed" aria-label="会话记录"></div>
115
154
 
155
+ <div id="run-activity" class="run-activity" role="status" aria-live="polite" hidden>
156
+ <i id="run-activity-mark" class="run-activity-mark"></i>
157
+ <span id="run-activity-label" class="run-activity-label"></span>
158
+ <span id="run-activity-elapsed" class="run-activity-elapsed"></span>
159
+ </div>
116
160
  <div class="composer-wrap">
117
161
  <div id="notice-line" class="notice-line" role="status">正在启动…</div>
162
+ <div id="message-queue" class="message-queue" aria-label="排队消息" hidden></div>
118
163
  <form id="composer-form" class="composer" autocomplete="off">
119
- <textarea id="composer-input" name="message" rows="3" maxlength="65536" placeholder="向 main 发送消息…" aria-label="消息"></textarea>
164
+ <div id="composer-drop-overlay" class="composer-drop-overlay" role="status" hidden>
165
+ <strong>松开以添加文件引用</strong>
166
+ <span>仅记录文件或目录路径,不读取、不上传内容</span>
167
+ </div>
168
+ <textarea id="composer-input" name="message" rows="3" maxlength="65536" placeholder="向 main 发送消息…" aria-label="消息" aria-describedby="composer-file-hint"></textarea>
169
+ <div id="composer-references" class="composer-references" role="list" aria-label="文件与目录引用" hidden></div>
120
170
  <div class="composer-toolbar">
121
- <label class="mode-select"><span>发送方式</span>
122
- <select id="composer-mode" name="mode">
123
- <option value="prompt">Prompt</option>
124
- <option value="steer">Steer</option>
125
- <option value="follow_up">Follow-up</option>
126
- </select>
127
- </label>
171
+ <span id="composer-file-hint" class="send-behavior-hint">拖入文件/目录或点「附件」选择,仅引用路径 · 运行中发送会继续排队</span>
128
172
  <div class="composer-actions">
173
+ <button id="attach-file-button" class="icon-button" type="button" title="选择文件" aria-label="选择文件">
174
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.4 11.6 12 20a5 5 0 0 1-7.1-7.1l8.5-8.4a3.3 3.3 0 0 1 4.7 4.7l-8.5 8.4a1.7 1.7 0 0 1-2.3-2.3l7.8-7.8"></path></svg>
175
+ </button>
176
+ <button id="attach-directory-button" class="icon-button" type="button" title="选择文件夹" aria-label="选择文件夹">
177
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2.5h8a2 2 0 0 1 2 2V18a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"></path></svg>
178
+ </button>
129
179
  <button id="compact-button" class="ghost-button" type="button">压缩上下文</button>
130
180
  <button id="abort-button" class="danger-ghost-button" type="button">中止</button>
131
- <button id="send-button" class="primary-button" type="submit">发送 <kbd>Ctrl ↵</kbd></button>
181
+ <button id="send-button" class="primary-button" type="submit" title="Enter 发送 · Shift+Enter 或 Ctrl+Enter 换行">发送 <kbd>↵</kbd></button>
132
182
  </div>
133
183
  </div>
134
184
  </form>
135
185
  </div>
136
186
  </section>
137
187
 
188
+ <section id="article-panel" class="article-panel panel" hidden aria-label="文稿">
189
+ <div id="article-resize" class="article-resize" role="separator" aria-orientation="vertical" aria-label="调整文稿宽度" tabindex="0"></div>
190
+ <header class="article-header">
191
+ <div class="article-heading">
192
+ <span class="eyebrow">ARTICLE</span>
193
+ <h2 id="article-title">文稿</h2>
194
+ </div>
195
+ <div class="article-header-actions">
196
+ <span id="article-version" class="count-pill">v1</span>
197
+ <div id="article-views" class="segmented" role="group" aria-label="文稿视图">
198
+ <button id="article-view-read" class="segment" type="button" data-view="read" aria-pressed="true">正文</button>
199
+ <button id="article-view-token" class="segment" type="button" data-view="token" aria-pressed="false">修订</button>
200
+ <button id="article-view-line" class="segment" type="button" data-view="line" aria-pressed="false">行级</button>
201
+ </div>
202
+ <button id="article-close" class="quiet-icon-button" type="button" aria-label="关闭文稿">×</button>
203
+ </div>
204
+ </header>
205
+ <div class="article-toolbar">
206
+ <div id="article-versions" class="article-versions" role="tablist" aria-label="文稿版本"></div>
207
+ <div class="article-export">
208
+ <span class="article-export-label" id="article-export-label">导出</span>
209
+ <button class="ghost-button" type="button" data-export="txt" aria-describedby="article-export-label">TXT</button>
210
+ <button class="ghost-button" type="button" data-export="md" aria-describedby="article-export-label">MD</button>
211
+ <button class="ghost-button" type="button" data-export="docx" aria-describedby="article-export-label">DOCX</button>
212
+ <button class="ghost-button" type="button" data-export="pdf" aria-describedby="article-export-label">PDF</button>
213
+ </div>
214
+ </div>
215
+ <p id="article-diff-summary" class="article-diff-summary" hidden></p>
216
+ <div id="article-stage" class="article-stage">
217
+ <div id="article-render" class="article-render message-body markdown"></div>
218
+ </div>
219
+ <p id="article-status" class="article-status" role="status"></p>
220
+ </section>
221
+
138
222
  <aside id="inspector-panel" class="right-rail panel" aria-label="上下文检查器">
139
223
  <header class="inspector-header">
140
- <div><span class="eyebrow">WORKSPACE</span><h2>检查器</h2></div>
224
+ <div><h2>检查器</h2></div>
141
225
  <button id="inspector-close" class="quiet-icon-button" type="button" aria-label="关闭检查器">×</button>
142
226
  </header>
143
227
  <nav class="inspector-tabs" role="tablist" aria-label="检查器分类">
@@ -149,7 +233,7 @@
149
233
  <div class="inspector-content">
150
234
  <section id="panel-activity" class="inspector-view" role="tabpanel" aria-labelledby="tab-activity" data-inspector-panel="activity">
151
235
  <div class="section-heading">
152
- <div><span class="eyebrow">LIVE TRACE</span><h2>最近活动</h2></div>
236
+ <div><h2>最近活动</h2></div>
153
237
  <span id="activity-count" class="count-pill">0</span>
154
238
  </div>
155
239
  <div id="activity-list" class="activity-list"></div>
@@ -158,7 +242,19 @@
158
242
  </section>
159
243
 
160
244
  <section id="panel-automation" class="inspector-view" role="tabpanel" aria-labelledby="tab-automation" data-inspector-panel="automation" hidden>
161
- <div class="section-heading"><div><span class="eyebrow">AUTOMATION</span><h2>计划与运行</h2></div></div>
245
+ <div class="section-heading">
246
+ <div><h2>本机索引</h2></div>
247
+ <span id="indexing-phase" class="count-pill">—</span>
248
+ </div>
249
+ <div id="indexing-panel" class="indexing-panel">
250
+ <div class="indexing-bar" role="progressbar" aria-labelledby="indexing-phase" aria-valuemin="0" aria-valuemax="100">
251
+ <i id="indexing-bar-fill"></i>
252
+ </div>
253
+ <p id="indexing-counts" class="indexing-counts">尚未开始</p>
254
+ <p id="indexing-current" class="indexing-current"></p>
255
+ <p id="indexing-note" class="settings-field-note"></p>
256
+ </div>
257
+ <div class="section-heading"><div><h2>计划与运行</h2></div></div>
162
258
  <div class="subsection-heading"><span>计划任务</span></div>
163
259
  <div id="job-list" class="dense-list"></div>
164
260
  <div class="subsection-heading"><span>运行记录</span></div>
@@ -166,12 +262,12 @@
166
262
  </section>
167
263
 
168
264
  <section id="panel-integrations" class="inspector-view" role="tabpanel" aria-labelledby="tab-integrations" data-inspector-panel="integrations" hidden>
169
- <div class="section-heading"><div><span class="eyebrow">EXTENSIONS</span><h2>集成状态</h2></div></div>
265
+ <div class="section-heading"><div><h2>集成状态</h2></div></div>
170
266
  <div id="integration-list" class="dense-list"></div>
171
267
  </section>
172
268
 
173
269
  <section id="panel-resources" class="inspector-view" role="tabpanel" aria-labelledby="tab-resources" data-inspector-panel="resources" hidden>
174
- <div class="section-heading"><div><span class="eyebrow">TRUST GATE</span><h2>资源与信任</h2></div></div>
270
+ <div class="section-heading"><div><h2>资源与信任</h2></div></div>
175
271
  <p class="section-description">只检查 <code>workspace/staging</code> 下的单层资源,安装时锁定精确摘要。</p>
176
272
  <form id="inspect-form" class="compact-form inline-form" autocomplete="off">
177
273
  <label for="staging-name">暂存资源名称</label>
@@ -191,15 +287,15 @@
191
287
  <section class="settings-dialog" role="dialog" aria-modal="true" aria-labelledby="settings-title" aria-describedby="settings-description">
192
288
  <header class="settings-header">
193
289
  <div>
194
- <span class="eyebrow">PREFERENCES</span>
195
- <h2 id="settings-title">模型设置</h2>
196
- <p id="settings-description">配置本地 Daemon 使用的模型、接口与凭据。</p>
290
+
291
+ <h2 id="settings-title">设置</h2>
292
+ <p id="settings-description">配置系统服务使用的模型、上下文与凭据。</p>
197
293
  </div>
198
294
  <button id="settings-close" class="quiet-icon-button" type="button" aria-label="关闭设置">×</button>
199
295
  </header>
200
296
  <form id="settings-form" class="settings-form" autocomplete="off">
201
297
  <section class="settings-section">
202
- <div class="settings-section-title"><span>01</span><div><h3>模型</h3><p>选择当前主会话使用的 provider 与 model。</p></div></div>
298
+ <div class="settings-section-title"><h3>模型</h3><p>选择当前主会话使用的 provider 与 model。</p></div>
203
299
  <div class="field-grid two-columns">
204
300
  <label><span>Provider</span>
205
301
  <select id="settings-provider" name="provider">
@@ -211,10 +307,11 @@
211
307
  <label><span>Model</span><input id="settings-model" name="model" maxlength="128" spellcheck="false" required /></label>
212
308
  </div>
213
309
  <p id="settings-provider-help" class="settings-field-note">使用 DeepSeek 内置模型目录与默认接口。</p>
310
+ <p class="settings-path-note">配置文件<code id="settings-config-path">—</code></p>
214
311
  </section>
215
312
 
216
313
  <section class="settings-section">
217
- <div class="settings-section-title"><span>02</span><div><h3>接口</h3><p>Base URL 留空时使用 provider 默认地址。</p></div></div>
314
+ <div class="settings-section-title"><h3>接口</h3><p>Base URL 与 API 类型都保存在 config.json,Pi 模型目录由它派生。</p></div>
218
315
  <label><span>Base URL</span><input id="settings-base-url" name="baseUrl" type="url" maxlength="2048" placeholder="输入完整 API 服务地址" spellcheck="false" /></label>
219
316
  <div class="field-grid two-columns">
220
317
  <label><span>API 兼容类型</span>
@@ -239,17 +336,96 @@
239
336
  </section>
240
337
 
241
338
  <section class="settings-section">
242
- <div class="settings-section-title"><span>03</span><div><h3>凭据</h3><p>Key 只保存到当前用户私有目录,不进入聊天、日志或仓库。</p></div></div>
339
+ <div class="settings-section-title"><h3>权限</h3><p>决定工具调用在执行前是否需要你确认。</p></div>
340
+ <label><span>授权模式</span>
341
+ <select id="settings-permission-mode" name="permissionMode">
342
+ <option value="ask_risky">仅高危操作询问(默认)</option>
343
+ <option value="ask_all">所有写入类操作都询问</option>
344
+ <option value="allow_all">绕过所有授权确认(Bypass)</option>
345
+ <option value="deny">拒绝所有受控操作</option>
346
+ </select>
347
+ </label>
348
+ <p id="settings-permission-help" class="settings-field-note">越界操作会先弹出批准请求。</p>
349
+ <p id="settings-permission-warning" class="settings-danger-note" hidden>
350
+ 绕过模式下,读写文件、执行 Shell、sudo 与 MCP 调用都会以你当前登录用户的权限直接运行,不再询问。pSpore 不是沙箱,请只在你完全信任当前任务时开启。
351
+ </p>
352
+ </section>
353
+
354
+ <section class="settings-section">
355
+ <div class="settings-section-title"><h3>自动压缩</h3><p>控制长会话何时 compact,以及压缩后保留多少最近上下文。</p></div>
356
+ <label class="checkbox-field">
357
+ <input id="settings-auto-compaction" name="autoCompactionEnabled" type="checkbox" />
358
+ <span><b>启用自动 compact</b><small>达到模型上下文上限前自动生成摘要并继续会话。</small></span>
359
+ </label>
360
+ <div class="field-grid two-columns">
361
+ <label><span>触发上下文 tokens</span><input id="settings-compaction-trigger" name="autoCompactionTriggerTokens" type="number" min="1" max="1000000" step="1" required /></label>
362
+ <label><span>模型上限预留 tokens</span><input id="settings-compaction-reserve" name="autoCompactionReserveTokens" type="number" min="1" max="1000000" step="1" required /></label>
363
+ <label><span>压缩后保留 tokens</span><input id="settings-compaction-keep-recent" name="autoCompactionKeepRecentTokens" type="number" min="1" max="1000000" step="1" required /></label>
364
+ </div>
365
+ <p class="settings-field-note">达到触发长度,或距离模型上限只剩预留量时(以更早者为准)自动 compact。保存后由系统服务重启应用到所有 session。</p>
366
+ <p class="settings-path-note">派生模型目录<code id="settings-models-path">—</code></p>
367
+ </section>
368
+
369
+ <section class="settings-section">
370
+ <div class="settings-section-title"><h3>本机索引</h3><p>后台持续为选定目录建立全文索引,供助手检索你自己的文档。</p></div>
371
+ <label class="checkbox-field">
372
+ <input id="settings-indexing-enabled" name="indexingEnabled" type="checkbox" />
373
+ <span><b>启用本机索引</b><small>与 Aegis Searcher 桌面版共用同一份索引。</small></span>
374
+ </label>
375
+ <div class="field-grid two-columns">
376
+ <label><span>检查间隔(分钟)</span><input id="settings-indexing-interval" name="indexingInterval" type="number" min="1" max="10080" step="1" /></label>
377
+ <label><span>文件类型</span><input id="settings-indexing-ext" name="indexingExtensions" maxlength="256" spellcheck="false" placeholder="txt,md,pdf" /></label>
378
+ </div>
379
+ <div class="indexing-directories">
380
+ <div class="subsection-heading"><span>索引目录</span>
381
+ <button id="settings-indexing-add" class="quiet-text-button" type="button">添加目录…</button>
382
+ </div>
383
+ <div id="settings-indexing-list" class="indexing-dir-list" role="list"></div>
384
+ </div>
385
+ <p id="settings-indexing-note" class="settings-field-note"></p>
386
+ </section>
387
+
388
+ <section class="settings-section">
389
+ <div class="settings-section-title"><h3>凭据</h3><p>Key 只保存到当前用户私有目录(0600),config.json 只记录文件地址。</p></div>
243
390
  <label><span>API Key</span>
244
391
  <div class="secret-input">
245
392
  <input id="settings-api-key" name="apiKey" type="password" maxlength="16384" placeholder="未配置" autocomplete="new-password" spellcheck="false" />
246
393
  <button id="settings-key-reveal" class="quiet-text-button" type="button">显示</button>
247
394
  </div>
248
395
  </label>
396
+ <p class="settings-path-note">
397
+ <span id="settings-api-key-state" class="settings-path-state">未配置</span>
398
+ <code id="settings-api-key-path">—</code>
399
+ <button id="settings-key-copy-path" class="quiet-text-button" type="button">复制路径</button>
400
+ </p>
249
401
  <label class="checkbox-field destructive">
250
402
  <input id="settings-clear-key" name="clearApiKey" type="checkbox" />
251
403
  <span><b>清除桌面设置保存的 Key</b><small>不会删除其他 provider 的凭据。</small></span>
252
404
  </label>
405
+ <label><span>Cookie</span>
406
+ <div class="secret-input">
407
+ <input id="settings-cookie" name="cookie" type="password" maxlength="16384" placeholder="未配置" autocomplete="new-password" spellcheck="false" />
408
+ <button id="settings-cookie-reveal" class="quiet-text-button" type="button">显示</button>
409
+ </div>
410
+ </label>
411
+ <p class="settings-path-note">
412
+ <span id="settings-cookie-state" class="settings-path-state">未配置</span>
413
+ <code id="settings-cookie-path">—</code>
414
+ <button id="settings-cookie-copy-path" class="quiet-text-button" type="button">复制路径</button>
415
+ </p>
416
+ <p class="settings-field-note">调用 LLM 代理接口时作为 HTTP Cookie 头发送。适用于需要浏览器会话的反向代理;留空则保留已保存的值。</p>
417
+ <label class="checkbox-field destructive">
418
+ <input id="settings-clear-cookie" name="clearCookie" type="checkbox" />
419
+ <span><b>清除已保存的 Cookie</b><small>不会删除 API Key。</small></span>
420
+ </label>
421
+ <div class="settings-headers">
422
+ <div class="settings-headers-heading">
423
+ <span>自定义请求头</span>
424
+ <button id="settings-header-add" class="ghost-button" type="button">添加请求头</button>
425
+ </div>
426
+ <div id="settings-header-list" class="settings-header-list"></div>
427
+ <p id="settings-headers-empty" class="settings-field-note">除 Cookie 外,还可以给每次模型请求附加自定义 HTTP 头,例如反向代理要求的鉴权或路由标识。值与 API Key 一样单独存放在 <code>credentials/</code> 下,只有名字会写进模型目录。</p>
428
+ </div>
253
429
  </section>
254
430
 
255
431
  <footer class="settings-footer">
@@ -279,6 +455,7 @@
279
455
  </section>
280
456
  </div>
281
457
 
458
+ <script src="./vendor/gsap.min.js"></script>
282
459
  <script type="module" src="./renderer.js"></script>
283
460
  </body>
284
461
  </html>
@@ -0,0 +1,22 @@
1
+ import type { IndexingPhase, IndexingStatus } from "../../domain/indexing.js";
2
+ /**
3
+ * What the indexing panel shows for a status, kept free of the DOM so the rules
4
+ * can be tested. The panel used to show an empty bar and "正在扫描目录…" for as
5
+ * long as the CLI walked the directories — which reports no counts and can take
6
+ * minutes — and "尚未开始" after a pass that found nothing new, so a working
7
+ * indexer read as stuck or never run.
8
+ */
9
+ export interface IndexingView {
10
+ phase: IndexingPhase;
11
+ phaseLabel: string;
12
+ /** 0–100, or undefined while the indexer cannot say how far along it is. */
13
+ percent: number | undefined;
14
+ counts: string;
15
+ current: string;
16
+ note: string;
17
+ /** The text changes with the clock alone, so the caller has to re-render on a timer. */
18
+ ticking: boolean;
19
+ }
20
+ export declare function presentIndexing(status: IndexingStatus | undefined, now: number): IndexingView;
21
+ export declare function formatElapsed(seconds: number): string;
22
+ //# sourceMappingURL=indexing-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexing-view.d.ts","sourceRoot":"","sources":["../../../src/desktop/renderer/indexing-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG9E;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,OAAO,EAAE,OAAO,CAAC;CAClB;AAuBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAyE7F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASrD"}
@@ -0,0 +1,115 @@
1
+ import { clockTime } from "../../ui/shared/presentation.js";
2
+ const PHASE_LABEL = {
3
+ disabled: "未启用",
4
+ unconfigured: "缺少目录",
5
+ unavailable: "不可用",
6
+ idle: "空闲",
7
+ scanning: "扫描中",
8
+ comparing: "比对中",
9
+ indexing: "索引中",
10
+ failed: "失败",
11
+ };
12
+ /** Why a switched-on indexer is not making progress, in the panel's own words. */
13
+ const IDLE_REASON = {
14
+ disabled: "未启用本机索引",
15
+ unconfigured: "已启用,但还没有选择要索引的目录",
16
+ unavailable: "已启用,但本次发行版没有可用的索引程序",
17
+ };
18
+ /** Past this, a silent walk deserves an explanation rather than just a clock. */
19
+ const LONG_SCAN_MS = 60_000;
20
+ export function presentIndexing(status, now) {
21
+ const phase = status?.phase ?? "disabled";
22
+ const total = status?.total ?? 0;
23
+ const processed = status?.processed ?? 0;
24
+ const skipped = status?.skipped ?? 0;
25
+ const failed = status?.failed ?? 0;
26
+ const lastPass = status?.lastPass;
27
+ const running = phase === "scanning" || phase === "comparing" || phase === "indexing";
28
+ const elapsedMs = running && status?.startedAt ? Math.max(0, now - Date.parse(status.startedAt)) : 0;
29
+ const elapsed = Number.isFinite(elapsedMs) && elapsedMs >= 1_000 ? ` · 已用时 ${formatElapsed(Math.floor(elapsedMs / 1_000))}` : "";
30
+ let phaseLabel = PHASE_LABEL[phase];
31
+ let percent = 0;
32
+ let counts;
33
+ const idleReason = IDLE_REASON[phase];
34
+ if (idleReason !== undefined) {
35
+ counts = status?.message ?? idleReason;
36
+ }
37
+ else if (phase === "scanning") {
38
+ percent = undefined;
39
+ counts = `正在扫描目录${elapsed}`;
40
+ }
41
+ else if (phase === "comparing") {
42
+ percent = undefined;
43
+ counts = `正在比对文件变化${elapsed}`;
44
+ }
45
+ else if (phase === "indexing") {
46
+ if (total > 0) {
47
+ percent = Math.min(100, Math.round((processed / total) * 100));
48
+ counts = `${processed} / ${total} 个文件 · 未变化 ${skipped} · 失败 ${failed}${elapsed}`;
49
+ }
50
+ else {
51
+ // Nothing new was found; the CLI is only closing the pass.
52
+ percent = undefined;
53
+ counts = `没有需要更新的文件 · 未变化 ${skipped}${elapsed}`;
54
+ }
55
+ }
56
+ else if (phase === "idle") {
57
+ if (lastPass) {
58
+ phaseLabel = "已是最新";
59
+ percent = 100;
60
+ counts = lastPass.processed > 0
61
+ ? `本次更新 ${lastPass.processed} 个文件 · 未变化 ${lastPass.skipped}`
62
+ : `没有变化 · 已检查 ${lastPass.skipped} 个文件`;
63
+ if (lastPass.failed > 0)
64
+ counts += ` · 失败 ${lastPass.failed}`;
65
+ }
66
+ else {
67
+ counts = "等待首次索引";
68
+ }
69
+ }
70
+ else {
71
+ percent = total > 0 ? Math.min(100, Math.round((processed / total) * 100)) : 0;
72
+ counts = total > 0 ? `中断于 ${processed} / ${total} 个文件` : "本次索引未完成";
73
+ }
74
+ const notes = [];
75
+ // The settings panel is the only place indexing is switched on, so the status
76
+ // panel repeats that switch rather than letting the phase stand in for it.
77
+ notes.push(status?.enabled ? "设置:已启用" : "设置:未启用");
78
+ if (phase === "unconfigured")
79
+ notes.push("在设置 → 本机索引中添加目录后开始索引");
80
+ if (phase === "failed" && status?.message)
81
+ notes.push(status.message);
82
+ else if ((status?.directories.length ?? 0) > 0)
83
+ notes.push(`索引目录:${status?.directories.join("、")}`);
84
+ if (running && (phase !== "indexing" || total === 0) && elapsedMs >= LONG_SCAN_MS) {
85
+ notes.push("文件很多或位于网络盘时,扫描可能需要几分钟,期间没有逐个文件的进度");
86
+ }
87
+ if (lastPass && (running || phase === "failed")) {
88
+ notes.push(`上次完成于 ${clockTime(lastPass.finishedAt)},此前的索引仍可搜索`);
89
+ }
90
+ if (phase === "idle" && lastPass)
91
+ notes.push(`完成于 ${clockTime(lastPass.finishedAt)} · 用时 ${formatElapsed(Math.round(lastPass.durationMs / 1_000))}`);
92
+ if (phase === "idle" && status?.nextRunAt)
93
+ notes.push(`下次检查 ${clockTime(status.nextRunAt)}`);
94
+ return {
95
+ phase,
96
+ phaseLabel,
97
+ percent,
98
+ counts,
99
+ current: phase === "indexing" ? (status?.currentFile ?? "") : "",
100
+ note: notes.join(" · "),
101
+ ticking: running,
102
+ };
103
+ }
104
+ export function formatElapsed(seconds) {
105
+ if (seconds < 60)
106
+ return `${seconds} 秒`;
107
+ if (seconds < 3_600) {
108
+ const minutes = Math.floor(seconds / 60);
109
+ return seconds % 60 === 0 ? `${minutes} 分` : `${minutes} 分 ${seconds % 60} 秒`;
110
+ }
111
+ const hours = Math.floor(seconds / 3_600);
112
+ const minutes = Math.floor((seconds % 3_600) / 60);
113
+ return minutes === 0 ? `${hours} 小时` : `${hours} 小时 ${minutes} 分`;
114
+ }
115
+ //# sourceMappingURL=indexing-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexing-view.js","sourceRoot":"","sources":["../../../src/desktop/renderer/indexing-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** Renders `source` as markdown into `container`, replacing nothing that is already there. */
2
+ export declare function appendMarkdown(container: HTMLElement, source: string): void;
3
+ /**
4
+ * The streaming bubble needs its caret to sit at the end of the last rendered
5
+ * line rather than on a line of its own, so it is appended inside the trailing
6
+ * block whenever that block is normal prose.
7
+ */
8
+ export declare function appendMarkdownWithTrailing(container: HTMLElement, source: string, trailing: HTMLElement): void;
9
+ /**
10
+ * A markdown body that can be re-rendered from a growing source without
11
+ * discarding the part that did not change.
12
+ *
13
+ * `appendMarkdown` builds the whole body at once, which is right for a message
14
+ * that is already complete. A streaming reply is re-rendered on every token,
15
+ * and replacing the DOM each time collapses any selection the reader is holding
16
+ * — so text they can already see is text they cannot copy until the reply ends.
17
+ * This keeps the blocks whose parse is unchanged and rebuilds only the tail.
18
+ */
19
+ export interface MarkdownSurface {
20
+ update(source: string, trailing?: HTMLElement): void;
21
+ }
22
+ export declare function createMarkdownSurface(container: HTMLElement): MarkdownSurface;
23
+ //# sourceMappingURL=markdown-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-view.d.ts","sourceRoot":"","sources":["../../../src/desktop/renderer/markdown-view.ts"],"names":[],"mappings":"AA0BA,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO3E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CAK9G;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACtD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,WAAW,GAAG,eAAe,CA2B7E"}