@jingyi0605/codingns 0.5.5 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/public/assets/{AdaptiveButlerPage-CUyNL98E.js → AdaptiveButlerPage-uFwDdN-F.js} +3 -3
  2. package/dist/public/assets/{App-BFP7LCSC.js → App-BZvapsi8.js} +3 -3
  3. package/dist/public/assets/App-CcDXqFl1.css +1 -0
  4. package/dist/public/assets/{BootstrapPage-G74dX2Us.js → BootstrapPage-gHSoa4JN.js} +1 -1
  5. package/dist/public/assets/ConversationPage-z3sXtKZ7.js +4 -0
  6. package/dist/public/assets/{DesktopDetachPreviewPage-IV7oEdOX.js → DesktopDetachPreviewPage-4eMRxiBW.js} +1 -1
  7. package/dist/public/assets/DesktopWindowPage-CZcoGApB.js +2 -0
  8. package/dist/public/assets/FileContextPanel-C3qex8bb.js +1 -0
  9. package/dist/public/assets/GitSidebar-BK6H16XU.js +6 -0
  10. package/dist/public/assets/{MobileCreateSessionSheet-DqVwz_Hp.js → MobileCreateSessionSheet-BYfbvK8o.js} +1 -1
  11. package/dist/public/assets/MobileSheet-Ckug8hTb.js +1 -0
  12. package/dist/public/assets/{MobileTopHeaderFrame-COTc7cRr.js → MobileTopHeaderFrame-Bwv8Ovm_.js} +1 -1
  13. package/dist/public/assets/MobileWorkspaceSwitcherHeader-RqWrBdn2.js +1 -0
  14. package/dist/public/assets/RelayConnectEntryPage-D_4YL-YH.js +1 -0
  15. package/dist/public/assets/ServerSettingsModal-CMSm3BZU.js +1 -0
  16. package/dist/public/assets/SessionIndexPage-DuK10DL5.js +1 -0
  17. package/dist/public/assets/SettingsPage-fyD-xaHL.js +1 -0
  18. package/dist/public/assets/TerminalManagerPanel-CCLr1Ypk.js +1 -0
  19. package/dist/public/assets/{TerminalPage-DpsvQQVR.js → TerminalPage-DaooFaJ4.js} +19 -19
  20. package/dist/public/assets/{TerminalRuntimeFallbackModal-CNzOt5v5.js → TerminalRuntimeFallbackModal-aUzjEBwP.js} +1 -1
  21. package/dist/public/assets/ToolFilesPage-CGxBvYG0.js +1 -0
  22. package/dist/public/assets/ToolGitPage-C264yjS9.js +1 -0
  23. package/dist/public/assets/ToolProcessesPage-BOP4A1cb.js +1 -0
  24. package/dist/public/assets/ToolsHomePage-CQxGiKQA.js +1 -0
  25. package/dist/public/assets/WorkbenchLandingPage-CvAY68ca.js +1 -0
  26. package/dist/public/assets/WorkbenchLayout-DGm8Tc5M.js +3 -0
  27. package/dist/public/assets/{WorkbenchModal-CbDxaCOR.js → WorkbenchModal-0tPIIhca.js} +1 -1
  28. package/dist/public/assets/{WorkbenchShellRoute-BMcnFadA.css → WorkbenchShellRoute-BF0nHWOk.css} +1 -1
  29. package/dist/public/assets/WorkbenchShellRoute-DBBOsJo9.js +1 -0
  30. package/dist/public/assets/WorkspaceDebugDetailPage-CDerFYd2.js +1 -0
  31. package/dist/public/assets/WorkspaceDetailPage-BlJc1CHE.js +1 -0
  32. package/dist/public/assets/WorkspaceHomePage-BUsKJ3lv.js +1 -0
  33. package/dist/public/assets/client-runtime-manager-BZpL17fc.js +1 -0
  34. package/dist/public/assets/{default-session-permission-mode-Cu5SreTG.js → default-session-permission-mode-DT4SGiwp.js} +1 -1
  35. package/dist/public/assets/{file-tree-icon-BMKuc5pw.js → file-tree-icon-Db5LXC8h.js} +7 -7
  36. package/dist/public/assets/index-BZLcEHW3.js +42 -0
  37. package/dist/public/assets/index-BbspQPC2.css +1 -0
  38. package/dist/public/assets/login-direct-candidate-resolver-1mxe_Oh8.js +1 -0
  39. package/dist/public/assets/{preferences-service-gv_9vGKz.js → preferences-service-DWnzl5a0.js} +1 -1
  40. package/dist/public/assets/relay-entry-C5_Iay0I.js +1 -0
  41. package/dist/public/assets/session-runtime-machine-DdLeDqQr.js +17 -0
  42. package/dist/public/assets/{styles-BWPBZvze.css → styles-CsEMfdaS.css} +1 -1
  43. package/dist/public/assets/{terminal-runtime-meta-B9xJGY__.js → terminal-runtime-meta-cdtWVfCm.js} +1 -1
  44. package/dist/public/assets/{useRegisteredDebugTemplates-CDfl54Wt.js → useRegisteredDebugTemplates-oFAQNIqh.js} +1 -1
  45. package/dist/public/assets/window-BVUB8gMK.js +1 -0
  46. package/dist/public/index.html +2 -2
  47. package/dist/server/config/env.d.ts +1 -0
  48. package/dist/server/config/env.js +3 -0
  49. package/dist/server/config/env.js.map +1 -1
  50. package/dist/server/modules/client/npm-global-package-service.d.ts +7 -1
  51. package/dist/server/modules/client/npm-global-package-service.js +149 -43
  52. package/dist/server/modules/client/npm-global-package-service.js.map +1 -1
  53. package/dist/server/modules/client/service-update-task-service.js +6 -2
  54. package/dist/server/modules/client/service-update-task-service.js.map +1 -1
  55. package/dist/server/modules/client/service-update-types.d.ts +2 -0
  56. package/dist/server/modules/git/git-controller.d.ts +3 -0
  57. package/dist/server/modules/git/git-controller.js +3 -0
  58. package/dist/server/modules/git/git-controller.js.map +1 -1
  59. package/dist/server/modules/git/git-read-service.js +47 -1
  60. package/dist/server/modules/git/git-read-service.js.map +1 -1
  61. package/dist/server/modules/git/git-write-service.d.ts +4 -0
  62. package/dist/server/modules/git/git-write-service.js +24 -0
  63. package/dist/server/modules/git/git-write-service.js.map +1 -1
  64. package/dist/server/modules/git/types.d.ts +1 -0
  65. package/dist/server/modules/git/workspace-repo-guard.d.ts +2 -0
  66. package/dist/server/modules/git/workspace-repo-guard.js +24 -10
  67. package/dist/server/modules/git/workspace-repo-guard.js.map +1 -1
  68. package/dist/server/modules/parallel-sessions/parallel-session-controller.d.ts +53 -0
  69. package/dist/server/modules/parallel-sessions/parallel-session-controller.js +70 -0
  70. package/dist/server/modules/parallel-sessions/parallel-session-controller.js.map +1 -0
  71. package/dist/server/modules/parallel-sessions/parallel-session-group-service.d.ts +83 -0
  72. package/dist/server/modules/parallel-sessions/parallel-session-group-service.js +591 -0
  73. package/dist/server/modules/parallel-sessions/parallel-session-group-service.js.map +1 -0
  74. package/dist/server/modules/parallel-sessions/session-isolated-workspace-service.d.ts +56 -0
  75. package/dist/server/modules/parallel-sessions/session-isolated-workspace-service.js +483 -0
  76. package/dist/server/modules/parallel-sessions/session-isolated-workspace-service.js.map +1 -0
  77. package/dist/server/modules/relay-tunnel/relay-tunnel-candidate-endpoints.d.ts +2 -0
  78. package/dist/server/modules/relay-tunnel/relay-tunnel-candidate-endpoints.js +129 -0
  79. package/dist/server/modules/relay-tunnel/relay-tunnel-candidate-endpoints.js.map +1 -0
  80. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js +12 -9
  81. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js.map +1 -1
  82. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js +1 -128
  83. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js.map +1 -1
  84. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +3 -0
  85. package/dist/server/modules/sessions/codex-app-server-helper-client.js +56 -45
  86. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  87. package/dist/server/modules/sessions/codex-app-server-helper-process.js +21 -2
  88. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  89. package/dist/server/modules/sessions/session-history-service.d.ts +10 -1
  90. package/dist/server/modules/sessions/session-history-service.js +142 -14
  91. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  92. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +8 -0
  93. package/dist/server/modules/sessions/session-live-runtime-service.js +208 -25
  94. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  95. package/dist/server/modules/workbench/codex-archive-watcher.d.ts +16 -0
  96. package/dist/server/modules/workbench/codex-archive-watcher.js +50 -0
  97. package/dist/server/modules/workbench/codex-archive-watcher.js.map +1 -0
  98. package/dist/server/modules/workbench/workbench-service.d.ts +11 -2
  99. package/dist/server/modules/workbench/workbench-service.js +37 -8
  100. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  101. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +1 -1
  102. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +26 -3
  103. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  104. package/dist/server/modules/workspace/workspace-service.d.ts +3 -1
  105. package/dist/server/modules/workspace/workspace-service.js +10 -2
  106. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  107. package/dist/server/modules/worktree/worktree-base-ref-resolver.d.ts +20 -0
  108. package/dist/server/modules/worktree/worktree-base-ref-resolver.js +111 -0
  109. package/dist/server/modules/worktree/worktree-base-ref-resolver.js.map +1 -0
  110. package/dist/server/modules/worktree/worktree-cleanup-service.js +9 -3
  111. package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -1
  112. package/dist/server/modules/worktree/worktree-manager.d.ts +0 -1
  113. package/dist/server/modules/worktree/worktree-manager.js +14 -20
  114. package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
  115. package/dist/server/routes/git.js +1 -0
  116. package/dist/server/routes/git.js.map +1 -1
  117. package/dist/server/routes/parallel-groups.d.ts +3 -0
  118. package/dist/server/routes/parallel-groups.js +9 -0
  119. package/dist/server/routes/parallel-groups.js.map +1 -0
  120. package/dist/server/server/create-server.d.ts +8 -0
  121. package/dist/server/server/create-server.js +38 -4
  122. package/dist/server/server/create-server.js.map +1 -1
  123. package/dist/server/server/workbench-runtime-terminal-sync.d.ts +14 -0
  124. package/dist/server/server/workbench-runtime-terminal-sync.js +17 -0
  125. package/dist/server/server/workbench-runtime-terminal-sync.js.map +1 -0
  126. package/dist/server/storage/repositories/parallel-session-group-repository.d.ts +11 -0
  127. package/dist/server/storage/repositories/parallel-session-group-repository.js +131 -0
  128. package/dist/server/storage/repositories/parallel-session-group-repository.js.map +1 -0
  129. package/dist/server/storage/repositories/parallel-session-member-repository.d.ts +12 -0
  130. package/dist/server/storage/repositories/parallel-session-member-repository.js +150 -0
  131. package/dist/server/storage/repositories/parallel-session-member-repository.js.map +1 -0
  132. package/dist/server/storage/repositories/session-isolated-workspace-repository.d.ts +15 -0
  133. package/dist/server/storage/repositories/session-isolated-workspace-repository.js +230 -0
  134. package/dist/server/storage/repositories/session-isolated-workspace-repository.js.map +1 -0
  135. package/dist/server/storage/sqlite/schema.sql +73 -0
  136. package/dist/server/types/domain.d.ts +72 -0
  137. package/dist/server/ws/workbench-ws-hub.d.ts +3 -1
  138. package/dist/server/ws/workbench-ws-hub.js +23 -4
  139. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  140. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -0
  141. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +34 -0
  142. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  143. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +3 -0
  144. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +46 -22
  145. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  146. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +488 -281
  147. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  148. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +29 -5
  149. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -1
  150. package/package.json +1 -1
  151. package/dist/public/assets/App-DUAg5urj.css +0 -1
  152. package/dist/public/assets/ConversationPage-Bz0_tvvM.js +0 -2
  153. package/dist/public/assets/DesktopWindowPage-BBmHyRg5.js +0 -2
  154. package/dist/public/assets/FileContextPanel--FVTxDrq.js +0 -1
  155. package/dist/public/assets/GitSidebar-DAiSi9oc.js +0 -6
  156. package/dist/public/assets/MobileSheet-D1lMrcvD.js +0 -1
  157. package/dist/public/assets/MobileWorkspaceSwitcherHeader-DJPV9ym2.js +0 -1
  158. package/dist/public/assets/RelayConnectEntryPage-dSwU8VzK.js +0 -1
  159. package/dist/public/assets/ServerSettingsModal-B34ms3ze.js +0 -1
  160. package/dist/public/assets/SessionIndexPage-D3tG1gmM.js +0 -1
  161. package/dist/public/assets/SettingsPage-B3-6-5GL.js +0 -1
  162. package/dist/public/assets/TerminalManagerPanel-DhuTEdzV.js +0 -1
  163. package/dist/public/assets/ToolFilesPage-BX9QDi9Y.js +0 -1
  164. package/dist/public/assets/ToolGitPage-4VtFox3p.js +0 -1
  165. package/dist/public/assets/ToolProcessesPage-DZJC6Qnt.js +0 -1
  166. package/dist/public/assets/ToolsHomePage-D7JbrAWv.js +0 -1
  167. package/dist/public/assets/WorkbenchLandingPage-C0yqnzqh.js +0 -1
  168. package/dist/public/assets/WorkbenchLayout-Brlj8K3i.js +0 -3
  169. package/dist/public/assets/WorkbenchShellRoute-puGpdDFY.js +0 -1
  170. package/dist/public/assets/WorkspaceDebugDetailPage-fTGweC9N.js +0 -1
  171. package/dist/public/assets/WorkspaceDetailPage-BtaIzSDB.js +0 -1
  172. package/dist/public/assets/WorkspaceHomePage-CUmmYDrM.js +0 -1
  173. package/dist/public/assets/client-runtime-manager-RHFa_iWo.js +0 -1
  174. package/dist/public/assets/index-Cq3ue0za.css +0 -1
  175. package/dist/public/assets/index-DEbFT-Aq.js +0 -42
  176. package/dist/public/assets/session-runtime-machine-Bfnxkk9B.js +0 -17
  177. package/dist/public/assets/window-BWqRixxq.js +0 -1
  178. /package/dist/public/assets/{styles-CSUx5LGe.js → styles-DRVvx_kv.js} +0 -0
