@itphx/synth-core 0.3.0 → 0.4.4

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 (187) hide show
  1. package/dist/auth/local.d.ts +14 -0
  2. package/dist/auth/local.d.ts.map +1 -1
  3. package/dist/auth/local.js +63 -11
  4. package/dist/auth/local.js.map +1 -1
  5. package/dist/auth/local.test.js +59 -0
  6. package/dist/auth/local.test.js.map +1 -1
  7. package/dist/events/bus.d.ts +7 -0
  8. package/dist/events/bus.d.ts.map +1 -1
  9. package/dist/events/bus.js +26 -3
  10. package/dist/events/bus.js.map +1 -1
  11. package/dist/events/bus.test.js +46 -0
  12. package/dist/events/bus.test.js.map +1 -1
  13. package/dist/index.d.ts +3 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/main.js +247 -8
  18. package/dist/main.js.map +1 -1
  19. package/dist/providers/index.d.ts +1 -0
  20. package/dist/providers/index.d.ts.map +1 -1
  21. package/dist/providers/index.js +4 -0
  22. package/dist/providers/index.js.map +1 -1
  23. package/dist/providers/remote.d.ts +60 -0
  24. package/dist/providers/remote.d.ts.map +1 -0
  25. package/dist/providers/remote.js +394 -0
  26. package/dist/providers/remote.js.map +1 -0
  27. package/dist/providers/remote.test.d.ts +2 -0
  28. package/dist/providers/remote.test.d.ts.map +1 -0
  29. package/dist/providers/remote.test.js +258 -0
  30. package/dist/providers/remote.test.js.map +1 -0
  31. package/dist/remote/aggregate.d.ts +43 -0
  32. package/dist/remote/aggregate.d.ts.map +1 -0
  33. package/dist/remote/aggregate.js +84 -0
  34. package/dist/remote/aggregate.js.map +1 -0
  35. package/dist/remote/aggregate.test.d.ts +2 -0
  36. package/dist/remote/aggregate.test.d.ts.map +1 -0
  37. package/dist/remote/aggregate.test.js +120 -0
  38. package/dist/remote/aggregate.test.js.map +1 -0
  39. package/dist/remote/client.d.ts +142 -0
  40. package/dist/remote/client.d.ts.map +1 -0
  41. package/dist/remote/client.js +290 -0
  42. package/dist/remote/client.js.map +1 -0
  43. package/dist/remote/client.test.d.ts +2 -0
  44. package/dist/remote/client.test.d.ts.map +1 -0
  45. package/dist/remote/client.test.js +176 -0
  46. package/dist/remote/client.test.js.map +1 -0
  47. package/dist/remote/connection.d.ts +66 -0
  48. package/dist/remote/connection.d.ts.map +1 -0
  49. package/dist/remote/connection.js +298 -0
  50. package/dist/remote/connection.js.map +1 -0
  51. package/dist/remote/connection.test.d.ts +2 -0
  52. package/dist/remote/connection.test.d.ts.map +1 -0
  53. package/dist/remote/connection.test.js +323 -0
  54. package/dist/remote/connection.test.js.map +1 -0
  55. package/dist/remote/credentials.d.ts +13 -0
  56. package/dist/remote/credentials.d.ts.map +1 -0
  57. package/dist/remote/credentials.js +81 -0
  58. package/dist/remote/credentials.js.map +1 -0
  59. package/dist/remote/credentials.test.d.ts +2 -0
  60. package/dist/remote/credentials.test.d.ts.map +1 -0
  61. package/dist/remote/credentials.test.js +69 -0
  62. package/dist/remote/credentials.test.js.map +1 -0
  63. package/dist/remote/device-flow.d.ts +72 -0
  64. package/dist/remote/device-flow.d.ts.map +1 -0
  65. package/dist/remote/device-flow.js +229 -0
  66. package/dist/remote/device-flow.js.map +1 -0
  67. package/dist/remote/device-flow.test.d.ts +2 -0
  68. package/dist/remote/device-flow.test.d.ts.map +1 -0
  69. package/dist/remote/device-flow.test.js +103 -0
  70. package/dist/remote/device-flow.test.js.map +1 -0
  71. package/dist/remote/event-bridge.d.ts +46 -0
  72. package/dist/remote/event-bridge.d.ts.map +1 -0
  73. package/dist/remote/event-bridge.js +218 -0
  74. package/dist/remote/event-bridge.js.map +1 -0
  75. package/dist/remote/event-bridge.test.d.ts +2 -0
  76. package/dist/remote/event-bridge.test.d.ts.map +1 -0
  77. package/dist/remote/event-bridge.test.js +240 -0
  78. package/dist/remote/event-bridge.test.js.map +1 -0
  79. package/dist/remote/index.d.ts +19 -0
  80. package/dist/remote/index.d.ts.map +1 -0
  81. package/dist/remote/index.js +11 -0
  82. package/dist/remote/index.js.map +1 -0
  83. package/dist/remote/session.d.ts +72 -0
  84. package/dist/remote/session.d.ts.map +1 -0
  85. package/dist/remote/session.js +248 -0
  86. package/dist/remote/session.js.map +1 -0
  87. package/dist/remote/session.test.d.ts +2 -0
  88. package/dist/remote/session.test.d.ts.map +1 -0
  89. package/dist/remote/session.test.js +482 -0
  90. package/dist/remote/session.test.js.map +1 -0
  91. package/dist/remote/transfer.d.ts +75 -0
  92. package/dist/remote/transfer.d.ts.map +1 -0
  93. package/dist/remote/transfer.js +491 -0
  94. package/dist/remote/transfer.js.map +1 -0
  95. package/dist/remote/transfer.test.d.ts +2 -0
  96. package/dist/remote/transfer.test.d.ts.map +1 -0
  97. package/dist/remote/transfer.test.js +416 -0
  98. package/dist/remote/transfer.test.js.map +1 -0
  99. package/dist/remote/types.d.ts +28 -0
  100. package/dist/remote/types.d.ts.map +1 -0
  101. package/dist/remote/types.js +10 -0
  102. package/dist/remote/types.js.map +1 -0
  103. package/dist/server/app.d.ts +62 -1
  104. package/dist/server/app.d.ts.map +1 -1
  105. package/dist/server/app.js +364 -20
  106. package/dist/server/app.js.map +1 -1
  107. package/dist/server/app.proxy.test.d.ts +2 -0
  108. package/dist/server/app.proxy.test.d.ts.map +1 -0
  109. package/dist/server/app.proxy.test.js +193 -0
  110. package/dist/server/app.proxy.test.js.map +1 -0
  111. package/dist/server/app.remote.test.d.ts +2 -0
  112. package/dist/server/app.remote.test.d.ts.map +1 -0
  113. package/dist/server/app.remote.test.js +674 -0
  114. package/dist/server/app.remote.test.js.map +1 -0
  115. package/dist/server/proxy.d.ts +14 -0
  116. package/dist/server/proxy.d.ts.map +1 -0
  117. package/dist/server/proxy.js +93 -0
  118. package/dist/server/proxy.js.map +1 -0
  119. package/dist/server/routes/auth.d.ts +26 -2
  120. package/dist/server/routes/auth.d.ts.map +1 -1
  121. package/dist/server/routes/auth.js +269 -36
  122. package/dist/server/routes/auth.js.map +1 -1
  123. package/dist/server/routes/auth.test.d.ts +2 -0
  124. package/dist/server/routes/auth.test.d.ts.map +1 -0
  125. package/dist/server/routes/auth.test.js +466 -0
  126. package/dist/server/routes/auth.test.js.map +1 -0
  127. package/dist/server/routes/fs.d.ts +2 -1
  128. package/dist/server/routes/fs.d.ts.map +1 -1
  129. package/dist/server/routes/fs.js +159 -5
  130. package/dist/server/routes/fs.js.map +1 -1
  131. package/dist/server/routes/hybrid.d.ts +32 -0
  132. package/dist/server/routes/hybrid.d.ts.map +1 -0
  133. package/dist/server/routes/hybrid.js +21 -0
  134. package/dist/server/routes/hybrid.js.map +1 -0
  135. package/dist/server/routes/hybrid.test.d.ts +2 -0
  136. package/dist/server/routes/hybrid.test.d.ts.map +1 -0
  137. package/dist/server/routes/hybrid.test.js +454 -0
  138. package/dist/server/routes/hybrid.test.js.map +1 -0
  139. package/dist/server/routes/messages.d.ts +2 -1
  140. package/dist/server/routes/messages.d.ts.map +1 -1
  141. package/dist/server/routes/messages.js +104 -1
  142. package/dist/server/routes/messages.js.map +1 -1
  143. package/dist/server/routes/models.cache.test.d.ts +2 -0
  144. package/dist/server/routes/models.cache.test.d.ts.map +1 -0
  145. package/dist/server/routes/models.cache.test.js +59 -0
  146. package/dist/server/routes/models.cache.test.js.map +1 -0
  147. package/dist/server/routes/models.d.ts +9 -1
  148. package/dist/server/routes/models.d.ts.map +1 -1
  149. package/dist/server/routes/models.js +35 -2
  150. package/dist/server/routes/models.js.map +1 -1
  151. package/dist/server/routes/models.remote.test.d.ts +2 -0
  152. package/dist/server/routes/models.remote.test.d.ts.map +1 -0
  153. package/dist/server/routes/models.remote.test.js +101 -0
  154. package/dist/server/routes/models.remote.test.js.map +1 -0
  155. package/dist/server/routes/project-transfer.d.ts +16 -0
  156. package/dist/server/routes/project-transfer.d.ts.map +1 -0
  157. package/dist/server/routes/project-transfer.js +141 -0
  158. package/dist/server/routes/project-transfer.js.map +1 -0
  159. package/dist/server/routes/project-transfer.test.d.ts +2 -0
  160. package/dist/server/routes/project-transfer.test.d.ts.map +1 -0
  161. package/dist/server/routes/project-transfer.test.js +199 -0
  162. package/dist/server/routes/project-transfer.test.js.map +1 -0
  163. package/dist/server/routes/projects.d.ts +2 -1
  164. package/dist/server/routes/projects.d.ts.map +1 -1
  165. package/dist/server/routes/projects.js +101 -5
  166. package/dist/server/routes/projects.js.map +1 -1
  167. package/dist/server/routes/providers.d.ts +1 -1
  168. package/dist/server/routes/providers.d.ts.map +1 -1
  169. package/dist/server/routes/providers.js +3 -1
  170. package/dist/server/routes/providers.js.map +1 -1
  171. package/dist/server/routes/providers.test.d.ts +2 -0
  172. package/dist/server/routes/providers.test.d.ts.map +1 -0
  173. package/dist/server/routes/providers.test.js +58 -0
  174. package/dist/server/routes/providers.test.js.map +1 -0
  175. package/dist/server/routes/queue.d.ts +2 -1
  176. package/dist/server/routes/queue.d.ts.map +1 -1
  177. package/dist/server/routes/queue.js +89 -1
  178. package/dist/server/routes/queue.js.map +1 -1
  179. package/dist/server/routes/sessions.d.ts +8 -1
  180. package/dist/server/routes/sessions.d.ts.map +1 -1
  181. package/dist/server/routes/sessions.js +202 -9
  182. package/dist/server/routes/sessions.js.map +1 -1
  183. package/dist/server/serialize.d.ts +2 -0
  184. package/dist/server/serialize.d.ts.map +1 -1
  185. package/dist/server/serialize.js +2 -0
  186. package/dist/server/serialize.js.map +1 -1
  187. package/package.json +6 -2
