@jingyi0605/codingns 0.9.0 → 0.9.6

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 (331) hide show
  1. package/bin/codingns.mjs +75 -0
  2. package/dist/public/assets/{AdaptiveButlerPage-B17QiMyT.js → AdaptiveButlerPage-khJQh6a_.js} +2 -2
  3. package/dist/public/assets/{App-CFBwDUNA.js → App-If9gThKM.js} +6 -6
  4. package/dist/public/assets/{BootstrapPage-W5wU3BPh.js → BootstrapPage-DcfYtoLC.js} +1 -1
  5. package/dist/public/assets/{ConversationPage-DQLX1bUh.js → ConversationPage-Bfb7GLTM.js} +1 -1
  6. package/dist/public/assets/{DesktopDetachPreviewPage-DTPeuAW-.js → DesktopDetachPreviewPage-CXUPMcBz.js} +1 -1
  7. package/dist/public/assets/{DesktopModal-6ii53_Y9.js → DesktopModal-bMdI1jEe.js} +1 -1
  8. package/dist/public/assets/DesktopWindowPage-D1xwgS-7.js +2 -0
  9. package/dist/public/assets/FileContextPanel-C4syif3B.js +1 -0
  10. package/dist/public/assets/GitSidebar-DduL9aTV.js +6 -0
  11. package/dist/public/assets/MobileCreateSessionSheet-DWPBsEx8.js +1 -0
  12. package/dist/public/assets/{MobileSheet-opTWyRe1.js → MobileSheet-BXvQPkxt.js} +1 -1
  13. package/dist/public/assets/{MobileTopHeaderFrame-BbNON3Y4.js → MobileTopHeaderFrame-vdYOyaaB.js} +1 -1
  14. package/dist/public/assets/{MobileWorkspaceSwitcherHeader-BZEzPeMj.js → MobileWorkspaceSwitcherHeader-DT330cAx.js} +1 -1
  15. package/dist/public/assets/{PluginAccessOverview-mQDmAljp.js → PluginAccessOverview-C77TeZTK.js} +1 -1
  16. package/dist/public/assets/{PluginContainerPage-CcxUJpM4.js → PluginContainerPage-DdSwOCw-.js} +1 -1
  17. package/dist/public/assets/{PluginDetailPage-D5--ACIt.js → PluginDetailPage-BK1yTzvO.js} +1 -1
  18. package/dist/public/assets/{PluginsListPage-D_oJxYXT.js → PluginsListPage-DAAwSc6W.js} +1 -1
  19. package/dist/public/assets/{RelayConnectEntryPage-DROxpnkv.js → RelayConnectEntryPage-4Yyo2p8b.js} +1 -1
  20. package/dist/public/assets/{ServerSettingsModal-CUUOPqSe.js → ServerSettingsModal-C_DEisHs.js} +1 -1
  21. package/dist/public/assets/{SessionIndexPage-C2Jxh6Gp.js → SessionIndexPage-DyMikN_x.js} +1 -1
  22. package/dist/public/assets/SettingsPage-CDAVsPr3.js +2 -0
  23. package/dist/public/assets/TerminalManagerPanel-4OR47vcf.js +1 -0
  24. package/dist/public/assets/{TerminalPage-CwWyFDj8.js → TerminalPage-Pvx396YX.js} +1 -1
  25. package/dist/public/assets/{TerminalRuntimeFallbackModal-CSVVbO8r.js → TerminalRuntimeFallbackModal-KvG6k4AQ.js} +1 -1
  26. package/dist/public/assets/{ToolFilesPage-QBEY8oCf.js → ToolFilesPage-DrYHk0N-.js} +1 -1
  27. package/dist/public/assets/{ToolGitPage-BKoZ2l9v.js → ToolGitPage-Dz1q-Ns_.js} +1 -1
  28. package/dist/public/assets/{ToolProcessesPage-BOH0ib4G.js → ToolProcessesPage-CRhphOmM.js} +1 -1
  29. package/dist/public/assets/{ToolsHomePage-BcMZ3BCQ.js → ToolsHomePage-BJSDLR6T.js} +1 -1
  30. package/dist/public/assets/{WorkbenchLandingPage-B5zoppEl.js → WorkbenchLandingPage-BlkxdOLC.js} +1 -1
  31. package/dist/public/assets/WorkbenchLayout-D-U7ghT0.js +1022 -0
  32. package/dist/public/assets/{WorkbenchModal-NGmPgqaE.js → WorkbenchModal-xbx1o6MO.js} +1 -1
  33. package/dist/public/assets/WorkbenchShellRoute-DyWSCHz_.js +1 -0
  34. package/dist/public/assets/WorkbenchShellRoute-htbkGbtW.css +1 -0
  35. package/dist/public/assets/WorkspaceDebugDetailPage-B4ol2_a5.js +1 -0
  36. package/dist/public/assets/WorkspaceDetailPage-DMakfmHR.js +1 -0
  37. package/dist/public/assets/WorkspaceHomePage-tmCafatd.js +1 -0
  38. package/dist/public/assets/{client-runtime-manager-DXbI9K1K.js → client-runtime-manager-Bwau7p1v.js} +1 -1
  39. package/dist/public/assets/index-DmUJ8tIw.css +1 -0
  40. package/dist/public/assets/index-_OCkVmfl.js +50 -0
  41. package/dist/public/assets/{login-direct-candidate-resolver-DkKyFtQJ.js → login-direct-candidate-resolver-CKUQ07IA.js} +1 -1
  42. package/dist/public/assets/{plugin-permission-copy-CzN269Bk.js → plugin-permission-copy-DIVk5jNp.js} +1 -1
  43. package/dist/public/assets/{plugins-api-Bv9DHpLF.js → plugins-api-DHJVvPZw.js} +1 -1
  44. package/dist/public/assets/{preferences-service-D2ISL2Zz.js → preferences-service-CyxxeBmS.js} +1 -1
  45. package/dist/public/assets/{relay-entry-Bg0OisQy.js → relay-entry-B5GmiOrR.js} +1 -1
  46. package/dist/public/assets/{terminal-runtime-meta-C8t-CIDF.js → terminal-runtime-meta-DBsyT35T.js} +1 -1
  47. package/dist/public/assets/useRegisteredDebugTemplates-wCGD2SLW.js +1 -0
  48. package/dist/public/assets/workbench-navigation-RyUjchbD.js +1 -0
  49. package/dist/public/index.html +2 -2
  50. package/dist/server/config/env.d.ts +1 -0
  51. package/dist/server/config/env.js +3 -0
  52. package/dist/server/config/env.js.map +1 -1
  53. package/dist/server/modules/affairs-indexer/core/src/parser/parser-skip-repository.js.map +1 -1
  54. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.d.ts +1 -0
  55. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js +31 -0
  56. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js.map +1 -1
  57. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-write-repository.js.map +1 -1
  58. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.d.ts +1 -0
  59. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js +1 -0
  60. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js.map +1 -1
  61. package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js +4 -1
  62. package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js.map +1 -1
  63. package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js +140 -16
  64. package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js.map +1 -1
  65. package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js +2 -2
  66. package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js.map +1 -1
  67. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.d.ts +20 -3
  68. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js +3 -3
  69. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js.map +1 -1
  70. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +1 -1
  71. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +8 -7
  72. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  73. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +14 -13
  74. package/dist/server/modules/assistant-capability/assistant-capability-service.js +27 -24
  75. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  76. package/dist/server/modules/auth/auth-controller.d.ts +27 -1
  77. package/dist/server/modules/auth/auth-controller.js +20 -0
  78. package/dist/server/modules/auth/auth-controller.js.map +1 -1
  79. package/dist/server/modules/auth/auth-service.d.ts +32 -1
  80. package/dist/server/modules/auth/auth-service.js +217 -2
  81. package/dist/server/modules/auth/auth-service.js.map +1 -1
  82. package/dist/server/modules/bootstrap/bootstrap-service.js +1 -0
  83. package/dist/server/modules/bootstrap/bootstrap-service.js.map +1 -1
  84. package/dist/server/modules/butler/assistant-automation-service.d.ts +1 -1
  85. package/dist/server/modules/butler/assistant-automation-service.js +9 -10
  86. package/dist/server/modules/butler/assistant-automation-service.js.map +1 -1
  87. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +32 -0
  88. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +93 -0
  89. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +1 -0
  90. package/dist/server/modules/butler/assistant-sandbox-service.d.ts +69 -0
  91. package/dist/server/modules/butler/assistant-sandbox-service.js +399 -0
  92. package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -0
  93. package/dist/server/modules/butler/butler-action-context-service.js +2 -2
  94. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -1
  95. package/dist/server/modules/butler/butler-control-action-service.d.ts +5 -5
  96. package/dist/server/modules/butler/butler-control-action-service.js +19 -19
  97. package/dist/server/modules/butler/butler-control-action-service.js.map +1 -1
  98. package/dist/server/modules/butler/butler-control-session-service.d.ts +1 -1
  99. package/dist/server/modules/butler/butler-control-session-service.js +27 -26
  100. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  101. package/dist/server/modules/butler/butler-control-timer-service.js +4 -5
  102. package/dist/server/modules/butler/butler-control-timer-service.js.map +1 -1
  103. package/dist/server/modules/butler/butler-controller.d.ts +2 -2
  104. package/dist/server/modules/butler/butler-controller.js +19 -17
  105. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  106. package/dist/server/modules/butler/butler-follow-up-service.d.ts +3 -0
  107. package/dist/server/modules/butler/butler-follow-up-service.js +11 -1
  108. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  109. package/dist/server/modules/butler/butler-inbox-service.d.ts +3 -0
  110. package/dist/server/modules/butler/butler-inbox-service.js +14 -2
  111. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  112. package/dist/server/modules/butler/butler-profile-service.d.ts +5 -5
  113. package/dist/server/modules/butler/butler-profile-service.js +17 -16
  114. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  115. package/dist/server/modules/butler/butler-project-service.d.ts +7 -6
  116. package/dist/server/modules/butler/butler-project-service.js +35 -21
  117. package/dist/server/modules/butler/butler-project-service.js.map +1 -1
  118. package/dist/server/modules/butler/butler-session-service.d.ts +5 -2
  119. package/dist/server/modules/butler/butler-session-service.js +51 -27
  120. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  121. package/dist/server/modules/butler/butler-session-summary-service.d.ts +2 -2
  122. package/dist/server/modules/butler/butler-session-summary-service.js +23 -9
  123. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  124. package/dist/server/modules/butler/context-aggregator.js +9 -9
  125. package/dist/server/modules/butler/context-aggregator.js.map +1 -1
  126. package/dist/server/modules/butler/patrol-execution-service.d.ts +0 -1
  127. package/dist/server/modules/butler/patrol-execution-service.js +6 -12
  128. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -1
  129. package/dist/server/modules/channels/wechat-claw-client.d.ts +51 -0
  130. package/dist/server/modules/channels/wechat-claw-client.js +245 -0
  131. package/dist/server/modules/channels/wechat-claw-client.js.map +1 -0
  132. package/dist/server/modules/file/file-controller.d.ts +11 -2
  133. package/dist/server/modules/file/file-controller.js +404 -17
  134. package/dist/server/modules/file/file-controller.js.map +1 -1
  135. package/dist/server/modules/file/file-search-service.js +200 -12
  136. package/dist/server/modules/file/file-search-service.js.map +1 -1
  137. package/dist/server/modules/file/runtime/codingns-workspace-bridge.js +18 -5
  138. package/dist/server/modules/file/workspace-file-bridge-service.d.ts +9 -0
  139. package/dist/server/modules/file/workspace-file-bridge-service.js +3 -0
  140. package/dist/server/modules/file/workspace-file-bridge-service.js.map +1 -1
  141. package/dist/server/modules/file/workspace-file-bridge-watch-service.d.ts +9 -0
  142. package/dist/server/modules/file/workspace-file-bridge-watch-service.js +28 -0
  143. package/dist/server/modules/file/workspace-file-bridge-watch-service.js.map +1 -1
  144. package/dist/server/modules/sessions/session-controller.js +3 -3
  145. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  146. package/dist/server/modules/sessions/session-history-service.d.ts +8 -3
  147. package/dist/server/modules/sessions/session-history-service.js +126 -11
  148. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  149. package/dist/server/modules/sessions/session-live-runtime-service.js +25 -15
  150. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  151. package/dist/server/modules/sessions/session-permission-request-service.js +28 -15
  152. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  153. package/dist/server/modules/tasks/task-types.d.ts +1 -0
  154. package/dist/server/modules/tasks/task-types.js +1 -0
  155. package/dist/server/modules/tasks/task-types.js.map +1 -1
  156. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.d.ts +1 -1
  157. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js +22 -5
  158. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js.map +1 -1
  159. package/dist/server/modules/workbench/workbench-controller.d.ts +5 -0
  160. package/dist/server/modules/workbench/workbench-controller.js +20 -0
  161. package/dist/server/modules/workbench/workbench-controller.js.map +1 -1
  162. package/dist/server/modules/workbench/workbench-service.d.ts +6 -6
  163. package/dist/server/modules/workbench/workbench-service.js +42 -45
  164. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  165. package/dist/server/modules/workspace/affairs-library-controller.d.ts +8 -0
  166. package/dist/server/modules/workspace/affairs-library-controller.js +11 -0
  167. package/dist/server/modules/workspace/affairs-library-controller.js.map +1 -1
  168. package/dist/server/modules/workspace/affairs-library-preview-link-service.d.ts +6 -0
  169. package/dist/server/modules/workspace/affairs-library-preview-link-service.js +12 -2
  170. package/dist/server/modules/workspace/affairs-library-preview-link-service.js.map +1 -1
  171. package/dist/server/modules/workspace/affairs-library-service.d.ts +12 -1
  172. package/dist/server/modules/workspace/affairs-library-service.js +294 -96
  173. package/dist/server/modules/workspace/affairs-library-service.js.map +1 -1
  174. package/dist/server/modules/workspace/affairs-lightweight-session-controller.d.ts +8 -0
  175. package/dist/server/modules/workspace/affairs-lightweight-session-controller.js +55 -8
  176. package/dist/server/modules/workspace/affairs-lightweight-session-controller.js.map +1 -1
  177. package/dist/server/modules/workspace/affairs-lightweight-session-service.d.ts +13 -0
  178. package/dist/server/modules/workspace/affairs-lightweight-session-service.js +167 -21
  179. package/dist/server/modules/workspace/affairs-lightweight-session-service.js.map +1 -1
  180. package/dist/server/modules/workspace/affairs-tag-controller.d.ts +3 -0
  181. package/dist/server/modules/workspace/affairs-tag-controller.js +5 -0
  182. package/dist/server/modules/workspace/affairs-tag-controller.js.map +1 -1
  183. package/dist/server/modules/workspace/affairs-tag-service.d.ts +34 -1
  184. package/dist/server/modules/workspace/affairs-tag-service.js +568 -4
  185. package/dist/server/modules/workspace/affairs-tag-service.js.map +1 -1
  186. package/dist/server/modules/workspace/teable-api-client.d.ts +118 -0
  187. package/dist/server/modules/workspace/teable-api-client.js +142 -0
  188. package/dist/server/modules/workspace/teable-api-client.js.map +1 -0
  189. package/dist/server/modules/workspace/teable-catalog-controller.d.ts +18 -0
  190. package/dist/server/modules/workspace/teable-catalog-controller.js +17 -0
  191. package/dist/server/modules/workspace/teable-catalog-controller.js.map +1 -0
  192. package/dist/server/modules/workspace/teable-catalog-service.d.ts +36 -0
  193. package/dist/server/modules/workspace/teable-catalog-service.js +124 -0
  194. package/dist/server/modules/workspace/teable-catalog-service.js.map +1 -0
  195. package/dist/server/modules/workspace/teable-credential-service.d.ts +8 -0
  196. package/dist/server/modules/workspace/teable-credential-service.js +37 -0
  197. package/dist/server/modules/workspace/teable-credential-service.js.map +1 -0
  198. package/dist/server/modules/workspace/teable-field-mapping-controller.d.ts +25 -0
  199. package/dist/server/modules/workspace/teable-field-mapping-controller.js +31 -0
  200. package/dist/server/modules/workspace/teable-field-mapping-controller.js.map +1 -0
  201. package/dist/server/modules/workspace/teable-field-mapping-service.d.ts +38 -0
  202. package/dist/server/modules/workspace/teable-field-mapping-service.js +215 -0
  203. package/dist/server/modules/workspace/teable-field-mapping-service.js.map +1 -0
  204. package/dist/server/modules/workspace/teable-global-binding-controller.d.ts +22 -0
  205. package/dist/server/modules/workspace/teable-global-binding-controller.js +25 -0
  206. package/dist/server/modules/workspace/teable-global-binding-controller.js.map +1 -0
  207. package/dist/server/modules/workspace/teable-global-binding-service.d.ts +35 -0
  208. package/dist/server/modules/workspace/teable-global-binding-service.js +151 -0
  209. package/dist/server/modules/workspace/teable-global-binding-service.js.map +1 -0
  210. package/dist/server/modules/workspace/teable-mirror-sync-controller.d.ts +29 -0
  211. package/dist/server/modules/workspace/teable-mirror-sync-controller.js +50 -0
  212. package/dist/server/modules/workspace/teable-mirror-sync-controller.js.map +1 -0
  213. package/dist/server/modules/workspace/teable-mirror-sync-service.d.ts +157 -0
  214. package/dist/server/modules/workspace/teable-mirror-sync-service.js +917 -0
  215. package/dist/server/modules/workspace/teable-mirror-sync-service.js.map +1 -0
  216. package/dist/server/modules/workspace/teable-runtime-controller.d.ts +58 -0
  217. package/dist/server/modules/workspace/teable-runtime-controller.js +60 -0
  218. package/dist/server/modules/workspace/teable-runtime-controller.js.map +1 -0
  219. package/dist/server/modules/workspace/teable-runtime-service.d.ts +96 -0
  220. package/dist/server/modules/workspace/teable-runtime-service.js +362 -0
  221. package/dist/server/modules/workspace/teable-runtime-service.js.map +1 -0
  222. package/dist/server/modules/workspace/teable-workbench-sync-config-controller.d.ts +22 -0
  223. package/dist/server/modules/workspace/teable-workbench-sync-config-controller.js +20 -0
  224. package/dist/server/modules/workspace/teable-workbench-sync-config-controller.js.map +1 -0
  225. package/dist/server/modules/workspace/teable-workbench-sync-config-service.d.ts +22 -0
  226. package/dist/server/modules/workspace/teable-workbench-sync-config-service.js +159 -0
  227. package/dist/server/modules/workspace/teable-workbench-sync-config-service.js.map +1 -0
  228. package/dist/server/modules/workspace/workspace-controller.d.ts +1 -1
  229. package/dist/server/modules/workspace/workspace-controller.js +7 -7
  230. package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
  231. package/dist/server/modules/workspace/workspace-service.d.ts +7 -0
  232. package/dist/server/modules/workspace/workspace-service.js +151 -10
  233. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  234. package/dist/server/routes/affairs.d.ts +9 -1
  235. package/dist/server/routes/affairs.js +120 -1
  236. package/dist/server/routes/affairs.js.map +1 -1
  237. package/dist/server/routes/auth.js +6 -0
  238. package/dist/server/routes/auth.js.map +1 -1
  239. package/dist/server/routes/workbench.js +15 -0
  240. package/dist/server/routes/workbench.js.map +1 -1
  241. package/dist/server/routes/workspaces.js +51 -41
  242. package/dist/server/routes/workspaces.js.map +1 -1
  243. package/dist/server/server/create-server.d.ts +18 -0
  244. package/dist/server/server/create-server.js +99 -7
  245. package/dist/server/server/create-server.js.map +1 -1
  246. package/dist/server/server/start-host.js +20 -0
  247. package/dist/server/server/start-host.js.map +1 -1
  248. package/dist/server/shared/http/request-diagnostics.d.ts +56 -0
  249. package/dist/server/shared/http/request-diagnostics.js +256 -0
  250. package/dist/server/shared/http/request-diagnostics.js.map +1 -0
  251. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +18 -0
  252. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +191 -0
  253. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -0
  254. package/dist/server/storage/repositories/auth-token-repository.d.ts +1 -0
  255. package/dist/server/storage/repositories/auth-token-repository.js +8 -0
  256. package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
  257. package/dist/server/storage/repositories/auth-user-repository.d.ts +50 -0
  258. package/dist/server/storage/repositories/auth-user-repository.js +198 -27
  259. package/dist/server/storage/repositories/auth-user-repository.js.map +1 -1
  260. package/dist/server/storage/repositories/butler-control-session-repository.d.ts +4 -1
  261. package/dist/server/storage/repositories/butler-control-session-repository.js +55 -8
  262. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  263. package/dist/server/storage/repositories/butler-profile-repository.d.ts +2 -1
  264. package/dist/server/storage/repositories/butler-profile-repository.js +35 -6
  265. package/dist/server/storage/repositories/butler-profile-repository.js.map +1 -1
  266. package/dist/server/storage/repositories/butler-project-repository.d.ts +2 -0
  267. package/dist/server/storage/repositories/butler-project-repository.js +38 -4
  268. package/dist/server/storage/repositories/butler-project-repository.js.map +1 -1
  269. package/dist/server/storage/repositories/butler-session-repository.d.ts +2 -1
  270. package/dist/server/storage/repositories/butler-session-repository.js +35 -6
  271. package/dist/server/storage/repositories/butler-session-repository.js.map +1 -1
  272. package/dist/server/storage/repositories/session-binding-repository.d.ts +3 -0
  273. package/dist/server/storage/repositories/session-binding-repository.js +70 -2
  274. package/dist/server/storage/repositories/session-binding-repository.js.map +1 -1
  275. package/dist/server/storage/repositories/session-index-repository.js +7 -5
  276. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  277. package/dist/server/storage/repositories/user-affairs-library-setting-repository.js +8 -5
  278. package/dist/server/storage/repositories/user-affairs-library-setting-repository.js.map +1 -1
  279. package/dist/server/storage/repositories/user-teable-credential-repository.d.ts +9 -0
  280. package/dist/server/storage/repositories/user-teable-credential-repository.js +45 -0
  281. package/dist/server/storage/repositories/user-teable-credential-repository.js.map +1 -0
  282. package/dist/server/storage/repositories/user-teable-field-mapping-repository.d.ts +10 -0
  283. package/dist/server/storage/repositories/user-teable-field-mapping-repository.js +69 -0
  284. package/dist/server/storage/repositories/user-teable-field-mapping-repository.js.map +1 -0
  285. package/dist/server/storage/repositories/user-teable-global-setting-repository.d.ts +8 -0
  286. package/dist/server/storage/repositories/user-teable-global-setting-repository.js +52 -0
  287. package/dist/server/storage/repositories/user-teable-global-setting-repository.js.map +1 -0
  288. package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.d.ts +9 -0
  289. package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.js +66 -0
  290. package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.js.map +1 -0
  291. package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.d.ts +9 -0
  292. package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.js +67 -0
  293. package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.js.map +1 -0
  294. package/dist/server/storage/repositories/user-teable-sync-log-repository.d.ts +14 -0
  295. package/dist/server/storage/repositories/user-teable-sync-log-repository.js +97 -0
  296. package/dist/server/storage/repositories/user-teable-sync-log-repository.js.map +1 -0
  297. package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.d.ts +8 -0
  298. package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.js +55 -0
  299. package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.js.map +1 -0
  300. package/dist/server/storage/repositories/workspace-repository.d.ts +3 -1
  301. package/dist/server/storage/repositories/workspace-repository.js +24 -10
  302. package/dist/server/storage/repositories/workspace-repository.js.map +1 -1
  303. package/dist/server/storage/sqlite/client.js +692 -1
  304. package/dist/server/storage/sqlite/client.js.map +1 -1
  305. package/dist/server/storage/sqlite/schema.sql +200 -10
  306. package/dist/server/types/domain.d.ts +114 -1
  307. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js +34 -7
  308. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js.map +1 -1
  309. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +3 -7
  310. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  311. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +22 -3
  312. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +29 -2
  313. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +1 -1
  314. package/node_modules/@codingns/session-sync-core/package.json +3 -1
  315. package/package.json +1 -1
  316. package/dist/public/assets/DesktopWindowPage-D0blSuKd.js +0 -2
  317. package/dist/public/assets/FileContextPanel-BrKO8Xt6.js +0 -1
  318. package/dist/public/assets/GitSidebar-BdwiDtOr.js +0 -6
  319. package/dist/public/assets/MobileCreateSessionSheet-Cx_dBiBb.js +0 -1
  320. package/dist/public/assets/SettingsPage-BlAZCHsy.js +0 -2
  321. package/dist/public/assets/TerminalManagerPanel-CjzbiWjl.js +0 -1
  322. package/dist/public/assets/WorkbenchLayout-CikJBS62.js +0 -1019
  323. package/dist/public/assets/WorkbenchShellRoute-BbbSOiZw.js +0 -1
  324. package/dist/public/assets/WorkbenchShellRoute-DT3VMjWD.css +0 -1
  325. package/dist/public/assets/WorkspaceDebugDetailPage-CVivdPx5.js +0 -1
  326. package/dist/public/assets/WorkspaceDetailPage-DgOSjscR.js +0 -1
  327. package/dist/public/assets/WorkspaceHomePage-HPa7M_Vh.js +0 -1
  328. package/dist/public/assets/index-BxJPQpFM.css +0 -1
  329. package/dist/public/assets/index-CeXGOT_T.js +0 -50
  330. package/dist/public/assets/useRegisteredDebugTemplates-Bol3NVfN.js +0 -1
  331. package/dist/public/assets/workbench-navigation-B7IjRQd8.js +0 -1
