@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.
- package/bin/codingns.mjs +75 -0
- package/dist/public/assets/{AdaptiveButlerPage-B17QiMyT.js → AdaptiveButlerPage-khJQh6a_.js} +2 -2
- package/dist/public/assets/{App-CFBwDUNA.js → App-If9gThKM.js} +6 -6
- package/dist/public/assets/{BootstrapPage-W5wU3BPh.js → BootstrapPage-DcfYtoLC.js} +1 -1
- package/dist/public/assets/{ConversationPage-DQLX1bUh.js → ConversationPage-Bfb7GLTM.js} +1 -1
- package/dist/public/assets/{DesktopDetachPreviewPage-DTPeuAW-.js → DesktopDetachPreviewPage-CXUPMcBz.js} +1 -1
- package/dist/public/assets/{DesktopModal-6ii53_Y9.js → DesktopModal-bMdI1jEe.js} +1 -1
- package/dist/public/assets/DesktopWindowPage-D1xwgS-7.js +2 -0
- package/dist/public/assets/FileContextPanel-C4syif3B.js +1 -0
- package/dist/public/assets/GitSidebar-DduL9aTV.js +6 -0
- package/dist/public/assets/MobileCreateSessionSheet-DWPBsEx8.js +1 -0
- package/dist/public/assets/{MobileSheet-opTWyRe1.js → MobileSheet-BXvQPkxt.js} +1 -1
- package/dist/public/assets/{MobileTopHeaderFrame-BbNON3Y4.js → MobileTopHeaderFrame-vdYOyaaB.js} +1 -1
- package/dist/public/assets/{MobileWorkspaceSwitcherHeader-BZEzPeMj.js → MobileWorkspaceSwitcherHeader-DT330cAx.js} +1 -1
- package/dist/public/assets/{PluginAccessOverview-mQDmAljp.js → PluginAccessOverview-C77TeZTK.js} +1 -1
- package/dist/public/assets/{PluginContainerPage-CcxUJpM4.js → PluginContainerPage-DdSwOCw-.js} +1 -1
- package/dist/public/assets/{PluginDetailPage-D5--ACIt.js → PluginDetailPage-BK1yTzvO.js} +1 -1
- package/dist/public/assets/{PluginsListPage-D_oJxYXT.js → PluginsListPage-DAAwSc6W.js} +1 -1
- package/dist/public/assets/{RelayConnectEntryPage-DROxpnkv.js → RelayConnectEntryPage-4Yyo2p8b.js} +1 -1
- package/dist/public/assets/{ServerSettingsModal-CUUOPqSe.js → ServerSettingsModal-C_DEisHs.js} +1 -1
- package/dist/public/assets/{SessionIndexPage-C2Jxh6Gp.js → SessionIndexPage-DyMikN_x.js} +1 -1
- package/dist/public/assets/SettingsPage-CDAVsPr3.js +2 -0
- package/dist/public/assets/TerminalManagerPanel-4OR47vcf.js +1 -0
- package/dist/public/assets/{TerminalPage-CwWyFDj8.js → TerminalPage-Pvx396YX.js} +1 -1
- package/dist/public/assets/{TerminalRuntimeFallbackModal-CSVVbO8r.js → TerminalRuntimeFallbackModal-KvG6k4AQ.js} +1 -1
- package/dist/public/assets/{ToolFilesPage-QBEY8oCf.js → ToolFilesPage-DrYHk0N-.js} +1 -1
- package/dist/public/assets/{ToolGitPage-BKoZ2l9v.js → ToolGitPage-Dz1q-Ns_.js} +1 -1
- package/dist/public/assets/{ToolProcessesPage-BOH0ib4G.js → ToolProcessesPage-CRhphOmM.js} +1 -1
- package/dist/public/assets/{ToolsHomePage-BcMZ3BCQ.js → ToolsHomePage-BJSDLR6T.js} +1 -1
- package/dist/public/assets/{WorkbenchLandingPage-B5zoppEl.js → WorkbenchLandingPage-BlkxdOLC.js} +1 -1
- package/dist/public/assets/WorkbenchLayout-D-U7ghT0.js +1022 -0
- package/dist/public/assets/{WorkbenchModal-NGmPgqaE.js → WorkbenchModal-xbx1o6MO.js} +1 -1
- package/dist/public/assets/WorkbenchShellRoute-DyWSCHz_.js +1 -0
- package/dist/public/assets/WorkbenchShellRoute-htbkGbtW.css +1 -0
- package/dist/public/assets/WorkspaceDebugDetailPage-B4ol2_a5.js +1 -0
- package/dist/public/assets/WorkspaceDetailPage-DMakfmHR.js +1 -0
- package/dist/public/assets/WorkspaceHomePage-tmCafatd.js +1 -0
- package/dist/public/assets/{client-runtime-manager-DXbI9K1K.js → client-runtime-manager-Bwau7p1v.js} +1 -1
- package/dist/public/assets/index-DmUJ8tIw.css +1 -0
- package/dist/public/assets/index-_OCkVmfl.js +50 -0
- package/dist/public/assets/{login-direct-candidate-resolver-DkKyFtQJ.js → login-direct-candidate-resolver-CKUQ07IA.js} +1 -1
- package/dist/public/assets/{plugin-permission-copy-CzN269Bk.js → plugin-permission-copy-DIVk5jNp.js} +1 -1
- package/dist/public/assets/{plugins-api-Bv9DHpLF.js → plugins-api-DHJVvPZw.js} +1 -1
- package/dist/public/assets/{preferences-service-D2ISL2Zz.js → preferences-service-CyxxeBmS.js} +1 -1
- package/dist/public/assets/{relay-entry-Bg0OisQy.js → relay-entry-B5GmiOrR.js} +1 -1
- package/dist/public/assets/{terminal-runtime-meta-C8t-CIDF.js → terminal-runtime-meta-DBsyT35T.js} +1 -1
- package/dist/public/assets/useRegisteredDebugTemplates-wCGD2SLW.js +1 -0
- package/dist/public/assets/workbench-navigation-RyUjchbD.js +1 -0
- package/dist/public/index.html +2 -2
- package/dist/server/config/env.d.ts +1 -0
- package/dist/server/config/env.js +3 -0
- package/dist/server/config/env.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/parser/parser-skip-repository.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.d.ts +1 -0
- package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js +31 -0
- package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-write-repository.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.d.ts +1 -0
- package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js +1 -0
- package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js +4 -1
- package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js +140 -16
- package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js +2 -2
- package/dist/server/modules/affairs-indexer/core/src/sqlite/detect-catalog-schema.js.map +1 -1
- package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.d.ts +20 -3
- package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js +3 -3
- package/dist/server/modules/affairs-indexer/core/src/sqlite/open-database.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js +8 -7
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +14 -13
- package/dist/server/modules/assistant-capability/assistant-capability-service.js +27 -24
- package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
- package/dist/server/modules/auth/auth-controller.d.ts +27 -1
- package/dist/server/modules/auth/auth-controller.js +20 -0
- package/dist/server/modules/auth/auth-controller.js.map +1 -1
- package/dist/server/modules/auth/auth-service.d.ts +32 -1
- package/dist/server/modules/auth/auth-service.js +217 -2
- package/dist/server/modules/auth/auth-service.js.map +1 -1
- package/dist/server/modules/bootstrap/bootstrap-service.js +1 -0
- package/dist/server/modules/bootstrap/bootstrap-service.js.map +1 -1
- package/dist/server/modules/butler/assistant-automation-service.d.ts +1 -1
- package/dist/server/modules/butler/assistant-automation-service.js +9 -10
- package/dist/server/modules/butler/assistant-automation-service.js.map +1 -1
- package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +32 -0
- package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +93 -0
- package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +1 -0
- package/dist/server/modules/butler/assistant-sandbox-service.d.ts +69 -0
- package/dist/server/modules/butler/assistant-sandbox-service.js +399 -0
- package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -0
- package/dist/server/modules/butler/butler-action-context-service.js +2 -2
- package/dist/server/modules/butler/butler-action-context-service.js.map +1 -1
- package/dist/server/modules/butler/butler-control-action-service.d.ts +5 -5
- package/dist/server/modules/butler/butler-control-action-service.js +19 -19
- package/dist/server/modules/butler/butler-control-action-service.js.map +1 -1
- package/dist/server/modules/butler/butler-control-session-service.d.ts +1 -1
- package/dist/server/modules/butler/butler-control-session-service.js +27 -26
- package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-control-timer-service.js +4 -5
- package/dist/server/modules/butler/butler-control-timer-service.js.map +1 -1
- package/dist/server/modules/butler/butler-controller.d.ts +2 -2
- package/dist/server/modules/butler/butler-controller.js +19 -17
- package/dist/server/modules/butler/butler-controller.js.map +1 -1
- package/dist/server/modules/butler/butler-follow-up-service.d.ts +3 -0
- package/dist/server/modules/butler/butler-follow-up-service.js +11 -1
- package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
- package/dist/server/modules/butler/butler-inbox-service.d.ts +3 -0
- package/dist/server/modules/butler/butler-inbox-service.js +14 -2
- package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
- package/dist/server/modules/butler/butler-profile-service.d.ts +5 -5
- package/dist/server/modules/butler/butler-profile-service.js +17 -16
- package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
- package/dist/server/modules/butler/butler-project-service.d.ts +7 -6
- package/dist/server/modules/butler/butler-project-service.js +35 -21
- package/dist/server/modules/butler/butler-project-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-service.d.ts +5 -2
- package/dist/server/modules/butler/butler-session-service.js +51 -27
- package/dist/server/modules/butler/butler-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-summary-service.d.ts +2 -2
- package/dist/server/modules/butler/butler-session-summary-service.js +23 -9
- package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
- package/dist/server/modules/butler/context-aggregator.js +9 -9
- package/dist/server/modules/butler/context-aggregator.js.map +1 -1
- package/dist/server/modules/butler/patrol-execution-service.d.ts +0 -1
- package/dist/server/modules/butler/patrol-execution-service.js +6 -12
- package/dist/server/modules/butler/patrol-execution-service.js.map +1 -1
- package/dist/server/modules/channels/wechat-claw-client.d.ts +51 -0
- package/dist/server/modules/channels/wechat-claw-client.js +245 -0
- package/dist/server/modules/channels/wechat-claw-client.js.map +1 -0
- package/dist/server/modules/file/file-controller.d.ts +11 -2
- package/dist/server/modules/file/file-controller.js +404 -17
- package/dist/server/modules/file/file-controller.js.map +1 -1
- package/dist/server/modules/file/file-search-service.js +200 -12
- package/dist/server/modules/file/file-search-service.js.map +1 -1
- package/dist/server/modules/file/runtime/codingns-workspace-bridge.js +18 -5
- package/dist/server/modules/file/workspace-file-bridge-service.d.ts +9 -0
- package/dist/server/modules/file/workspace-file-bridge-service.js +3 -0
- package/dist/server/modules/file/workspace-file-bridge-service.js.map +1 -1
- package/dist/server/modules/file/workspace-file-bridge-watch-service.d.ts +9 -0
- package/dist/server/modules/file/workspace-file-bridge-watch-service.js +28 -0
- package/dist/server/modules/file/workspace-file-bridge-watch-service.js.map +1 -1
- package/dist/server/modules/sessions/session-controller.js +3 -3
- package/dist/server/modules/sessions/session-controller.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +8 -3
- package/dist/server/modules/sessions/session-history-service.js +126 -11
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.js +25 -15
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-permission-request-service.js +28 -15
- package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
- package/dist/server/modules/tasks/task-types.d.ts +1 -0
- package/dist/server/modules/tasks/task-types.js +1 -0
- package/dist/server/modules/tasks/task-types.js.map +1 -1
- package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.d.ts +1 -1
- package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js +22 -5
- package/dist/server/modules/workbench/affairs-assistant-session-snapshot-service.js.map +1 -1
- package/dist/server/modules/workbench/workbench-controller.d.ts +5 -0
- package/dist/server/modules/workbench/workbench-controller.js +20 -0
- package/dist/server/modules/workbench/workbench-controller.js.map +1 -1
- package/dist/server/modules/workbench/workbench-service.d.ts +6 -6
- package/dist/server/modules/workbench/workbench-service.js +42 -45
- package/dist/server/modules/workbench/workbench-service.js.map +1 -1
- package/dist/server/modules/workspace/affairs-library-controller.d.ts +8 -0
- package/dist/server/modules/workspace/affairs-library-controller.js +11 -0
- package/dist/server/modules/workspace/affairs-library-controller.js.map +1 -1
- package/dist/server/modules/workspace/affairs-library-preview-link-service.d.ts +6 -0
- package/dist/server/modules/workspace/affairs-library-preview-link-service.js +12 -2
- package/dist/server/modules/workspace/affairs-library-preview-link-service.js.map +1 -1
- package/dist/server/modules/workspace/affairs-library-service.d.ts +12 -1
- package/dist/server/modules/workspace/affairs-library-service.js +294 -96
- package/dist/server/modules/workspace/affairs-library-service.js.map +1 -1
- package/dist/server/modules/workspace/affairs-lightweight-session-controller.d.ts +8 -0
- package/dist/server/modules/workspace/affairs-lightweight-session-controller.js +55 -8
- package/dist/server/modules/workspace/affairs-lightweight-session-controller.js.map +1 -1
- package/dist/server/modules/workspace/affairs-lightweight-session-service.d.ts +13 -0
- package/dist/server/modules/workspace/affairs-lightweight-session-service.js +167 -21
- package/dist/server/modules/workspace/affairs-lightweight-session-service.js.map +1 -1
- package/dist/server/modules/workspace/affairs-tag-controller.d.ts +3 -0
- package/dist/server/modules/workspace/affairs-tag-controller.js +5 -0
- package/dist/server/modules/workspace/affairs-tag-controller.js.map +1 -1
- package/dist/server/modules/workspace/affairs-tag-service.d.ts +34 -1
- package/dist/server/modules/workspace/affairs-tag-service.js +568 -4
- package/dist/server/modules/workspace/affairs-tag-service.js.map +1 -1
- package/dist/server/modules/workspace/teable-api-client.d.ts +118 -0
- package/dist/server/modules/workspace/teable-api-client.js +142 -0
- package/dist/server/modules/workspace/teable-api-client.js.map +1 -0
- package/dist/server/modules/workspace/teable-catalog-controller.d.ts +18 -0
- package/dist/server/modules/workspace/teable-catalog-controller.js +17 -0
- package/dist/server/modules/workspace/teable-catalog-controller.js.map +1 -0
- package/dist/server/modules/workspace/teable-catalog-service.d.ts +36 -0
- package/dist/server/modules/workspace/teable-catalog-service.js +124 -0
- package/dist/server/modules/workspace/teable-catalog-service.js.map +1 -0
- package/dist/server/modules/workspace/teable-credential-service.d.ts +8 -0
- package/dist/server/modules/workspace/teable-credential-service.js +37 -0
- package/dist/server/modules/workspace/teable-credential-service.js.map +1 -0
- package/dist/server/modules/workspace/teable-field-mapping-controller.d.ts +25 -0
- package/dist/server/modules/workspace/teable-field-mapping-controller.js +31 -0
- package/dist/server/modules/workspace/teable-field-mapping-controller.js.map +1 -0
- package/dist/server/modules/workspace/teable-field-mapping-service.d.ts +38 -0
- package/dist/server/modules/workspace/teable-field-mapping-service.js +215 -0
- package/dist/server/modules/workspace/teable-field-mapping-service.js.map +1 -0
- package/dist/server/modules/workspace/teable-global-binding-controller.d.ts +22 -0
- package/dist/server/modules/workspace/teable-global-binding-controller.js +25 -0
- package/dist/server/modules/workspace/teable-global-binding-controller.js.map +1 -0
- package/dist/server/modules/workspace/teable-global-binding-service.d.ts +35 -0
- package/dist/server/modules/workspace/teable-global-binding-service.js +151 -0
- package/dist/server/modules/workspace/teable-global-binding-service.js.map +1 -0
- package/dist/server/modules/workspace/teable-mirror-sync-controller.d.ts +29 -0
- package/dist/server/modules/workspace/teable-mirror-sync-controller.js +50 -0
- package/dist/server/modules/workspace/teable-mirror-sync-controller.js.map +1 -0
- package/dist/server/modules/workspace/teable-mirror-sync-service.d.ts +157 -0
- package/dist/server/modules/workspace/teable-mirror-sync-service.js +917 -0
- package/dist/server/modules/workspace/teable-mirror-sync-service.js.map +1 -0
- package/dist/server/modules/workspace/teable-runtime-controller.d.ts +58 -0
- package/dist/server/modules/workspace/teable-runtime-controller.js +60 -0
- package/dist/server/modules/workspace/teable-runtime-controller.js.map +1 -0
- package/dist/server/modules/workspace/teable-runtime-service.d.ts +96 -0
- package/dist/server/modules/workspace/teable-runtime-service.js +362 -0
- package/dist/server/modules/workspace/teable-runtime-service.js.map +1 -0
- package/dist/server/modules/workspace/teable-workbench-sync-config-controller.d.ts +22 -0
- package/dist/server/modules/workspace/teable-workbench-sync-config-controller.js +20 -0
- package/dist/server/modules/workspace/teable-workbench-sync-config-controller.js.map +1 -0
- package/dist/server/modules/workspace/teable-workbench-sync-config-service.d.ts +22 -0
- package/dist/server/modules/workspace/teable-workbench-sync-config-service.js +159 -0
- package/dist/server/modules/workspace/teable-workbench-sync-config-service.js.map +1 -0
- package/dist/server/modules/workspace/workspace-controller.d.ts +1 -1
- package/dist/server/modules/workspace/workspace-controller.js +7 -7
- package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
- package/dist/server/modules/workspace/workspace-service.d.ts +7 -0
- package/dist/server/modules/workspace/workspace-service.js +151 -10
- package/dist/server/modules/workspace/workspace-service.js.map +1 -1
- package/dist/server/routes/affairs.d.ts +9 -1
- package/dist/server/routes/affairs.js +120 -1
- package/dist/server/routes/affairs.js.map +1 -1
- package/dist/server/routes/auth.js +6 -0
- package/dist/server/routes/auth.js.map +1 -1
- package/dist/server/routes/workbench.js +15 -0
- package/dist/server/routes/workbench.js.map +1 -1
- package/dist/server/routes/workspaces.js +51 -41
- package/dist/server/routes/workspaces.js.map +1 -1
- package/dist/server/server/create-server.d.ts +18 -0
- package/dist/server/server/create-server.js +99 -7
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/server/start-host.js +20 -0
- package/dist/server/server/start-host.js.map +1 -1
- package/dist/server/shared/http/request-diagnostics.d.ts +56 -0
- package/dist/server/shared/http/request-diagnostics.js +256 -0
- package/dist/server/shared/http/request-diagnostics.js.map +1 -0
- package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +18 -0
- package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +191 -0
- package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -0
- package/dist/server/storage/repositories/auth-token-repository.d.ts +1 -0
- package/dist/server/storage/repositories/auth-token-repository.js +8 -0
- package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
- package/dist/server/storage/repositories/auth-user-repository.d.ts +50 -0
- package/dist/server/storage/repositories/auth-user-repository.js +198 -27
- package/dist/server/storage/repositories/auth-user-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-control-session-repository.d.ts +4 -1
- package/dist/server/storage/repositories/butler-control-session-repository.js +55 -8
- package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-profile-repository.d.ts +2 -1
- package/dist/server/storage/repositories/butler-profile-repository.js +35 -6
- package/dist/server/storage/repositories/butler-profile-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-project-repository.d.ts +2 -0
- package/dist/server/storage/repositories/butler-project-repository.js +38 -4
- package/dist/server/storage/repositories/butler-project-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-session-repository.d.ts +2 -1
- package/dist/server/storage/repositories/butler-session-repository.js +35 -6
- package/dist/server/storage/repositories/butler-session-repository.js.map +1 -1
- package/dist/server/storage/repositories/session-binding-repository.d.ts +3 -0
- package/dist/server/storage/repositories/session-binding-repository.js +70 -2
- package/dist/server/storage/repositories/session-binding-repository.js.map +1 -1
- package/dist/server/storage/repositories/session-index-repository.js +7 -5
- package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
- package/dist/server/storage/repositories/user-affairs-library-setting-repository.js +8 -5
- package/dist/server/storage/repositories/user-affairs-library-setting-repository.js.map +1 -1
- package/dist/server/storage/repositories/user-teable-credential-repository.d.ts +9 -0
- package/dist/server/storage/repositories/user-teable-credential-repository.js +45 -0
- package/dist/server/storage/repositories/user-teable-credential-repository.js.map +1 -0
- package/dist/server/storage/repositories/user-teable-field-mapping-repository.d.ts +10 -0
- package/dist/server/storage/repositories/user-teable-field-mapping-repository.js +69 -0
- package/dist/server/storage/repositories/user-teable-field-mapping-repository.js.map +1 -0
- package/dist/server/storage/repositories/user-teable-global-setting-repository.d.ts +8 -0
- package/dist/server/storage/repositories/user-teable-global-setting-repository.js +52 -0
- package/dist/server/storage/repositories/user-teable-global-setting-repository.js.map +1 -0
- package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.d.ts +9 -0
- package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.js +66 -0
- package/dist/server/storage/repositories/user-teable-mirror-record-mapping-repository.js.map +1 -0
- package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.d.ts +9 -0
- package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.js +67 -0
- package/dist/server/storage/repositories/user-teable-mirror-table-binding-repository.js.map +1 -0
- package/dist/server/storage/repositories/user-teable-sync-log-repository.d.ts +14 -0
- package/dist/server/storage/repositories/user-teable-sync-log-repository.js +97 -0
- package/dist/server/storage/repositories/user-teable-sync-log-repository.js.map +1 -0
- package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.d.ts +8 -0
- package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.js +55 -0
- package/dist/server/storage/repositories/user-teable-workbench-sync-config-repository.js.map +1 -0
- package/dist/server/storage/repositories/workspace-repository.d.ts +3 -1
- package/dist/server/storage/repositories/workspace-repository.js +24 -10
- package/dist/server/storage/repositories/workspace-repository.js.map +1 -1
- package/dist/server/storage/sqlite/client.js +692 -1
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +200 -10
- package/dist/server/types/domain.d.ts +114 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js +34 -7
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +3 -7
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +22 -3
- package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +29 -2
- package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/package.json +3 -1
- package/package.json +1 -1
- package/dist/public/assets/DesktopWindowPage-D0blSuKd.js +0 -2
- package/dist/public/assets/FileContextPanel-BrKO8Xt6.js +0 -1
- package/dist/public/assets/GitSidebar-BdwiDtOr.js +0 -6
- package/dist/public/assets/MobileCreateSessionSheet-Cx_dBiBb.js +0 -1
- package/dist/public/assets/SettingsPage-BlAZCHsy.js +0 -2
- package/dist/public/assets/TerminalManagerPanel-CjzbiWjl.js +0 -1
- package/dist/public/assets/WorkbenchLayout-CikJBS62.js +0 -1019
- package/dist/public/assets/WorkbenchShellRoute-BbbSOiZw.js +0 -1
- package/dist/public/assets/WorkbenchShellRoute-DT3VMjWD.css +0 -1
- package/dist/public/assets/WorkspaceDebugDetailPage-CVivdPx5.js +0 -1
- package/dist/public/assets/WorkspaceDetailPage-DgOSjscR.js +0 -1
- package/dist/public/assets/WorkspaceHomePage-HPa7M_Vh.js +0 -1
- package/dist/public/assets/index-BxJPQpFM.css +0 -1
- package/dist/public/assets/index-CeXGOT_T.js +0 -50
- package/dist/public/assets/useRegisteredDebugTemplates-Bol3NVfN.js +0 -1
- 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)")
|