@@ -0,0 +1,491 @@
1
+ // Операции переноса проектов между мирами (гибридный режим, часть 8):
2
+ // publish — локальный проект → удалённый backend (проект + сессии + файлы);
3
+ // fork — удалённый проект → локальный мир (проект + сессии + файлы).
4
+ // Файлы переносятся прямой синхронизацией (не git): текстовые — через fsWrite,
5
+ // бинарные — через fsUpload (publish) / fsDownload (fork).
6
+ import { readdir, readFile, stat, mkdir, writeFile } from 'node:fs/promises';
7
+ import { join, dirname, basename, isAbsolute, normalize, resolve } from 'node:path';
8
+ /** Каталоги, исключаемые из прямой синхронизации файлов. */
9
+ export const EXCLUDED_DIRS = new Set(['node_modules', '.git', '.synth']);
10
+ /** Преобразовать имя проекта в безопасное относительное имя workspace. */
11
+ export function slugify(name) {
12
+ const slug = (name || 'project')
13
+ .toLowerCase()
14
+ .trim()
15
+ .replace(/[^a-z0-9]+/gi, '-')
16
+ .replace(/^-+|-+$/g, '')
17
+ .replace(/-+/g, '-');
18
+ return slug || 'project';
19
+ }
20
+ /** Резолв локального каталога workspace проекта (абсолютный — как есть, относительный — относительно workspacesRoot). */
21
+ export function resolveLocalWorkspace(project, workspacesRoot, defaultWorkingDir) {
22
+ if (project.workspace) {
23
+ return isAbsolute(project.workspace)
24
+ ? normalize(project.workspace)
25
+ : resolve(workspacesRoot, project.workspace);
26
+ }
27
+ return defaultWorkingDir;
28
+ }
29
+ /** true, если содержимое буфера выглядит бинарным (есть NUL-байт, без UTF-16 BOM). */
30
+ export function isBinaryBuffer(buf) {
31
+ if (buf.length >= 2 && ((buf[0] === 0xff && buf[1] === 0xfe) || (buf[0] === 0xfe && buf[1] === 0xff))) {
32
+ return false;
33
+ }
34
+ return buf.includes(0);
35
+ }
36
+ /**
37
+ * Рекурсивный обход локального каталога. Возвращает отсортированный список
38
+ * относительных POSIX-путей файлов. Исключаются: скрытые файлы/каталоги
39
+ * (имя начинается с '.' — в т.ч. .git/.synth) и EXCLUDED_DIRS (node_modules).
40
+ */
41
+ export async function walkDir(dir, relPrefix = '') {
42
+ const out = [];
43
+ let entries;
44
+ try {
45
+ entries = await readdir(dir, { withFileTypes: true });
46
+ }
47
+ catch {
48
+ return out; // каталог не существует/не читается — нечего синхронизировать
49
+ }
50
+ for (const entry of entries) {
51
+ const name = entry.name;
52
+ if (name.startsWith('.'))
53
+ continue;
54
+ if (EXCLUDED_DIRS.has(name))
55
+ continue;
56
+ const rel = relPrefix ? `${relPrefix}/${name}` : name;
57
+ if (entry.isDirectory()) {
58
+ out.push(...(await walkDir(join(dir, name), rel)));
59
+ }
60
+ else if (entry.isFile()) {
61
+ out.push(rel);
62
+ }
63
+ }
64
+ return out.sort();
65
+ }
66
+ /**
67
+ * Рекурсивный обход workspace удалённого проекта через fsList. Возвращает
68
+ * список относительных POSIX-путей файлов (аккумулятор acc передаётся по ссылке).
69
+ * Применяются те же исключения, что и в walkDir.
70
+ */
71
+ export async function remoteWalk(remoteClient, projectId, path, acc) {
72
+ const data = (await remoteClient.fsList({ projectId, path }));
73
+ const entries = Array.isArray(data?.entries) ? data.entries : [];
74
+ for (const entry of entries) {
75
+ const name = entry.name;
76
+ if (name.startsWith('.'))
77
+ continue;
78
+ if (EXCLUDED_DIRS.has(name))
79
+ continue;
80
+ if (entry.isDirectory) {
81
+ await remoteWalk(remoteClient, projectId, entry.path, acc);
82
+ }
83
+ else {
84
+ acc.push(entry.path);
85
+ }
86
+ }
87
+ return acc.sort();
88
+ }
89
+ /** Собрать тело экспорта сессии из локального объекта Session (camelCase). */
90
+ export function buildSessionExport(session) {
91
+ return { ...session };
92
+ }
93
+ /** Идентификаторы сессий, на которые ссылается сессия: parentId, references[].sessionId, session_reference-части сообщений. */
94
+ function collectReferencedSessionIds(session) {
95
+ const out = new Set();
96
+ if (typeof session.parentId === 'string' && session.parentId)
97
+ out.add(session.parentId);
98
+ for (const ref of session.references ?? []) {
99
+ if (typeof ref.sessionId === 'string' && ref.sessionId)
100
+ out.add(ref.sessionId);
101
+ }
102
+ for (const m of session.messages ?? []) {
103
+ for (const p of m.parts ?? []) {
104
+ if (p.type !== 'session_reference' || !p.data || typeof p.data !== 'object')
105
+ continue;
106
+ const d = p.data;
107
+ const sid = d.sessionId ?? d.session_id;
108
+ if (typeof sid === 'string' && sid)
109
+ out.add(sid);
110
+ }
111
+ }
112
+ return [...out];
113
+ }
114
+ /**
115
+ * Упорядочить сессии так, чтобы зависимости (parentId/references) импортировались
116
+ * раньше ссылающихся на них. Нужно для publish/fork: remote-id создаётся в момент
117
+ * импорта, поэтому к моменту переноса дочерней сессии mapping родителя уже известен.
118
+ * Циклы (взаимные ссылки) добавляются в исходном порядке — их ссылки останутся локальными.
119
+ */
120
+ function orderSessionsForTransfer(sessions) {
121
+ if (sessions.length <= 1)
122
+ return sessions;
123
+ const byId = new Map(sessions.map((s) => [s.id, s]));
124
+ const localIds = new Set(byId.keys());
125
+ const deps = new Map();
126
+ const dependents = new Map();
127
+ for (const s of sessions) {
128
+ const refs = collectReferencedSessionIds(s).filter((id) => localIds.has(id) && id !== s.id);
129
+ deps.set(s.id, refs);
130
+ for (const dep of refs) {
131
+ const arr = dependents.get(dep) ?? [];
132
+ arr.push(s.id);
133
+ dependents.set(dep, arr);
134
+ }
135
+ }
136
+ const indegree = new Map();
137
+ for (const s of sessions)
138
+ indegree.set(s.id, (deps.get(s.id) ?? []).length);
139
+ const originalIndex = new Map(sessions.map((s, i) => [s.id, i]));
140
+ const queue = sessions.filter((s) => (indegree.get(s.id) ?? 0) === 0).map((s) => s.id);
141
+ const order = [];
142
+ while (queue.length > 0) {
143
+ // Стабильный порядок: в рамках уровня — по исходному индексу.
144
+ queue.sort((a, b) => (originalIndex.get(a) ?? 0) - (originalIndex.get(b) ?? 0));
145
+ const id = queue.shift();
146
+ order.push(id);
147
+ for (const dependent of dependents.get(id) ?? []) {
148
+ const deg = (indegree.get(dependent) ?? 0) - 1;
149
+ indegree.set(dependent, deg);
150
+ if (deg === 0)
151
+ queue.push(dependent);
152
+ }
153
+ }
154
+ if (order.length < sessions.length) {
155
+ for (const s of sessions)
156
+ if (!order.includes(s.id))
157
+ order.push(s.id);
158
+ }
159
+ return order.map((id) => byId.get(id));
160
+ }
161
+ /** Переписать sessionId в session_reference-части сообщения по mapping (не перенесено → null). */
162
+ function rewriteReferencePart(p, mapping) {
163
+ if (!p || typeof p !== 'object')
164
+ return p;
165
+ const part = p;
166
+ if (part.type !== 'session_reference' || !part.data || typeof part.data !== 'object')
167
+ return part;
168
+ const d = { ...part.data };
169
+ const sid = d.sessionId ?? d.session_id;
170
+ if (typeof sid === 'string') {
171
+ d.sessionId = mapping.get(sid) ?? null;
172
+ delete d.session_id;
173
+ }
174
+ return { ...part, data: d };
175
+ }
176
+ /**
177
+ * Переписать ссылки экспорта сессии при publish: parentId/references[].sessionId
178
+ * и session_reference-части сообщений получают новые remote-id из mapping.
179
+ * Ссылки на сессии вне переносимого набора зануляются (иначе битые ссылки на
180
+ * несуществующие id). sourceMsgId валиден только если сообщение есть в переносимом
181
+ * наборе (id сообщений при импорте сохраняются) — иначе зануляется.
182
+ */
183
+ function rewriteSessionExportForRemote(session, mapping, transferredMessageIds) {
184
+ const out = buildSessionExport(session);
185
+ if (typeof out.parentId === 'string') {
186
+ out.parentId = mapping.get(out.parentId) ?? null;
187
+ }
188
+ if (Array.isArray(out.references)) {
189
+ out.references = out.references.map((ref) => {
190
+ if (ref && typeof ref === 'object') {
191
+ const r = { ...ref };
192
+ if (typeof r.sessionId === 'string')
193
+ r.sessionId = mapping.get(r.sessionId) ?? null;
194
+ return r;
195
+ }
196
+ return ref;
197
+ });
198
+ }
199
+ if (Array.isArray(out.messages)) {
200
+ out.messages = out.messages.map((m) => {
201
+ const mm = { ...m };
202
+ if (typeof mm.sourceMsgId === 'string' && !transferredMessageIds.has(mm.sourceMsgId)) {
203
+ mm.sourceMsgId = null;
204
+ }
205
+ if (Array.isArray(mm.parts)) {
206
+ mm.parts = mm.parts.map((p) => rewriteReferencePart(p, mapping));
207
+ }
208
+ return mm;
209
+ });
210
+ }
211
+ return out;
212
+ }
213
+ /**
214
+ * Publish: локальный проект → сервер.
215
+ * 1. Создать/обновить проект на сервере (без локального workspace-пути —
216
+ * на сервере задаётся свой workspace: slug(name) для нового, существующий
217
+ * для --remote-project). Каталог workspace создаётся через fs/workspace-root/mkdir.
218
+ * 2. Сессии: каждая localSession → importSession({ ...export, import: { project_id } }).
219
+ * 3. Файлы: walkDir(localProjectDir) → fsWrite (текст) / fsUpload (бинарные).
220
+ */
221
+ export async function syncProjectToRemote(opts) {
222
+ const { localProject, remoteClient, remoteProjectId, includeFiles, includeSessions, localProjectDir, localSessions, log, } = opts;
223
+ const logger = log ?? (() => { });
224
+ let targetProjectId = remoteProjectId;
225
+ let targetWorkspace;
226
+ let created = false;
227
+ if (targetProjectId) {
228
+ const existing = (await remoteClient.getProject(targetProjectId));
229
+ targetWorkspace = typeof existing.workspace === 'string' ? existing.workspace : undefined;
230
+ await remoteClient.updateProject(targetProjectId, {
231
+ name: localProject.name,
232
+ description: localProject.description,
233
+ icon: localProject.icon ?? null,
234
+ color: localProject.color ?? null,
235
+ repos: localProject.repos ?? null,
236
+ ...(localProject.plan ? { plan: localProject.plan } : {}),
237
+ });
238
+ logger(`Проект обновлён на сервере: ${targetProjectId}`);
239
+ }
240
+ else {
241
+ const workspace = slugify(localProject.name);
242
+ // Backend валидирует workspace при создании проекта (каталог должен
243
+ // существовать на диске) — создаём каталог в корне workspace до createProject.
244
+ if (includeFiles) {
245
+ await remoteClient.fsWorkspaceMkdir({ path: workspace }).catch(() => {
246
+ // Каталог уже существует (409 ALREADY_EXISTS) — это не ошибка.
247
+ });
248
+ }
249
+ const createdProj = (await remoteClient.createProject({
250
+ name: localProject.name,
251
+ description: localProject.description,
252
+ icon: localProject.icon ?? null,
253
+ color: localProject.color ?? null,
254
+ repos: localProject.repos ?? null,
255
+ workspace,
256
+ ...(localProject.plan ? { plan: localProject.plan } : {}),
257
+ }));
258
+ targetProjectId = String(createdProj.id ?? createdProj.project_id ?? '');
259
+ targetWorkspace = workspace;
260
+ created = true;
261
+ logger(`Проект создан на сервере: ${targetProjectId}`);
262
+ }
263
+ if (!targetProjectId) {
264
+ throw new Error('Не удалось определить ID проекта на сервере');
265
+ }
266
+ // fsWrite на сервере требует, чтобы каталог workspace существовал физически.
267
+ if (includeFiles && targetWorkspace && !created) {
268
+ await remoteClient.fsWorkspaceMkdir({ path: targetWorkspace }).catch(() => {
269
+ // Каталог уже существует (409 ALREADY_EXISTS) — это не ошибка.
270
+ });
271
+ }
272
+ let sessionsImported = 0;
273
+ if (includeSessions) {
274
+ // Mapping локальный id → remote id: remote-id создаётся в момент импорта,
275
+ // поэтому сессии переносим в топологическом порядке (зависимости раньше) и
276
+ // переписываем parentId/references уже известными remote-id.
277
+ const mapping = new Map();
278
+ const transferredMessageIds = new Set();
279
+ for (const s of localSessions) {
280
+ for (const m of s.messages ?? [])
281
+ transferredMessageIds.add(m.id);
282
+ }
283
+ const ordered = orderSessionsForTransfer(localSessions);
284
+ for (const s of ordered) {
285
+ const exportBody = rewriteSessionExportForRemote(s, mapping, transferredMessageIds);
286
+ const created = (await remoteClient.importSession({
287
+ ...exportBody,
288
+ import: { project_id: targetProjectId },
289
+ }));
290
+ const remoteId = String(created?.id ?? '');
291
+ if (remoteId) {
292
+ mapping.set(s.id, remoteId);
293
+ }
294
+ else {
295
+ logger(` сессия ${s.title || s.id}: не получен remote-id — ссылки на неё будут занулены`);
296
+ }
297
+ sessionsImported++;
298
+ logger(` сессия: ${s.title || s.id}`);
299
+ }
300
+ }
301
+ let filesUploaded = 0;
302
+ if (includeFiles) {
303
+ try {
304
+ const s = await stat(localProjectDir);
305
+ if (!s.isDirectory()) {
306
+ throw new Error(`Workspace не является директорией: ${localProjectDir}`);
307
+ }
308
+ }
309
+ catch (err) {
310
+ if (err instanceof Error && err.message.includes('не является директорией'))
311
+ throw err;
312
+ throw new Error(`Каталог workspace не найден: ${localProjectDir}`);
313
+ }
314
+ const files = await walkDir(localProjectDir);
315
+ for (const rel of files) {
316
+ const buf = await readFile(join(localProjectDir, rel));
317
+ if (isBinaryBuffer(buf)) {
318
+ const fd = new FormData();
319
+ fd.append('project_id', targetProjectId);
320
+ fd.append('path', dirname(rel));
321
+ fd.append('file', new Blob([buf]), basename(rel));
322
+ await remoteClient.fsUpload(fd);
323
+ }
324
+ else {
325
+ await remoteClient.fsWrite({ projectId: targetProjectId, path: rel, content: buf.toString('utf-8') });
326
+ }
327
+ filesUploaded++;
328
+ if (filesUploaded % 50 === 0)
329
+ logger(` файлов загружено: ${filesUploaded}`);
330
+ }
331
+ }
332
+ return { projectId: targetProjectId, sessionsImported, filesUploaded, filesDownloaded: 0, created };
333
+ }
334
+ /**
335
+ * Fork: удалённый проект → локально.
336
+ * 1. getProject → создать локальный проект (workspace = {workspacesRoot}/{slug}).
337
+ * 2. Сессии: listSessions(remoteProjectId) → exportSession → createSession + история.
338
+ * 3. Файлы: remoteWalk → fsDownload → запись в локальный workspace.
339
+ */
340
+ export async function forkProjectToLocal(opts) {
341
+ const { remoteProjectId, remoteClient, localProjectStore, localSessionManager, includeFiles, includeSessions, localWorkspacesRoot, localName, log, } = opts;
342
+ const logger = log ?? (() => { });
343
+ const remote = (await remoteClient.getProject(remoteProjectId));
344
+ const name = localName || String(remote.name || 'remote-project');
345
+ const workspaceRel = slugify(name);
346
+ const workspaceAbs = join(localWorkspacesRoot, workspaceRel);
347
+ const localProject = localProjectStore.create(name, 'local', {
348
+ description: typeof remote.description === 'string' ? remote.description : '',
349
+ icon: typeof remote.icon === 'string' && remote.icon ? remote.icon : undefined,
350
+ color: typeof remote.color === 'string' && remote.color ? remote.color : undefined,
351
+ workspace: workspaceRel,
352
+ repos: Array.isArray(remote.repos) ? remote.repos : undefined,
353
+ });
354
+ // Переносим контентные поля проекта: план (AD-039), лог, инварианты, текущую задачу.
355
+ if (remote.plan && typeof remote.plan === 'object')
356
+ localProject.plan = remote.plan;
357
+ if (Array.isArray(remote.log))
358
+ localProject.log = remote.log;
359
+ if (typeof remote.current_task === 'string')
360
+ localProject.currentTask = remote.current_task;
361
+ if (typeof remote.invariants === 'string')
362
+ localProject.invariants = remote.invariants;
363
+ await localProjectStore.save(localProject);
364
+ await mkdir(workspaceAbs, { recursive: true });
365
+ logger(`Проект создан локально: ${localProject.id} (${name}) → ${workspaceAbs}`);
366
+ let sessionsImported = 0;
367
+ if (includeSessions) {
368
+ const remoteSessions = (await remoteClient.listSessions(remoteProjectId));
369
+ // Backend может не отфильтровать по project_id — фильтруем сами.
370
+ const sessionsForProject = remoteSessions.filter((s) => s.project_id === remoteProjectId || s.projectId === remoteProjectId);
371
+ // Сначала экспортируем ВСЕ сессии: нужны их ссылки для упорядочивания (remote-id
372
+ // локальных сессий создаётся в момент createSession) и набор message-id для sourceMsgId.
373
+ const exports = new Map();
374
+ for (const rs of sessionsForProject) {
375
+ const id = String(rs.id ?? '');
376
+ exports.set(id, (await remoteClient.exportSession(id)));
377
+ }
378
+ const remoteShapes = sessionsForProject.map((rs) => {
379
+ const id = String(rs.id ?? '');
380
+ const exp = exports.get(id) ?? {};
381
+ return {
382
+ id,
383
+ parentId: typeof exp.parentId === 'string' ? exp.parentId : undefined,
384
+ references: Array.isArray(exp.references)
385
+ ? exp.references
386
+ : [],
387
+ messages: Array.isArray(exp.messages)
388
+ ? exp.messages
389
+ : [],
390
+ };
391
+ });
392
+ const orderedIds = orderSessionsForTransfer(remoteShapes).map((s) => s.id);
393
+ const transferredMessageIds = new Set();
394
+ for (const exp of exports.values()) {
395
+ for (const m of (Array.isArray(exp.messages) ? exp.messages : [])) {
396
+ if (typeof m.id === 'string')
397
+ transferredMessageIds.add(m.id);
398
+ }
399
+ }
400
+ // Mapping remote id → локальный id для переписывания parentId/references.
401
+ const mapping = new Map();
402
+ for (const id of orderedIds) {
403
+ const exportData = exports.get(id);
404
+ const session = await localSessionManager.createSession({
405
+ title: typeof exportData.title === 'string' ? exportData.title : undefined,
406
+ projectId: localProject.id,
407
+ engine: typeof exportData.engine === 'string'
408
+ ? exportData.engine
409
+ : undefined,
410
+ sessionOrigin: (exportData.session_origin ?? exportData.sessionOrigin),
411
+ settings: (exportData.settings ?? {}),
412
+ });
413
+ // parentId: ссылка на переносимую сессию → новый локальный id; иначе убираем.
414
+ if (typeof exportData.parentId === 'string' && exportData.parentId) {
415
+ session.parentId = mapping.get(exportData.parentId) ?? undefined;
416
+ }
417
+ const messages = Array.isArray(exportData.messages)
418
+ ? exportData.messages.map((m) => ({ ...structuredClone(m), seq: 0 }))
419
+ : [];
420
+ messages.forEach((m, i) => { m.seq = i + 1; });
421
+ // Переписываем ссылки в сообщениях: session_reference-части — по mapping,
422
+ // sourceMsgId — только если сообщение есть в переносимом наборе.
423
+ for (const m of messages) {
424
+ if (typeof m.sourceMsgId === 'string' && !transferredMessageIds.has(m.sourceMsgId)) {
425
+ m.sourceMsgId = undefined;
426
+ }
427
+ m.parts = m.parts.map((p) => rewriteReferencePart(p, mapping));
428
+ }
429
+ session.messages = messages;
430
+ session.pendingMessages = [];
431
+ session.todos = (exportData.todos ?? undefined);
432
+ session.stickyNotes = Array.isArray(exportData.sticky_notes ?? exportData.stickyNotes)
433
+ ? (exportData.sticky_notes ?? exportData.stickyNotes)
434
+ : [];
435
+ session.references = Array.isArray(exportData.references)
436
+ ? exportData.references.map((ref) => ({
437
+ ...ref,
438
+ sessionId: typeof ref.sessionId === 'string'
439
+ ? (mapping.get(ref.sessionId) ?? null)
440
+ : ref.sessionId,
441
+ }))
442
+ : [];
443
+ session.checkpoints = Array.isArray(exportData.checkpoints) ? exportData.checkpoints : [];
444
+ session.mode = (exportData.mode ?? undefined);
445
+ session.planApproved = (exportData.plan_approved ?? exportData.planApproved ?? false);
446
+ session.branchPoint = (exportData.branch_point ?? exportData.branchPoint);
447
+ session.obfuscationMap = (exportData.obfuscation_map ?? exportData.obfuscationMap);
448
+ const createdAt = exportData.created_at ?? exportData.createdAt;
449
+ session.createdAt = typeof createdAt === 'string' ? createdAt : session.createdAt;
450
+ session.status = {};
451
+ session.currentStream = undefined;
452
+ session.summarizationPending = false;
453
+ session.canSummarize = false;
454
+ // Локальные сессии принадлежат локальному пользователю (в standalone core — 'local'):
455
+ // иначе их не вернёт GET /api/v2/sessions (список сессий фильтруется по userId).
456
+ session.userId = 'local';
457
+ session.ownerId = 'local';
458
+ const num = (v, def = 0) => (typeof v === 'number' ? v : def);
459
+ session.inputTokens = num(exportData.input_tokens ?? exportData.inputTokens);
460
+ session.outputTokens = num(exportData.output_tokens ?? exportData.outputTokens);
461
+ session.totalTokens = num(exportData.total_tokens ?? exportData.totalTokens);
462
+ session.cacheReadTokens = num(exportData.cache_read_tokens ?? exportData.cacheReadTokens);
463
+ session.cacheWriteTokens = num(exportData.cache_write_tokens ?? exportData.cacheWriteTokens);
464
+ session.reasoningTokens = num(exportData.reasoning_tokens ?? exportData.reasoningTokens);
465
+ session.inputCost = num(exportData.input_cost ?? exportData.inputCost);
466
+ session.outputCost = num(exportData.output_cost ?? exportData.outputCost);
467
+ session.cacheReadCost = num(exportData.cache_read_cost ?? exportData.cacheReadCost);
468
+ session.cacheWriteCost = num(exportData.cache_write_cost ?? exportData.cacheWriteCost);
469
+ await localSessionManager.saveSession(session);
470
+ mapping.set(id, session.id);
471
+ sessionsImported++;
472
+ logger(` сессия: ${session.title || session.id}`);
473
+ }
474
+ }
475
+ let filesDownloaded = 0;
476
+ if (includeFiles) {
477
+ const files = await remoteWalk(remoteClient, remoteProjectId, '', []);
478
+ for (const rel of files) {
479
+ const res = await remoteClient.fsDownload({ projectId: remoteProjectId, path: rel });
480
+ const buf = Buffer.from(await res.arrayBuffer());
481
+ const abs = join(workspaceAbs, rel);
482
+ await mkdir(dirname(abs), { recursive: true });
483
+ await writeFile(abs, buf);
484
+ filesDownloaded++;
485
+ if (filesDownloaded % 50 === 0)
486
+ logger(` файлов скачано: ${filesDownloaded}`);
487
+ }
488
+ }
489
+ return { projectId: localProject.id, sessionsImported, filesUploaded: 0, filesDownloaded, created: true };
490
+ }
491
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/remote/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transfer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.test.d.ts","sourceRoot":"","sources":["../../src/remote/transfer.test.ts"],"names":[],"mappings":""}