@jingyi0605/codingns 0.9.0 → 0.9.5

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 (224) hide show
  1. package/dist/public/assets/{AdaptiveButlerPage-B17QiMyT.js → AdaptiveButlerPage-kkJDsnCO.js} +2 -2
  2. package/dist/public/assets/{App-CFBwDUNA.js → App-DrNI9lWA.js} +6 -6
  3. package/dist/public/assets/{BootstrapPage-W5wU3BPh.js → BootstrapPage-QgVH5Mps.js} +1 -1
  4. package/dist/public/assets/{ConversationPage-DQLX1bUh.js → ConversationPage-DVk8VfIj.js} +1 -1
  5. package/dist/public/assets/{DesktopDetachPreviewPage-DTPeuAW-.js → DesktopDetachPreviewPage-BhfP0TpH.js} +1 -1
  6. package/dist/public/assets/{DesktopModal-6ii53_Y9.js → DesktopModal-DRmDrv0S.js} +1 -1
  7. package/dist/public/assets/DesktopWindowPage-DNbJXnSs.js +2 -0
  8. package/dist/public/assets/FileContextPanel---fLO4ve.js +1 -0
  9. package/dist/public/assets/GitSidebar-sXUE0TqT.js +6 -0
  10. package/dist/public/assets/MobileCreateSessionSheet-BftZ5pvb.js +1 -0
  11. package/dist/public/assets/{MobileSheet-opTWyRe1.js → MobileSheet-nw5SCa3N.js} +1 -1
  12. package/dist/public/assets/{MobileTopHeaderFrame-BbNON3Y4.js → MobileTopHeaderFrame-DH_D02Wy.js} +1 -1
  13. package/dist/public/assets/{MobileWorkspaceSwitcherHeader-BZEzPeMj.js → MobileWorkspaceSwitcherHeader-2K406G5p.js} +1 -1
  14. package/dist/public/assets/{PluginAccessOverview-mQDmAljp.js → PluginAccessOverview-BVJihw3D.js} +1 -1
  15. package/dist/public/assets/{PluginContainerPage-CcxUJpM4.js → PluginContainerPage-CR4vStvr.js} +1 -1
  16. package/dist/public/assets/{PluginDetailPage-D5--ACIt.js → PluginDetailPage-CrMX0Mnm.js} +1 -1
  17. package/dist/public/assets/{PluginsListPage-D_oJxYXT.js → PluginsListPage-FtIL71Yg.js} +1 -1
  18. package/dist/public/assets/{RelayConnectEntryPage-DROxpnkv.js → RelayConnectEntryPage-Bt1apX53.js} +1 -1
  19. package/dist/public/assets/{ServerSettingsModal-CUUOPqSe.js → ServerSettingsModal-D-guzPrI.js} +1 -1
  20. package/dist/public/assets/{SessionIndexPage-C2Jxh6Gp.js → SessionIndexPage-CX2FppcJ.js} +1 -1
  21. package/dist/public/assets/SettingsPage-BI2Olcvr.js +2 -0
  22. package/dist/public/assets/TerminalManagerPanel-B5MKGPy-.js +1 -0
  23. package/dist/public/assets/{TerminalPage-CwWyFDj8.js → TerminalPage-C2dTNGHK.js} +1 -1
  24. package/dist/public/assets/{TerminalRuntimeFallbackModal-CSVVbO8r.js → TerminalRuntimeFallbackModal-DAqOxFD8.js} +1 -1
  25. package/dist/public/assets/{ToolFilesPage-QBEY8oCf.js → ToolFilesPage-IsNwyE6T.js} +1 -1
  26. package/dist/public/assets/{ToolGitPage-BKoZ2l9v.js → ToolGitPage-BK1JBERN.js} +1 -1
  27. package/dist/public/assets/{ToolProcessesPage-BOH0ib4G.js → ToolProcessesPage-DwTYUQCK.js} +1 -1
  28. package/dist/public/assets/{ToolsHomePage-BcMZ3BCQ.js → ToolsHomePage-BLOy7lPg.js} +1 -1
  29. package/dist/public/assets/{WorkbenchLandingPage-B5zoppEl.js → WorkbenchLandingPage-CqZKR6EA.js} +1 -1
  30. package/dist/public/assets/WorkbenchLayout-CJHQtwuL.js +1022 -0
  31. package/dist/public/assets/{WorkbenchModal-NGmPgqaE.js → WorkbenchModal-BM-OeW-b.js} +1 -1
  32. package/dist/public/assets/WorkbenchShellRoute-2bKI6Q9k.js +1 -0
  33. package/dist/public/assets/WorkbenchShellRoute-BjuZD101.css +1 -0
  34. package/dist/public/assets/WorkspaceDebugDetailPage-BMsEN5iG.js +1 -0
  35. package/dist/public/assets/WorkspaceDetailPage-5H9Gosx2.js +1 -0
  36. package/dist/public/assets/WorkspaceHomePage-DQiXKgiP.js +1 -0
  37. package/dist/public/assets/{client-runtime-manager-DXbI9K1K.js → client-runtime-manager-CgPJq21V.js} +1 -1
  38. package/dist/public/assets/index-BARqMVSw.css +1 -0
  39. package/dist/public/assets/index-BUoNjVrY.js +50 -0
  40. package/dist/public/assets/{login-direct-candidate-resolver-DkKyFtQJ.js → login-direct-candidate-resolver-CGaxAXV8.js} +1 -1
  41. package/dist/public/assets/{plugin-permission-copy-CzN269Bk.js → plugin-permission-copy-BR9gWy8b.js} +1 -1
  42. package/dist/public/assets/{plugins-api-Bv9DHpLF.js → plugins-api-CdCsrG2e.js} +1 -1
  43. package/dist/public/assets/{preferences-service-D2ISL2Zz.js → preferences-service-lOhnlxzP.js} +1 -1
  44. package/dist/public/assets/{relay-entry-Bg0OisQy.js → relay-entry-CQpxTS8y.js} +1 -1
  45. package/dist/public/assets/{terminal-runtime-meta-C8t-CIDF.js → terminal-runtime-meta-oteTx66X.js} +1 -1
  46. package/dist/public/assets/useRegisteredDebugTemplates-Bu2ykZ6s.js +1 -0
  47. package/dist/public/assets/workbench-navigation-DlgXuFW2.js +1 -0
  48. package/dist/public/index.html +2 -2
  49. package/dist/server/config/env.d.ts +1 -0
  50. package/dist/server/config/env.js +3 -0
  51. package/dist/server/config/env.js.map +1 -1
  52. package/dist/server/modules/affairs-indexer/core/src/parser/parser-skip-repository.js.map +1 -1
  53. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-write-repository.js.map +1 -1
  54. package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js +2 -2
  55. package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js.map +1 -1
  56. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.d.ts +20 -3
  57. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js +3 -3
  58. package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js.map +1 -1
  59. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +32 -0
  60. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +93 -0
  61. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +1 -0
  62. package/dist/server/modules/butler/assistant-sandbox-service.d.ts +69 -0
  63. package/dist/server/modules/butler/assistant-sandbox-service.js +399 -0
  64. package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -0
  65. package/dist/server/modules/butler/butler-follow-up-service.d.ts +3 -0
  66. package/dist/server/modules/butler/butler-follow-up-service.js +11 -1
  67. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  68. package/dist/server/modules/butler/butler-inbox-service.d.ts +3 -0
  69. package/dist/server/modules/butler/butler-inbox-service.js +14 -2
  70. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  71. package/dist/server/modules/butler/butler-session-service.d.ts +3 -0
  72. package/dist/server/modules/butler/butler-session-service.js +18 -0
  73. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  74. package/dist/server/modules/channels/wechat-claw-client.d.ts +51 -0
  75. package/dist/server/modules/channels/wechat-claw-client.js +245 -0
  76. package/dist/server/modules/channels/wechat-claw-client.js.map +1 -0
  77. package/dist/server/modules/file/file-controller.d.ts +11 -2
  78. package/dist/server/modules/file/file-controller.js +404 -17
  79. package/dist/server/modules/file/file-controller.js.map +1 -1
  80. package/dist/server/modules/file/file-search-service.js +200 -12
  81. package/dist/server/modules/file/file-search-service.js.map +1 -1
  82. package/dist/server/modules/file/runtime/codingns-workspace-bridge.js +18 -5
  83. package/dist/server/modules/file/workspace-file-bridge-service.d.ts +9 -0
  84. package/dist/server/modules/file/workspace-file-bridge-service.js +3 -0
  85. package/dist/server/modules/file/workspace-file-bridge-service.js.map +1 -1
  86. package/dist/server/modules/file/workspace-file-bridge-watch-service.d.ts +9 -0
  87. package/dist/server/modules/file/workspace-file-bridge-watch-service.js +28 -0
  88. package/dist/server/modules/file/workspace-file-bridge-watch-service.js.map +1 -1
  89. package/dist/server/modules/tasks/task-types.d.ts +1 -0
  90. package/dist/server/modules/tasks/task-types.js +1 -0
  91. package/dist/server/modules/tasks/task-types.js.map +1 -1
  92. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.d.ts +1 -1
  93. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js +22 -5
  94. package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js.map +1 -1
  95. package/dist/server/modules/workbench/workbench-controller.d.ts +5 -0
  96. package/dist/server/modules/workbench/workbench-controller.js +20 -0
  97. package/dist/server/modules/workbench/workbench-controller.js.map +1 -1
  98. package/dist/server/modules/workbench/workbench-service.d.ts +6 -6
  99. package/dist/server/modules/workbench/workbench-service.js +33 -36
  100. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  101. package/dist/server/modules/workspace/affairs-library-controller.d.ts +8 -0
  102. package/dist/server/modules/workspace/affairs-library-controller.js +11 -0
  103. package/dist/server/modules/workspace/affairs-library-controller.js.map +1 -1
  104. package/dist/server/modules/workspace/affairs-library-preview-link-service.d.ts +6 -0
  105. package/dist/server/modules/workspace/affairs-library-preview-link-service.js +12 -2
  106. package/dist/server/modules/workspace/affairs-library-preview-link-service.js.map +1 -1
  107. package/dist/server/modules/workspace/affairs-library-service.d.ts +9 -0
  108. package/dist/server/modules/workspace/affairs-library-service.js +182 -42
  109. package/dist/server/modules/workspace/affairs-library-service.js.map +1 -1
  110. package/dist/server/modules/workspace/affairs-lightweight-session-controller.d.ts +8 -0
  111. package/dist/server/modules/workspace/affairs-lightweight-session-controller.js +55 -8
  112. package/dist/server/modules/workspace/affairs-lightweight-session-controller.js.map +1 -1
  113. package/dist/server/modules/workspace/affairs-lightweight-session-service.d.ts +13 -0
  114. package/dist/server/modules/workspace/affairs-lightweight-session-service.js +167 -21
  115. package/dist/server/modules/workspace/affairs-lightweight-session-service.js.map +1 -1
  116. package/dist/server/modules/workspace/affairs-tag-controller.d.ts +3 -0
  117. package/dist/server/modules/workspace/affairs-tag-controller.js +5 -0
  118. package/dist/server/modules/workspace/affairs-tag-controller.js.map +1 -1
  119. package/dist/server/modules/workspace/affairs-tag-service.d.ts +22 -1
  120. package/dist/server/modules/workspace/affairs-tag-service.js +41 -2
  121. package/dist/server/modules/workspace/affairs-tag-service.js.map +1 -1
  122. package/dist/server/modules/workspace/teable-api-client.d.ts +118 -0
  123. package/dist/server/modules/workspace/teable-api-client.js +142 -0
  124. package/dist/server/modules/workspace/teable-api-client.js.map +1 -0
  125. package/dist/server/modules/workspace/teable-catalog-controller.d.ts +18 -0
  126. package/dist/server/modules/workspace/teable-catalog-controller.js +17 -0
  127. package/dist/server/modules/workspace/teable-catalog-controller.js.map +1 -0
  128. package/dist/server/modules/workspace/teable-catalog-service.d.ts +36 -0
  129. package/dist/server/modules/workspace/teable-catalog-service.js +124 -0
  130. package/dist/server/modules/workspace/teable-catalog-service.js.map +1 -0
  131. package/dist/server/modules/workspace/teable-credential-service.d.ts +8 -0
  132. package/dist/server/modules/workspace/teable-credential-service.js +37 -0
  133. package/dist/server/modules/workspace/teable-credential-service.js.map +1 -0
  134. package/dist/server/modules/workspace/teable-field-mapping-controller.d.ts +25 -0
  135. package/dist/server/modules/workspace/teable-field-mapping-controller.js +31 -0
  136. package/dist/server/modules/workspace/teable-field-mapping-controller.js.map +1 -0
  137. package/dist/server/modules/workspace/teable-field-mapping-service.d.ts +38 -0
  138. package/dist/server/modules/workspace/teable-field-mapping-service.js +215 -0
  139. package/dist/server/modules/workspace/teable-field-mapping-service.js.map +1 -0
  140. package/dist/server/modules/workspace/teable-global-binding-controller.d.ts +22 -0
  141. package/dist/server/modules/workspace/teable-global-binding-controller.js +25 -0
  142. package/dist/server/modules/workspace/teable-global-binding-controller.js.map +1 -0
  143. package/dist/server/modules/workspace/teable-global-binding-service.d.ts +35 -0
  144. package/dist/server/modules/workspace/teable-global-binding-service.js +151 -0
  145. package/dist/server/modules/workspace/teable-global-binding-service.js.map +1 -0
  146. package/dist/server/modules/workspace/teable-mirror-sync-controller.d.ts +29 -0
  147. package/dist/server/modules/workspace/teable-mirror-sync-controller.js +50 -0
  148. package/dist/server/modules/workspace/teable-mirror-sync-controller.js.map +1 -0
  149. package/dist/server/modules/workspace/teable-mirror-sync-service.d.ts +157 -0
  150. package/dist/server/modules/workspace/teable-mirror-sync-service.js +917 -0
  151. package/dist/server/modules/workspace/teable-mirror-sync-service.js.map +1 -0
  152. package/dist/server/modules/workspace/teable-runtime-controller.d.ts +58 -0
  153. package/dist/server/modules/workspace/teable-runtime-controller.js +60 -0
  154. package/dist/server/modules/workspace/teable-runtime-controller.js.map +1 -0
  155. package/dist/server/modules/workspace/teable-runtime-service.d.ts +96 -0
  156. package/dist/server/modules/workspace/teable-runtime-service.js +362 -0
  157. package/dist/server/modules/workspace/teable-runtime-service.js.map +1 -0
  158. package/dist/server/modules/workspace/teable-workbench-sync-config-controller.d.ts +22 -0
  159. package/dist/server/modules/workspace/teable-workbench-sync-config-controller.js +20 -0
  160. package/dist/server/modules/workspace/teable-workbench-sync-config-controller.js.map +1 -0
  161. package/dist/server/modules/workspace/teable-workbench-sync-config-service.d.ts +22 -0
  162. package/dist/server/modules/workspace/teable-workbench-sync-config-service.js +159 -0
  163. package/dist/server/modules/workspace/teable-workbench-sync-config-service.js.map +1 -0
  164. package/dist/server/routes/affairs.d.ts +9 -1
  165. package/dist/server/routes/affairs.js +120 -1
  166. package/dist/server/routes/affairs.js.map +1 -1
  167. package/dist/server/routes/workbench.js +15 -0
  168. package/dist/server/routes/workbench.js.map +1 -1
  169. package/dist/server/routes/workspaces.js +51 -41
  170. package/dist/server/routes/workspaces.js.map +1 -1
  171. package/dist/server/server/create-server.d.ts +14 -0
  172. package/dist/server/server/create-server.js +73 -7
  173. package/dist/server/server/create-server.js.map +1 -1
  174. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +18 -0
  175. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +191 -0
  176. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -0
  177. package/dist/server/storage/repositories/user-affairs-library-setting-repository.js +8 -5
  178. package/dist/server/storage/repositories/user-affairs-library-setting-repository.js.map +1 -1
  179. package/dist/server/storage/repositories/user-teable-credential-repository.d.ts +9 -0
  180. package/dist/server/storage/repositories/user-teable-credential-repository.js +45 -0
  181. package/dist/server/storage/repositories/user-teable-credential-repository.js.map +1 -0
  182. package/dist/server/storage/repositories/user-teable-field-mapping-repository.d.ts +10 -0
  183. package/dist/server/storage/repositories/user-teable-field-mapping-repository.js +69 -0
  184. package/dist/server/storage/repositories/user-teable-field-mapping-repository.js.map +1 -0
  185. package/dist/server/storage/repositories/user-teable-global-setting-repository.d.ts +8 -0
  186. package/dist/server/storage/repositories/user-teable-global-setting-repository.js +52 -0
  187. package/dist/server/storage/repositories/user-teable-global-setting-repository.js.map +1 -0
  188. package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.d.ts +9 -0
  189. package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.js +66 -0
  190. package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.js.map +1 -0
  191. package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.d.ts +9 -0
  192. package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.js +67 -0
  193. package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.js.map +1 -0
  194. package/dist/server/storage/repositories/user-teable-sync-log-repository.d.ts +14 -0
  195. package/dist/server/storage/repositories/user-teable-sync-log-repository.js +97 -0
  196. package/dist/server/storage/repositories/user-teable-sync-log-repository.js.map +1 -0
  197. package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.d.ts +8 -0
  198. package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.js +55 -0
  199. package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.js.map +1 -0
  200. package/dist/server/storage/sqlite/client.js +404 -1
  201. package/dist/server/storage/sqlite/client.js.map +1 -1
  202. package/dist/server/storage/sqlite/schema.sql +167 -1
  203. package/dist/server/types/domain.d.ts +106 -0
  204. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +22 -3
  205. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +29 -2
  206. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +1 -1
  207. package/node_modules/@codingns/session-sync-core/package.json +3 -1
  208. package/package.json +1 -1
  209. package/dist/public/assets/DesktopWindowPage-D0blSuKd.js +0 -2
  210. package/dist/public/assets/FileContextPanel-BrKO8Xt6.js +0 -1
  211. package/dist/public/assets/GitSidebar-BdwiDtOr.js +0 -6
  212. package/dist/public/assets/MobileCreateSessionSheet-Cx_dBiBb.js +0 -1
  213. package/dist/public/assets/SettingsPage-BlAZCHsy.js +0 -2
  214. package/dist/public/assets/TerminalManagerPanel-CjzbiWjl.js +0 -1
  215. package/dist/public/assets/WorkbenchLayout-CikJBS62.js +0 -1019
  216. package/dist/public/assets/WorkbenchShellRoute-BbbSOiZw.js +0 -1
  217. package/dist/public/assets/WorkbenchShellRoute-DT3VMjWD.css +0 -1
  218. package/dist/public/assets/WorkspaceDebugDetailPage-CVivdPx5.js +0 -1
  219. package/dist/public/assets/WorkspaceDetailPage-DgOSjscR.js +0 -1
  220. package/dist/public/assets/WorkspaceHomePage-HPa7M_Vh.js +0 -1
  221. package/dist/public/assets/index-BxJPQpFM.css +0 -1
  222. package/dist/public/assets/index-CeXGOT_T.js +0 -50
  223. package/dist/public/assets/useRegisteredDebugTemplates-Bol3NVfN.js +0 -1
  224. package/dist/public/assets/workbench-navigation-B7IjRQd8.js +0 -1