@@ -0,0 +1,131 @@
1
+ export class ParallelSessionGroupRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ create(record) {
7
+ this.db
8
+ .prepare(`INSERT INTO parallel_session_groups (
9
+ id,
10
+ workspace_id,
11
+ source_type,
12
+ source_session_id,
13
+ source_message_id,
14
+ shared_prompt,
15
+ requested_count,
16
+ anchor_session_id,
17
+ status,
18
+ created_by_user_id,
19
+ created_at,
20
+ updated_at,
21
+ deleted_at
22
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
23
+ .run(record.id, record.workspaceId, record.sourceType, record.sourceSessionId, record.sourceMessageId, record.sharedPrompt, record.requestedCount, record.anchorSessionId, record.status, record.createdByUserId, record.createdAt, record.updatedAt, record.deletedAt);
24
+ return record;
25
+ }
26
+ update(record) {
27
+ this.db
28
+ .prepare(`UPDATE parallel_session_groups
29
+ SET workspace_id = ?,
30
+ source_type = ?,
31
+ source_session_id = ?,
32
+ source_message_id = ?,
33
+ shared_prompt = ?,
34
+ requested_count = ?,
35
+ anchor_session_id = ?,
36
+ status = ?,
37
+ created_by_user_id = ?,
38
+ created_at = ?,
39
+ updated_at = ?,
40
+ deleted_at = ?
41
+ WHERE id = ?`)
42
+ .run(record.workspaceId, record.sourceType, record.sourceSessionId, record.sourceMessageId, record.sharedPrompt, record.requestedCount, record.anchorSessionId, record.status, record.createdByUserId, record.createdAt, record.updatedAt, record.deletedAt, record.id);
43
+ return this.findById(record.id);
44
+ }
45
+ findById(groupId) {
46
+ const row = this.db
47
+ .prepare(`SELECT
48
+ id,
49
+ workspace_id,
50
+ source_type,
51
+ source_session_id,
52
+ source_message_id,
53
+ shared_prompt,
54
+ requested_count,
55
+ anchor_session_id,
56
+ status,
57
+ created_by_user_id,
58
+ created_at,
59
+ updated_at,
60
+ deleted_at
61
+ FROM parallel_session_groups
62
+ WHERE id = ?`)
63
+ .get(groupId);
64
+ return row ? mapParallelSessionGroupRow(row) : null;
65
+ }
66
+ listByWorkspaceId(workspaceId) {
67
+ return this.db
68
+ .prepare(`SELECT
69
+ id,
70
+ workspace_id,
71
+ source_type,
72
+ source_session_id,
73
+ source_message_id,
74
+ shared_prompt,
75
+ requested_count,
76
+ anchor_session_id,
77
+ status,
78
+ created_by_user_id,
79
+ created_at,
80
+ updated_at,
81
+ deleted_at
82
+ FROM parallel_session_groups
83
+ WHERE workspace_id = ?
84
+ ORDER BY updated_at DESC, created_at DESC`)
85
+ .all(workspaceId)
86
+ .map((row) => mapParallelSessionGroupRow(row));
87
+ }
88
+ listByIds(groupIds) {
89
+ if (groupIds.length === 0) {
90
+ return [];
91
+ }
92
+ const placeholders = groupIds.map(() => "?").join(", ");
93
+ return this.db
94
+ .prepare(`SELECT
95
+ id,
96
+ workspace_id,
97
+ source_type,
98
+ source_session_id,
99
+ source_message_id,
100
+ shared_prompt,
101
+ requested_count,
102
+ anchor_session_id,
103
+ status,
104
+ created_by_user_id,
105
+ created_at,
106
+ updated_at,
107
+ deleted_at
108
+ FROM parallel_session_groups
109
+ WHERE id IN (${placeholders})`)
110
+ .all(...groupIds)
111
+ .map((row) => mapParallelSessionGroupRow(row));
112
+ }
113
+ }
114
+ function mapParallelSessionGroupRow(row) {
115
+ return {
116
+ id: row.id,
117
+ workspaceId: row.workspace_id,
118
+ sourceType: row.source_type,
119
+ sourceSessionId: row.source_session_id,
120
+ sourceMessageId: row.source_message_id,
121
+ sharedPrompt: row.shared_prompt,
122
+ requestedCount: row.requested_count,
123
+ anchorSessionId: row.anchor_session_id,
124
+ status: row.status,
125
+ createdByUserId: row.created_by_user_id,
126
+ createdAt: row.created_at,
127
+ updatedAt: row.updated_at,
128
+ deletedAt: row.deleted_at
129
+ };
130
+ }
131
+ //# sourceMappingURL=parallel-session-group-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-session-group-repository.js","sourceRoot":"","sources":["../../../../src/storage/repositories/parallel-session-group-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { ParallelSessionMemberRecord } from "../../types/domain.js";
3
+ export declare class ParallelSessionMemberRepository {
4
+ private readonly db;
5
+ constructor(db: Database.Database);
6
+ create(record: ParallelSessionMemberRecord): ParallelSessionMemberRecord;
7
+ update(record: ParallelSessionMemberRecord): ParallelSessionMemberRecord | null;
8
+ findBySessionId(sessionId: string): ParallelSessionMemberRecord | null;
9
+ listByGroupId(groupId: string): ParallelSessionMemberRecord[];
10
+ listBySessionIds(sessionIds: readonly string[]): ParallelSessionMemberRecord[];
11
+ listByGroupIds(groupIds: readonly string[]): ParallelSessionMemberRecord[];
12
+ }
@@ -0,0 +1,150 @@
1
+ export class ParallelSessionMemberRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ create(record) {
7
+ this.db
8
+ .prepare(`INSERT INTO parallel_session_members (
9
+ group_id,
10
+ session_id,
11
+ ordinal,
12
+ role,
13
+ provider,
14
+ model,
15
+ member_prompt,
16
+ workspace_isolation_mode,
17
+ temporary_workspace_id,
18
+ created_at,
19
+ updated_at,
20
+ deleted_at
21
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
22
+ .run(record.groupId, record.sessionId, record.ordinal, record.role, record.provider, record.model, record.memberPrompt, record.workspaceIsolationMode, record.temporaryWorkspaceId, record.createdAt, record.updatedAt, record.deletedAt);
23
+ return record;
24
+ }
25
+ update(record) {
26
+ this.db
27
+ .prepare(`UPDATE parallel_session_members
28
+ SET group_id = ?,
29
+ ordinal = ?,
30
+ role = ?,
31
+ provider = ?,
32
+ model = ?,
33
+ member_prompt = ?,
34
+ workspace_isolation_mode = ?,
35
+ temporary_workspace_id = ?,
36
+ created_at = ?,
37
+ updated_at = ?,
38
+ deleted_at = ?
39
+ WHERE session_id = ?`)
40
+ .run(record.groupId, record.ordinal, record.role, record.provider, record.model, record.memberPrompt, record.workspaceIsolationMode, record.temporaryWorkspaceId, record.createdAt, record.updatedAt, record.deletedAt, record.sessionId);
41
+ return this.findBySessionId(record.sessionId);
42
+ }
43
+ findBySessionId(sessionId) {
44
+ const row = this.db
45
+ .prepare(`SELECT
46
+ group_id,
47
+ session_id,
48
+ ordinal,
49
+ role,
50
+ provider,
51
+ model,
52
+ member_prompt,
53
+ workspace_isolation_mode,
54
+ temporary_workspace_id,
55
+ created_at,
56
+ updated_at,
57
+ deleted_at
58
+ FROM parallel_session_members
59
+ WHERE session_id = ?`)
60
+ .get(sessionId);
61
+ return row ? mapParallelSessionMemberRow(row) : null;
62
+ }
63
+ listByGroupId(groupId) {
64
+ return this.db
65
+ .prepare(`SELECT
66
+ group_id,
67
+ session_id,
68
+ ordinal,
69
+ role,
70
+ provider,
71
+ model,
72
+ member_prompt,
73
+ workspace_isolation_mode,
74
+ temporary_workspace_id,
75
+ created_at,
76
+ updated_at,
77
+ deleted_at
78
+ FROM parallel_session_members
79
+ WHERE group_id = ?
80
+ ORDER BY ordinal ASC, created_at ASC`)
81
+ .all(groupId)
82
+ .map((row) => mapParallelSessionMemberRow(row));
83
+ }
84
+ listBySessionIds(sessionIds) {
85
+ if (sessionIds.length === 0) {
86
+ return [];
87
+ }
88
+ const placeholders = sessionIds.map(() => "?").join(", ");
89
+ return this.db
90
+ .prepare(`SELECT
91
+ group_id,
92
+ session_id,
93
+ ordinal,
94
+ role,
95
+ provider,
96
+ model,
97
+ member_prompt,
98
+ workspace_isolation_mode,
99
+ temporary_workspace_id,
100
+ created_at,
101
+ updated_at,
102
+ deleted_at
103
+ FROM parallel_session_members
104
+ WHERE session_id IN (${placeholders})`)
105
+ .all(...sessionIds)
106
+ .map((row) => mapParallelSessionMemberRow(row));
107
+ }
108
+ listByGroupIds(groupIds) {
109
+ if (groupIds.length === 0) {
110
+ return [];
111
+ }
112
+ const placeholders = groupIds.map(() => "?").join(", ");
113
+ return this.db
114
+ .prepare(`SELECT
115
+ group_id,
116
+ session_id,
117
+ ordinal,
118
+ role,
119
+ provider,
120
+ model,
121
+ member_prompt,
122
+ workspace_isolation_mode,
123
+ temporary_workspace_id,
124
+ created_at,
125
+ updated_at,
126
+ deleted_at
127
+ FROM parallel_session_members
128
+ WHERE group_id IN (${placeholders})
129
+ ORDER BY group_id ASC, ordinal ASC`)
130
+ .all(...groupIds)
131
+ .map((row) => mapParallelSessionMemberRow(row));
132
+ }
133
+ }
134
+ function mapParallelSessionMemberRow(row) {
135
+ return {
136
+ groupId: row.group_id,
137
+ sessionId: row.session_id,
138
+ ordinal: row.ordinal,
139
+ role: row.role,
140
+ provider: row.provider,
141
+ model: row.model,
142
+ memberPrompt: row.member_prompt,
143
+ workspaceIsolationMode: row.workspace_isolation_mode,
144
+ temporaryWorkspaceId: row.temporary_workspace_id,
145
+ createdAt: row.created_at,
146
+ updatedAt: row.updated_at,
147
+ deletedAt: row.deleted_at
148
+ };
149
+ }
150
+ //# sourceMappingURL=parallel-session-member-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-session-member-repository.js","sourceRoot":"","sources":["../../../../src/storage/repositories/parallel-session-member-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { SessionIsolatedWorkspaceRecord } from "../../types/domain.js";
3
+ export declare class SessionIsolatedWorkspaceRepository {
4
+ private readonly db;
5
+ constructor(db: Database.Database);
6
+ create(record: SessionIsolatedWorkspaceRecord): SessionIsolatedWorkspaceRecord;
7
+ update(record: SessionIsolatedWorkspaceRecord): SessionIsolatedWorkspaceRecord | null;
8
+ findById(id: string): SessionIsolatedWorkspaceRecord | null;
9
+ findByOwnerSessionId(ownerSessionId: string): SessionIsolatedWorkspaceRecord | null;
10
+ findByWorkspaceId(workspaceId: string): SessionIsolatedWorkspaceRecord | null;
11
+ listByGroupId(groupId: string): SessionIsolatedWorkspaceRecord[];
12
+ listByOwnerSessionIds(ownerSessionIds: readonly string[]): SessionIsolatedWorkspaceRecord[];
13
+ listByLifecycleStatuses(lifecycleStatuses: readonly SessionIsolatedWorkspaceRecord["lifecycleStatus"][]): SessionIsolatedWorkspaceRecord[];
14
+ listBySourceWorkspaceId(sourceWorkspaceId: string): SessionIsolatedWorkspaceRecord[];
15
+ }
@@ -0,0 +1,230 @@
1
+ export class SessionIsolatedWorkspaceRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ create(record) {
7
+ this.db
8
+ .prepare(`INSERT INTO session_isolated_workspaces (
9
+ id,
10
+ group_id,
11
+ owner_session_id,
12
+ workspace_id,
13
+ source_workspace_id,
14
+ branch_name,
15
+ base_ref,
16
+ base_commit,
17
+ head_commit,
18
+ lifecycle_status,
19
+ promoted_at,
20
+ removed_at,
21
+ created_at,
22
+ updated_at
23
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
24
+ .run(record.id, record.groupId, record.ownerSessionId, record.workspaceId, record.sourceWorkspaceId, record.branchName, record.baseRef, record.baseCommit, record.headCommit, record.lifecycleStatus, record.promotedAt, record.removedAt, record.createdAt, record.updatedAt);
25
+ return record;
26
+ }
27
+ update(record) {
28
+ this.db
29
+ .prepare(`UPDATE session_isolated_workspaces
30
+ SET group_id = ?,
31
+ owner_session_id = ?,
32
+ workspace_id = ?,
33
+ source_workspace_id = ?,
34
+ branch_name = ?,
35
+ base_ref = ?,
36
+ base_commit = ?,
37
+ head_commit = ?,
38
+ lifecycle_status = ?,
39
+ promoted_at = ?,
40
+ removed_at = ?,
41
+ created_at = ?,
42
+ updated_at = ?
43
+ WHERE id = ?`)
44
+ .run(record.groupId, record.ownerSessionId, record.workspaceId, record.sourceWorkspaceId, record.branchName, record.baseRef, record.baseCommit, record.headCommit, record.lifecycleStatus, record.promotedAt, record.removedAt, record.createdAt, record.updatedAt, record.id);
45
+ return this.findById(record.id);
46
+ }
47
+ findById(id) {
48
+ const row = this.db
49
+ .prepare(`SELECT
50
+ id,
51
+ group_id,
52
+ owner_session_id,
53
+ workspace_id,
54
+ source_workspace_id,
55
+ branch_name,
56
+ base_ref,
57
+ base_commit,
58
+ head_commit,
59
+ lifecycle_status,
60
+ promoted_at,
61
+ removed_at,
62
+ created_at,
63
+ updated_at
64
+ FROM session_isolated_workspaces
65
+ WHERE id = ?`)
66
+ .get(id);
67
+ return row ? mapSessionIsolatedWorkspaceRow(row) : null;
68
+ }
69
+ findByOwnerSessionId(ownerSessionId) {
70
+ const row = this.db
71
+ .prepare(`SELECT
72
+ id,
73
+ group_id,
74
+ owner_session_id,
75
+ workspace_id,
76
+ source_workspace_id,
77
+ branch_name,
78
+ base_ref,
79
+ base_commit,
80
+ head_commit,
81
+ lifecycle_status,
82
+ promoted_at,
83
+ removed_at,
84
+ created_at,
85
+ updated_at
86
+ FROM session_isolated_workspaces
87
+ WHERE owner_session_id = ?`)
88
+ .get(ownerSessionId);
89
+ return row ? mapSessionIsolatedWorkspaceRow(row) : null;
90
+ }
91
+ findByWorkspaceId(workspaceId) {
92
+ const row = this.db
93
+ .prepare(`SELECT
94
+ id,
95
+ group_id,
96
+ owner_session_id,
97
+ workspace_id,
98
+ source_workspace_id,
99
+ branch_name,
100
+ base_ref,
101
+ base_commit,
102
+ head_commit,
103
+ lifecycle_status,
104
+ promoted_at,
105
+ removed_at,
106
+ created_at,
107
+ updated_at
108
+ FROM session_isolated_workspaces
109
+ WHERE workspace_id = ?`)
110
+ .get(workspaceId);
111
+ return row ? mapSessionIsolatedWorkspaceRow(row) : null;
112
+ }
113
+ listByGroupId(groupId) {
114
+ return this.db
115
+ .prepare(`SELECT
116
+ id,
117
+ group_id,
118
+ owner_session_id,
119
+ workspace_id,
120
+ source_workspace_id,
121
+ branch_name,
122
+ base_ref,
123
+ base_commit,
124
+ head_commit,
125
+ lifecycle_status,
126
+ promoted_at,
127
+ removed_at,
128
+ created_at,
129
+ updated_at
130
+ FROM session_isolated_workspaces
131
+ WHERE group_id = ?
132
+ ORDER BY created_at ASC`)
133
+ .all(groupId)
134
+ .map((row) => mapSessionIsolatedWorkspaceRow(row));
135
+ }
136
+ listByOwnerSessionIds(ownerSessionIds) {
137
+ if (ownerSessionIds.length === 0) {
138
+ return [];
139
+ }
140
+ const placeholders = ownerSessionIds.map(() => "?").join(", ");
141
+ return this.db
142
+ .prepare(`SELECT
143
+ id,
144
+ group_id,
145
+ owner_session_id,
146
+ workspace_id,
147
+ source_workspace_id,
148
+ branch_name,
149
+ base_ref,
150
+ base_commit,
151
+ head_commit,
152
+ lifecycle_status,
153
+ promoted_at,
154
+ removed_at,
155
+ created_at,
156
+ updated_at
157
+ FROM session_isolated_workspaces
158
+ WHERE owner_session_id IN (${placeholders})`)
159
+ .all(...ownerSessionIds)
160
+ .map((row) => mapSessionIsolatedWorkspaceRow(row));
161
+ }
162
+ listByLifecycleStatuses(lifecycleStatuses) {
163
+ if (lifecycleStatuses.length === 0) {
164
+ return [];
165
+ }
166
+ const placeholders = lifecycleStatuses.map(() => "?").join(", ");
167
+ return this.db
168
+ .prepare(`SELECT
169
+ id,
170
+ group_id,
171
+ owner_session_id,
172
+ workspace_id,
173
+ source_workspace_id,
174
+ branch_name,
175
+ base_ref,
176
+ base_commit,
177
+ head_commit,
178
+ lifecycle_status,
179
+ promoted_at,
180
+ removed_at,
181
+ created_at,
182
+ updated_at
183
+ FROM session_isolated_workspaces
184
+ WHERE lifecycle_status IN (${placeholders})`)
185
+ .all(...lifecycleStatuses)
186
+ .map((row) => mapSessionIsolatedWorkspaceRow(row));
187
+ }
188
+ listBySourceWorkspaceId(sourceWorkspaceId) {
189
+ return this.db
190
+ .prepare(`SELECT
191
+ id,
192
+ group_id,
193
+ owner_session_id,
194
+ workspace_id,
195
+ source_workspace_id,
196
+ branch_name,
197
+ base_ref,
198
+ base_commit,
199
+ head_commit,
200
+ lifecycle_status,
201
+ promoted_at,
202
+ removed_at,
203
+ created_at,
204
+ updated_at
205
+ FROM session_isolated_workspaces
206
+ WHERE source_workspace_id = ?
207
+ ORDER BY created_at ASC`)
208
+ .all(sourceWorkspaceId)
209
+ .map((row) => mapSessionIsolatedWorkspaceRow(row));
210
+ }
211
+ }
212
+ function mapSessionIsolatedWorkspaceRow(row) {
213
+ return {
214
+ id: row.id,
215
+ groupId: row.group_id,
216
+ ownerSessionId: row.owner_session_id,
217
+ workspaceId: row.workspace_id,
218
+ sourceWorkspaceId: row.source_workspace_id,
219
+ branchName: row.branch_name,
220
+ baseRef: row.base_ref,
221
+ baseCommit: row.base_commit,
222
+ headCommit: row.head_commit,
223
+ lifecycleStatus: row.lifecycle_status,
224
+ promotedAt: row.promoted_at,
225
+ removedAt: row.removed_at,
226
+ createdAt: row.created_at,
227
+ updatedAt: row.updated_at
228
+ };
229
+ }
230
+ //# sourceMappingURL=session-isolated-workspace-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-isolated-workspace-repository.js","sourceRoot":"","sources":["../../../../src/storage/repositories/session-isolated-workspace-repository.ts"],"names":[],"mappings":"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"}
@@ -236,6 +236,79 @@ CREATE INDEX IF NOT EXISTS idx_session_forks_parent_session_id
236
236
  CREATE INDEX IF NOT EXISTS idx_session_forks_source_message_id
237
237
  ON session_forks(fork_source_message_id);
238
238
 
239
+ CREATE TABLE IF NOT EXISTS parallel_session_groups (
240
+ id TEXT PRIMARY KEY,
241
+ workspace_id TEXT NOT NULL,
242
+ source_type TEXT NOT NULL CHECK (source_type IN ('fork', 'new')),
243
+ source_session_id TEXT,
244
+ source_message_id TEXT,
245
+ shared_prompt TEXT,
246
+ requested_count INTEGER NOT NULL CHECK (requested_count BETWEEN 2 AND 4),
247
+ anchor_session_id TEXT,
248
+ status TEXT NOT NULL CHECK (status IN ('active', 'deleting', 'deleted')),
249
+ created_by_user_id TEXT NOT NULL,
250
+ created_at TEXT NOT NULL,
251
+ updated_at TEXT NOT NULL,
252
+ deleted_at TEXT,
253
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id),
254
+ FOREIGN KEY (created_by_user_id) REFERENCES auth_users(id)
255
+ );
256
+
257
+ CREATE INDEX IF NOT EXISTS idx_parallel_session_groups_workspace_id
258
+ ON parallel_session_groups(workspace_id, status, updated_at DESC);
259
+ CREATE INDEX IF NOT EXISTS idx_parallel_session_groups_anchor_session_id
260
+ ON parallel_session_groups(anchor_session_id);
261
+
262
+ CREATE TABLE IF NOT EXISTS parallel_session_members (
263
+ group_id TEXT NOT NULL,
264
+ session_id TEXT NOT NULL PRIMARY KEY,
265
+ ordinal INTEGER NOT NULL CHECK (ordinal >= 0),
266
+ role TEXT NOT NULL CHECK (role IN ('anchor', 'member')),
267
+ provider TEXT NOT NULL,
268
+ model TEXT,
269
+ member_prompt TEXT,
270
+ workspace_isolation_mode TEXT NOT NULL CHECK (
271
+ workspace_isolation_mode IN ('none', 'temporary_worktree')
272
+ ),
273
+ temporary_workspace_id TEXT,
274
+ created_at TEXT NOT NULL,
275
+ updated_at TEXT NOT NULL,
276
+ deleted_at TEXT,
277
+ FOREIGN KEY (group_id) REFERENCES parallel_session_groups(id) ON DELETE CASCADE
278
+ );
279
+
280
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_parallel_session_members_group_ordinal
281
+ ON parallel_session_members(group_id, ordinal);
282
+ CREATE INDEX IF NOT EXISTS idx_parallel_session_members_group_id
283
+ ON parallel_session_members(group_id, deleted_at, ordinal ASC);
284
+
285
+ CREATE TABLE IF NOT EXISTS session_isolated_workspaces (
286
+ id TEXT PRIMARY KEY,
287
+ group_id TEXT NOT NULL,
288
+ owner_session_id TEXT NOT NULL UNIQUE,
289
+ workspace_id TEXT NOT NULL,
290
+ source_workspace_id TEXT NOT NULL,
291
+ branch_name TEXT NOT NULL,
292
+ base_ref TEXT NOT NULL,
293
+ base_commit TEXT NOT NULL,
294
+ head_commit TEXT,
295
+ lifecycle_status TEXT NOT NULL CHECK (
296
+ lifecycle_status IN ('active', 'promoted', 'removing', 'removed')
297
+ ),
298
+ promoted_at TEXT,
299
+ removed_at TEXT,
300
+ created_at TEXT NOT NULL,
301
+ updated_at TEXT NOT NULL,
302
+ FOREIGN KEY (group_id) REFERENCES parallel_session_groups(id) ON DELETE CASCADE,
303
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id),
304
+ FOREIGN KEY (source_workspace_id) REFERENCES workspaces(id)
305
+ );
306
+
307
+ CREATE INDEX IF NOT EXISTS idx_session_isolated_workspaces_group_id
308
+ ON session_isolated_workspaces(group_id, lifecycle_status, updated_at DESC);
309
+ CREATE INDEX IF NOT EXISTS idx_session_isolated_workspaces_workspace_id
310
+ ON session_isolated_workspaces(workspace_id, lifecycle_status, updated_at DESC);
311
+
239
312
  CREATE TABLE IF NOT EXISTS session_changed_files (
240
313
  session_id TEXT NOT NULL,
241
314
  workspace_id TEXT NOT NULL,