@jingyi0605/codingns 0.8.1 → 0.9.0

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 (587) hide show
  1. package/bin/codingns.mjs +187 -156
  2. package/dist/public/assets/AdaptiveButlerPage-B17QiMyT.js +2 -0
  3. package/dist/public/assets/App-CFBwDUNA.js +30 -0
  4. package/dist/public/assets/{BootstrapPage-jFfl7KNK.js → BootstrapPage-W5wU3BPh.js} +1 -1
  5. package/dist/public/assets/{ConversationPage-sj_rn4q0.js → ConversationPage-DQLX1bUh.js} +6 -6
  6. package/dist/public/assets/{DesktopDetachPreviewPage-C5c88SOX.js → DesktopDetachPreviewPage-DTPeuAW-.js} +1 -1
  7. package/dist/public/assets/DesktopModal-6ii53_Y9.js +1 -0
  8. package/dist/public/assets/DesktopWindowPage-D0blSuKd.js +2 -0
  9. package/dist/public/assets/FileContextPanel-BrKO8Xt6.js +1 -0
  10. package/dist/public/assets/GitSidebar-BdwiDtOr.js +6 -0
  11. package/dist/public/assets/MobileCreateSessionSheet-Cx_dBiBb.js +1 -0
  12. package/dist/public/assets/MobileSheet-opTWyRe1.js +1 -0
  13. package/dist/public/assets/{MobileTopHeaderFrame-_I0t7cC_.js → MobileTopHeaderFrame-BbNON3Y4.js} +1 -1
  14. package/dist/public/assets/MobileWorkspaceSwitcherHeader-BZEzPeMj.js +1 -0
  15. package/dist/public/assets/PluginAccessOverview-mQDmAljp.js +1 -0
  16. package/dist/public/assets/PluginContainerPage-CcxUJpM4.js +1 -0
  17. package/dist/public/assets/PluginDetailPage-D5--ACIt.js +1 -0
  18. package/dist/public/assets/PluginsListPage-D_oJxYXT.js +1 -0
  19. package/dist/public/assets/{RelayConnectEntryPage-CMtDWyGS.js → RelayConnectEntryPage-DROxpnkv.js} +1 -1
  20. package/dist/public/assets/ServerSettingsModal-CUUOPqSe.js +1 -0
  21. package/dist/public/assets/SessionIndexPage-C2Jxh6Gp.js +1 -0
  22. package/dist/public/assets/SettingsPage-BlAZCHsy.js +2 -0
  23. package/dist/public/assets/TerminalManagerPanel-CjzbiWjl.js +1 -0
  24. package/dist/public/assets/{TerminalPage-CBIKHI33.js → TerminalPage-CwWyFDj8.js} +3 -3
  25. package/dist/public/assets/TerminalRuntimeFallbackModal-CSVVbO8r.js +1 -0
  26. package/dist/public/assets/ToolFilesPage-QBEY8oCf.js +1 -0
  27. package/dist/public/assets/ToolGitPage-BKoZ2l9v.js +1 -0
  28. package/dist/public/assets/ToolProcessesPage-BOH0ib4G.js +1 -0
  29. package/dist/public/assets/ToolsHomePage-BcMZ3BCQ.js +1 -0
  30. package/dist/public/assets/WorkbenchLandingPage-B5zoppEl.js +1 -0
  31. package/dist/public/assets/WorkbenchLayout-BksVkkFF.css +1 -0
  32. package/dist/public/assets/WorkbenchLayout-CikJBS62.js +1019 -0
  33. package/dist/public/assets/WorkbenchModal-NGmPgqaE.js +1 -0
  34. package/dist/public/assets/WorkbenchShellRoute-BbbSOiZw.js +1 -0
  35. package/dist/public/assets/WorkbenchShellRoute-DT3VMjWD.css +1 -0
  36. package/dist/public/assets/WorkspaceDebugDetailPage-CVivdPx5.js +1 -0
  37. package/dist/public/assets/WorkspaceDetailPage-DgOSjscR.js +1 -0
  38. package/dist/public/assets/WorkspaceHomePage-HPa7M_Vh.js +1 -0
  39. package/dist/public/assets/{client-runtime-manager-CdJP7nUp.js → client-runtime-manager-DXbI9K1K.js} +1 -1
  40. package/dist/public/assets/index-BxJPQpFM.css +1 -0
  41. package/dist/public/assets/index-CeXGOT_T.js +50 -0
  42. package/dist/public/assets/{login-direct-candidate-resolver-C-mo698r.js → login-direct-candidate-resolver-DkKyFtQJ.js} +1 -1
  43. package/dist/public/assets/plugin-permission-copy-CzN269Bk.js +1 -0
  44. package/dist/public/assets/plugins-api-Bv9DHpLF.js +1 -0
  45. package/dist/public/assets/{preferences-service-CnaTvZq2.js → preferences-service-D2ISL2Zz.js} +1 -1
  46. package/dist/public/assets/{relay-entry-D7OgZZN-.js → relay-entry-Bg0OisQy.js} +1 -1
  47. package/dist/public/assets/{terminal-runtime-meta-BCtAYB0E.js → terminal-runtime-meta-C8t-CIDF.js} +1 -1
  48. package/dist/public/assets/useRegisteredDebugTemplates-Bol3NVfN.js +1 -0
  49. package/dist/public/assets/workbench-navigation-B7IjRQd8.js +1 -0
  50. package/dist/public/index.html +2 -2
  51. package/dist/server/config/env.d.ts +1 -0
  52. package/dist/server/config/env.js +4 -0
  53. package/dist/server/config/env.js.map +1 -1
  54. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js +1 -1
  55. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js.map +1 -1
  56. package/dist/server/middlewares/auth-guard.js +10 -5
  57. package/dist/server/middlewares/auth-guard.js.map +1 -1
  58. package/dist/server/modules/affairs-indexer/contracts/src/errors/app-error.d.ts +11 -0
  59. package/dist/server/modules/affairs-indexer/contracts/src/errors/app-error.js +22 -0
  60. package/dist/server/modules/affairs-indexer/contracts/src/errors/app-error.js.map +1 -0
  61. package/dist/server/modules/affairs-indexer/contracts/src/errors/error-codes.d.ts +23 -0
  62. package/dist/server/modules/affairs-indexer/contracts/src/errors/error-codes.js +23 -0
  63. package/dist/server/modules/affairs-indexer/contracts/src/errors/error-codes.js.map +1 -0
  64. package/dist/server/modules/affairs-indexer/contracts/src/index.d.ts +4 -0
  65. package/dist/server/modules/affairs-indexer/contracts/src/index.js +5 -0
  66. package/dist/server/modules/affairs-indexer/contracts/src/index.js.map +1 -0
  67. package/dist/server/modules/affairs-indexer/contracts/src/types/cli-command-context.d.ts +7 -0
  68. package/dist/server/modules/affairs-indexer/contracts/src/types/cli-command-context.js +2 -0
  69. package/dist/server/modules/affairs-indexer/contracts/src/types/cli-command-context.js.map +1 -0
  70. package/dist/server/modules/affairs-indexer/contracts/src/types/runtime-config.d.ts +16 -0
  71. package/dist/server/modules/affairs-indexer/contracts/src/types/runtime-config.js +2 -0
  72. package/dist/server/modules/affairs-indexer/contracts/src/types/runtime-config.js.map +1 -0
  73. package/dist/server/modules/affairs-indexer/core/src/config/load-runtime-config.d.ts +10 -0
  74. package/dist/server/modules/affairs-indexer/core/src/config/load-runtime-config.js +215 -0
  75. package/dist/server/modules/affairs-indexer/core/src/config/load-runtime-config.js.map +1 -0
  76. package/dist/server/modules/affairs-indexer/core/src/index.d.ts +31 -0
  77. package/dist/server/modules/affairs-indexer/core/src/index.js +32 -0
  78. package/dist/server/modules/affairs-indexer/core/src/index.js.map +1 -0
  79. package/dist/server/modules/affairs-indexer/core/src/logging/structured-logger.d.ts +20 -0
  80. package/dist/server/modules/affairs-indexer/core/src/logging/structured-logger.js +47 -0
  81. package/dist/server/modules/affairs-indexer/core/src/logging/structured-logger.js.map +1 -0
  82. package/dist/server/modules/affairs-indexer/core/src/parser/base-complex-parser-adapter.d.ts +17 -0
  83. package/dist/server/modules/affairs-indexer/core/src/parser/base-complex-parser-adapter.js +63 -0
  84. package/dist/server/modules/affairs-indexer/core/src/parser/base-complex-parser-adapter.js.map +1 -0
  85. package/dist/server/modules/affairs-indexer/core/src/parser/complex-document-skip-adapter.d.ts +12 -0
  86. package/dist/server/modules/affairs-indexer/core/src/parser/complex-document-skip-adapter.js +42 -0
  87. package/dist/server/modules/affairs-indexer/core/src/parser/complex-document-skip-adapter.js.map +1 -0
  88. package/dist/server/modules/affairs-indexer/core/src/parser/csv-parser-adapter.d.ts +7 -0
  89. package/dist/server/modules/affairs-indexer/core/src/parser/csv-parser-adapter.js +107 -0
  90. package/dist/server/modules/affairs-indexer/core/src/parser/csv-parser-adapter.js.map +1 -0
  91. package/dist/server/modules/affairs-indexer/core/src/parser/document-parser.d.ts +19 -0
  92. package/dist/server/modules/affairs-indexer/core/src/parser/document-parser.js +37 -0
  93. package/dist/server/modules/affairs-indexer/core/src/parser/document-parser.js.map +1 -0
  94. package/dist/server/modules/affairs-indexer/core/src/parser/docx-parser-adapter.d.ts +7 -0
  95. package/dist/server/modules/affairs-indexer/core/src/parser/docx-parser-adapter.js +123 -0
  96. package/dist/server/modules/affairs-indexer/core/src/parser/docx-parser-adapter.js.map +1 -0
  97. package/dist/server/modules/affairs-indexer/core/src/parser/openxml-utils.d.ts +8 -0
  98. package/dist/server/modules/affairs-indexer/core/src/parser/openxml-utils.js +111 -0
  99. package/dist/server/modules/affairs-indexer/core/src/parser/openxml-utils.js.map +1 -0
  100. package/dist/server/modules/affairs-indexer/core/src/parser/parser-adapter.d.ts +42 -0
  101. package/dist/server/modules/affairs-indexer/core/src/parser/parser-adapter.js +2 -0
  102. package/dist/server/modules/affairs-indexer/core/src/parser/parser-adapter.js.map +1 -0
  103. package/dist/server/modules/affairs-indexer/core/src/parser/parser-capability-registry.d.ts +18 -0
  104. package/dist/server/modules/affairs-indexer/core/src/parser/parser-capability-registry.js +91 -0
  105. package/dist/server/modules/affairs-indexer/core/src/parser/parser-capability-registry.js.map +1 -0
  106. package/dist/server/modules/affairs-indexer/core/src/parser/parser-router.d.ts +18 -0
  107. package/dist/server/modules/affairs-indexer/core/src/parser/parser-router.js +59 -0
  108. package/dist/server/modules/affairs-indexer/core/src/parser/parser-router.js.map +1 -0
  109. package/dist/server/modules/affairs-indexer/core/src/parser/parser-skip-repository.d.ts +48 -0
  110. package/dist/server/modules/affairs-indexer/core/src/parser/parser-skip-repository.js +193 -0
  111. package/dist/server/modules/affairs-indexer/core/src/parser/parser-skip-repository.js.map +1 -0
  112. package/dist/server/modules/affairs-indexer/core/src/parser/pdf-parser-adapter.d.ts +7 -0
  113. package/dist/server/modules/affairs-indexer/core/src/parser/pdf-parser-adapter.js +371 -0
  114. package/dist/server/modules/affairs-indexer/core/src/parser/pdf-parser-adapter.js.map +1 -0
  115. package/dist/server/modules/affairs-indexer/core/src/parser/plain-text-parser-adapter.d.ts +10 -0
  116. package/dist/server/modules/affairs-indexer/core/src/parser/plain-text-parser-adapter.js +55 -0
  117. package/dist/server/modules/affairs-indexer/core/src/parser/plain-text-parser-adapter.js.map +1 -0
  118. package/dist/server/modules/affairs-indexer/core/src/parser/plain-text-parser.d.ts +9 -0
  119. package/dist/server/modules/affairs-indexer/core/src/parser/plain-text-parser.js +2 -0
  120. package/dist/server/modules/affairs-indexer/core/src/parser/plain-text-parser.js.map +1 -0
  121. package/dist/server/modules/affairs-indexer/core/src/parser/pptx-parser-adapter.d.ts +7 -0
  122. package/dist/server/modules/affairs-indexer/core/src/parser/pptx-parser-adapter.js +130 -0
  123. package/dist/server/modules/affairs-indexer/core/src/parser/pptx-parser-adapter.js.map +1 -0
  124. package/dist/server/modules/affairs-indexer/core/src/parser/xlsx-parser-adapter.d.ts +7 -0
  125. package/dist/server/modules/affairs-indexer/core/src/parser/xlsx-parser-adapter.js +228 -0
  126. package/dist/server/modules/affairs-indexer/core/src/parser/xlsx-parser-adapter.js.map +1 -0
  127. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.d.ts +205 -0
  128. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js +1471 -0
  129. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js.map +1 -0
  130. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-write-repository.d.ts +161 -0
  131. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-write-repository.js +1350 -0
  132. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-write-repository.js.map +1 -0
  133. package/dist/server/modules/affairs-indexer/core/src/scanner/file-scanner.d.ts +32 -0
  134. package/dist/server/modules/affairs-indexer/core/src/scanner/file-scanner.js +208 -0
  135. package/dist/server/modules/affairs-indexer/core/src/scanner/file-scanner.js.map +1 -0
  136. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.d.ts +30 -0
  137. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js +66 -0
  138. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js.map +1 -0
  139. package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.d.ts +33 -0
  140. package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js +705 -0
  141. package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js.map +1 -0
  142. package/dist/server/modules/affairs-indexer/core/src/services/indexer/allowed-extensions-diff-service.d.ts +80 -0
  143. package/dist/server/modules/affairs-indexer/core/src/services/indexer/allowed-extensions-diff-service.js +193 -0
  144. package/dist/server/modules/affairs-indexer/core/src/services/indexer/allowed-extensions-diff-service.js.map +1 -0
  145. package/dist/server/modules/affairs-indexer/core/src/services/indexer/text-indexer.d.ts +77 -0
  146. package/dist/server/modules/affairs-indexer/core/src/services/indexer/text-indexer.js +467 -0
  147. package/dist/server/modules/affairs-indexer/core/src/services/indexer/text-indexer.js.map +1 -0
  148. package/dist/server/modules/affairs-indexer/core/src/services/mcp/mcp-stdio-server.d.ts +17 -0
  149. package/dist/server/modules/affairs-indexer/core/src/services/mcp/mcp-stdio-server.js +264 -0
  150. package/dist/server/modules/affairs-indexer/core/src/services/mcp/mcp-stdio-server.js.map +1 -0
  151. package/dist/server/modules/affairs-indexer/core/src/services/search/offline-search-service.d.ts +11 -0
  152. package/dist/server/modules/affairs-indexer/core/src/services/search/offline-search-service.js +76 -0
  153. package/dist/server/modules/affairs-indexer/core/src/services/search/offline-search-service.js.map +1 -0
  154. package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.d.ts +26 -0
  155. package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js +305 -0
  156. package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js.map +1 -0
  157. package/dist/server/modules/affairs-indexer/core/src/services/tagging/tag-recompute-service.d.ts +53 -0
  158. package/dist/server/modules/affairs-indexer/core/src/services/tagging/tag-recompute-service.js +566 -0
  159. package/dist/server/modules/affairs-indexer/core/src/services/tagging/tag-recompute-service.js.map +1 -0
  160. package/dist/server/modules/affairs-indexer/core/src/services/watch/watch-service.d.ts +47 -0
  161. package/dist/server/modules/affairs-indexer/core/src/services/watch/watch-service.js +227 -0
  162. package/dist/server/modules/affairs-indexer/core/src/services/watch/watch-service.js.map +1 -0
  163. package/dist/server/modules/affairs-indexer/core/src/sqlite/catalog-schema.d.ts +5 -0
  164. package/dist/server/modules/affairs-indexer/core/src/sqlite/catalog-schema.js +245 -0
  165. package/dist/server/modules/affairs-indexer/core/src/sqlite/catalog-schema.js.map +1 -0
  166. package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.d.ts +14 -0
  167. package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js +87 -0
  168. package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js.map +1 -0
  169. package/dist/server/modules/affairs-indexer/core/src/sqlite/init-catalog.d.ts +13 -0
  170. package/dist/server/modules/affairs-indexer/core/src/sqlite/init-catalog.js +16 -0
  171. package/dist/server/modules/affairs-indexer/core/src/sqlite/init-catalog.js.map +1 -0
  172. package/dist/server/modules/affairs-indexer/core/src/sqlite/migration-runner.d.ts +22 -0
  173. package/dist/server/modules/affairs-indexer/core/src/sqlite/migration-runner.js +430 -0
  174. package/dist/server/modules/affairs-indexer/core/src/sqlite/migration-runner.js.map +1 -0
  175. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.d.ts +9 -0
  176. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js +19 -0
  177. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js.map +1 -0
  178. package/dist/server/modules/affairs-indexer/core/src/tagging/simple-tag-inference.d.ts +21 -0
  179. package/dist/server/modules/affairs-indexer/core/src/tagging/simple-tag-inference.js +94 -0
  180. package/dist/server/modules/affairs-indexer/core/src/tagging/simple-tag-inference.js.map +1 -0
  181. package/dist/server/modules/affairs-indexer/core/src/utils/abort.d.ts +2 -0
  182. package/dist/server/modules/affairs-indexer/core/src/utils/abort.js +13 -0
  183. package/dist/server/modules/affairs-indexer/core/src/utils/abort.js.map +1 -0
  184. package/dist/server/modules/affairs-indexer/core/src/utils/file-streaming.d.ts +9 -0
  185. package/dist/server/modules/affairs-indexer/core/src/utils/file-streaming.js +64 -0
  186. package/dist/server/modules/affairs-indexer/core/src/utils/file-streaming.js.map +1 -0
  187. package/dist/server/modules/affairs-indexer/core/src/utils/root-command-lock.d.ts +10 -0
  188. package/dist/server/modules/affairs-indexer/core/src/utils/root-command-lock.js +230 -0
  189. package/dist/server/modules/affairs-indexer/core/src/utils/root-command-lock.js.map +1 -0
  190. package/dist/server/modules/affairs-indexer/core/src/utils/rss-log.d.ts +2 -0
  191. package/dist/server/modules/affairs-indexer/core/src/utils/rss-log.js +19 -0
  192. package/dist/server/modules/affairs-indexer/core/src/utils/rss-log.js.map +1 -0
  193. package/dist/server/modules/affairs-indexer/internal-command-runner.d.ts +31 -0
  194. package/dist/server/modules/affairs-indexer/internal-command-runner.js +643 -0
  195. package/dist/server/modules/affairs-indexer/internal-command-runner.js.map +1 -0
  196. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +0 -49
  197. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +10 -56
  198. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  199. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +2 -46
  200. package/dist/server/modules/assistant-capability/assistant-capability-service.js +15 -158
  201. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  202. package/dist/server/modules/browser-runtime/opencli-bridge-browser-executor.d.ts +4 -2
  203. package/dist/server/modules/browser-runtime/opencli-bridge-browser-executor.js +62 -21
  204. package/dist/server/modules/browser-runtime/opencli-bridge-browser-executor.js.map +1 -1
  205. package/dist/server/modules/butler/butler-control-session-service.d.ts +3 -4
  206. package/dist/server/modules/butler/butler-control-session-service.js +39 -62
  207. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  208. package/dist/server/modules/butler/butler-controller.d.ts +11 -3
  209. package/dist/server/modules/butler/butler-controller.js +19 -4
  210. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  211. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  212. package/dist/server/modules/butler/butler-profile-service.d.ts +1 -1
  213. package/dist/server/modules/butler/butler-profile-service.js +34 -63
  214. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  215. package/dist/server/modules/butler/butler-project-service.d.ts +1 -3
  216. package/dist/server/modules/butler/butler-project-service.js +1 -7
  217. package/dist/server/modules/butler/butler-project-service.js.map +1 -1
  218. package/dist/server/modules/butler/butler-session-service.d.ts +1 -0
  219. package/dist/server/modules/butler/butler-session-service.js +109 -0
  220. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  221. package/dist/server/modules/butler/butler-session-summary-service.js +0 -2
  222. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  223. package/dist/server/modules/butler/butler-workspace-context.d.ts +5 -1
  224. package/dist/server/modules/butler/butler-workspace-context.js +21 -12
  225. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -1
  226. package/dist/server/modules/file/file-access-guard.d.ts +2 -0
  227. package/dist/server/modules/file/file-access-guard.js +24 -2
  228. package/dist/server/modules/file/file-access-guard.js.map +1 -1
  229. package/dist/server/modules/file/file-content-service.d.ts +11 -0
  230. package/dist/server/modules/file/file-content-service.js +55 -0
  231. package/dist/server/modules/file/file-content-service.js.map +1 -1
  232. package/dist/server/modules/file/file-controller.d.ts +178 -1
  233. package/dist/server/modules/file/file-controller.js +273 -4
  234. package/dist/server/modules/file/file-controller.js.map +1 -1
  235. package/dist/server/modules/file/file-preview-link-service.d.ts +3 -0
  236. package/dist/server/modules/file/file-preview-link-service.js +30 -1
  237. package/dist/server/modules/file/file-preview-link-service.js.map +1 -1
  238. package/dist/server/modules/file/file-preview-service.js +15 -4
  239. package/dist/server/modules/file/file-preview-service.js.map +1 -1
  240. package/dist/server/modules/file/file-preview-types.d.ts +9 -1
  241. package/dist/server/modules/file/file-preview-types.js +8 -1
  242. package/dist/server/modules/file/file-preview-types.js.map +1 -1
  243. package/dist/server/modules/file/recent-modified-file-service.d.ts +15 -0
  244. package/dist/server/modules/file/recent-modified-file-service.js +102 -0
  245. package/dist/server/modules/file/recent-modified-file-service.js.map +1 -0
  246. package/dist/server/modules/file/runtime/codingns-workspace-bridge.js +917 -0
  247. package/dist/server/modules/file/workspace-file-bridge-service.d.ts +137 -0
  248. package/dist/server/modules/file/workspace-file-bridge-service.js +490 -0
  249. package/dist/server/modules/file/workspace-file-bridge-service.js.map +1 -0
  250. package/dist/server/modules/file/workspace-file-bridge-watch-service.d.ts +42 -0
  251. package/dist/server/modules/file/workspace-file-bridge-watch-service.js +304 -0
  252. package/dist/server/modules/file/workspace-file-bridge-watch-service.js.map +1 -0
  253. package/dist/server/modules/file/workspace-index-apply-service.d.ts +25 -0
  254. package/dist/server/modules/file/workspace-index-apply-service.js +42 -0
  255. package/dist/server/modules/file/workspace-index-apply-service.js.map +1 -0
  256. package/dist/server/modules/model-switch/cc-switch-adapter.js +1 -1
  257. package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -1
  258. package/dist/server/modules/office/office-controller.d.ts +15 -1
  259. package/dist/server/modules/office/office-controller.js +26 -1
  260. package/dist/server/modules/office/office-controller.js.map +1 -1
  261. package/dist/server/modules/office/onlyoffice-integration-service.d.ts +78 -0
  262. package/dist/server/modules/office/onlyoffice-integration-service.js +610 -0
  263. package/dist/server/modules/office/onlyoffice-integration-service.js.map +1 -0
  264. package/dist/server/modules/plugins/plugin-controller.d.ts +131 -0
  265. package/dist/server/modules/plugins/plugin-controller.js +277 -0
  266. package/dist/server/modules/plugins/plugin-controller.js.map +1 -0
  267. package/dist/server/modules/plugins/plugin-file-gateway-service.d.ts +50 -0
  268. package/dist/server/modules/plugins/plugin-file-gateway-service.js +191 -0
  269. package/dist/server/modules/plugins/plugin-file-gateway-service.js.map +1 -0
  270. package/dist/server/modules/plugins/plugin-manifest.d.ts +8 -0
  271. package/dist/server/modules/plugins/plugin-manifest.js +420 -0
  272. package/dist/server/modules/plugins/plugin-manifest.js.map +1 -0
  273. package/dist/server/modules/plugins/plugin-permission-service.d.ts +49 -0
  274. package/dist/server/modules/plugins/plugin-permission-service.js +267 -0
  275. package/dist/server/modules/plugins/plugin-permission-service.js.map +1 -0
  276. package/dist/server/modules/plugins/plugin-process-runner.d.ts +21 -0
  277. package/dist/server/modules/plugins/plugin-process-runner.js +127 -0
  278. package/dist/server/modules/plugins/plugin-process-runner.js.map +1 -0
  279. package/dist/server/modules/plugins/plugin-registry-service.d.ts +41 -0
  280. package/dist/server/modules/plugins/plugin-registry-service.js +238 -0
  281. package/dist/server/modules/plugins/plugin-registry-service.js.map +1 -0
  282. package/dist/server/modules/plugins/plugin-runtime-service.d.ts +55 -0
  283. package/dist/server/modules/plugins/plugin-runtime-service.js +252 -0
  284. package/dist/server/modules/plugins/plugin-runtime-service.js.map +1 -0
  285. package/dist/server/modules/plugins/plugin-runtime-session-service.d.ts +21 -0
  286. package/dist/server/modules/plugins/plugin-runtime-session-service.js +83 -0
  287. package/dist/server/modules/plugins/plugin-runtime-session-service.js.map +1 -0
  288. package/dist/server/modules/plugins/plugin-scheduler-service.d.ts +31 -0
  289. package/dist/server/modules/plugins/plugin-scheduler-service.js +232 -0
  290. package/dist/server/modules/plugins/plugin-scheduler-service.js.map +1 -0
  291. package/dist/server/modules/plugins/plugin-static-service.d.ts +11 -0
  292. package/dist/server/modules/plugins/plugin-static-service.js +145 -0
  293. package/dist/server/modules/plugins/plugin-static-service.js.map +1 -0
  294. package/dist/server/modules/preferences/profile-service.d.ts +1 -0
  295. package/dist/server/modules/preferences/profile-service.js +27 -3
  296. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  297. package/dist/server/modules/presentation/presentation-controller.d.ts +3 -0
  298. package/dist/server/modules/presentation/presentation-controller.js +11 -0
  299. package/dist/server/modules/presentation/presentation-controller.js.map +1 -1
  300. package/dist/server/modules/presentation/presentation-export-task-service.d.ts +6 -0
  301. package/dist/server/modules/presentation/presentation-export-task-service.js +52 -8
  302. package/dist/server/modules/presentation/presentation-export-task-service.js.map +1 -1
  303. package/dist/server/modules/presentation/presentation-pptx-export-service.js +200 -14
  304. package/dist/server/modules/presentation/presentation-pptx-export-service.js.map +1 -1
  305. package/dist/server/modules/presentation/presentation-renderer.d.ts +50 -0
  306. package/dist/server/modules/presentation/presentation-renderer.js +450 -37
  307. package/dist/server/modules/presentation/presentation-renderer.js.map +1 -1
  308. package/dist/server/modules/sessions/codex-app-server-helper-process.js +0 -8
  309. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  310. package/dist/server/modules/sessions/session-controller.d.ts +1 -0
  311. package/dist/server/modules/sessions/session-controller.js +3 -0
  312. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  313. package/dist/server/modules/sessions/session-history-service.d.ts +2 -0
  314. package/dist/server/modules/sessions/session-history-service.js +78 -3
  315. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  316. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +1 -0
  317. package/dist/server/modules/sessions/session-live-runtime-service.js +4 -0
  318. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  319. package/dist/server/modules/sessions/session-permission-request-service.js +0 -4
  320. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  321. package/dist/server/modules/sessions/workspace-session-instruction-watch-service.d.ts +23 -0
  322. package/dist/server/modules/sessions/workspace-session-instruction-watch-service.js +122 -0
  323. package/dist/server/modules/sessions/workspace-session-instruction-watch-service.js.map +1 -0
  324. package/dist/server/modules/sessions/workspace-session-runtime-context-service.d.ts +15 -0
  325. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js +93 -10
  326. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js.map +1 -1
  327. package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +6 -7
  328. package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +2 -3
  329. package/dist/server/modules/system/host-resource-controller.d.ts +7 -0
  330. package/dist/server/modules/system/host-resource-controller.js +12 -0
  331. package/dist/server/modules/system/host-resource-controller.js.map +1 -0
  332. package/dist/server/modules/system/host-resource-service.d.ts +54 -0
  333. package/dist/server/modules/system/host-resource-service.js +162 -0
  334. package/dist/server/modules/system/host-resource-service.js.map +1 -0
  335. package/dist/server/modules/tasks/observability-service.d.ts +12 -2
  336. package/dist/server/modules/tasks/observability-service.js +13 -1
  337. package/dist/server/modules/tasks/observability-service.js.map +1 -1
  338. package/dist/server/modules/tasks/task-helper-client.d.ts +36 -2
  339. package/dist/server/modules/tasks/task-helper-client.js +201 -19
  340. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  341. package/dist/server/modules/tasks/task-helper-pool.d.ts +37 -0
  342. package/dist/server/modules/tasks/task-helper-pool.js +173 -0
  343. package/dist/server/modules/tasks/task-helper-pool.js.map +1 -0
  344. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +27 -0
  345. package/dist/server/modules/tasks/task-helper-process-handlers.js +25 -1
  346. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
  347. package/dist/server/modules/tasks/task-helper-process.js +75 -26
  348. package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
  349. package/dist/server/modules/tasks/task-helper-scheduling.d.ts +11 -0
  350. package/dist/server/modules/tasks/task-helper-scheduling.js +43 -0
  351. package/dist/server/modules/tasks/task-helper-scheduling.js.map +1 -0
  352. package/dist/server/modules/tasks/task-lane-executors.js +19 -3
  353. package/dist/server/modules/tasks/task-lane-executors.js.map +1 -1
  354. package/dist/server/modules/tasks/task-manager.d.ts +1 -0
  355. package/dist/server/modules/tasks/task-manager.js +3 -0
  356. package/dist/server/modules/tasks/task-manager.js.map +1 -1
  357. package/dist/server/modules/tasks/task-registry.d.ts +1 -0
  358. package/dist/server/modules/tasks/task-registry.js +3 -0
  359. package/dist/server/modules/tasks/task-registry.js.map +1 -1
  360. package/dist/server/modules/tasks/task-scheduler.d.ts +6 -0
  361. package/dist/server/modules/tasks/task-scheduler.js +162 -7
  362. package/dist/server/modules/tasks/task-scheduler.js.map +1 -1
  363. package/dist/server/modules/tasks/task-types.d.ts +30 -3
  364. package/dist/server/modules/tasks/task-types.js +16 -2
  365. package/dist/server/modules/tasks/task-types.js.map +1 -1
  366. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +1 -1
  367. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -1
  368. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.d.ts +68 -0
  369. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js +286 -0
  370. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js.map +1 -0
  371. package/dist/server/modules/workbench/workbench-controller.js +11 -1
  372. package/dist/server/modules/workbench/workbench-controller.js.map +1 -1
  373. package/dist/server/modules/workbench/workbench-service.d.ts +9 -2
  374. package/dist/server/modules/workbench/workbench-service.js +58 -18
  375. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  376. package/dist/server/modules/workspace/affairs-library-controller.d.ts +117 -0
  377. package/dist/server/modules/workspace/affairs-library-controller.js +164 -0
  378. package/dist/server/modules/workspace/affairs-library-controller.js.map +1 -0
  379. package/dist/server/modules/workspace/affairs-library-debug-log.d.ts +23 -0
  380. package/dist/server/modules/workspace/affairs-library-debug-log.js +107 -0
  381. package/dist/server/modules/workspace/affairs-library-debug-log.js.map +1 -0
  382. package/dist/server/modules/workspace/affairs-library-dirty-watch-service.d.ts +52 -0
  383. package/dist/server/modules/workspace/affairs-library-dirty-watch-service.js +555 -0
  384. package/dist/server/modules/workspace/affairs-library-dirty-watch-service.js.map +1 -0
  385. package/dist/server/modules/workspace/affairs-library-preview-link-service.d.ts +24 -0
  386. package/dist/server/modules/workspace/affairs-library-preview-link-service.js +157 -0
  387. package/dist/server/modules/workspace/affairs-library-preview-link-service.js.map +1 -0
  388. package/dist/server/modules/workspace/affairs-library-refresh-contract.d.ts +56 -0
  389. package/dist/server/modules/workspace/affairs-library-refresh-contract.js +48 -0
  390. package/dist/server/modules/workspace/affairs-library-refresh-contract.js.map +1 -0
  391. package/dist/server/modules/workspace/affairs-library-service.d.ts +344 -0
  392. package/dist/server/modules/workspace/affairs-library-service.js +3755 -0
  393. package/dist/server/modules/workspace/affairs-library-service.js.map +1 -0
  394. package/dist/server/modules/workspace/affairs-lightweight-session-controller.d.ts +78 -0
  395. package/dist/server/modules/workspace/affairs-lightweight-session-controller.js +146 -0
  396. package/dist/server/modules/workspace/affairs-lightweight-session-controller.js.map +1 -0
  397. package/dist/server/modules/workspace/affairs-lightweight-session-service.d.ts +133 -0
  398. package/dist/server/modules/workspace/affairs-lightweight-session-service.js +1447 -0
  399. package/dist/server/modules/workspace/affairs-lightweight-session-service.js.map +1 -0
  400. package/dist/server/modules/workspace/affairs-tag-controller.d.ts +107 -0
  401. package/dist/server/modules/workspace/affairs-tag-controller.js +97 -0
  402. package/dist/server/modules/workspace/affairs-tag-controller.js.map +1 -0
  403. package/dist/server/modules/workspace/affairs-tag-service.d.ts +153 -0
  404. package/dist/server/modules/workspace/affairs-tag-service.js +680 -0
  405. package/dist/server/modules/workspace/affairs-tag-service.js.map +1 -0
  406. package/dist/server/modules/workspace/workspace-controller.d.ts +2 -1
  407. package/dist/server/modules/workspace/workspace-controller.js +8 -2
  408. package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
  409. package/dist/server/modules/workspace/workspace-service.js +60 -9
  410. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  411. package/dist/server/routes/affairs.d.ts +3 -0
  412. package/dist/server/routes/affairs.js +7 -0
  413. package/dist/server/routes/affairs.js.map +1 -0
  414. package/dist/server/routes/assistant.js +0 -5
  415. package/dist/server/routes/assistant.js.map +1 -1
  416. package/dist/server/routes/files.js +45 -0
  417. package/dist/server/routes/files.js.map +1 -1
  418. package/dist/server/routes/office.js +4 -0
  419. package/dist/server/routes/office.js.map +1 -1
  420. package/dist/server/routes/plugins-public.d.ts +3 -0
  421. package/dist/server/routes/plugins-public.js +5 -0
  422. package/dist/server/routes/plugins-public.js.map +1 -0
  423. package/dist/server/routes/plugins.d.ts +3 -0
  424. package/dist/server/routes/plugins.js +19 -0
  425. package/dist/server/routes/plugins.js.map +1 -0
  426. package/dist/server/routes/presentation.js +1 -0
  427. package/dist/server/routes/presentation.js.map +1 -1
  428. package/dist/server/routes/system.d.ts +2 -1
  429. package/dist/server/routes/system.js +2 -1
  430. package/dist/server/routes/system.js.map +1 -1
  431. package/dist/server/routes/workspaces.d.ts +4 -1
  432. package/dist/server/routes/workspaces.js +46 -1
  433. package/dist/server/routes/workspaces.js.map +1 -1
  434. package/dist/server/server/create-server.d.ts +26 -2
  435. package/dist/server/server/create-server.js +159 -32
  436. package/dist/server/server/create-server.js.map +1 -1
  437. package/dist/server/shared/http/error-handler.js +20 -6
  438. package/dist/server/shared/http/error-handler.js.map +1 -1
  439. package/dist/server/shared/runtime/better-sqlite3.d.ts +5 -0
  440. package/dist/server/shared/runtime/better-sqlite3.js +6 -0
  441. package/dist/server/shared/runtime/better-sqlite3.js.map +1 -0
  442. package/dist/server/storage/repositories/affairs-assistant-session-snapshot-repository.d.ts +10 -0
  443. package/dist/server/storage/repositories/affairs-assistant-session-snapshot-repository.js +47 -0
  444. package/dist/server/storage/repositories/affairs-assistant-session-snapshot-repository.js.map +1 -0
  445. package/dist/server/storage/repositories/butler-profile-repository.js +7 -3
  446. package/dist/server/storage/repositories/butler-profile-repository.js.map +1 -1
  447. package/dist/server/storage/repositories/office-onlyoffice-setting-repository.d.ts +19 -0
  448. package/dist/server/storage/repositories/office-onlyoffice-setting-repository.js +55 -0
  449. package/dist/server/storage/repositories/office-onlyoffice-setting-repository.js.map +1 -0
  450. package/dist/server/storage/repositories/plugin-audit-event-repository.d.ts +8 -0
  451. package/dist/server/storage/repositories/plugin-audit-event-repository.js +49 -0
  452. package/dist/server/storage/repositories/plugin-audit-event-repository.js.map +1 -0
  453. package/dist/server/storage/repositories/plugin-definition-repository.d.ts +10 -0
  454. package/dist/server/storage/repositories/plugin-definition-repository.js +84 -0
  455. package/dist/server/storage/repositories/plugin-definition-repository.js.map +1 -0
  456. package/dist/server/storage/repositories/plugin-enablement-repository.d.ts +9 -0
  457. package/dist/server/storage/repositories/plugin-enablement-repository.js +74 -0
  458. package/dist/server/storage/repositories/plugin-enablement-repository.js.map +1 -0
  459. package/dist/server/storage/repositories/plugin-permission-grant-repository.d.ts +12 -0
  460. package/dist/server/storage/repositories/plugin-permission-grant-repository.js +142 -0
  461. package/dist/server/storage/repositories/plugin-permission-grant-repository.js.map +1 -0
  462. package/dist/server/storage/repositories/plugin-run-repository.d.ts +10 -0
  463. package/dist/server/storage/repositories/plugin-run-repository.js +111 -0
  464. package/dist/server/storage/repositories/plugin-run-repository.js.map +1 -0
  465. package/dist/server/storage/repositories/plugin-runtime-session-repository.d.ts +10 -0
  466. package/dist/server/storage/repositories/plugin-runtime-session-repository.js +86 -0
  467. package/dist/server/storage/repositories/plugin-runtime-session-repository.js.map +1 -0
  468. package/dist/server/storage/repositories/session-index-repository.js +9 -2
  469. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  470. package/dist/server/storage/repositories/user-affairs-library-setting-repository.d.ts +10 -0
  471. package/dist/server/storage/repositories/user-affairs-library-setting-repository.js +69 -0
  472. package/dist/server/storage/repositories/user-affairs-library-setting-repository.js.map +1 -0
  473. package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
  474. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
  475. package/dist/server/storage/repositories/workspace-navigation-state-repository.d.ts +3 -0
  476. package/dist/server/storage/repositories/workspace-navigation-state-repository.js +47 -4
  477. package/dist/server/storage/repositories/workspace-navigation-state-repository.js.map +1 -1
  478. package/dist/server/storage/sqlite/client.d.ts +2 -2
  479. package/dist/server/storage/sqlite/client.js +480 -124
  480. package/dist/server/storage/sqlite/client.js.map +1 -1
  481. package/dist/server/storage/sqlite/schema.sql +188 -25
  482. package/dist/server/types/domain.d.ts +149 -20
  483. package/dist/server/ws/workbench-ws-hub.js +2 -2
  484. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  485. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js +0 -2
  486. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js.map +1 -1
  487. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +0 -6
  488. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  489. package/package.json +10 -3
  490. package/scripts/postinstall.mjs +248 -11
  491. package/vendor/better-sqlite3-win32-x64-node22/LICENSE +21 -0
  492. package/vendor/better-sqlite3-win32-x64-node22/README.md +12 -0
  493. package/vendor/better-sqlite3-win32-x64-node22/README.upstream.md +99 -0
  494. package/vendor/better-sqlite3-win32-x64-node22/binding.gyp +38 -0
  495. package/vendor/better-sqlite3-win32-x64-node22/build/Release/better_sqlite3.node +0 -0
  496. package/vendor/better-sqlite3-win32-x64-node22/deps/common.gypi +68 -0
  497. package/vendor/better-sqlite3-win32-x64-node22/deps/copy.js +31 -0
  498. package/vendor/better-sqlite3-win32-x64-node22/deps/defines.gypi +41 -0
  499. package/vendor/better-sqlite3-win32-x64-node22/deps/download.sh +122 -0
  500. package/vendor/better-sqlite3-win32-x64-node22/deps/patches/1208.patch +15 -0
  501. package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3/sqlite3.c +265994 -0
  502. package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3/sqlite3.h +13968 -0
  503. package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3/sqlite3ext.h +730 -0
  504. package/vendor/better-sqlite3-win32-x64-node22/deps/sqlite3.gyp +80 -0
  505. package/vendor/better-sqlite3-win32-x64-node22/deps/test_extension.c +21 -0
  506. package/vendor/better-sqlite3-win32-x64-node22/lib/database.js +90 -0
  507. package/vendor/better-sqlite3-win32-x64-node22/lib/index.js +3 -0
  508. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/aggregate.js +43 -0
  509. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/backup.js +67 -0
  510. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/function.js +31 -0
  511. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/inspect.js +7 -0
  512. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/pragma.js +12 -0
  513. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/serialize.js +16 -0
  514. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/table.js +189 -0
  515. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/transaction.js +78 -0
  516. package/vendor/better-sqlite3-win32-x64-node22/lib/methods/wrappers.js +54 -0
  517. package/vendor/better-sqlite3-win32-x64-node22/lib/sqlite-error.js +20 -0
  518. package/vendor/better-sqlite3-win32-x64-node22/lib/util.js +12 -0
  519. package/vendor/better-sqlite3-win32-x64-node22/package.json +38 -0
  520. package/vendor/better-sqlite3-win32-x64-node22/scripts/verify-runtime.cjs +42 -0
  521. package/vendor/better-sqlite3-win32-x64-node22/src/addon.cpp +47 -0
  522. package/vendor/better-sqlite3-win32-x64-node22/src/better_sqlite3.cpp +74 -0
  523. package/vendor/better-sqlite3-win32-x64-node22/src/objects/backup.cpp +120 -0
  524. package/vendor/better-sqlite3-win32-x64-node22/src/objects/backup.hpp +36 -0
  525. package/vendor/better-sqlite3-win32-x64-node22/src/objects/database.cpp +417 -0
  526. package/vendor/better-sqlite3-win32-x64-node22/src/objects/database.hpp +103 -0
  527. package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement-iterator.cpp +113 -0
  528. package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement-iterator.hpp +50 -0
  529. package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement.cpp +383 -0
  530. package/vendor/better-sqlite3-win32-x64-node22/src/objects/statement.hpp +58 -0
  531. package/vendor/better-sqlite3-win32-x64-node22/src/util/bind-map.cpp +73 -0
  532. package/vendor/better-sqlite3-win32-x64-node22/src/util/binder.cpp +193 -0
  533. package/vendor/better-sqlite3-win32-x64-node22/src/util/constants.cpp +172 -0
  534. package/vendor/better-sqlite3-win32-x64-node22/src/util/custom-aggregate.cpp +121 -0
  535. package/vendor/better-sqlite3-win32-x64-node22/src/util/custom-function.cpp +59 -0
  536. package/vendor/better-sqlite3-win32-x64-node22/src/util/custom-table.cpp +409 -0
  537. package/vendor/better-sqlite3-win32-x64-node22/src/util/data-converter.cpp +17 -0
  538. package/vendor/better-sqlite3-win32-x64-node22/src/util/data.cpp +194 -0
  539. package/vendor/better-sqlite3-win32-x64-node22/src/util/helpers.cpp +109 -0
  540. package/vendor/better-sqlite3-win32-x64-node22/src/util/macros.cpp +83 -0
  541. package/vendor/better-sqlite3-win32-x64-node22/src/util/query-macros.cpp +71 -0
  542. package/vendor/better-sqlite3-win32-x64-node22/src/util/row-builder.cpp +49 -0
  543. package/vendor/node-pty-fork/README.md +1 -0
  544. package/vendor/node-pty-fork/scripts/runtime-install-context.cjs +24 -0
  545. package/vendor/node-pty-fork/scripts/verify-runtime.cjs +8 -0
  546. package/vendor/node-pty-fork/scripts/verify-runtime.test.cjs +30 -0
  547. package/vendor-src/better-sqlite3-win32-x64-node22/README.md +12 -0
  548. package/dist/public/assets/AdaptiveButlerPage-B153lk5H.css +0 -1
  549. package/dist/public/assets/AdaptiveButlerPage-b7s6F_sd.js +0 -3
  550. package/dist/public/assets/App-B0q8uDA-.js +0 -30
  551. package/dist/public/assets/DesktopWindowPage-BdKUZrKG.js +0 -2
  552. package/dist/public/assets/FileContextPanel-lM5mBcfn.js +0 -1
  553. package/dist/public/assets/GitSidebar-CmXAhyjo.js +0 -6
  554. package/dist/public/assets/MobileCreateSessionSheet-CceV0-AH.js +0 -1
  555. package/dist/public/assets/MobileWorkspaceSwitcherHeader-DhaM9fgx.js +0 -1
  556. package/dist/public/assets/ServerSettingsModal-Rkgn3jft.js +0 -1
  557. package/dist/public/assets/SessionIndexPage-BOumP3ij.js +0 -1
  558. package/dist/public/assets/SettingsPage-vx_c-00-.js +0 -2
  559. package/dist/public/assets/TerminalManagerPanel-D9JHCS6d.js +0 -1
  560. package/dist/public/assets/TerminalRuntimeFallbackModal-W5NjqFEz.js +0 -1
  561. package/dist/public/assets/ToolFilesPage-DWtpaN_7.js +0 -1
  562. package/dist/public/assets/ToolGitPage-MpGXsw4_.js +0 -1
  563. package/dist/public/assets/ToolProcessesPage-B1jHQKhZ.js +0 -1
  564. package/dist/public/assets/ToolsHomePage-CJrn8ZFl.js +0 -1
  565. package/dist/public/assets/WorkbenchLandingPage-CJQ1V5U-.js +0 -1
  566. package/dist/public/assets/WorkbenchLayout-D48i71PU.js +0 -244
  567. package/dist/public/assets/WorkbenchModal-BYNuMIoV.js +0 -1
  568. package/dist/public/assets/WorkbenchShellRoute-B4XB8SwG.css +0 -1
  569. package/dist/public/assets/WorkbenchShellRoute-CGKjy4J-.js +0 -1
  570. package/dist/public/assets/WorkspaceDebugDetailPage-DCAYgays.js +0 -1
  571. package/dist/public/assets/WorkspaceDetailPage-D5v-nUIi.js +0 -1
  572. package/dist/public/assets/WorkspaceHomePage-I5G1p5SR.js +0 -1
  573. package/dist/public/assets/file-tree-icon-BFwaPxKs.js +0 -590
  574. package/dist/public/assets/index-CjewzOUG.js +0 -42
  575. package/dist/public/assets/index-VVxfF0s5.css +0 -1
  576. package/dist/public/assets/model-switch-api-Br0ivfe5.js +0 -1
  577. package/dist/public/assets/realtime-client-BlQRqVmm.js +0 -1
  578. package/dist/public/assets/useRegisteredDebugTemplates-CXmxu69X.js +0 -1
  579. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +0 -32
  580. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +0 -93
  581. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +0 -1
  582. package/dist/server/modules/butler/assistant-sandbox-service.d.ts +0 -69
  583. package/dist/server/modules/butler/assistant-sandbox-service.js +0 -399
  584. package/dist/server/modules/butler/assistant-sandbox-service.js.map +0 -1
  585. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +0 -18
  586. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +0 -191
  587. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +0 -1