@@ -0,0 +1,97 @@
1
+ export class UserTeableSyncLogRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ listByUserId(userId, input = {}) {
7
+ const where = ["user_id = ?"];
8
+ const values = [userId];
9
+ if (input.triggerType) {
10
+ where.push("trigger_type = ?");
11
+ values.push(input.triggerType);
12
+ }
13
+ if (input.state) {
14
+ where.push("state = ?");
15
+ values.push(input.state);
16
+ }
17
+ const limit = Math.min(Math.max(input.limit ?? 50, 1), 200);
18
+ values.push(limit);
19
+ return this.db
20
+ .prepare(`SELECT log_id, user_id, trigger_type, source_types_json, task_id, state, summary, counts_json,
21
+ error_detail, reason, started_at, finished_at, created_at, updated_at
22
+ FROM user_teable_sync_logs
23
+ WHERE ${where.join(" AND ")}
24
+ ORDER BY datetime(created_at) DESC, log_id DESC
25
+ LIMIT ?`)
26
+ .all(...values)
27
+ .map((row) => mapRow(row));
28
+ }
29
+ create(record) {
30
+ this.db
31
+ .prepare(`INSERT INTO user_teable_sync_logs (
32
+ log_id,
33
+ user_id,
34
+ trigger_type,
35
+ source_types_json,
36
+ task_id,
37
+ state,
38
+ summary,
39
+ counts_json,
40
+ error_detail,
41
+ reason,
42
+ started_at,
43
+ finished_at,
44
+ created_at,
45
+ updated_at
46
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
47
+ .run(record.logId, record.userId, record.triggerType, record.sourceTypesJson, record.taskId, record.state, record.summary, record.countsJson, record.errorDetail, record.reason, record.startedAt, record.finishedAt, record.createdAt, record.updatedAt);
48
+ return record;
49
+ }
50
+ update(record) {
51
+ this.db
52
+ .prepare(`UPDATE user_teable_sync_logs
53
+ SET task_id = ?,
54
+ state = ?,
55
+ summary = ?,
56
+ counts_json = ?,
57
+ error_detail = ?,
58
+ reason = ?,
59
+ started_at = ?,
60
+ finished_at = ?,
61
+ updated_at = ?
62
+ WHERE log_id = ?
63
+ AND user_id = ?`)
64
+ .run(record.taskId, record.state, record.summary, record.countsJson, record.errorDetail, record.reason, record.startedAt, record.finishedAt, record.updatedAt, record.logId, record.userId);
65
+ return record;
66
+ }
67
+ findById(userId, logId) {
68
+ const row = this.db
69
+ .prepare(`SELECT log_id, user_id, trigger_type, source_types_json, task_id, state, summary, counts_json,
70
+ error_detail, reason, started_at, finished_at, created_at, updated_at
71
+ FROM user_teable_sync_logs
72
+ WHERE user_id = ?
73
+ AND log_id = ?
74
+ LIMIT 1`)
75
+ .get(userId, logId);
76
+ return row ? mapRow(row) : null;
77
+ }
78
+ }
79
+ function mapRow(row) {
80
+ return {
81
+ logId: row.log_id,
82
+ userId: row.user_id,
83
+ triggerType: row.trigger_type,
84
+ sourceTypesJson: row.source_types_json,
85
+ taskId: row.task_id,
86
+ state: row.state,
87
+ summary: row.summary,
88
+ countsJson: row.counts_json,
89
+ errorDetail: row.error_detail,
90
+ reason: row.reason,
91
+ startedAt: row.started_at,
92
+ finishedAt: row.finished_at,
93
+ createdAt: row.created_at,
94
+ updatedAt: row.updated_at
95
+ };
96
+ }
97
+ //# sourceMappingURL=user-teable-sync-log-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-teable-sync-log-repository.js","sourceRoot":"","sources":["../../../../src/storage/repositories/user-teable-sync-log-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { UserTeableWorkbenchSyncConfigRecord } from "../../types/domain.js";
3
+ export declare class UserTeableWorkbenchSyncConfigRepository {
4
+ private readonly db;
5
+ constructor(db: Database.Database);
6
+ listByUserId(userId: string): UserTeableWorkbenchSyncConfigRecord[];
7
+ replaceAllForUser(userId: string, records: UserTeableWorkbenchSyncConfigRecord[]): UserTeableWorkbenchSyncConfigRecord[];
8
+ }
@@ -0,0 +1,55 @@
1
+ export class UserTeableWorkbenchSyncConfigRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ listByUserId(userId) {
7
+ return this.db
8
+ .prepare(`SELECT config_id, user_id, source_type, enabled, scope_json, target_table_id, created_at, updated_at
9
+ FROM user_teable_workbench_sync_configs
10
+ WHERE user_id = ?
11
+ ORDER BY CASE source_type
12
+ WHEN 'tags' THEN 1
13
+ WHEN 'sessions' THEN 2
14
+ WHEN 'todos' THEN 3
15
+ ELSE 99
16
+ END ASC`)
17
+ .all(userId)
18
+ .map((row) => mapRow(row));
19
+ }
20
+ replaceAllForUser(userId, records) {
21
+ const deleteStatement = this.db.prepare(`DELETE FROM user_teable_workbench_sync_configs
22
+ WHERE user_id = ?`);
23
+ const insertStatement = this.db.prepare(`INSERT INTO user_teable_workbench_sync_configs (
24
+ config_id,
25
+ user_id,
26
+ source_type,
27
+ enabled,
28
+ scope_json,
29
+ target_table_id,
30
+ created_at,
31
+ updated_at
32
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
33
+ const transaction = this.db.transaction((nextUserId, nextRecords) => {
34
+ deleteStatement.run(nextUserId);
35
+ for (const record of nextRecords) {
36
+ insertStatement.run(record.configId, record.userId, record.sourceType, record.enabled ? 1 : 0, record.scopeJson, record.targetTableId, record.createdAt, record.updatedAt);
37
+ }
38
+ });
39
+ transaction(userId, records);
40
+ return records;
41
+ }
42
+ }
43
+ function mapRow(row) {
44
+ return {
45
+ configId: row.config_id,
46
+ userId: row.user_id,
47
+ sourceType: row.source_type,
48
+ enabled: row.enabled === 1,
49
+ scopeJson: row.scope_json,
50
+ targetTableId: row.target_table_id,
51
+ createdAt: row.created_at,
52
+ updatedAt: row.updated_at
53
+ };
54
+ }
55
+ //# sourceMappingURL=user-teable-workbench-sync-config-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-teable-workbench-sync-config-repository.js","sourceRoot":"","sources":["../../../../src/storage/repositories/user-teable-workbench-sync-config-repository.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,uCAAuC;IACrB;IAA7B,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN;;;;;;;;iBAQS,CACV;aACA,GAAG,CAAC,MAAM,CAAC;aACX,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAuC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,iBAAiB,CAAC,MAAc,EAAE,OAA8C;QAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACrC;yBACmB,CACpB,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACrC;;;;;;;;;wCASkC,CACnC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,UAAkB,EAAE,WAAkD,EAAE,EAAE;YACjH,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,eAAe,CAAC,GAAG,CACjB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,CACjB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAaD,SAAS,MAAM,CAAC,GAAqC;IACnD,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC;QAC1B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,aAAa,EAAE,GAAG,CAAC,eAAe;QAClC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC"}
@@ -28,6 +28,7 @@ export function createDatabaseClient(databasePath) {
28
28
  ensureSessionRelationColumns(db);
29
29
  ensureSessionForkSchema(db);
30
30
  ensureSessionChangedFileTables(db);
31
+ ensureAffairsAssistantSessionSnapshotSchema(db);
31
32
  ensureTerminalInstanceProcessIdColumn(db);
32
33
  ensureTerminalRuntimeSchema(db);
33
34
  ensureTerminalLogSchema(db);
@@ -47,6 +48,14 @@ export function createDatabaseClient(databasePath) {
47
48
  ensureTerminalInstanceDebugSchema(db);
48
49
  ensureUserPreferenceProfileSchema(db);
49
50
  ensureUserAffairsLibrarySettingsSchema(db);
51
+ ensureUserTeableGlobalSettingsSchema(db);
52
+ ensureUserTeableCredentialsSchema(db);
53
+ ensureUserTeableWorkbenchSyncConfigsSchema(db);
54
+ ensureUserTeableMirrorTableBindingsSchema(db);
55
+ ensureUserTeableMirrorRecordMappingsSchema(db);
56
+ ensureUserTeableFormBindingsSchema(db);
57
+ ensureUserTeableFieldMappingsSchema(db);
58
+ ensureUserTeableInboundRecordMappingsSchema(db);
50
59
  ensureButlerProfileSchema(db);
51
60
  ensureButlerControlSessionSchema(db);
52
61
  ensureButlerControlTimerSchema(db);
@@ -70,6 +79,7 @@ export function createDatabaseClient(databasePath) {
70
79
  function ensurePreSchemaCompatibility(db) {
71
80
  // 旧库还没有这些列时,schema.sql 里的索引会先炸掉,所以必须先补齐。
72
81
  ensureAuthTokenDeviceColumns(db);
82
+ ensureUserTeableFormBindingsPreSchemaCompatibility(db);
73
83
  ensureOpsTargetWorkspaceSchema(db);
74
84
  ensureManagedSkillScopeSchema(db);
75
85
  ensureAuthTokenCallerKindSchema(db);
@@ -104,6 +114,18 @@ function ensureAuthTokenDeviceColumns(db) {
104
114
  db.exec("CREATE INDEX IF NOT EXISTS idx_auth_tokens_workspace_id ON auth_tokens(workspace_id)");
105
115
  db.exec("CREATE INDEX IF NOT EXISTS idx_auth_tokens_session_id ON auth_tokens(session_id)");
106
116
  }
117
+ function ensureUserTeableFormBindingsPreSchemaCompatibility(db) {
118
+ if (!tableExists(db, "user_teable_form_bindings")) {
119
+ return;
120
+ }
121
+ const columns = db
122
+ .prepare("PRAGMA table_info(user_teable_form_bindings)")
123
+ .all();
124
+ const columnNames = new Set(columns.map((column) => column.name ?? ""));
125
+ if (!columnNames.has("enabled")) {
126
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1");
127
+ }
128
+ }
107
129
  function ensureAuthTokenCallerKindSchema(db) {
108
130
  if (!tableExists(db, "auth_tokens")) {
109
131
  return;
@@ -799,12 +821,12 @@ function ensureUserAffairsLibrarySettingsSchema(db) {
799
821
  enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
800
822
  favorites_json TEXT,
801
823
  last_workspace_id TEXT,
824
+ dashboard_state_json TEXT NOT NULL DEFAULT '{}',
802
825
  created_at TEXT NOT NULL,
803
826
  updated_at TEXT NOT NULL,
804
827
  FOREIGN KEY (user_id) REFERENCES auth_users(id)
805
828
  )
806
829
  `);
807
- return;
808
830
  }
809
831
  const columns = db
810
832
  .prepare("PRAGMA table_info(user_affairs_library_settings)")
@@ -816,7 +838,313 @@ function ensureUserAffairsLibrarySettingsSchema(db) {
816
838
  if (!columnNames.has("last_workspace_id")) {
817
839
  db.exec("ALTER TABLE user_affairs_library_settings ADD COLUMN last_workspace_id TEXT");
818
840
  }
841
+ if (!columnNames.has("dashboard_state_json")) {
842
+ db.exec("ALTER TABLE user_affairs_library_settings ADD COLUMN dashboard_state_json TEXT NOT NULL DEFAULT '{}'");
843
+ }
819
844
  migrateLegacyAffairsLibrarySettings(db);
845
+ migrateLegacyDashboardStatesIntoGlobalAffairsSettings(db);
846
+ }
847
+ function migrateLegacyDashboardStatesIntoGlobalAffairsSettings(db) {
848
+ if (!tableExists(db, "user_preference_profiles") || !tableExists(db, "user_affairs_library_settings")) {
849
+ return;
850
+ }
851
+ const rows = db
852
+ .prepare("SELECT user_id, affairs_dashboard_states_json FROM user_preference_profiles")
853
+ .all();
854
+ const updateStatement = db.prepare(`
855
+ UPDATE user_affairs_library_settings
856
+ SET dashboard_state_json = ?
857
+ WHERE user_id = ?
858
+ AND (dashboard_state_json IS NULL OR TRIM(dashboard_state_json) = '' OR dashboard_state_json = '{}')
859
+ `);
860
+ for (const row of rows) {
861
+ const dashboardState = pickLatestLegacyDashboardState(parseJsonObjectRecord(row.affairs_dashboard_states_json));
862
+ if (!dashboardState) {
863
+ continue;
864
+ }
865
+ updateStatement.run(JSON.stringify(dashboardState), row.user_id);
866
+ }
867
+ }
868
+ function pickLatestLegacyDashboardState(dashboardStatesByWorkspace) {
869
+ const candidates = Object.entries(dashboardStatesByWorkspace)
870
+ .map(([workspaceId, rawState]) => normalizeLegacyDashboardStateCandidate(workspaceId, rawState))
871
+ .filter((item) => item !== null)
872
+ .sort((left, right) => {
873
+ if (right.score !== left.score) {
874
+ return right.score - left.score;
875
+ }
876
+ return right.updatedAt.localeCompare(left.updatedAt);
877
+ });
878
+ return candidates[0]?.state ?? null;
879
+ }
880
+ function normalizeLegacyDashboardStateCandidate(workspaceId, rawState) {
881
+ if (typeof rawState !== "object" || rawState === null || Array.isArray(rawState)) {
882
+ return null;
883
+ }
884
+ const state = {
885
+ ...rawState,
886
+ workspaceId: "affairs-global"
887
+ };
888
+ const shortcutApps = Array.isArray(state.shortcutApps) ? state.shortcutApps : [];
889
+ const tabs = Array.isArray(state.tabs) ? state.tabs : [];
890
+ const widgetCount = tabs.reduce((total, tab) => {
891
+ if (typeof tab !== "object" || tab === null || Array.isArray(tab)) {
892
+ return total;
893
+ }
894
+ return total + (Array.isArray(tab.widgets) ? tab.widgets.length : 0);
895
+ }, 0);
896
+ const updatedAt = typeof state.updatedAt === "string" && state.updatedAt.trim()
897
+ ? state.updatedAt.trim()
898
+ : "";
899
+ return {
900
+ state,
901
+ score: shortcutApps.length * 100 + widgetCount,
902
+ updatedAt: updatedAt || workspaceId
903
+ };
904
+ }
905
+ function ensureUserTeableGlobalSettingsSchema(db) {
906
+ if (!tableExists(db, "user_teable_global_settings")) {
907
+ db.exec(`
908
+ CREATE TABLE user_teable_global_settings (
909
+ user_id TEXT PRIMARY KEY,
910
+ base_url TEXT,
911
+ space_id TEXT,
912
+ base_id TEXT,
913
+ auth_ref TEXT,
914
+ enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
915
+ mirror_mode TEXT NOT NULL DEFAULT 'manual' CHECK (mirror_mode IN ('manual', 'scheduled', 'event_driven')),
916
+ created_at TEXT NOT NULL,
917
+ updated_at TEXT NOT NULL,
918
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
919
+ )
920
+ `);
921
+ return;
922
+ }
923
+ const columns = db
924
+ .prepare("PRAGMA table_info(user_teable_global_settings)")
925
+ .all();
926
+ const columnNames = new Set(columns.map((column) => column.name));
927
+ if (!columnNames.has("base_id")) {
928
+ db.exec("ALTER TABLE user_teable_global_settings ADD COLUMN base_id TEXT");
929
+ }
930
+ if (!columnNames.has("mirror_mode")) {
931
+ db.exec("ALTER TABLE user_teable_global_settings ADD COLUMN mirror_mode TEXT NOT NULL DEFAULT 'manual'");
932
+ }
933
+ }
934
+ function ensureUserTeableCredentialsSchema(db) {
935
+ if (!tableExists(db, "user_teable_credentials")) {
936
+ db.exec(`
937
+ CREATE TABLE user_teable_credentials (
938
+ user_id TEXT NOT NULL,
939
+ auth_ref TEXT NOT NULL,
940
+ token_ciphertext TEXT NOT NULL,
941
+ created_at TEXT NOT NULL,
942
+ updated_at TEXT NOT NULL,
943
+ PRIMARY KEY (user_id, auth_ref),
944
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
945
+ )
946
+ `);
947
+ }
948
+ db.exec(`
949
+ CREATE INDEX IF NOT EXISTS idx_user_teable_credentials_user_updated_at
950
+ ON user_teable_credentials(user_id, updated_at DESC)
951
+ `);
952
+ }
953
+ function ensureUserTeableWorkbenchSyncConfigsSchema(db) {
954
+ if (!tableExists(db, "user_teable_workbench_sync_configs")) {
955
+ db.exec(`
956
+ CREATE TABLE user_teable_workbench_sync_configs (
957
+ config_id TEXT PRIMARY KEY,
958
+ user_id TEXT NOT NULL,
959
+ source_type TEXT NOT NULL CHECK (source_type IN ('tags', 'sessions', 'todos')),
960
+ enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
961
+ scope_json TEXT NOT NULL,
962
+ target_table_id TEXT,
963
+ created_at TEXT NOT NULL,
964
+ updated_at TEXT NOT NULL,
965
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
966
+ UNIQUE (user_id, source_type)
967
+ )
968
+ `);
969
+ db.exec(`
970
+ CREATE INDEX IF NOT EXISTS idx_user_teable_workbench_sync_configs_user
971
+ ON user_teable_workbench_sync_configs(user_id, source_type)
972
+ `);
973
+ return;
974
+ }
975
+ db.exec(`
976
+ CREATE INDEX IF NOT EXISTS idx_user_teable_workbench_sync_configs_user
977
+ ON user_teable_workbench_sync_configs(user_id, source_type)
978
+ `);
979
+ }
980
+ function ensureUserTeableMirrorTableBindingsSchema(db) {
981
+ if (!tableExists(db, "user_teable_mirror_table_bindings")) {
982
+ db.exec(`
983
+ CREATE TABLE user_teable_mirror_table_bindings (
984
+ binding_id TEXT PRIMARY KEY,
985
+ user_id TEXT NOT NULL,
986
+ mirror_type TEXT NOT NULL CHECK (mirror_type IN ('tags', 'sessions', 'todos')),
987
+ table_id TEXT NOT NULL,
988
+ table_name TEXT NOT NULL,
989
+ read_only_mode TEXT NOT NULL CHECK (read_only_mode IN ('role_based', 'matrix_based', 'unknown')),
990
+ last_synced_at TEXT,
991
+ created_at TEXT NOT NULL,
992
+ updated_at TEXT NOT NULL,
993
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
994
+ UNIQUE (user_id, mirror_type)
995
+ )
996
+ `);
997
+ }
998
+ db.exec(`
999
+ CREATE INDEX IF NOT EXISTS idx_user_teable_mirror_table_bindings_user
1000
+ ON user_teable_mirror_table_bindings(user_id, mirror_type)
1001
+ `);
1002
+ }
1003
+ function ensureUserTeableMirrorRecordMappingsSchema(db) {
1004
+ if (!tableExists(db, "user_teable_mirror_record_mappings")) {
1005
+ db.exec(`
1006
+ CREATE TABLE user_teable_mirror_record_mappings (
1007
+ mapping_id TEXT PRIMARY KEY,
1008
+ user_id TEXT NOT NULL,
1009
+ mirror_type TEXT NOT NULL CHECK (mirror_type IN ('tags', 'sessions', 'todos')),
1010
+ local_id TEXT NOT NULL,
1011
+ teable_record_id TEXT NOT NULL,
1012
+ fingerprint TEXT NOT NULL,
1013
+ last_synced_at TEXT NOT NULL,
1014
+ deleted_at TEXT,
1015
+ created_at TEXT NOT NULL,
1016
+ updated_at TEXT NOT NULL,
1017
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1018
+ UNIQUE (user_id, mirror_type, local_id)
1019
+ )
1020
+ `);
1021
+ }
1022
+ db.exec(`
1023
+ CREATE INDEX IF NOT EXISTS idx_user_teable_mirror_record_mappings_user
1024
+ ON user_teable_mirror_record_mappings(user_id, mirror_type, updated_at DESC)
1025
+ `);
1026
+ }
1027
+ function ensureUserTeableFormBindingsSchema(db) {
1028
+ if (!tableExists(db, "user_teable_form_bindings")) {
1029
+ db.exec(`
1030
+ CREATE TABLE user_teable_form_bindings (
1031
+ form_binding_id TEXT PRIMARY KEY,
1032
+ user_id TEXT NOT NULL,
1033
+ workspace_id TEXT NOT NULL,
1034
+ source_workspace_ids_json TEXT NOT NULL DEFAULT '[]',
1035
+ table_id TEXT NOT NULL,
1036
+ view_id TEXT NOT NULL,
1037
+ name TEXT NOT NULL,
1038
+ linked_mirror_types_json TEXT NOT NULL,
1039
+ teable_table_id TEXT NOT NULL DEFAULT '',
1040
+ teable_view_id TEXT NOT NULL DEFAULT '',
1041
+ teable_share_id TEXT,
1042
+ teable_form_name TEXT NOT NULL DEFAULT '',
1043
+ display_name TEXT NOT NULL DEFAULT '',
1044
+ open_mode TEXT NOT NULL DEFAULT 'embed' CHECK (open_mode IN ('embed', 'external')),
1045
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
1046
+ inbound_action TEXT NOT NULL CHECK (inbound_action IN ('create_todo', 'append_session_context', 'request_tag_assignment', 'none')),
1047
+ open_url TEXT NOT NULL,
1048
+ created_at TEXT NOT NULL,
1049
+ updated_at TEXT NOT NULL,
1050
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
1051
+ )
1052
+ `);
1053
+ }
1054
+ const columns = db
1055
+ .prepare("PRAGMA table_info(user_teable_form_bindings)")
1056
+ .all();
1057
+ const columnNames = new Set(columns.map((item) => item.name ?? ""));
1058
+ if (!columnNames.has("source_workspace_ids_json")) {
1059
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN source_workspace_ids_json TEXT NOT NULL DEFAULT '[]'");
1060
+ db.exec(`
1061
+ UPDATE user_teable_form_bindings
1062
+ SET source_workspace_ids_json = json_array(workspace_id)
1063
+ WHERE COALESCE(TRIM(source_workspace_ids_json), '') = ''
1064
+ OR source_workspace_ids_json = '[]'
1065
+ `);
1066
+ }
1067
+ if (!columnNames.has("teable_table_id")) {
1068
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_table_id TEXT NOT NULL DEFAULT ''");
1069
+ db.exec("UPDATE user_teable_form_bindings SET teable_table_id = table_id WHERE COALESCE(TRIM(teable_table_id), '') = ''");
1070
+ }
1071
+ if (!columnNames.has("teable_view_id")) {
1072
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_view_id TEXT NOT NULL DEFAULT ''");
1073
+ db.exec("UPDATE user_teable_form_bindings SET teable_view_id = view_id WHERE COALESCE(TRIM(teable_view_id), '') = ''");
1074
+ }
1075
+ if (!columnNames.has("teable_share_id")) {
1076
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_share_id TEXT");
1077
+ }
1078
+ if (!columnNames.has("teable_form_name")) {
1079
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN teable_form_name TEXT NOT NULL DEFAULT ''");
1080
+ db.exec("UPDATE user_teable_form_bindings SET teable_form_name = name WHERE COALESCE(TRIM(teable_form_name), '') = ''");
1081
+ }
1082
+ if (!columnNames.has("display_name")) {
1083
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN display_name TEXT NOT NULL DEFAULT ''");
1084
+ db.exec("UPDATE user_teable_form_bindings SET display_name = name WHERE COALESCE(TRIM(display_name), '') = ''");
1085
+ }
1086
+ if (!columnNames.has("open_mode")) {
1087
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN open_mode TEXT NOT NULL DEFAULT 'embed'");
1088
+ }
1089
+ if (!columnNames.has("enabled")) {
1090
+ db.exec("ALTER TABLE user_teable_form_bindings ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1");
1091
+ }
1092
+ db.exec(`
1093
+ CREATE INDEX IF NOT EXISTS idx_user_teable_form_bindings_user_workspace
1094
+ ON user_teable_form_bindings(user_id, workspace_id, updated_at DESC)
1095
+ `);
1096
+ db.exec(`
1097
+ CREATE INDEX IF NOT EXISTS idx_user_teable_form_bindings_user_enabled
1098
+ ON user_teable_form_bindings(user_id, enabled, updated_at DESC)
1099
+ `);
1100
+ }
1101
+ function ensureUserTeableFieldMappingsSchema(db) {
1102
+ if (!tableExists(db, "user_teable_field_mappings")) {
1103
+ db.exec(`
1104
+ CREATE TABLE user_teable_field_mappings (
1105
+ mapping_id TEXT PRIMARY KEY,
1106
+ user_id TEXT NOT NULL,
1107
+ config_id TEXT NOT NULL,
1108
+ source_type TEXT NOT NULL CHECK (source_type IN ('tags', 'sessions', 'todos')),
1109
+ target_table_id TEXT NOT NULL,
1110
+ items_json TEXT NOT NULL,
1111
+ created_at TEXT NOT NULL,
1112
+ updated_at TEXT NOT NULL,
1113
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1114
+ UNIQUE (user_id, config_id)
1115
+ )
1116
+ `);
1117
+ }
1118
+ db.exec(`
1119
+ CREATE INDEX IF NOT EXISTS idx_user_teable_field_mappings_user
1120
+ ON user_teable_field_mappings(user_id, source_type, updated_at DESC)
1121
+ `);
1122
+ }
1123
+ function ensureUserTeableInboundRecordMappingsSchema(db) {
1124
+ if (!tableExists(db, "user_teable_inbound_record_mappings")) {
1125
+ db.exec(`
1126
+ CREATE TABLE user_teable_inbound_record_mappings (
1127
+ mapping_id TEXT PRIMARY KEY,
1128
+ user_id TEXT NOT NULL,
1129
+ form_binding_id TEXT NOT NULL,
1130
+ teable_record_id TEXT NOT NULL,
1131
+ teable_record_fingerprint TEXT NOT NULL,
1132
+ inbound_action TEXT NOT NULL CHECK (inbound_action IN ('create_todo', 'append_session_context', 'request_tag_assignment', 'none')),
1133
+ target_local_id TEXT,
1134
+ status TEXT NOT NULL CHECK (status IN ('applied', 'skipped', 'failed')),
1135
+ error_detail TEXT,
1136
+ last_synced_at TEXT NOT NULL,
1137
+ created_at TEXT NOT NULL,
1138
+ updated_at TEXT NOT NULL,
1139
+ FOREIGN KEY (user_id) REFERENCES auth_users(id),
1140
+ UNIQUE (user_id, form_binding_id, teable_record_id)
1141
+ )
1142
+ `);
1143
+ }
1144
+ db.exec(`
1145
+ CREATE INDEX IF NOT EXISTS idx_user_teable_inbound_record_mappings_user_form
1146
+ ON user_teable_inbound_record_mappings(user_id, form_binding_id, updated_at DESC)
1147
+ `);
820
1148
  }
821
1149
  function migrateLegacyAffairsLibrarySettings(db) {
822
1150
  if (!tableExists(db, "workspace_navigation_states") || !tableExists(db, "user_affairs_library_settings")) {
@@ -1677,6 +2005,81 @@ function ensureSessionChangedFileTables(db) {
1677
2005
  );
1678
2006
  `);
1679
2007
  }
2008
+ function ensureAffairsAssistantSessionSnapshotSchema(db) {
2009
+ const currentSql = readTableSql(db, "affairs_assistant_session_snapshots");
2010
+ if (!currentSql) {
2011
+ db.exec(`
2012
+ CREATE TABLE affairs_assistant_session_snapshots (
2013
+ workspace_id TEXT NOT NULL,
2014
+ user_id TEXT NOT NULL,
2015
+ project_id TEXT,
2016
+ project_workspace_id TEXT,
2017
+ agent_workspace_path TEXT,
2018
+ sessions_json TEXT NOT NULL,
2019
+ updated_at TEXT NOT NULL,
2020
+ PRIMARY KEY (workspace_id, user_id),
2021
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
2022
+ );
2023
+
2024
+ CREATE INDEX IF NOT EXISTS idx_affairs_assistant_session_snapshots_user_id
2025
+ ON affairs_assistant_session_snapshots(user_id, updated_at DESC);
2026
+ `);
2027
+ return;
2028
+ }
2029
+ if (!currentSql.includes("FOREIGN KEY (workspace_id) REFERENCES workspaces(id)")) {
2030
+ db.exec(`
2031
+ CREATE INDEX IF NOT EXISTS idx_affairs_assistant_session_snapshots_user_id
2032
+ ON affairs_assistant_session_snapshots(user_id, updated_at DESC);
2033
+ `);
2034
+ return;
2035
+ }
2036
+ db.exec(`
2037
+ PRAGMA foreign_keys = OFF;
2038
+
2039
+ DROP TABLE IF EXISTS affairs_assistant_session_snapshots_next;
2040
+
2041
+ CREATE TABLE affairs_assistant_session_snapshots_next (
2042
+ workspace_id TEXT NOT NULL,
2043
+ user_id TEXT NOT NULL,
2044
+ project_id TEXT,
2045
+ project_workspace_id TEXT,
2046
+ agent_workspace_path TEXT,
2047
+ sessions_json TEXT NOT NULL,
2048
+ updated_at TEXT NOT NULL,
2049
+ PRIMARY KEY (workspace_id, user_id),
2050
+ FOREIGN KEY (user_id) REFERENCES auth_users(id)
2051
+ );
2052
+
2053
+ INSERT INTO affairs_assistant_session_snapshots_next (
2054
+ workspace_id,
2055
+ user_id,
2056
+ project_id,
2057
+ project_workspace_id,
2058
+ agent_workspace_path,
2059
+ sessions_json,
2060
+ updated_at
2061
+ )
2062
+ SELECT
2063
+ workspace_id,
2064
+ user_id,
2065
+ project_id,
2066
+ project_workspace_id,
2067
+ agent_workspace_path,
2068
+ sessions_json,
2069
+ updated_at
2070
+ FROM affairs_assistant_session_snapshots;
2071
+
2072
+ DROP TABLE affairs_assistant_session_snapshots;
2073
+
2074
+ ALTER TABLE affairs_assistant_session_snapshots_next
2075
+ RENAME TO affairs_assistant_session_snapshots;
2076
+
2077
+ PRAGMA foreign_keys = ON;
2078
+
2079
+ CREATE INDEX IF NOT EXISTS idx_affairs_assistant_session_snapshots_user_id
2080
+ ON affairs_assistant_session_snapshots(user_id, updated_at DESC);
2081
+ `);
2082
+ }
1680
2083
  function ensureTerminalCommandTemplatePortColumn(db) {
1681
2084
  const columns = db
1682
2085
  .prepare("PRAGMA table_info(terminal_command_templates)")