@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.
- package/dist/public/assets/{AdaptiveButlerPage-B17QiMyT.js → AdaptiveButlerPage-kkJDsnCO.js} +2 -2
- package/dist/public/assets/{App-CFBwDUNA.js → App-DrNI9lWA.js} +6 -6
- package/dist/public/assets/{BootstrapPage-W5wU3BPh.js → BootstrapPage-QgVH5Mps.js} +1 -1
- package/dist/public/assets/{ConversationPage-DQLX1bUh.js → ConversationPage-DVk8VfIj.js} +1 -1
- package/dist/public/assets/{DesktopDetachPreviewPage-DTPeuAW-.js → DesktopDetachPreviewPage-BhfP0TpH.js} +1 -1
- package/dist/public/assets/{DesktopModal-6ii53_Y9.js → DesktopModal-DRmDrv0S.js} +1 -1
- package/dist/public/assets/DesktopWindowPage-DNbJXnSs.js +2 -0
- package/dist/public/assets/FileContextPanel---fLO4ve.js +1 -0
- package/dist/public/assets/GitSidebar-sXUE0TqT.js +6 -0
- package/dist/public/assets/MobileCreateSessionSheet-BftZ5pvb.js +1 -0
- package/dist/public/assets/{MobileSheet-opTWyRe1.js → MobileSheet-nw5SCa3N.js} +1 -1
- package/dist/public/assets/{MobileTopHeaderFrame-BbNON3Y4.js → MobileTopHeaderFrame-DH_D02Wy.js} +1 -1
- package/dist/public/assets/{MobileWorkspaceSwitcherHeader-BZEzPeMj.js → MobileWorkspaceSwitcherHeader-2K406G5p.js} +1 -1
- package/dist/public/assets/{PluginAccessOverview-mQDmAljp.js → PluginAccessOverview-BVJihw3D.js} +1 -1
- package/dist/public/assets/{PluginContainerPage-CcxUJpM4.js → PluginContainerPage-CR4vStvr.js} +1 -1
- package/dist/public/assets/{PluginDetailPage-D5--ACIt.js → PluginDetailPage-CrMX0Mnm.js} +1 -1
- package/dist/public/assets/{PluginsListPage-D_oJxYXT.js → PluginsListPage-FtIL71Yg.js} +1 -1
- package/dist/public/assets/{RelayConnectEntryPage-DROxpnkv.js → RelayConnectEntryPage-Bt1apX53.js} +1 -1
- package/dist/public/assets/{ServerSettingsModal-CUUOPqSe.js → ServerSettingsModal-D-guzPrI.js} +1 -1
- package/dist/public/assets/{SessionIndexPage-C2Jxh6Gp.js → SessionIndexPage-CX2FppcJ.js} +1 -1
- package/dist/public/assets/SettingsPage-BI2Olcvr.js +2 -0
- package/dist/public/assets/TerminalManagerPanel-B5MKGPy-.js +1 -0
- package/dist/public/assets/{TerminalPage-CwWyFDj8.js → TerminalPage-C2dTNGHK.js} +1 -1
- package/dist/public/assets/{TerminalRuntimeFallbackModal-CSVVbO8r.js → TerminalRuntimeFallbackModal-DAqOxFD8.js} +1 -1
- package/dist/public/assets/{ToolFilesPage-QBEY8oCf.js → ToolFilesPage-IsNwyE6T.js} +1 -1
- package/dist/public/assets/{ToolGitPage-BKoZ2l9v.js → ToolGitPage-BK1JBERN.js} +1 -1
- package/dist/public/assets/{ToolProcessesPage-BOH0ib4G.js → ToolProcessesPage-DwTYUQCK.js} +1 -1
- package/dist/public/assets/{ToolsHomePage-BcMZ3BCQ.js → ToolsHomePage-BLOy7lPg.js} +1 -1
- package/dist/public/assets/{WorkbenchLandingPage-B5zoppEl.js → WorkbenchLandingPage-CqZKR6EA.js} +1 -1
- package/dist/public/assets/WorkbenchLayout-CJHQtwuL.js +1022 -0
- package/dist/public/assets/{WorkbenchModal-NGmPgqaE.js → WorkbenchModal-BM-OeW-b.js} +1 -1
- package/dist/public/assets/WorkbenchShellRoute-2bKI6Q9k.js +1 -0
- package/dist/public/assets/WorkbenchShellRoute-BjuZD101.css +1 -0
- package/dist/public/assets/WorkspaceDebugDetailPage-BMsEN5iG.js +1 -0
- package/dist/public/assets/WorkspaceDetailPage-5H9Gosx2.js +1 -0
- package/dist/public/assets/WorkspaceHomePage-DQiXKgiP.js +1 -0
- package/dist/public/assets/{client-runtime-manager-DXbI9K1K.js → client-runtime-manager-CgPJq21V.js} +1 -1
- package/dist/public/assets/index-BARqMVSw.css +1 -0
- package/dist/public/assets/index-BUoNjVrY.js +50 -0
- package/dist/public/assets/{login-direct-candidate-resolver-DkKyFtQJ.js → login-direct-candidate-resolver-CGaxAXV8.js} +1 -1
- package/dist/public/assets/{plugin-permission-copy-CzN269Bk.js → plugin-permission-copy-BR9gWy8b.js} +1 -1
- package/dist/public/assets/{plugins-api-Bv9DHpLF.js → plugins-api-CdCsrG2e.js} +1 -1
- package/dist/public/assets/{preferences-service-D2ISL2Zz.js → preferences-service-lOhnlxzP.js} +1 -1
- package/dist/public/assets/{relay-entry-Bg0OisQy.js → relay-entry-CQpxTS8y.js} +1 -1
- package/dist/public/assets/{terminal-runtime-meta-C8t-CIDF.js → terminal-runtime-meta-oteTx66X.js} +1 -1
- package/dist/public/assets/useRegisteredDebugTemplates-Bu2ykZ6s.js +1 -0
- package/dist/public/assets/workbench-navigation-DlgXuFW2.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-write-repository.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/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-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-session-service.d.ts +3 -0
- package/dist/server/modules/butler/butler-session-service.js +18 -0
- package/dist/server/modules/butler/butler-session-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/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 +33 -36
- 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 +9 -0
- package/dist/server/modules/workspace/affairs-library-service.js +182 -42
- 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 +22 -1
- package/dist/server/modules/workspace/affairs-tag-service.js +41 -2
- 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/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/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 +14 -0
- package/dist/server/server/create-server.js +73 -7
- package/dist/server/server/create-server.js.map +1 -1
- 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/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/sqlite/client.js +404 -1
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +167 -1
- package/dist/server/types/domain.d.ts +106 -0
- 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
|
@@ -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)")
|