@@ -10,9 +10,11 @@ export function createDatabaseClient(databasePath) {
10
10
  const schema = fs.readFileSync(schemaPath, "utf8");
11
11
  ensurePreSchemaCompatibility(db);
12
12
  db.exec(schema);
13
+ ensureAuthUserStatusSchema(db);
13
14
  ensureAuthTokenDeviceColumns(db);
14
15
  ensureAuthDeviceSchema(db);
15
16
  ensureAuthLoginAttemptSchema(db);
17
+ ensureWorkspaceOwnerSchema(db);
16
18
  ensureWorkspaceRemovalColumn(db);
17
19
  ensureWorkspaceSortOrderColumn(db);
18
20
  ensureWorkspaceNavigationBackgroundColorColumn(db);
@@ -21,6 +23,7 @@ export function createDatabaseClient(databasePath) {
21
23
  ensureOpenCliCatalogSchema(db);
22
24
  ensureOpenCliRuntimeProfileSchema(db);
23
25
  ensureSessionProviderSchema(db);
26
+ ensureSessionBindingUserSchema(db);
24
27
  ensureSessionBindingPresetSchema(db);
25
28
  ensureSessionStateSchema(db);
26
29
  ensureSessionAttachmentSchema(db);
@@ -28,6 +31,7 @@ export function createDatabaseClient(databasePath) {
28
31
  ensureSessionRelationColumns(db);
29
32
  ensureSessionForkSchema(db);
30
33
  ensureSessionChangedFileTables(db);
34
+ ensureAffairsAssistantSessionSnapshotSchema(db);
31
35
  ensureTerminalInstanceProcessIdColumn(db);
32
36
  ensureTerminalRuntimeSchema(db);
33
37
  ensureTerminalLogSchema(db);
@@ -47,6 +51,14 @@ export function createDatabaseClient(databasePath) {
47
51
  ensureTerminalInstanceDebugSchema(db);
48
52
  ensureUserPreferenceProfileSchema(db);
49
53
  ensureUserAffairsLibrarySettingsSchema(db);
54
+ ensureUserTeableGlobalSettingsSchema(db);
55
+ ensureUserTeableCredentialsSchema(db);
56
+ ensureUserTeableWorkbenchSyncConfigsSchema(db);
57
+ ensureUserTeableMirrorTableBindingsSchema(db);
58
+ ensureUserTeableMirrorRecordMappingsSchema(db);
59
+ ensureUserTeableFormBindingsSchema(db);
60
+ ensureUserTeableFieldMappingsSchema(db);
61
+ ensureUserTeableInboundRecordMappingsSchema(db);
50
62
  ensureButlerProfileSchema(db);
51
63
  ensureButlerControlSessionSchema(db);
52
64
  ensureButlerControlTimerSchema(db);
@@ -70,10 +82,29 @@ export function createDatabaseClient(databasePath) {
70
82
  function ensurePreSchemaCompatibility(db) {
71
83
  // 旧库还没有这些列时,schema.sql 里的索引会先炸掉,所以必须先补齐。
72
84
  ensureAuthTokenDeviceColumns(db);
85
+ ensureWorkspaceRemovalColumn(db);
86
+ ensureWorkspaceSortOrderColumn(db);
87
+ ensureWorkspaceOwnerColumn(db);
88
+ ensureSessionBindingUserSchema(db);
89
+ ensureButlerOwnershipPreSchemaCompatibility(db);
90
+ ensureUserTeableFormBindingsPreSchemaCompatibility(db);
73
91
  ensureOpsTargetWorkspaceSchema(db);
74
92
  ensureManagedSkillScopeSchema(db);
75
93
  ensureAuthTokenCallerKindSchema(db);
76
94
  }
95
+ function ensureAuthUserStatusSchema(db) {
96
+ if (!tableExists(db, "auth_users")) {
97
+ return;
98
+ }
99
+ const columns = db
100
+ .prepare("PRAGMA table_info(auth_users)")
101
+ .all();
102
+ const columnNames = new Set(columns.map((column) => column.name));
103
+ if (!columnNames.has("status")) {
104
+ db.exec("ALTER TABLE auth_users ADD COLUMN status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'disabled'))");
105
+ }
106
+ db.exec("UPDATE auth_users SET status = 'active' WHERE status IS NULL OR TRIM(status) = ''");
107
+ }
77
108
  function ensureAuthTokenDeviceColumns(db) {
78
109
  if (!tableExists(db, "auth_tokens")) {
79
110
  return;
@@ -104,6 +135,18 @@ function ensureAuthTokenDeviceColumns(db) {
104
135
  db.exec("CREATE INDEX IF NOT EXISTS idx_auth_tokens_workspace_id ON auth_tokens(workspace_id)");
105
136
  db.exec("CREATE INDEX IF NOT EXISTS idx_auth_tokens_session_id ON auth_tokens(session_id)");
106
137
  }
138
+ function ensureUserTeableFormBindingsPreSchemaCompatibility(db) {
139
+ if (!tableExists(db, "user_teable_form_bindings")) {
140
+ return;
141
+ }
142
+ const columns = db
143
+ .prepare("PRAGMA table_info(user_teable_form_bindings)")
144
+ .all();
145
+ const columnNames = new Set(columns.map((column) => column.name ?? ""));
146
+ if (!columnNames.has("enabled")) {
147
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1");
148
+ }
149
+ }
107
150
  function ensureAuthTokenCallerKindSchema(db) {
108
151
  if (!tableExists(db, "auth_tokens")) {
109
152
  return;
@@ -188,6 +231,12 @@ function tableExists(db, tableName) {
188
231
  .get(tableName);
189
232
  return row?.name === tableName;
190
233
  }
234
+ function tableHasColumn(db, tableName, columnName) {
235
+ if (!tableExists(db, tableName)) {
236
+ return false;
237
+ }
238
+ return db.prepare(`PRAGMA table_info(${tableName})`).all().some((column) => column.name === columnName);
239
+ }
191
240
  function ensureAuthDeviceSchema(db) {
192
241
  db.exec(`
193
242
  CREATE TABLE IF NOT EXISTS auth_devices (
@@ -250,6 +299,230 @@ function ensureAuthDeviceSchema(db) {
250
299
  db.exec("ALTER TABLE auth_devices ADD COLUMN user_agent TEXT");
251
300
  }
252
301
  }
302
+ function readLegacyDefaultUserId(db) {
303
+ if (!tableExists(db, "auth_users")) {
304
+ return null;
305
+ }
306
+ const orderBy = tableHasColumn(db, "auth_users", "created_at")
307
+ ? "created_at ASC, id ASC"
308
+ : "id ASC";
309
+ const row = db
310
+ .prepare(`SELECT id
311
+ FROM auth_users
312
+ ORDER BY ${orderBy}
313
+ LIMIT 1`)
314
+ .get();
315
+ return row?.id?.trim() || null;
316
+ }
317
+ function ensureButlerOwnershipPreSchemaCompatibility(db) {
318
+ const legacyUserId = readLegacyDefaultUserId(db);
319
+ ensureButlerProfileOwnershipSchema(db, legacyUserId);
320
+ ensureButlerProjectOwnershipSchema(db, legacyUserId);
321
+ ensureButlerSessionOwnershipSchema(db, legacyUserId);
322
+ ensureButlerControlSessionOwnershipSchema(db, legacyUserId);
323
+ }
324
+ function ensureButlerProfileOwnershipSchema(db, legacyUserId) {
325
+ if (!tableExists(db, "butler_profiles")) {
326
+ return;
327
+ }
328
+ if (!tableHasColumn(db, "butler_profiles", "user_id")) {
329
+ db.exec("ALTER TABLE butler_profiles ADD COLUMN user_id TEXT");
330
+ }
331
+ if (legacyUserId) {
332
+ db.prepare(`
333
+ UPDATE butler_profiles
334
+ SET user_id = ?
335
+ WHERE user_id IS NULL OR TRIM(user_id) = ''
336
+ `).run(legacyUserId);
337
+ }
338
+ db.exec("CREATE INDEX IF NOT EXISTS idx_butler_profiles_user_id ON butler_profiles(user_id)");
339
+ const requiredColumns = [
340
+ "display_name",
341
+ "provider_id",
342
+ "workspace_path",
343
+ "agents_mode",
344
+ "agents_content",
345
+ "persona_json",
346
+ "focus_json",
347
+ "setup_completed",
348
+ "initialized_at",
349
+ "updated_at"
350
+ ];
351
+ if (requiredColumns.some((columnName) => !tableHasColumn(db, "butler_profiles", columnName))) {
352
+ return;
353
+ }
354
+ const needsRebuild = readTableSql(db, "butler_profiles").includes("CHECK (id = 'default')");
355
+ if (!needsRebuild) {
356
+ return;
357
+ }
358
+ db.exec("PRAGMA foreign_keys = OFF");
359
+ try {
360
+ db.exec("BEGIN");
361
+ db.exec(`
362
+ CREATE TABLE butler_profiles_next (
363
+ id TEXT PRIMARY KEY,
364
+ user_id TEXT NOT NULL UNIQUE,
365
+ display_name TEXT NOT NULL,
366
+ provider_id TEXT NOT NULL CHECK (provider_id IN ('codex', 'claude-code')),
367
+ workspace_path TEXT NOT NULL,
368
+ agents_mode TEXT NOT NULL CHECK (agents_mode IN ('inline', 'file')),
369
+ agents_file_path TEXT,
370
+ agents_content TEXT NOT NULL,
371
+ persona_json TEXT NOT NULL,
372
+ focus_json TEXT NOT NULL,
373
+ setup_completed INTEGER NOT NULL DEFAULT 1 CHECK (setup_completed IN (0, 1)),
374
+ initialized_at TEXT NOT NULL,
375
+ updated_at TEXT NOT NULL,
376
+ FOREIGN KEY (user_id) REFERENCES auth_users(id) ON DELETE CASCADE
377
+ );
378
+ `);
379
+ if (legacyUserId) {
380
+ db.prepare(`
381
+ INSERT OR IGNORE INTO butler_profiles_next (
382
+ id,
383
+ user_id,
384
+ display_name,
385
+ provider_id,
386
+ workspace_path,
387
+ agents_mode,
388
+ agents_file_path,
389
+ agents_content,
390
+ persona_json,
391
+ focus_json,
392
+ setup_completed,
393
+ initialized_at,
394
+ updated_at
395
+ )
396
+ SELECT
397
+ CASE
398
+ WHEN id = 'default' THEN ?
399
+ ELSE id
400
+ END,
401
+ COALESCE(NULLIF(TRIM(user_id), ''), ?),
402
+ display_name,
403
+ provider_id,
404
+ workspace_path,
405
+ agents_mode,
406
+ agents_file_path,
407
+ agents_content,
408
+ persona_json,
409
+ focus_json,
410
+ setup_completed,
411
+ initialized_at,
412
+ updated_at
413
+ FROM butler_profiles
414
+ `).run(`default:${legacyUserId}`, legacyUserId);
415
+ }
416
+ db.exec("DROP TABLE butler_profiles");
417
+ db.exec("ALTER TABLE butler_profiles_next RENAME TO butler_profiles");
418
+ db.exec("COMMIT");
419
+ }
420
+ catch (error) {
421
+ db.exec("ROLLBACK");
422
+ throw error;
423
+ }
424
+ finally {
425
+ db.exec("PRAGMA foreign_keys = ON");
426
+ }
427
+ db.exec("CREATE INDEX IF NOT EXISTS idx_butler_profiles_user_id ON butler_profiles(user_id)");
428
+ }
429
+ function ensureButlerProjectOwnershipSchema(db, legacyUserId) {
430
+ if (!tableExists(db, "butler_projects")) {
431
+ return;
432
+ }
433
+ if (!tableHasColumn(db, "butler_projects", "user_id")) {
434
+ db.exec("ALTER TABLE butler_projects ADD COLUMN user_id TEXT");
435
+ }
436
+ if (legacyUserId) {
437
+ db.prepare(`
438
+ UPDATE butler_projects
439
+ SET user_id = ?
440
+ WHERE user_id IS NULL OR TRIM(user_id) = ''
441
+ `).run(legacyUserId);
442
+ }
443
+ db.exec(`
444
+ CREATE INDEX IF NOT EXISTS idx_butler_projects_user_id
445
+ ON butler_projects(user_id, lifecycle_status, updated_at DESC);
446
+ CREATE INDEX IF NOT EXISTS idx_butler_projects_workspace_id
447
+ ON butler_projects(user_id, workspace_id);
448
+ `);
449
+ }
450
+ function ensureButlerSessionOwnershipSchema(db, legacyUserId) {
451
+ if (!tableExists(db, "butler_sessions")) {
452
+ return;
453
+ }
454
+ if (!tableHasColumn(db, "butler_sessions", "user_id")) {
455
+ db.exec("ALTER TABLE butler_sessions ADD COLUMN user_id TEXT");
456
+ }
457
+ if (legacyUserId) {
458
+ db.prepare(`
459
+ UPDATE butler_sessions
460
+ SET user_id = COALESCE(
461
+ (
462
+ SELECT projects.user_id
463
+ FROM butler_projects AS projects
464
+ WHERE projects.id = butler_sessions.project_id
465
+ ),
466
+ ?
467
+ )
468
+ WHERE user_id IS NULL OR TRIM(user_id) = ''
469
+ `).run(legacyUserId);
470
+ }
471
+ db.exec(`
472
+ CREATE INDEX IF NOT EXISTS idx_butler_sessions_user_id
473
+ ON butler_sessions(user_id, updated_at DESC);
474
+ CREATE INDEX IF NOT EXISTS idx_butler_sessions_project_id
475
+ ON butler_sessions(user_id, project_id, updated_at DESC);
476
+ `);
477
+ }
478
+ function ensureButlerControlSessionOwnershipSchema(db, legacyUserId) {
479
+ if (!tableExists(db, "butler_control_sessions")) {
480
+ return;
481
+ }
482
+ if (!tableHasColumn(db, "butler_control_sessions", "user_id")) {
483
+ db.exec("ALTER TABLE butler_control_sessions ADD COLUMN user_id TEXT");
484
+ }
485
+ if (legacyUserId) {
486
+ db.prepare(`
487
+ UPDATE butler_control_sessions
488
+ SET user_id = COALESCE(
489
+ (
490
+ SELECT bindings.user_id
491
+ FROM session_bindings AS bindings
492
+ WHERE bindings.session_id = butler_control_sessions.session_id
493
+ ),
494
+ ?
495
+ )
496
+ WHERE user_id IS NULL OR TRIM(user_id) = ''
497
+ `).run(legacyUserId);
498
+ }
499
+ db.exec(`
500
+ CREATE INDEX IF NOT EXISTS idx_butler_control_sessions_user_provider
501
+ ON butler_control_sessions(user_id, provider_id, updated_at DESC, created_at DESC);
502
+ `);
503
+ }
504
+ function ensureWorkspaceOwnerSchema(db) {
505
+ ensureWorkspaceOwnerColumn(db);
506
+ const legacyOwnerUserId = readLegacyDefaultUserId(db);
507
+ if (legacyOwnerUserId) {
508
+ db.prepare(`UPDATE workspaces
509
+ SET owner_user_id = ?
510
+ WHERE owner_user_id IS NULL OR TRIM(owner_user_id) = ''`).run(legacyOwnerUserId);
511
+ }
512
+ db.exec("CREATE INDEX IF NOT EXISTS idx_workspaces_owner_user_id ON workspaces(owner_user_id, removed_at, sort_order)");
513
+ }
514
+ function ensureWorkspaceOwnerColumn(db) {
515
+ if (!tableExists(db, "workspaces")) {
516
+ return;
517
+ }
518
+ const columns = db
519
+ .prepare("PRAGMA table_info(workspaces)")
520
+ .all();
521
+ const columnNames = new Set(columns.map((column) => column.name));
522
+ if (!columnNames.has("owner_user_id")) {
523
+ db.exec("ALTER TABLE workspaces ADD COLUMN owner_user_id TEXT");
524
+ }
525
+ }
253
526
  function ensureWorkspaceNavigationAffairsLibraryColumns(db) {
254
527
  if (!tableExists(db, "workspace_navigation_states")) {
255
528
  return;
@@ -536,6 +809,9 @@ function ensureAuthLoginAttemptSchema(db) {
536
809
  `);
537
810
  }
538
811
  function ensureWorkspaceRemovalColumn(db) {
812
+ if (!tableExists(db, "workspaces")) {
813
+ return;
814
+ }
539
815
  const columns = db
540
816
  .prepare("PRAGMA table_info(workspaces)")
541
817
  .all();
@@ -545,6 +821,9 @@ function ensureWorkspaceRemovalColumn(db) {
545
821
  db.exec("ALTER TABLE workspaces ADD COLUMN removed_at TEXT");
546
822
  }
547
823
  function ensureWorkspaceSortOrderColumn(db) {
824
+ if (!tableExists(db, "workspaces")) {
825
+ return;
826
+ }
548
827
  const columns = db
549
828
  .prepare("PRAGMA table_info(workspaces)")
550
829
  .all();
@@ -662,6 +941,7 @@ function ensureButlerProfileSchema(db) {
662
941
  if (!columnNames.has("setup_completed")) {
663
942
  db.exec("ALTER TABLE butler_profiles ADD COLUMN setup_completed INTEGER NOT NULL DEFAULT 0 CHECK (setup_completed IN (0, 1))");
664
943
  }
944
+ ensureButlerOwnershipPreSchemaCompatibility(db);
665
945
  }
666
946
  function ensureUserPreferenceProfileSchema(db) {
667
947
  const columns = db
@@ -799,12 +1079,12 @@ function ensureUserAffairsLibrarySettingsSchema(db) {
799
1079
  enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
800
1080
  favorites_json TEXT,
801
1081
  last_workspace_id TEXT,
1082
+ dashboard_state_json TEXT NOT NULL DEFAULT '{}',
802
1083
  created_at TEXT NOT NULL,
803
1084
  updated_at TEXT NOT NULL,
804
1085
  FOREIGN KEY (user_id) REFERENCES auth_users(id)
805
1086
  )
806
1087
  `);
807
- return;
808
1088
  }
809
1089
  const columns = db
810
1090
  .prepare("PRAGMA table_info(user_affairs_library_settings)")
@@ -816,7 +1096,313 @@ function ensureUserAffairsLibrarySettingsSchema(db) {
816
1096
  if (!columnNames.has("last_workspace_id")) {
817
1097
  db.exec("ALTER TABLE user_affairs_library_settings ADD COLUMN last_workspace_id TEXT");
818
1098
  }
1099
+ if (!columnNames.has("dashboard_state_json")) {
1100
+ db.exec("ALTER TABLE user_affairs_library_settings ADD COLUMN dashboard_state_json TEXT NOT NULL DEFAULT '{}'");
1101
+ }
819
1102
  migrateLegacyAffairsLibrarySettings(db);
1103
+ migrateLegacyDashboardStatesIntoGlobalAffairsSettings(db);
1104
+ }
1105
+ function migrateLegacyDashboardStatesIntoGlobalAffairsSettings(db) {
1106
+ if (!tableExists(db, "user_preference_profiles") || !tableExists(db, "user_affairs_library_settings")) {
1107
+ return;
1108
+ }
1109
+ const rows = db
1110
+ .prepare("SELECT user_id, affairs_dashboard_states_json FROM user_preference_profiles")
1111
+ .all();
1112
+ const updateStatement = db.prepare(`
1113
+ UPDATE user_affairs_library_settings
1114
+ SET dashboard_state_json = ?
1115
+ WHERE user_id = ?
1116
+ AND (dashboard_state_json IS NULL OR TRIM(dashboard_state_json) = '' OR dashboard_state_json = '{}')
1117
+ `);
1118
+ for (const row of rows) {
1119
+ const dashboardState = pickLatestLegacyDashboardState(parseJsonObjectRecord(row.affairs_dashboard_states_json));
1120
+ if (!dashboardState) {
1121
+ continue;
1122
+ }
1123
+ updateStatement.run(JSON.stringify(dashboardState), row.user_id);
1124
+ }
1125
+ }
1126
+ function pickLatestLegacyDashboardState(dashboardStatesByWorkspace) {
1127
+ const candidates = Object.entries(dashboardStatesByWorkspace)
1128
+ .map(([workspaceId, rawState]) => normalizeLegacyDashboardStateCandidate(workspaceId, rawState))
1129
+ .filter((item) => item !== null)
1130
+ .sort((left, right) => {
1131
+ if (right.score !== left.score) {
1132
+ return right.score - left.score;
1133
+ }
1134
+ return right.updatedAt.localeCompare(left.updatedAt);
1135
+ });
1136
+ return candidates[0]?.state ?? null;
1137
+ }
1138
+ function normalizeLegacyDashboardStateCandidate(workspaceId, rawState) {
1139
+ if (typeof rawState !== "object" || rawState === null || Array.isArray(rawState)) {
1140
+ return null;
1141
+ }
1142
+ const state = {
1143
+ ...rawState,
1144
+ workspaceId: "affairs-global"
1145
+ };
1146
+ const shortcutApps = Array.isArray(state.shortcutApps) ? state.shortcutApps : [];
1147
+ const tabs = Array.isArray(state.tabs) ? state.tabs : [];
1148
+ const widgetCount = tabs.reduce((total, tab) => {
1149
+ if (typeof tab !== "object" || tab === null || Array.isArray(tab)) {
1150
+ return total;
1151
+ }
1152
+ return total + (Array.isArray(tab.widgets) ? tab.widgets.length : 0);
1153
+ }, 0);
1154
+ const updatedAt = typeof state.updatedAt === "string" && state.updatedAt.trim()
1155
+ ? state.updatedAt.trim()
1156
+ : "";
1157
+ return {
1158
+ state,
1159
+ score: shortcutApps.length * 100 + widgetCount,
1160
+ updatedAt: updatedAt || workspaceId
1161
+ };
1162
+ }
1163
+ function ensureUserTeableGlobalSettingsSchema(db) {
1164
+ if (!tableExists(db, "user_teable_global_settings")) {
1165
+ db.exec(`
1166
+ CREATE TABLE user_teable_global_settings (
1167
+ user_id TEXT PRIMARY KEY,
1168
+ base_url TEXT,
1169
+ space_id TEXT,
1170
+ base_id TEXT,
1171
+ auth_ref TEXT,
1172
+ enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
1173
+ mirror_mode TEXT NOT NULL DEFAULT 'manual' CHECK (mirror_mode IN ('manual', 'scheduled', 'event_driven')),
1174
+ created_at TEXT NOT NULL,
1175
+ updated_at TEXT NOT NULL,
1176
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
1177
+ )
1178
+ `);
1179
+ return;
1180
+ }
1181
+ const columns = db
1182
+ .prepare("PRAGMA table_info(user_teable_global_settings)")
1183
+ .all();
1184
+ const columnNames = new Set(columns.map((column) => column.name));
1185
+ if (!columnNames.has("base_id")) {
1186
+ db.exec("ALTER TABLE user_teable_global_settings ADD COLUMN base_id TEXT");
1187
+ }
1188
+ if (!columnNames.has("mirror_mode")) {
1189
+ db.exec("ALTER TABLE user_teable_global_settings ADD COLUMN mirror_mode TEXT NOT NULL DEFAULT 'manual'");
1190
+ }
1191
+ }
1192
+ function ensureUserTeableCredentialsSchema(db) {
1193
+ if (!tableExists(db, "user_teable_credentials")) {
1194
+ db.exec(`
1195
+ CREATE TABLE user_teable_credentials (
1196
+ user_id TEXT NOT NULL,
1197
+ auth_ref TEXT NOT NULL,
1198
+ token_ciphertext TEXT NOT NULL,
1199
+ created_at TEXT NOT NULL,
1200
+ updated_at TEXT NOT NULL,
1201
+ PRIMARY KEY (user_id, auth_ref),
1202
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
1203
+ )
1204
+ `);
1205
+ }
1206
+ db.exec(`
1207
+ CREATE INDEX IF NOT EXISTS idx_user_teable_credentials_user_updated_at
1208
+ ON user_teable_credentials(user_id, updated_at DESC)
1209
+ `);
1210
+ }
1211
+ function ensureUserTeableWorkbenchSyncConfigsSchema(db) {
1212
+ if (!tableExists(db, "user_teable_workbench_sync_configs")) {
1213
+ db.exec(`
1214
+ CREATE TABLE user_teable_workbench_sync_configs (
1215
+ config_id TEXT PRIMARY KEY,
1216
+ user_id TEXT NOT NULL,
1217
+ source_type TEXT NOT NULL CHECK (source_type IN ('tags', 'sessions', 'todos')),
1218
+ enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
1219
+ scope_json TEXT NOT NULL,
1220
+ target_table_id TEXT,
1221
+ created_at TEXT NOT NULL,
1222
+ updated_at TEXT NOT NULL,
1223
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1224
+ UNIQUE (user_id, source_type)
1225
+ )
1226
+ `);
1227
+ db.exec(`
1228
+ CREATE INDEX IF NOT EXISTS idx_user_teable_workbench_sync_configs_user
1229
+ ON user_teable_workbench_sync_configs(user_id, source_type)
1230
+ `);
1231
+ return;
1232
+ }
1233
+ db.exec(`
1234
+ CREATE INDEX IF NOT EXISTS idx_user_teable_workbench_sync_configs_user
1235
+ ON user_teable_workbench_sync_configs(user_id, source_type)
1236
+ `);
1237
+ }
1238
+ function ensureUserTeableMirrorTableBindingsSchema(db) {
1239
+ if (!tableExists(db, "user_teable_mirror_table_bindings")) {
1240
+ db.exec(`
1241
+ CREATE TABLE user_teable_mirror_table_bindings (
1242
+ binding_id TEXT PRIMARY KEY,
1243
+ user_id TEXT NOT NULL,
1244
+ mirror_type TEXT NOT NULL CHECK (mirror_type IN ('tags', 'sessions', 'todos')),
1245
+ table_id TEXT NOT NULL,
1246
+ table_name TEXT NOT NULL,
1247
+ read_only_mode TEXT NOT NULL CHECK (read_only_mode IN ('role_based', 'matrix_based', 'unknown')),
1248
+ last_synced_at TEXT,
1249
+ created_at TEXT NOT NULL,
1250
+ updated_at TEXT NOT NULL,
1251
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1252
+ UNIQUE (user_id, mirror_type)
1253
+ )
1254
+ `);
1255
+ }
1256
+ db.exec(`
1257
+ CREATE INDEX IF NOT EXISTS idx_user_teable_mirror_table_bindings_user
1258
+ ON user_teable_mirror_table_bindings(user_id, mirror_type)
1259
+ `);
1260
+ }
1261
+ function ensureUserTeableMirrorRecordMappingsSchema(db) {
1262
+ if (!tableExists(db, "user_teable_mirror_record_mappings")) {
1263
+ db.exec(`
1264
+ CREATE TABLE user_teable_mirror_record_mappings (
1265
+ mapping_id TEXT PRIMARY KEY,
1266
+ user_id TEXT NOT NULL,
1267
+ mirror_type TEXT NOT NULL CHECK (mirror_type IN ('tags', 'sessions', 'todos')),
1268
+ local_id TEXT NOT NULL,
1269
+ teable_record_id TEXT NOT NULL,
1270
+ fingerprint TEXT NOT NULL,
1271
+ last_synced_at TEXT NOT NULL,
1272
+ deleted_at TEXT,
1273
+ created_at TEXT NOT NULL,
1274
+ updated_at TEXT NOT NULL,
1275
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1276
+ UNIQUE (user_id, mirror_type, local_id)
1277
+ )
1278
+ `);
1279
+ }
1280
+ db.exec(`
1281
+ CREATE INDEX IF NOT EXISTS idx_user_teable_mirror_record_mappings_user
1282
+ ON user_teable_mirror_record_mappings(user_id, mirror_type, updated_at DESC)
1283
+ `);
1284
+ }
1285
+ function ensureUserTeableFormBindingsSchema(db) {
1286
+ if (!tableExists(db, "user_teable_form_bindings")) {
1287
+ db.exec(`
1288
+ CREATE TABLE user_teable_form_bindings (
1289
+ form_binding_id TEXT PRIMARY KEY,
1290
+ user_id TEXT NOT NULL,
1291
+ workspace_id TEXT NOT NULL,
1292
+ source_workspace_ids_json TEXT NOT NULL DEFAULT '[]',
1293
+ table_id TEXT NOT NULL,
1294
+ view_id TEXT NOT NULL,
1295
+ name TEXT NOT NULL,
1296
+ linked_mirror_types_json TEXT NOT NULL,
1297
+ teable_table_id TEXT NOT NULL DEFAULT '',
1298
+ teable_view_id TEXT NOT NULL DEFAULT '',
1299
+ teable_share_id TEXT,
1300
+ teable_form_name TEXT NOT NULL DEFAULT '',
1301
+ display_name TEXT NOT NULL DEFAULT '',
1302
+ open_mode TEXT NOT NULL DEFAULT 'embed' CHECK (open_mode IN ('embed', 'external')),
1303
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
1304
+ inbound_action TEXT NOT NULL CHECK (inbound_action IN ('create_todo', 'append_session_context', 'request_tag_assignment', 'none')),
1305
+ open_url TEXT NOT NULL,
1306
+ created_at TEXT NOT NULL,
1307
+ updated_at TEXT NOT NULL,
1308
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
1309
+ )
1310
+ `);
1311
+ }
1312
+ const columns = db
1313
+ .prepare("PRAGMA table_info(user_teable_form_bindings)")
1314
+ .all();
1315
+ const columnNames = new Set(columns.map((item) => item.name ?? ""));
1316
+ if (!columnNames.has("source_workspace_ids_json")) {
1317
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN source_workspace_ids_json TEXT NOT NULL DEFAULT '[]'");
1318
+ db.exec(`
1319
+ UPDATE user_teable_form_bindings
1320
+ SET source_workspace_ids_json = json_array(workspace_id)
1321
+ WHERE COALESCE(TRIM(source_workspace_ids_json), '') = ''
1322
+ OR source_workspace_ids_json = '[]'
1323
+ `);
1324
+ }
1325
+ if (!columnNames.has("teable_table_id")) {
1326
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_table_id TEXT NOT NULL DEFAULT ''");
1327
+ db.exec("UPDATE user_teable_form_bindings SET teable_table_id = table_id WHERE COALESCE(TRIM(teable_table_id), '') = ''");
1328
+ }
1329
+ if (!columnNames.has("teable_view_id")) {
1330
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_view_id TEXT NOT NULL DEFAULT ''");
1331
+ db.exec("UPDATE user_teable_form_bindings SET teable_view_id = view_id WHERE COALESCE(TRIM(teable_view_id), '') = ''");
1332
+ }
1333
+ if (!columnNames.has("teable_share_id")) {
1334
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_share_id TEXT");
1335
+ }
1336
+ if (!columnNames.has("teable_form_name")) {
1337
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_form_name TEXT NOT NULL DEFAULT ''");
1338
+ db.exec("UPDATE user_teable_form_bindings SET teable_form_name = name WHERE COALESCE(TRIM(teable_form_name), '') = ''");
1339
+ }
1340
+ if (!columnNames.has("display_name")) {
1341
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN display_name TEXT NOT NULL DEFAULT ''");
1342
+ db.exec("UPDATE user_teable_form_bindings SET display_name = name WHERE COALESCE(TRIM(display_name), '') = ''");
1343
+ }
1344
+ if (!columnNames.has("open_mode")) {
1345
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN open_mode TEXT NOT NULL DEFAULT 'embed'");
1346
+ }
1347
+ if (!columnNames.has("enabled")) {
1348
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1");
1349
+ }
1350
+ db.exec(`
1351
+ CREATE INDEX IF NOT EXISTS idx_user_teable_form_bindings_user_workspace
1352
+ ON user_teable_form_bindings(user_id, workspace_id, updated_at DESC)
1353
+ `);
1354
+ db.exec(`
1355
+ CREATE INDEX IF NOT EXISTS idx_user_teable_form_bindings_user_enabled
1356
+ ON user_teable_form_bindings(user_id, enabled, updated_at DESC)
1357
+ `);
1358
+ }
1359
+ function ensureUserTeableFieldMappingsSchema(db) {
1360
+ if (!tableExists(db, "user_teable_field_mappings")) {
1361
+ db.exec(`
1362
+ CREATE TABLE user_teable_field_mappings (
1363
+ mapping_id TEXT PRIMARY KEY,
1364
+ user_id TEXT NOT NULL,
1365
+ config_id TEXT NOT NULL,
1366
+ source_type TEXT NOT NULL CHECK (source_type IN ('tags', 'sessions', 'todos')),
1367
+ target_table_id TEXT NOT NULL,
1368
+ items_json TEXT NOT NULL,
1369
+ created_at TEXT NOT NULL,
1370
+ updated_at TEXT NOT NULL,
1371
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1372
+ UNIQUE (user_id, config_id)
1373
+ )
1374
+ `);
1375
+ }
1376
+ db.exec(`
1377
+ CREATE INDEX IF NOT EXISTS idx_user_teable_field_mappings_user
1378
+ ON user_teable_field_mappings(user_id, source_type, updated_at DESC)
1379
+ `);
1380
+ }
1381
+ function ensureUserTeableInboundRecordMappingsSchema(db) {
1382
+ if (!tableExists(db, "user_teable_inbound_record_mappings")) {
1383
+ db.exec(`
1384
+ CREATE TABLE user_teable_inbound_record_mappings (
1385
+ mapping_id TEXT PRIMARY KEY,
1386
+ user_id TEXT NOT NULL,
1387
+ form_binding_id TEXT NOT NULL,
1388
+ teable_record_id TEXT NOT NULL,
1389
+ teable_record_fingerprint TEXT NOT NULL,
1390
+ inbound_action TEXT NOT NULL CHECK (inbound_action IN ('create_todo', 'append_session_context', 'request_tag_assignment', 'none')),
1391
+ target_local_id TEXT,
1392
+ status TEXT NOT NULL CHECK (status IN ('applied', 'skipped', 'failed')),
1393
+ error_detail TEXT,
1394
+ last_synced_at TEXT NOT NULL,
1395
+ created_at TEXT NOT NULL,
1396
+ updated_at TEXT NOT NULL,
1397
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1398
+ UNIQUE (user_id, form_binding_id, teable_record_id)
1399
+ )
1400
+ `);
1401
+ }
1402
+ db.exec(`
1403
+ CREATE INDEX IF NOT EXISTS idx_user_teable_inbound_record_mappings_user_form
1404
+ ON user_teable_inbound_record_mappings(user_id, form_binding_id, updated_at DESC)
1405
+ `);
820
1406
  }
821
1407
  function migrateLegacyAffairsLibrarySettings(db) {
822
1408
  if (!tableExists(db, "workspace_navigation_states") || !tableExists(db, "user_affairs_library_settings")) {
@@ -1438,6 +2024,36 @@ function ensureSessionBindingPresetSchema(db) {
1438
2024
  db.exec("ALTER TABLE session_bindings ADD COLUMN runtime_home_dir TEXT");
1439
2025
  }
1440
2026
  }
2027
+ function ensureSessionBindingUserSchema(db) {
2028
+ if (!tableExists(db, "session_bindings")) {
2029
+ return;
2030
+ }
2031
+ const columns = db
2032
+ .prepare("PRAGMA table_info(session_bindings)")
2033
+ .all();
2034
+ const columnNames = new Set(columns.map((column) => column.name));
2035
+ if (!columnNames.has("user_id")) {
2036
+ db.exec("ALTER TABLE session_bindings ADD COLUMN user_id TEXT");
2037
+ }
2038
+ if (tableHasColumn(db, "workspaces", "owner_user_id")) {
2039
+ db.exec(`
2040
+ UPDATE session_bindings
2041
+ SET user_id = (
2042
+ SELECT owner_user_id
2043
+ FROM workspaces
2044
+ WHERE workspaces.id = session_bindings.workspace_id
2045
+ )
2046
+ WHERE user_id IS NULL OR TRIM(user_id) = ''
2047
+ `);
2048
+ }
2049
+ const legacyOwnerUserId = readLegacyDefaultUserId(db);
2050
+ if (legacyOwnerUserId) {
2051
+ db.prepare(`UPDATE session_bindings
2052
+ SET user_id = ?
2053
+ WHERE user_id IS NULL OR TRIM(user_id) = ''`).run(legacyOwnerUserId);
2054
+ }
2055
+ db.exec("CREATE INDEX IF NOT EXISTS idx_session_bindings_user_id ON session_bindings(user_id, workspace_id)");
2056
+ }
1441
2057
  function ensureSessionStateSchema(db) {
1442
2058
  const columns = db
1443
2059
  .prepare("PRAGMA table_info(session_states)")
@@ -1677,6 +2293,81 @@ function ensureSessionChangedFileTables(db) {
1677
2293
  );
1678
2294
  `);
1679
2295
  }
2296
+ function ensureAffairsAssistantSessionSnapshotSchema(db) {
2297
+ const currentSql = readTableSql(db, "affairs_assistant_session_snapshots");
2298
+ if (!currentSql) {
2299
+ db.exec(`
2300
+ CREATE TABLE affairs_assistant_session_snapshots (
2301
+ workspace_id TEXT NOT NULL,
2302
+ user_id TEXT NOT NULL,
2303
+ project_id TEXT,
2304
+ project_workspace_id TEXT,
2305
+ agent_workspace_path TEXT,
2306
+ sessions_json TEXT NOT NULL,
2307
+ updated_at TEXT NOT NULL,
2308
+ PRIMARY KEY (workspace_id, user_id),
2309
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
2310
+ );
2311
+
2312
+ CREATE INDEX IF NOT EXISTS idx_affairs_assistant_session_snapshots_user_id
2313
+ ON affairs_assistant_session_snapshots(user_id, updated_at DESC);
2314
+ `);
2315
+ return;
2316
+ }
2317
+ if (!currentSql.includes("FOREIGN KEY (workspace_id) REFERENCES workspaces(id)")) {
2318
+ db.exec(`
2319
+ CREATE INDEX IF NOT EXISTS idx_affairs_assistant_session_snapshots_user_id
2320
+ ON affairs_assistant_session_snapshots(user_id, updated_at DESC);
2321
+ `);
2322
+ return;
2323
+ }
2324
+ db.exec(`
2325
+ PRAGMA foreign_keys = OFF;
2326
+
2327
+ DROP TABLE IF EXISTS affairs_assistant_session_snapshots_next;
2328
+
2329
+ CREATE TABLE affairs_assistant_session_snapshots_next (
2330
+ workspace_id TEXT NOT NULL,
2331
+ user_id TEXT NOT NULL,
2332
+ project_id TEXT,
2333
+ project_workspace_id TEXT,
2334
+ agent_workspace_path TEXT,
2335
+ sessions_json TEXT NOT NULL,
2336
+ updated_at TEXT NOT NULL,
2337
+ PRIMARY KEY (workspace_id, user_id),
2338
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
2339
+ );
2340
+
2341
+ INSERT INTO affairs_assistant_session_snapshots_next (
2342
+ workspace_id,
2343
+ user_id,
2344
+ project_id,
2345
+ project_workspace_id,
2346
+ agent_workspace_path,
2347
+ sessions_json,
2348
+ updated_at
2349
+ )
2350
+ SELECT
2351
+ workspace_id,
2352
+ user_id,
2353
+ project_id,
2354
+ project_workspace_id,
2355
+ agent_workspace_path,
2356
+ sessions_json,
2357
+ updated_at
2358
+ FROM affairs_assistant_session_snapshots;
2359
+
2360
+ DROP TABLE affairs_assistant_session_snapshots;
2361
+
2362
+ ALTER TABLE affairs_assistant_session_snapshots_next
2363
+ RENAME TO affairs_assistant_session_snapshots;
2364
+
2365
+ PRAGMA foreign_keys = ON;
2366
+
2367
+ CREATE INDEX IF NOT EXISTS idx_affairs_assistant_session_snapshots_user_id
2368
+ ON affairs_assistant_session_snapshots(user_id, updated_at DESC);
2369
+ `);
2370
+ }
1680
2371
  function ensureTerminalCommandTemplatePortColumn(db) {
1681
2372
  const columns = db
1682
2373
  .prepare("PRAGMA table_info(terminal_command_templates)")