@@ -0,0 +1,1447 @@
1
+ import { promises as fs } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { AppError } from "../../shared/errors/app-error.js";
5
+ import { createId } from "../../shared/utils/id.js";
6
+ const LIGHTWEIGHT_PROVIDER_IDS = new Set(["codex", "claude-code"]);
7
+ const LIGHTWEIGHT_STORAGE_VERSION = 1;
8
+ const DEFAULT_CLAUDE_MODEL = "claude-sonnet-4-20250514";
9
+ const DEFAULT_OPENAI_MODEL = "gpt-5.4";
10
+ const ANTHROPIC_API_VERSION = "2023-06-01";
11
+ const LIGHTWEIGHT_SESSION_TMP_FILE_SUFFIX = ".tmp";
12
+ const LIGHTWEIGHT_SESSION_READ_RETRY_DELAYS_MS = [12, 40];
13
+ const LIGHTWEIGHT_SYSTEM_PROMPT = [
14
+ "你是 CodingNS 的事务轻量会话。",
15
+ "你的职责是快速问答、联网搜索、轻量分析。",
16
+ "你没有本地文件、终端、浏览器自动化、工作区读写、MCP、本地工具权限。",
17
+ "如果用户要求你读取本地目录、执行命令、修改文件、调用本地工具,必须明确说当前轻量模式做不到,并建议切到 Agent 会话。",
18
+ "需要最新信息时,优先使用联网搜索,再给结论。",
19
+ "回答直接、清楚、少废话。"
20
+ ].join("\n");
21
+ export class AffairsLightweightSessionService {
22
+ hostDataRootDir;
23
+ sessionLocks = new Map();
24
+ sessionDocumentCache = new Map();
25
+ constructor(hostDataRootDir) {
26
+ this.hostDataRootDir = hostDataRootDir;
27
+ }
28
+ async listSessions(workspaceId, userId) {
29
+ const workspaceDir = this.resolveWorkspaceDir(workspaceId);
30
+ const entries = await safeReadDir(workspaceDir);
31
+ const sessions = await Promise.all(entries
32
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".json"))
33
+ .map(async (entry) => {
34
+ const document = await this.readSessionDocumentByPath(path.join(workspaceDir, entry.name));
35
+ return document?.userId === userId ? document.session : null;
36
+ }));
37
+ return sessions
38
+ .filter((item) => Boolean(item))
39
+ .sort((left, right) => {
40
+ const leftValue = left.lastMessageAt ?? left.updatedAt;
41
+ const rightValue = right.lastMessageAt ?? right.updatedAt;
42
+ return rightValue.localeCompare(leftValue);
43
+ });
44
+ }
45
+ async getSession(workspaceId, sessionId, userId) {
46
+ const document = await this.requireSessionDocument(workspaceId, sessionId, userId);
47
+ return document.session;
48
+ }
49
+ async readMessages(workspaceId, sessionId, userId) {
50
+ const document = await this.requireSessionDocument(workspaceId, sessionId, userId);
51
+ return {
52
+ messages: document.messages,
53
+ cursor: null,
54
+ nextCursor: null,
55
+ total: document.messages.length
56
+ };
57
+ }
58
+ async markSessionSeen(workspaceId, sessionId, userId, seenAt) {
59
+ await this.waitForSessionIdle(sessionId);
60
+ const document = await this.requireSessionDocument(workspaceId, sessionId, userId);
61
+ const normalizedSeenAt = normalizeOptionalTimestamp(seenAt) ?? new Date().toISOString();
62
+ const nextActivityState = document.session.activityState === "completed_unread"
63
+ ? "idle"
64
+ : document.session.activityState;
65
+ await this.writeSessionDocument({
66
+ ...document,
67
+ session: {
68
+ ...document.session,
69
+ lastSeenAt: normalizedSeenAt,
70
+ activityState: nextActivityState
71
+ }
72
+ });
73
+ }
74
+ async renameSessionTitle(workspaceId, sessionId, userId, title) {
75
+ await this.waitForSessionIdle(sessionId);
76
+ const normalizedTitle = title.trim();
77
+ if (!normalizedTitle) {
78
+ throw new AppError({
79
+ statusCode: 400,
80
+ errorCode: "INVALID_INPUT",
81
+ detail: "事务轻量会话标题不能为空",
82
+ field: "title"
83
+ });
84
+ }
85
+ return this.updateSessionSummary(workspaceId, sessionId, userId, (session) => ({
86
+ ...session,
87
+ title: normalizedTitle
88
+ }));
89
+ }
90
+ async updateSessionArchiveState(workspaceId, sessionId, userId, archived) {
91
+ await this.waitForSessionIdle(sessionId);
92
+ return this.updateSessionSummary(workspaceId, sessionId, userId, (session) => ({
93
+ ...session,
94
+ isArchived: archived
95
+ }));
96
+ }
97
+ async updateSessionFavoriteState(workspaceId, sessionId, userId, favorite) {
98
+ await this.waitForSessionIdle(sessionId);
99
+ return this.updateSessionSummary(workspaceId, sessionId, userId, (session) => ({
100
+ ...session,
101
+ isFavorite: favorite
102
+ }));
103
+ }
104
+ async deleteSession(workspaceId, sessionId, userId) {
105
+ await this.waitForSessionIdle(sessionId);
106
+ await this.requireSessionDocument(workspaceId, sessionId, userId);
107
+ await fs.unlink(this.resolveSessionFilePath(workspaceId, sessionId));
108
+ this.sessionDocumentCache.delete(sessionId);
109
+ }
110
+ async startSession(input) {
111
+ const sessionId = createId();
112
+ const clientRequestId = normalizeClientRequestId(input.clientRequestId);
113
+ const acceptedAt = new Date().toISOString();
114
+ const sessionFilePath = this.resolveSessionFilePath(input.workspaceId, sessionId);
115
+ const providerSessionId = `affairs-lightweight:${input.provider}:${sessionId}`;
116
+ const session = {
117
+ sessionId,
118
+ workspaceId: input.workspaceId,
119
+ provider: input.provider,
120
+ providerSessionId,
121
+ rawStoreRef: sessionFilePath,
122
+ providerConfigMode: "global-default",
123
+ providerPresetId: null,
124
+ parentSessionId: null,
125
+ isSubagent: false,
126
+ subagentLabel: null,
127
+ isArchived: false,
128
+ isFavorite: false,
129
+ title: buildDraftTitle(input.content),
130
+ messageCount: 0,
131
+ lastMessageAt: null,
132
+ createdAt: acceptedAt,
133
+ updatedAt: acceptedAt,
134
+ syncStatus: "idle",
135
+ syncCursor: null,
136
+ lastSyncAt: null,
137
+ lastErrorCode: null,
138
+ lastErrorDetail: null,
139
+ resumedAt: null,
140
+ runningState: "starting",
141
+ activitySource: "runtime",
142
+ lastEventAt: acceptedAt,
143
+ completedAt: null,
144
+ lastSeenAt: null,
145
+ activityState: "running"
146
+ };
147
+ const document = {
148
+ version: LIGHTWEIGHT_STORAGE_VERSION,
149
+ userId: input.userId,
150
+ session,
151
+ messages: []
152
+ };
153
+ await this.writeSessionDocument(document);
154
+ return this.runTurn(document, {
155
+ workspaceId: input.workspaceId,
156
+ userId: input.userId,
157
+ sessionId,
158
+ content: input.content,
159
+ clientRequestId,
160
+ model: input.model ?? null,
161
+ reasoningLevel: input.reasoningLevel ?? null
162
+ });
163
+ }
164
+ async sendMessage(input) {
165
+ const document = await this.requireSessionDocument(input.workspaceId, input.sessionId, input.userId);
166
+ return this.runTurn(document, {
167
+ ...input,
168
+ clientRequestId: normalizeClientRequestId(input.clientRequestId)
169
+ });
170
+ }
171
+ async startSessionStream(input, onEvent) {
172
+ const sessionId = createId();
173
+ const clientRequestId = normalizeClientRequestId(input.clientRequestId);
174
+ const acceptedAt = new Date().toISOString();
175
+ const sessionFilePath = this.resolveSessionFilePath(input.workspaceId, sessionId);
176
+ const providerSessionId = `affairs-lightweight:${input.provider}:${sessionId}`;
177
+ const session = {
178
+ sessionId,
179
+ workspaceId: input.workspaceId,
180
+ provider: input.provider,
181
+ providerSessionId,
182
+ rawStoreRef: sessionFilePath,
183
+ providerConfigMode: "global-default",
184
+ providerPresetId: null,
185
+ parentSessionId: null,
186
+ isSubagent: false,
187
+ subagentLabel: null,
188
+ isArchived: false,
189
+ isFavorite: false,
190
+ title: buildDraftTitle(input.content),
191
+ messageCount: 0,
192
+ lastMessageAt: null,
193
+ createdAt: acceptedAt,
194
+ updatedAt: acceptedAt,
195
+ syncStatus: "idle",
196
+ syncCursor: null,
197
+ lastSyncAt: null,
198
+ lastErrorCode: null,
199
+ lastErrorDetail: null,
200
+ resumedAt: null,
201
+ runningState: "starting",
202
+ activitySource: "runtime",
203
+ lastEventAt: acceptedAt,
204
+ completedAt: null,
205
+ lastSeenAt: null,
206
+ activityState: "running"
207
+ };
208
+ const document = {
209
+ version: LIGHTWEIGHT_STORAGE_VERSION,
210
+ userId: input.userId,
211
+ session,
212
+ messages: []
213
+ };
214
+ await this.writeSessionDocument(document);
215
+ await this.runTurn(document, {
216
+ workspaceId: input.workspaceId,
217
+ userId: input.userId,
218
+ sessionId,
219
+ content: input.content,
220
+ clientRequestId,
221
+ model: input.model ?? null,
222
+ reasoningLevel: input.reasoningLevel ?? null
223
+ }, onEvent);
224
+ }
225
+ async sendMessageStream(input, onEvent) {
226
+ const document = await this.requireSessionDocument(input.workspaceId, input.sessionId, input.userId);
227
+ await this.runTurn(document, {
228
+ ...input,
229
+ clientRequestId: normalizeClientRequestId(input.clientRequestId)
230
+ }, onEvent);
231
+ }
232
+ async runTurn(baseDocument, input, onEvent) {
233
+ const existingLock = this.sessionLocks.get(baseDocument.session.sessionId);
234
+ if (existingLock) {
235
+ throw new AppError({
236
+ statusCode: 409,
237
+ errorCode: "SESSION_BUSY",
238
+ detail: "当前轻量会话还在回复上一条消息"
239
+ });
240
+ }
241
+ const job = this.runTurnInternal(baseDocument, input, onEvent)
242
+ .finally(() => {
243
+ this.sessionLocks.delete(baseDocument.session.sessionId);
244
+ });
245
+ this.sessionLocks.set(baseDocument.session.sessionId, job);
246
+ return job;
247
+ }
248
+ async runTurnInternal(baseDocument, input, onEvent) {
249
+ validateLightweightProvider(baseDocument.session.provider);
250
+ const now = new Date().toISOString();
251
+ const document = await this.requireSessionDocument(input.workspaceId, input.sessionId, input.userId);
252
+ const provider = document.session.provider;
253
+ const userMessage = createUserMessage({
254
+ provider,
255
+ providerSessionId: document.session.providerSessionId,
256
+ sessionId: document.session.sessionId,
257
+ content: input.content,
258
+ clientRequestId: input.clientRequestId,
259
+ sequence: document.messages.length + 1,
260
+ timestamp: now,
261
+ rawStoreRef: document.session.rawStoreRef
262
+ });
263
+ const runningDocument = {
264
+ ...document,
265
+ session: {
266
+ ...document.session,
267
+ updatedAt: now,
268
+ lastMessageAt: now,
269
+ lastEventAt: now,
270
+ runningState: "running",
271
+ activityState: "running",
272
+ completedAt: null,
273
+ syncStatus: "syncing",
274
+ lastSyncAt: now,
275
+ lastErrorCode: null,
276
+ lastErrorDetail: null,
277
+ messageCount: document.messages.length + 1,
278
+ title: document.session.messageCount === 0 ? buildDraftTitle(input.content) : document.session.title
279
+ },
280
+ messages: [...document.messages, userMessage]
281
+ };
282
+ await this.writeSessionDocument(runningDocument);
283
+ await onEvent?.({
284
+ type: "started",
285
+ session: runningDocument.session,
286
+ acceptedAt: now,
287
+ clientRequestId: input.clientRequestId,
288
+ userMessage
289
+ });
290
+ let workingDocument = runningDocument;
291
+ try {
292
+ const handleToolEvent = async (event) => {
293
+ workingDocument = upsertToolLifecycleMessage({
294
+ document: workingDocument,
295
+ event,
296
+ observedAt: new Date().toISOString()
297
+ });
298
+ await this.writeSessionDocument(workingDocument);
299
+ await onEvent?.({ type: "tool", ...event });
300
+ };
301
+ const assistantContent = provider === "codex"
302
+ ? await this.generateOpenAiResponse(runningDocument, input, onEvent
303
+ ? async (delta) => {
304
+ await onEvent({ type: "delta", delta });
305
+ }
306
+ : undefined, handleToolEvent)
307
+ : await this.generateAnthropicResponse(runningDocument, input, onEvent
308
+ ? async (delta) => {
309
+ await onEvent({ type: "delta", delta });
310
+ }
311
+ : undefined, handleToolEvent);
312
+ const completedAt = new Date().toISOString();
313
+ const assistantMessage = createAssistantMessage({
314
+ provider,
315
+ providerSessionId: workingDocument.session.providerSessionId,
316
+ sessionId: workingDocument.session.sessionId,
317
+ content: assistantContent,
318
+ sequence: workingDocument.messages.length + 1,
319
+ timestamp: completedAt,
320
+ rawStoreRef: workingDocument.session.rawStoreRef
321
+ });
322
+ const completedDocument = {
323
+ ...workingDocument,
324
+ session: {
325
+ ...workingDocument.session,
326
+ updatedAt: completedAt,
327
+ lastMessageAt: completedAt,
328
+ lastEventAt: completedAt,
329
+ completedAt,
330
+ runningState: "completed",
331
+ activityState: "completed_unread",
332
+ syncStatus: "idle",
333
+ lastSyncAt: completedAt,
334
+ messageCount: workingDocument.messages.length + 1
335
+ },
336
+ messages: [...workingDocument.messages, assistantMessage]
337
+ };
338
+ await this.writeSessionDocument(completedDocument);
339
+ const result = {
340
+ session: completedDocument.session,
341
+ acceptedAt: now,
342
+ clientRequestId: input.clientRequestId,
343
+ userMessage,
344
+ assistantMessage,
345
+ messages: completedDocument.messages
346
+ };
347
+ await onEvent?.({
348
+ type: "completed",
349
+ result
350
+ });
351
+ return result;
352
+ }
353
+ catch (error) {
354
+ const failedAt = new Date().toISOString();
355
+ const failureMessage = getErrorMessage(error);
356
+ const failedDocument = {
357
+ ...workingDocument,
358
+ session: {
359
+ ...workingDocument.session,
360
+ updatedAt: failedAt,
361
+ lastEventAt: failedAt,
362
+ completedAt: failedAt,
363
+ runningState: "failed",
364
+ activityState: "completed_unread",
365
+ syncStatus: "error",
366
+ lastSyncAt: failedAt,
367
+ lastErrorCode: error instanceof AppError ? error.errorCode : "LIGHTWEIGHT_RUNTIME_FAILED",
368
+ lastErrorDetail: failureMessage,
369
+ messageCount: workingDocument.messages.length
370
+ }
371
+ };
372
+ await this.writeSessionDocument(failedDocument);
373
+ await onEvent?.({
374
+ type: "error",
375
+ errorCode: error instanceof AppError ? error.errorCode : "LIGHTWEIGHT_RUNTIME_FAILED",
376
+ detail: failureMessage
377
+ });
378
+ throw error;
379
+ }
380
+ }
381
+ async generateOpenAiResponse(document, input, onDelta, onTool) {
382
+ if (onDelta) {
383
+ const streamed = await this.generateOpenAiResponseStream(document, input, onDelta, onTool);
384
+ if (streamed) {
385
+ return streamed;
386
+ }
387
+ }
388
+ return this.generateOpenAiResponseSync(document, input);
389
+ }
390
+ async generateAnthropicResponse(document, input, onDelta, onTool) {
391
+ if (onDelta) {
392
+ const streamed = await this.generateAnthropicResponseStream(document, input, onDelta, onTool);
393
+ if (streamed) {
394
+ return streamed;
395
+ }
396
+ }
397
+ return this.generateAnthropicResponseSync(document, input);
398
+ }
399
+ async generateOpenAiResponseSync(document, input) {
400
+ const runtime = await this.readOpenAiRuntimeConfig(input.model?.trim() || null);
401
+ const responsePayload = createOpenAiResponsesPayload({
402
+ model: runtime.model,
403
+ messages: document.messages,
404
+ reasoningLevel: input.reasoningLevel ?? null
405
+ });
406
+ const headers = {
407
+ "content-type": "application/json",
408
+ authorization: `Bearer ${runtime.apiKey}`
409
+ };
410
+ const response = await postJsonWithFallbacks({
411
+ baseUrl: runtime.baseUrl,
412
+ pathCandidates: ["responses", "v1/responses"],
413
+ init: {
414
+ method: "POST",
415
+ headers,
416
+ body: JSON.stringify(responsePayload)
417
+ }
418
+ });
419
+ const body = await parseJsonResponse(response);
420
+ if (!response.ok) {
421
+ throw createUpstreamError("OPENAI_LIGHTWEIGHT_FAILED", body, response.status);
422
+ }
423
+ const outputText = extractOpenAiResponseText(body);
424
+ if (outputText) {
425
+ return outputText;
426
+ }
427
+ const fallbackResponse = await postJsonWithFallbacks({
428
+ baseUrl: runtime.baseUrl,
429
+ pathCandidates: ["v1/chat/completions", "chat/completions"],
430
+ init: {
431
+ method: "POST",
432
+ headers,
433
+ body: JSON.stringify(createOpenAiChatPayload({
434
+ model: runtime.model,
435
+ messages: document.messages
436
+ }))
437
+ }
438
+ });
439
+ const fallbackBody = await parseJsonResponse(fallbackResponse);
440
+ if (!fallbackResponse.ok) {
441
+ throw createUpstreamError("OPENAI_LIGHTWEIGHT_FAILED", fallbackBody, fallbackResponse.status);
442
+ }
443
+ const fallbackText = extractOpenAiResponseText(fallbackBody);
444
+ if (!fallbackText) {
445
+ throw new AppError({
446
+ statusCode: 502,
447
+ errorCode: "OPENAI_LIGHTWEIGHT_EMPTY",
448
+ detail: "轻量 Codex 没有返回正文"
449
+ });
450
+ }
451
+ return fallbackText;
452
+ }
453
+ async generateAnthropicResponseSync(document, input) {
454
+ const runtime = await this.readAnthropicRuntimeConfig(input.model?.trim() || null);
455
+ let messages = document.messages.map((message) => ({
456
+ role: message.role,
457
+ content: message.content
458
+ }));
459
+ let finalBody = null;
460
+ for (let index = 0; index < 4; index += 1) {
461
+ const response = await postJsonWithFallbacks({
462
+ baseUrl: runtime.baseUrl,
463
+ pathCandidates: ["v1/messages", "messages"],
464
+ init: {
465
+ method: "POST",
466
+ headers: {
467
+ "content-type": "application/json",
468
+ "anthropic-version": ANTHROPIC_API_VERSION,
469
+ "x-api-key": runtime.apiKey
470
+ },
471
+ body: JSON.stringify({
472
+ model: runtime.model,
473
+ max_tokens: 2048,
474
+ system: LIGHTWEIGHT_SYSTEM_PROMPT,
475
+ messages,
476
+ tools: [
477
+ {
478
+ type: "web_search_20250305",
479
+ name: "web_search",
480
+ max_uses: 5
481
+ }
482
+ ]
483
+ })
484
+ }
485
+ });
486
+ const body = await parseJsonResponse(response);
487
+ if (!response.ok) {
488
+ throw createUpstreamError("ANTHROPIC_LIGHTWEIGHT_FAILED", body, response.status);
489
+ }
490
+ finalBody = body;
491
+ const stopReason = normalizeText(body?.stop_reason);
492
+ const assistantContent = Array.isArray(body?.content) ? body.content : [];
493
+ if (stopReason === "pause_turn") {
494
+ messages = [
495
+ ...messages,
496
+ {
497
+ role: "assistant",
498
+ content: assistantContent
499
+ }
500
+ ];
501
+ continue;
502
+ }
503
+ break;
504
+ }
505
+ const outputText = extractAnthropicOutputText(finalBody?.content);
506
+ if (!outputText) {
507
+ throw new AppError({
508
+ statusCode: 502,
509
+ errorCode: "ANTHROPIC_LIGHTWEIGHT_EMPTY",
510
+ detail: "轻量 Claude Code 没有返回正文"
511
+ });
512
+ }
513
+ return outputText;
514
+ }
515
+ async generateOpenAiResponseStream(document, input, onDelta, onTool) {
516
+ const runtime = await this.readOpenAiRuntimeConfig(input.model?.trim() || null);
517
+ const headers = {
518
+ "content-type": "application/json",
519
+ authorization: `Bearer ${runtime.apiKey}`
520
+ };
521
+ const responsePayload = {
522
+ ...createOpenAiResponsesPayload({
523
+ model: runtime.model,
524
+ messages: document.messages,
525
+ reasoningLevel: input.reasoningLevel ?? null
526
+ }),
527
+ stream: true
528
+ };
529
+ const response = await postJsonWithFallbacks({
530
+ baseUrl: runtime.baseUrl,
531
+ pathCandidates: ["responses", "v1/responses"],
532
+ init: {
533
+ method: "POST",
534
+ headers,
535
+ body: JSON.stringify(responsePayload)
536
+ }
537
+ });
538
+ if (!response.ok) {
539
+ const body = await parseJsonResponse(response);
540
+ throw createUpstreamError("OPENAI_LIGHTWEIGHT_FAILED", body, response.status);
541
+ }
542
+ const streamedText = await streamOpenAiSseText(response, onDelta, onTool);
543
+ if (streamedText) {
544
+ return streamedText;
545
+ }
546
+ const fallbackResponse = await postJsonWithFallbacks({
547
+ baseUrl: runtime.baseUrl,
548
+ pathCandidates: ["v1/chat/completions", "chat/completions"],
549
+ init: {
550
+ method: "POST",
551
+ headers,
552
+ body: JSON.stringify({
553
+ ...createOpenAiChatPayload({
554
+ model: runtime.model,
555
+ messages: document.messages
556
+ }),
557
+ stream: true
558
+ })
559
+ }
560
+ });
561
+ if (!fallbackResponse.ok) {
562
+ const fallbackBody = await parseJsonResponse(fallbackResponse);
563
+ throw createUpstreamError("OPENAI_LIGHTWEIGHT_FAILED", fallbackBody, fallbackResponse.status);
564
+ }
565
+ return await streamOpenAiSseText(fallbackResponse, onDelta, onTool);
566
+ }
567
+ async generateAnthropicResponseStream(document, input, onDelta, onTool) {
568
+ const runtime = await this.readAnthropicRuntimeConfig(input.model?.trim() || null);
569
+ const response = await postJsonWithFallbacks({
570
+ baseUrl: runtime.baseUrl,
571
+ pathCandidates: ["v1/messages", "messages"],
572
+ init: {
573
+ method: "POST",
574
+ headers: {
575
+ "content-type": "application/json",
576
+ "anthropic-version": ANTHROPIC_API_VERSION,
577
+ "x-api-key": runtime.apiKey
578
+ },
579
+ body: JSON.stringify({
580
+ model: runtime.model,
581
+ max_tokens: 2048,
582
+ system: LIGHTWEIGHT_SYSTEM_PROMPT,
583
+ messages: document.messages.map((message) => ({
584
+ role: message.role,
585
+ content: message.content
586
+ })),
587
+ tools: [
588
+ {
589
+ type: "web_search_20250305",
590
+ name: "web_search",
591
+ max_uses: 5
592
+ }
593
+ ],
594
+ stream: true
595
+ })
596
+ }
597
+ });
598
+ if (!response.ok) {
599
+ const body = await parseJsonResponse(response);
600
+ throw createUpstreamError("ANTHROPIC_LIGHTWEIGHT_FAILED", body, response.status);
601
+ }
602
+ return await streamAnthropicSseText(response, onDelta, onTool);
603
+ }
604
+ async requireSessionDocument(workspaceId, sessionId, userId) {
605
+ const document = await this.readSessionDocument(workspaceId, sessionId);
606
+ if (!document || document.userId !== userId) {
607
+ throw new AppError({
608
+ statusCode: 404,
609
+ errorCode: "AFFAIRS_LIGHTWEIGHT_SESSION_NOT_FOUND",
610
+ detail: "未找到对应的事务轻量会话"
611
+ });
612
+ }
613
+ return document;
614
+ }
615
+ async readSessionDocument(workspaceId, sessionId) {
616
+ return this.readSessionDocumentByPath(this.resolveSessionFilePath(workspaceId, sessionId), sessionId);
617
+ }
618
+ async readSessionDocumentByPath(filePath, expectedSessionId = inferSessionIdFromSessionFilePath(filePath)) {
619
+ for (let attemptIndex = 0; attemptIndex <= LIGHTWEIGHT_SESSION_READ_RETRY_DELAYS_MS.length; attemptIndex += 1) {
620
+ try {
621
+ const raw = await fs.readFile(filePath, "utf8");
622
+ const parsed = JSON.parse(raw);
623
+ if (!parsed || typeof parsed !== "object") {
624
+ return this.readCachedSessionDocument(expectedSessionId);
625
+ }
626
+ if (!parsed.session || !Array.isArray(parsed.messages)) {
627
+ return this.readCachedSessionDocument(expectedSessionId);
628
+ }
629
+ this.cacheSessionDocument(parsed);
630
+ return parsed;
631
+ }
632
+ catch (error) {
633
+ if (error.code === "ENOENT") {
634
+ return null;
635
+ }
636
+ if (!shouldRetrySessionDocumentRead(error) || attemptIndex >= LIGHTWEIGHT_SESSION_READ_RETRY_DELAYS_MS.length) {
637
+ const cached = this.readCachedSessionDocument(expectedSessionId);
638
+ if (cached) {
639
+ return cached;
640
+ }
641
+ throw error;
642
+ }
643
+ await sleep(LIGHTWEIGHT_SESSION_READ_RETRY_DELAYS_MS[attemptIndex]);
644
+ }
645
+ }
646
+ return this.readCachedSessionDocument(expectedSessionId);
647
+ }
648
+ async writeSessionDocument(document) {
649
+ const filePath = document.session.rawStoreRef;
650
+ const tempFilePath = `${filePath}.${process.pid}.${createId()}${LIGHTWEIGHT_SESSION_TMP_FILE_SUFFIX}`;
651
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
652
+ await fs.writeFile(tempFilePath, `${JSON.stringify(document, null, 2)}\n`, "utf8");
653
+ await fs.rename(tempFilePath, filePath);
654
+ this.cacheSessionDocument(document);
655
+ }
656
+ async updateSessionSummary(workspaceId, sessionId, userId, updater) {
657
+ const document = await this.requireSessionDocument(workspaceId, sessionId, userId);
658
+ const nextSession = updater(document.session);
659
+ await this.writeSessionDocument({
660
+ ...document,
661
+ session: nextSession
662
+ });
663
+ return nextSession;
664
+ }
665
+ async waitForSessionIdle(sessionId) {
666
+ const inflight = this.sessionLocks.get(sessionId);
667
+ if (inflight) {
668
+ await inflight;
669
+ }
670
+ }
671
+ cacheSessionDocument(document) {
672
+ const sessionId = document.session.sessionId?.trim();
673
+ if (!sessionId) {
674
+ return;
675
+ }
676
+ this.sessionDocumentCache.set(sessionId, cloneSessionDocument(document));
677
+ }
678
+ readCachedSessionDocument(sessionId) {
679
+ const normalizedSessionId = sessionId?.trim() ?? "";
680
+ if (!normalizedSessionId) {
681
+ return null;
682
+ }
683
+ const cached = this.sessionDocumentCache.get(normalizedSessionId);
684
+ return cached ? cloneSessionDocument(cached) : null;
685
+ }
686
+ async readOpenAiRuntimeConfig(modelOverride) {
687
+ const injectedConfig = await this.readLightweightRuntimeConfigFile();
688
+ const authPath = path.join(os.homedir(), ".codex", "auth.json");
689
+ const configPath = path.join(os.homedir(), ".codex", "config.toml");
690
+ const auth = await readJsonFile(authPath);
691
+ const toml = await safeReadTextFile(configPath);
692
+ const parsed = parseCodexTomlConfig(toml);
693
+ const key = pickFirstText(process.env.CODINGNS_LIGHTWEIGHT_OPENAI_API_KEY, process.env.OPENAI_API_KEY, injectedConfig?.openai?.apiKey, String(auth?.OPENAI_API_KEY ?? ""));
694
+ const baseUrl = normalizeBaseUrl(pickFirstText(process.env.CODINGNS_LIGHTWEIGHT_OPENAI_BASE_URL, injectedConfig?.openai?.baseUrl, process.env.OPENAI_BASE_URL, parsed.baseUrl, "https://api.openai.com/v1") ?? "https://api.openai.com/v1");
695
+ const model = modelOverride
696
+ || pickFirstText(process.env.CODINGNS_LIGHTWEIGHT_OPENAI_MODEL, injectedConfig?.openai?.model, process.env.OPENAI_MODEL, parsed.model, DEFAULT_OPENAI_MODEL)
697
+ || DEFAULT_OPENAI_MODEL;
698
+ if (!key) {
699
+ throw new AppError({
700
+ statusCode: 500,
701
+ errorCode: "OPENAI_LIGHTWEIGHT_AUTH_MISSING",
702
+ detail: `未找到 Codex 轻量会话可用的 API key。优先检查 ~/.codex/auth.json,或在 ${this.getLightweightRuntimeConfigPath()} 写入 openai.apiKey。`
703
+ });
704
+ }
705
+ return {
706
+ apiKey: key,
707
+ baseUrl,
708
+ model
709
+ };
710
+ }
711
+ async readAnthropicRuntimeConfig(modelOverride) {
712
+ const injectedConfig = await this.readLightweightRuntimeConfigFile();
713
+ const settingsPath = path.join(os.homedir(), ".claude", "settings.json");
714
+ const configPath = path.join(os.homedir(), ".claude", "config.json");
715
+ const settings = await readJsonFile(settingsPath);
716
+ const config = await readJsonFile(configPath);
717
+ const env = typeof settings?.env === "object" && settings.env ? settings.env : {};
718
+ const key = pickFirstText(process.env.CODINGNS_LIGHTWEIGHT_ANTHROPIC_API_KEY, process.env.ANTHROPIC_API_KEY, injectedConfig?.anthropic?.apiKey, String(env.ANTHROPIC_AUTH_TOKEN ?? config?.primaryApiKey ?? ""));
719
+ const baseUrl = normalizeBaseUrl(pickFirstText(process.env.CODINGNS_LIGHTWEIGHT_ANTHROPIC_BASE_URL, injectedConfig?.anthropic?.baseUrl, String(env.ANTHROPIC_BASE_URL ?? ""), process.env.ANTHROPIC_BASE_URL, "https://api.anthropic.com") ?? "https://api.anthropic.com");
720
+ const model = modelOverride
721
+ || pickFirstText(process.env.CODINGNS_LIGHTWEIGHT_ANTHROPIC_MODEL, injectedConfig?.anthropic?.model, String(env.ANTHROPIC_MODEL ?? ""), DEFAULT_CLAUDE_MODEL)
722
+ || DEFAULT_CLAUDE_MODEL;
723
+ if (!key) {
724
+ throw new AppError({
725
+ statusCode: 500,
726
+ errorCode: "ANTHROPIC_LIGHTWEIGHT_AUTH_MISSING",
727
+ detail: `未找到 Claude Code 轻量会话可用的 API key。优先检查 ~/.claude/settings.json 或 ~/.claude/config.json,或在 ${this.getLightweightRuntimeConfigPath()} 写入 anthropic.apiKey。`
728
+ });
729
+ }
730
+ return {
731
+ apiKey: key,
732
+ baseUrl,
733
+ model
734
+ };
735
+ }
736
+ resolveWorkspaceDir(workspaceId) {
737
+ return path.join(this.hostDataRootDir, "affairs-lightweight-sessions", workspaceId);
738
+ }
739
+ resolveSessionFilePath(workspaceId, sessionId) {
740
+ return path.join(this.resolveWorkspaceDir(workspaceId), `${sessionId}.json`);
741
+ }
742
+ getLightweightRuntimeConfigPath() {
743
+ return path.join(this.hostDataRootDir, "lightweight-runtime.json");
744
+ }
745
+ async readLightweightRuntimeConfigFile() {
746
+ const configPath = this.getLightweightRuntimeConfigPath();
747
+ const content = await safeReadTextFile(configPath);
748
+ if (!content) {
749
+ return null;
750
+ }
751
+ try {
752
+ const parsed = JSON.parse(content);
753
+ return parsed && typeof parsed === "object" ? parsed : null;
754
+ }
755
+ catch {
756
+ throw new AppError({
757
+ statusCode: 500,
758
+ errorCode: "LIGHTWEIGHT_RUNTIME_CONFIG_INVALID",
759
+ detail: `事务轻量会话配置文件不是合法 JSON:${configPath}`
760
+ });
761
+ }
762
+ }
763
+ }
764
+ function validateLightweightProvider(provider) {
765
+ if (!LIGHTWEIGHT_PROVIDER_IDS.has(provider)) {
766
+ throw new AppError({
767
+ statusCode: 400,
768
+ errorCode: "INVALID_INPUT",
769
+ detail: "事务轻量会话只支持 Codex 和 Claude Code",
770
+ field: "provider"
771
+ });
772
+ }
773
+ }
774
+ function normalizeClientRequestId(value) {
775
+ const normalized = value?.trim();
776
+ return normalized || createId();
777
+ }
778
+ function normalizeOptionalTimestamp(value) {
779
+ const normalized = value?.trim() ?? "";
780
+ if (!normalized) {
781
+ return null;
782
+ }
783
+ const parsed = Date.parse(normalized);
784
+ return Number.isFinite(parsed) ? new Date(parsed).toISOString() : null;
785
+ }
786
+ function buildDraftTitle(content) {
787
+ const singleLine = content.replace(/\s+/g, " ").trim();
788
+ if (!singleLine) {
789
+ return "新对话";
790
+ }
791
+ return singleLine.length > 24 ? `${singleLine.slice(0, 24)}…` : singleLine;
792
+ }
793
+ function createUserMessage(input) {
794
+ return {
795
+ messageId: `lightweight-user-${input.clientRequestId}`,
796
+ provider: input.provider,
797
+ providerSessionId: input.providerSessionId,
798
+ role: "user",
799
+ kind: "text",
800
+ content: input.content,
801
+ toolCall: null,
802
+ timestamp: input.timestamp,
803
+ sequence: input.sequence,
804
+ rawRef: `${input.rawStoreRef}#${input.clientRequestId}`
805
+ };
806
+ }
807
+ function createAssistantMessage(input) {
808
+ return {
809
+ messageId: `lightweight-assistant-${createId()}`,
810
+ provider: input.provider,
811
+ providerSessionId: input.providerSessionId,
812
+ role: "assistant",
813
+ kind: "text",
814
+ content: input.content,
815
+ toolCall: null,
816
+ timestamp: input.timestamp,
817
+ sequence: input.sequence,
818
+ rawRef: `${input.rawStoreRef}#assistant-${input.sequence}`
819
+ };
820
+ }
821
+ function createToolLifecycleMessage(input) {
822
+ const content = normalizeText(input.event.detail)
823
+ || normalizeText(input.event.output)
824
+ || normalizeText(input.event.input)
825
+ || input.event.toolName;
826
+ return {
827
+ messageId: `lightweight-tool-${input.event.toolCallId}`,
828
+ provider: input.provider,
829
+ providerSessionId: input.providerSessionId,
830
+ role: "tool",
831
+ kind: input.event.status === "running" ? "tool_call" : "tool_result",
832
+ content,
833
+ toolCall: {
834
+ callId: input.event.toolCallId,
835
+ name: input.event.toolName,
836
+ input: input.event.input ?? "",
837
+ output: input.event.output,
838
+ error: input.event.status === "failed"
839
+ ? (normalizeText(input.event.detail) || normalizeText(input.event.output) || null)
840
+ : null,
841
+ status: input.event.status
842
+ },
843
+ timestamp: input.timestamp,
844
+ sequence: input.sequence,
845
+ rawRef: `${input.rawStoreRef}#tool-${input.event.toolCallId}`
846
+ };
847
+ }
848
+ function upsertToolLifecycleMessage(input) {
849
+ const timestamp = input.observedAt ?? new Date().toISOString();
850
+ const existingIndex = input.document.messages.findIndex((message) => {
851
+ if (message.role !== "tool" || !message.toolCall) {
852
+ return false;
853
+ }
854
+ return message.toolCall.callId === input.event.toolCallId;
855
+ });
856
+ if (existingIndex >= 0) {
857
+ const existing = input.document.messages[existingIndex];
858
+ const nextMessage = createToolLifecycleMessage({
859
+ provider: input.document.session.provider,
860
+ providerSessionId: input.document.session.providerSessionId,
861
+ timestamp,
862
+ rawStoreRef: input.document.session.rawStoreRef,
863
+ sequence: existing.sequence,
864
+ event: input.event
865
+ });
866
+ const nextMessages = [...input.document.messages];
867
+ nextMessages[existingIndex] = {
868
+ ...nextMessage,
869
+ timestamp: existing.timestamp,
870
+ sequence: existing.sequence,
871
+ rawRef: existing.rawRef,
872
+ messageId: existing.messageId
873
+ };
874
+ return {
875
+ ...input.document,
876
+ messages: nextMessages,
877
+ session: {
878
+ ...input.document.session,
879
+ updatedAt: timestamp,
880
+ lastEventAt: timestamp,
881
+ messageCount: nextMessages.length
882
+ }
883
+ };
884
+ }
885
+ const assistantIndex = input.document.messages.findIndex((message) => message.role === "assistant");
886
+ const insertAt = assistantIndex >= 0 ? assistantIndex : input.document.messages.length;
887
+ const sequence = insertAt > 0
888
+ ? input.document.messages[insertAt - 1].sequence + 1
889
+ : 1;
890
+ const nextMessage = createToolLifecycleMessage({
891
+ provider: input.document.session.provider,
892
+ providerSessionId: input.document.session.providerSessionId,
893
+ timestamp,
894
+ rawStoreRef: input.document.session.rawStoreRef,
895
+ sequence,
896
+ event: input.event
897
+ });
898
+ const nextMessages = [
899
+ ...input.document.messages.slice(0, insertAt),
900
+ nextMessage,
901
+ ...input.document.messages.slice(insertAt).map((message) => ({
902
+ ...message,
903
+ sequence: message.sequence + 1,
904
+ rawRef: message.role === "assistant"
905
+ ? `${input.document.session.rawStoreRef}#assistant-${message.sequence + 1}`
906
+ : message.rawRef
907
+ }))
908
+ ];
909
+ return {
910
+ ...input.document,
911
+ messages: nextMessages,
912
+ session: {
913
+ ...input.document.session,
914
+ updatedAt: timestamp,
915
+ lastEventAt: timestamp,
916
+ messageCount: nextMessages.length
917
+ }
918
+ };
919
+ }
920
+ function normalizeOpenAiReasoning(reasoningLevel) {
921
+ const normalized = reasoningLevel?.trim().toLowerCase();
922
+ if (normalized === "low" || normalized === "medium" || normalized === "high") {
923
+ return { effort: normalized };
924
+ }
925
+ if (normalized === "xhigh") {
926
+ return { effort: "high" };
927
+ }
928
+ return { effort: "medium" };
929
+ }
930
+ function createOpenAiResponsesPayload(input) {
931
+ return {
932
+ model: input.model,
933
+ reasoning: normalizeOpenAiReasoning(input.reasoningLevel),
934
+ tools: [
935
+ {
936
+ type: "web_search",
937
+ user_location: {
938
+ type: "approximate",
939
+ country: "US"
940
+ }
941
+ }
942
+ ],
943
+ tool_choice: "auto",
944
+ include: ["web_search_call.action.sources"],
945
+ input: [
946
+ {
947
+ role: "system",
948
+ content: LIGHTWEIGHT_SYSTEM_PROMPT
949
+ },
950
+ ...input.messages.map((message) => ({
951
+ role: message.role,
952
+ content: message.content
953
+ }))
954
+ ]
955
+ };
956
+ }
957
+ function createOpenAiChatPayload(input) {
958
+ return {
959
+ model: input.model,
960
+ messages: [
961
+ {
962
+ role: "system",
963
+ content: LIGHTWEIGHT_SYSTEM_PROMPT
964
+ },
965
+ ...input.messages.map((message) => ({
966
+ role: message.role,
967
+ content: message.content
968
+ }))
969
+ ],
970
+ temperature: 0.2
971
+ };
972
+ }
973
+ function extractOpenAiResponseText(body) {
974
+ return normalizeText(body?.output_text)
975
+ ?? extractOpenAiOutputText(body?.output)
976
+ ?? extractOpenAiChoiceText(body);
977
+ }
978
+ function extractOpenAiOutputText(output) {
979
+ if (!Array.isArray(output)) {
980
+ return null;
981
+ }
982
+ const segments = [];
983
+ for (const item of output) {
984
+ if (!item || typeof item !== "object") {
985
+ continue;
986
+ }
987
+ const content = Array.isArray(item.content) ? item.content : [];
988
+ for (const part of content) {
989
+ const text = normalizeText(part?.text);
990
+ if (text) {
991
+ segments.push(text);
992
+ }
993
+ }
994
+ }
995
+ return segments.length > 0 ? segments.join("\n\n") : null;
996
+ }
997
+ function extractOpenAiChoiceText(body) {
998
+ const rawContent = body?.choices?.[0]?.message?.content;
999
+ if (typeof rawContent === "string") {
1000
+ return normalizeText(rawContent);
1001
+ }
1002
+ if (!Array.isArray(rawContent)) {
1003
+ return null;
1004
+ }
1005
+ const segments = rawContent
1006
+ .map((item) => {
1007
+ if (typeof item === "string") {
1008
+ return item;
1009
+ }
1010
+ return normalizeText(item?.text);
1011
+ })
1012
+ .filter((item) => Boolean(item));
1013
+ return segments.length > 0 ? segments.join("\n\n") : null;
1014
+ }
1015
+ function extractAnthropicOutputText(content) {
1016
+ if (!Array.isArray(content)) {
1017
+ return null;
1018
+ }
1019
+ const segments = content
1020
+ .map((item) => normalizeText(item?.text))
1021
+ .filter((item) => Boolean(item));
1022
+ return segments.length > 0 ? segments.join("\n\n") : null;
1023
+ }
1024
+ function normalizeText(value) {
1025
+ const normalized = value?.trim();
1026
+ return normalized ? normalized : null;
1027
+ }
1028
+ function pickFirstText(...values) {
1029
+ for (const value of values) {
1030
+ const normalized = normalizeText(value);
1031
+ if (normalized) {
1032
+ return normalized;
1033
+ }
1034
+ }
1035
+ return null;
1036
+ }
1037
+ function normalizeBaseUrl(value) {
1038
+ return value.replace(/\/+$/, "");
1039
+ }
1040
+ async function streamOpenAiSseText(response, onDelta, onTool) {
1041
+ let accumulated = "";
1042
+ await consumeSseResponse(response, async ({ event, data }) => {
1043
+ if (!data || data === "[DONE]") {
1044
+ return;
1045
+ }
1046
+ let payload = null;
1047
+ try {
1048
+ payload = JSON.parse(data);
1049
+ }
1050
+ catch {
1051
+ return;
1052
+ }
1053
+ const toolEvent = extractOpenAiSseToolEvent(event, payload);
1054
+ if (toolEvent) {
1055
+ await onTool?.(toolEvent);
1056
+ }
1057
+ const chunks = extractOpenAiSseDeltaChunks(payload);
1058
+ for (const chunk of chunks) {
1059
+ if (!chunk) {
1060
+ continue;
1061
+ }
1062
+ accumulated += chunk;
1063
+ await onDelta(chunk);
1064
+ }
1065
+ });
1066
+ return normalizeText(accumulated);
1067
+ }
1068
+ async function streamAnthropicSseText(response, onDelta, onTool) {
1069
+ let accumulated = "";
1070
+ await consumeSseResponse(response, async ({ event, data }) => {
1071
+ if (!data) {
1072
+ return;
1073
+ }
1074
+ let payload = null;
1075
+ try {
1076
+ payload = JSON.parse(data);
1077
+ }
1078
+ catch {
1079
+ return;
1080
+ }
1081
+ const eventType = event || payload?.type;
1082
+ const toolEvent = extractAnthropicSseToolEvent(eventType, payload);
1083
+ if (toolEvent) {
1084
+ await onTool?.(toolEvent);
1085
+ }
1086
+ if (eventType === "content_block_delta" && payload?.delta?.type === "text_delta") {
1087
+ const chunk = normalizeText(payload?.delta?.text);
1088
+ if (chunk) {
1089
+ accumulated += chunk;
1090
+ await onDelta(chunk);
1091
+ }
1092
+ return;
1093
+ }
1094
+ if (eventType === "content_block_start" && payload?.content_block?.type === "text") {
1095
+ const chunk = normalizeText(payload?.content_block?.text);
1096
+ if (chunk) {
1097
+ accumulated += chunk;
1098
+ await onDelta(chunk);
1099
+ }
1100
+ }
1101
+ });
1102
+ return normalizeText(accumulated);
1103
+ }
1104
+ async function consumeSseResponse(response, onEvent) {
1105
+ const reader = response.body?.getReader();
1106
+ if (!reader) {
1107
+ return;
1108
+ }
1109
+ const decoder = new TextDecoder();
1110
+ let buffer = "";
1111
+ let currentEvent = "";
1112
+ let currentDataLines = [];
1113
+ const flushEvent = async () => {
1114
+ if (!currentEvent && currentDataLines.length === 0) {
1115
+ return;
1116
+ }
1117
+ const payload = {
1118
+ event: currentEvent,
1119
+ data: currentDataLines.join("\n")
1120
+ };
1121
+ currentEvent = "";
1122
+ currentDataLines = [];
1123
+ await onEvent(payload);
1124
+ };
1125
+ while (true) {
1126
+ const next = await reader.read();
1127
+ buffer += decoder.decode(next.value ?? new Uint8Array(), { stream: !next.done });
1128
+ while (true) {
1129
+ const newlineIndex = buffer.indexOf("\n");
1130
+ if (newlineIndex < 0) {
1131
+ break;
1132
+ }
1133
+ const rawLine = buffer.slice(0, newlineIndex).replace(/\r$/, "");
1134
+ buffer = buffer.slice(newlineIndex + 1);
1135
+ if (!rawLine) {
1136
+ await flushEvent();
1137
+ continue;
1138
+ }
1139
+ if (rawLine.startsWith(":")) {
1140
+ continue;
1141
+ }
1142
+ if (rawLine.startsWith("event:")) {
1143
+ currentEvent = rawLine.slice("event:".length).trim();
1144
+ continue;
1145
+ }
1146
+ if (rawLine.startsWith("data:")) {
1147
+ currentDataLines.push(rawLine.slice("data:".length).trimStart());
1148
+ }
1149
+ }
1150
+ if (next.done) {
1151
+ break;
1152
+ }
1153
+ }
1154
+ if (buffer.trim()) {
1155
+ const trailingLine = buffer.replace(/\r$/, "");
1156
+ if (trailingLine.startsWith("data:")) {
1157
+ currentDataLines.push(trailingLine.slice("data:".length).trimStart());
1158
+ }
1159
+ }
1160
+ await flushEvent();
1161
+ }
1162
+ function extractOpenAiSseDeltaChunks(payload) {
1163
+ const chunks = [];
1164
+ const responseDelta = normalizeText(payload?.delta);
1165
+ if (responseDelta) {
1166
+ chunks.push(responseDelta);
1167
+ }
1168
+ const outputTextDelta = normalizeText(payload?.text);
1169
+ if (payload?.type === "response.output_text.delta" && outputTextDelta) {
1170
+ chunks.push(outputTextDelta);
1171
+ }
1172
+ const chatDelta = payload?.choices?.[0]?.delta?.content;
1173
+ if (typeof chatDelta === "string" && chatDelta.trim().length > 0) {
1174
+ chunks.push(chatDelta);
1175
+ }
1176
+ return chunks;
1177
+ }
1178
+ function extractOpenAiSseToolEvent(eventName, payload) {
1179
+ const payloadType = normalizeText(payload?.type) ?? "";
1180
+ const resolvedEvent = normalizeText(eventName) ?? payloadType;
1181
+ const isDirectWebSearchEvent = resolvedEvent.includes("web_search_call");
1182
+ const isOutputItemWebSearchEvent = resolvedEvent === "response.output_item.done"
1183
+ && normalizeText(payload?.item?.type) === "web_search_call";
1184
+ const isOutputItemAddedWebSearchEvent = resolvedEvent === "response.output_item.added"
1185
+ && normalizeText(payload?.item?.type) === "web_search_call";
1186
+ if (!isDirectWebSearchEvent && !isOutputItemWebSearchEvent && !isOutputItemAddedWebSearchEvent) {
1187
+ return null;
1188
+ }
1189
+ const toolCallId = normalizeText(payload?.item_id)
1190
+ || normalizeText(payload?.item?.id)
1191
+ || normalizeText(payload?.call_id)
1192
+ || normalizeText(payload?.id)
1193
+ || "web_search";
1194
+ const status = isOutputItemWebSearchEvent
1195
+ ? "completed"
1196
+ : resolvedEvent.endsWith(".completed")
1197
+ ? "completed"
1198
+ : resolvedEvent.endsWith(".failed")
1199
+ ? "failed"
1200
+ : "running";
1201
+ const sources = readWebSearchSources(payload);
1202
+ const sourceCount = sources.length;
1203
+ const input = readWebSearchQuery(payload);
1204
+ const detail = status === "completed"
1205
+ ? (sourceCount > 0 ? `联网搜索完成,找到 ${sourceCount} 个来源` : "联网搜索完成")
1206
+ : status === "failed"
1207
+ ? normalizeText(payload?.error?.message) || "联网搜索失败"
1208
+ : resolvedEvent.endsWith(".searching")
1209
+ ? "正在联网搜索"
1210
+ : "正在准备联网搜索";
1211
+ return {
1212
+ type: "tool",
1213
+ toolCallId,
1214
+ toolName: "web_search",
1215
+ status,
1216
+ detail,
1217
+ input,
1218
+ output: status === "completed"
1219
+ ? JSON.stringify({
1220
+ detail,
1221
+ query: input,
1222
+ sources
1223
+ }, null, 2)
1224
+ : status === "failed"
1225
+ ? detail
1226
+ : null
1227
+ };
1228
+ }
1229
+ function extractAnthropicSseToolEvent(eventType, payload) {
1230
+ const block = payload?.content_block;
1231
+ const delta = payload?.delta;
1232
+ const blockType = normalizeText(block?.type) ?? normalizeText(delta?.type) ?? "";
1233
+ const toolName = normalizeText(block?.name)
1234
+ || normalizeText(payload?.name)
1235
+ || normalizeText(delta?.name)
1236
+ || (blockType.includes("web_search") ? "web_search" : null);
1237
+ if (toolName !== "web_search") {
1238
+ return null;
1239
+ }
1240
+ const status = eventType === "content_block_stop" || eventType === "message_stop"
1241
+ ? "completed"
1242
+ : eventType === "error"
1243
+ ? "failed"
1244
+ : "running";
1245
+ const input = readWebSearchQuery(payload);
1246
+ const sources = readWebSearchSources(payload);
1247
+ const detail = status === "completed"
1248
+ ? (sources.length > 0 ? `联网搜索完成,找到 ${sources.length} 个来源` : "联网搜索完成")
1249
+ : status === "failed"
1250
+ ? normalizeText(payload?.error?.message) || "联网搜索失败"
1251
+ : "正在联网搜索";
1252
+ return {
1253
+ type: "tool",
1254
+ toolCallId: normalizeText(block?.id) || normalizeText(payload?.id) || normalizeText(delta?.id) || "web_search",
1255
+ toolName,
1256
+ status,
1257
+ detail,
1258
+ input,
1259
+ output: status === "completed"
1260
+ ? JSON.stringify({
1261
+ detail,
1262
+ query: input,
1263
+ sources
1264
+ }, null, 2)
1265
+ : status === "failed"
1266
+ ? detail
1267
+ : null
1268
+ };
1269
+ }
1270
+ function readSourceCount(payload) {
1271
+ return readWebSearchSources(payload).length;
1272
+ }
1273
+ function readWebSearchQuery(payload) {
1274
+ return pickFirstText(payload?.action?.query, payload?.action?.search_query, payload?.item?.action?.query, payload?.item?.action?.search_query, payload?.item?.query, payload?.query, payload?.search_query, payload?.input, payload?.arguments?.query, payload?.arguments?.search_query, payload?.content_block?.input?.query, payload?.content_block?.input?.search_query, payload?.delta?.partial_json, payload?.result?.query, payload?.web_search?.query);
1275
+ }
1276
+ function flattenWebSearchSourceCandidates(payload) {
1277
+ const candidates = [
1278
+ payload?.action?.sources,
1279
+ payload?.item?.action?.sources,
1280
+ payload?.item?.sources,
1281
+ payload?.sources,
1282
+ payload?.result?.sources,
1283
+ payload?.web_search?.sources,
1284
+ payload?.content_block?.results,
1285
+ payload?.content_block?.sources,
1286
+ payload?.results
1287
+ ];
1288
+ for (const candidate of candidates) {
1289
+ if (Array.isArray(candidate) && candidate.length > 0) {
1290
+ return candidate;
1291
+ }
1292
+ }
1293
+ return [];
1294
+ }
1295
+ function readWebSearchSources(payload) {
1296
+ return flattenWebSearchSourceCandidates(payload)
1297
+ .map((item) => ({
1298
+ title: pickFirstText(item?.title, item?.name, item?.text),
1299
+ url: pickFirstText(item?.url, item?.link, item?.uri)
1300
+ }))
1301
+ .filter((item) => item.title || item.url)
1302
+ .slice(0, 8);
1303
+ }
1304
+ async function safeReadTextFile(filePath) {
1305
+ try {
1306
+ return await fs.readFile(filePath, "utf8");
1307
+ }
1308
+ catch (error) {
1309
+ if (error.code === "ENOENT") {
1310
+ return null;
1311
+ }
1312
+ throw error;
1313
+ }
1314
+ }
1315
+ async function readJsonFile(filePath) {
1316
+ const content = await safeReadTextFile(filePath);
1317
+ if (!content) {
1318
+ return {};
1319
+ }
1320
+ return JSON.parse(content);
1321
+ }
1322
+ function parseCodexTomlConfig(content) {
1323
+ if (!content) {
1324
+ return { model: null, baseUrl: null };
1325
+ }
1326
+ const model = matchTomlString(content, /^model\s*=\s*"([^"]+)"/m);
1327
+ const providerId = matchTomlString(content, /^model_provider\s*=\s*"([^"]+)"/m);
1328
+ if (!providerId) {
1329
+ return { model, baseUrl: null };
1330
+ }
1331
+ const marker = `[model_providers.${JSON.stringify(providerId).slice(1, -1)}]`;
1332
+ const sectionStart = content.indexOf(marker);
1333
+ if (sectionStart < 0) {
1334
+ return { model, baseUrl: null };
1335
+ }
1336
+ const nextSection = content.indexOf("\n[", sectionStart + marker.length);
1337
+ const section = nextSection >= 0 ? content.slice(sectionStart, nextSection) : content.slice(sectionStart);
1338
+ const baseUrl = matchTomlString(section, /^base_url\s*=\s*"([^"]+)"/m);
1339
+ return { model, baseUrl };
1340
+ }
1341
+ function matchTomlString(content, pattern) {
1342
+ const matched = content.match(pattern);
1343
+ return matched?.[1]?.trim() || null;
1344
+ }
1345
+ async function safeReadDir(dirPath) {
1346
+ try {
1347
+ return await fs.readdir(dirPath, { withFileTypes: true });
1348
+ }
1349
+ catch (error) {
1350
+ if (error.code === "ENOENT") {
1351
+ return [];
1352
+ }
1353
+ throw error;
1354
+ }
1355
+ }
1356
+ async function postJsonWithFallbacks(input) {
1357
+ let lastResponse = null;
1358
+ for (const candidate of input.pathCandidates) {
1359
+ const url = buildRequestUrl(input.baseUrl, candidate);
1360
+ const response = await fetch(url, input.init);
1361
+ if (response.status !== 404) {
1362
+ return response;
1363
+ }
1364
+ lastResponse = response;
1365
+ }
1366
+ if (lastResponse) {
1367
+ return lastResponse;
1368
+ }
1369
+ throw new AppError({
1370
+ statusCode: 502,
1371
+ errorCode: "LIGHTWEIGHT_RUNTIME_UNREACHABLE",
1372
+ detail: "轻量会话上游地址不可达"
1373
+ });
1374
+ }
1375
+ function buildRequestUrl(baseUrl, candidate) {
1376
+ const normalizedBase = normalizeBaseUrl(baseUrl);
1377
+ const normalizedPath = candidate.replace(/^\/+/, "");
1378
+ return `${normalizedBase}/${normalizedPath}`;
1379
+ }
1380
+ function inferSessionIdFromSessionFilePath(filePath) {
1381
+ const baseName = path.basename(filePath);
1382
+ if (!baseName.endsWith(".json")) {
1383
+ return null;
1384
+ }
1385
+ const sessionId = baseName.slice(0, -".json".length).trim();
1386
+ return sessionId || null;
1387
+ }
1388
+ function cloneSessionDocument(document) {
1389
+ return {
1390
+ ...document,
1391
+ session: {
1392
+ ...document.session
1393
+ },
1394
+ messages: document.messages.map((message) => ({
1395
+ ...message,
1396
+ toolCall: message.toolCall
1397
+ ? {
1398
+ ...message.toolCall
1399
+ }
1400
+ : null
1401
+ }))
1402
+ };
1403
+ }
1404
+ function shouldRetrySessionDocumentRead(error) {
1405
+ if (!(error instanceof Error)) {
1406
+ return false;
1407
+ }
1408
+ return error instanceof SyntaxError || /Unexpected end of JSON input/i.test(error.message);
1409
+ }
1410
+ async function sleep(timeoutMs) {
1411
+ await new Promise((resolve) => {
1412
+ setTimeout(resolve, timeoutMs);
1413
+ });
1414
+ }
1415
+ async function parseJsonResponse(response) {
1416
+ const text = await response.text();
1417
+ if (!text.trim()) {
1418
+ return null;
1419
+ }
1420
+ try {
1421
+ return JSON.parse(text);
1422
+ }
1423
+ catch {
1424
+ return { raw: text };
1425
+ }
1426
+ }
1427
+ function createUpstreamError(code, body, status) {
1428
+ return new AppError({
1429
+ statusCode: 502,
1430
+ errorCode: code,
1431
+ detail: normalizeText(body?.error?.message)
1432
+ || normalizeText(body?.error?.detail)
1433
+ || normalizeText(body?.detail)
1434
+ || normalizeText(body?.raw)
1435
+ || `上游轻量会话接口返回 ${status}`
1436
+ });
1437
+ }
1438
+ function getErrorMessage(error) {
1439
+ if (error instanceof AppError) {
1440
+ return error.message;
1441
+ }
1442
+ if (error instanceof Error) {
1443
+ return error.message;
1444
+ }
1445
+ return "未知错误";
1446
+ }
1447
+ //# sourceMappingURL=affairs-lightweight-session-service.js.map