@mrpatronz/nexusflow 2.4.0 → 2.5.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 (168) hide show
  1. package/dist/commands/isolate.d.ts +12 -0
  2. package/dist/commands/isolate.d.ts.map +1 -0
  3. package/dist/commands/isolate.js +78 -0
  4. package/dist/commands/isolate.js.map +1 -0
  5. package/dist/commands/isolate.test.d.ts +2 -0
  6. package/dist/commands/isolate.test.d.ts.map +1 -0
  7. package/dist/commands/isolate.test.js +59 -0
  8. package/dist/commands/isolate.test.js.map +1 -0
  9. package/dist/commands/open.d.ts.map +1 -1
  10. package/dist/commands/open.js +66 -21
  11. package/dist/commands/open.js.map +1 -1
  12. package/dist/commands/ui.d.ts +1 -1
  13. package/dist/commands/ui.d.ts.map +1 -1
  14. package/dist/commands/ui.js +26 -6
  15. package/dist/commands/ui.js.map +1 -1
  16. package/dist/core/config-schema.d.ts +17 -0
  17. package/dist/core/config-schema.d.ts.map +1 -0
  18. package/dist/core/config-schema.js +24 -0
  19. package/dist/core/config-schema.js.map +1 -0
  20. package/dist/core/doctor.d.ts.map +1 -1
  21. package/dist/core/doctor.js +19 -5
  22. package/dist/core/doctor.js.map +1 -1
  23. package/dist/core/isolate.d.ts +31 -0
  24. package/dist/core/isolate.d.ts.map +1 -0
  25. package/dist/core/isolate.js +175 -0
  26. package/dist/core/isolate.js.map +1 -0
  27. package/dist/core/isolate.test.d.ts +2 -0
  28. package/dist/core/isolate.test.d.ts.map +1 -0
  29. package/dist/core/isolate.test.js +290 -0
  30. package/dist/core/isolate.test.js.map +1 -0
  31. package/dist/core/refresh.d.ts.map +1 -1
  32. package/dist/core/refresh.js +35 -1
  33. package/dist/core/refresh.js.map +1 -1
  34. package/dist/core/sync.d.ts.map +1 -1
  35. package/dist/core/sync.js +21 -7
  36. package/dist/core/sync.js.map +1 -1
  37. package/dist/core/workspace.d.ts +6 -0
  38. package/dist/core/workspace.d.ts.map +1 -1
  39. package/dist/core/workspace.js +61 -17
  40. package/dist/core/workspace.js.map +1 -1
  41. package/dist/core/worktree.d.ts.map +1 -1
  42. package/dist/core/worktree.js +7 -0
  43. package/dist/core/worktree.js.map +1 -1
  44. package/dist/desktop-server.js +2 -1
  45. package/dist/desktop-server.js.map +1 -1
  46. package/dist/generators/base.d.ts.map +1 -1
  47. package/dist/generators/base.js +13 -5
  48. package/dist/generators/base.js.map +1 -1
  49. package/dist/generators/base.test.js +1 -1
  50. package/dist/generators/base.test.js.map +1 -1
  51. package/dist/gui/antigravity-logo.png +0 -0
  52. package/dist/gui/assets/AgentsPage-BNHR9qux.js +3 -0
  53. package/dist/gui/assets/CSPContext-BG7no5S_.js +1 -0
  54. package/dist/gui/assets/DashboardPage-BScH3Cxp.js +1 -0
  55. package/dist/gui/assets/{GettingStartedPage-DQ5kCj0q.js → GettingStartedPage-AWlI-176.js} +1 -1
  56. package/dist/gui/assets/ProjectsPage-Bojj7gxI.js +1 -0
  57. package/dist/gui/assets/ScaffoldRepoInline-DJMbeHVM.js +1 -0
  58. package/dist/gui/assets/SettingsPage-BAdXO8X0.js +1 -0
  59. package/dist/gui/assets/SkillsPage-CF6Db1FA.js +6 -0
  60. package/dist/gui/assets/StartWorkPage-BQid3uIw.js +1 -0
  61. package/dist/gui/assets/{StrategiesPage-CkpJI4Q3.js → StrategiesPage-nGbR9TAc.js} +2 -2
  62. package/dist/gui/assets/WorkspacesPage-7XRtVJNF.js +2 -0
  63. package/dist/gui/assets/{alert-dialog-Cjwogh-W.js → alert-dialog-67uzXJi4.js} +1 -1
  64. package/dist/gui/assets/antigravity-logo-DRKQga2U.png +0 -0
  65. package/dist/gui/assets/{badge-BnkhqVEF.js → badge-CAohJGj6.js} +1 -1
  66. package/dist/gui/assets/{bot-wH0FKlic.js → bot-C2HWrAft.js} +1 -1
  67. package/dist/gui/assets/{button-cPldH5S4.js → button-BDDZnIHx.js} +1 -1
  68. package/dist/gui/assets/card-BKXzd_5L.js +1 -0
  69. package/dist/gui/assets/chevron-down-qTL8HPug.js +1 -0
  70. package/dist/gui/assets/{circle-plus-C0PNc7h4.js → circle-plus-lmU1yNJd.js} +1 -1
  71. package/dist/gui/assets/code-xml-jFAa3-TT.js +1 -0
  72. package/dist/gui/assets/{cpu-CPUNnHRM.js → cpu-Cdwd84Jz.js} +1 -1
  73. package/dist/gui/assets/{empty-DWyDwDYB.js → empty-BdlgbifD.js} +1 -1
  74. package/dist/gui/assets/{git-branch-Dw55pQWa.js → git-branch-Cfj9D8yW.js} +1 -1
  75. package/dist/gui/assets/index-CZoZQkeC.css +2 -0
  76. package/dist/gui/assets/index-V1dDX1O_.js +50 -0
  77. package/dist/gui/assets/isElementDisabled-D_fu2zfc.js +1 -0
  78. package/dist/gui/assets/{label-JFgMNsTn.js → label-CG5exjag.js} +1 -1
  79. package/dist/gui/assets/{terminal-D1awFRPr.js → square-DlIYnlSq.js} +1 -1
  80. package/dist/gui/assets/store-D7ixdVck.js +3 -0
  81. package/dist/gui/assets/styles-CVwNuFCx.js +1 -0
  82. package/dist/gui/assets/textarea-BNRuIXNs.js +1 -0
  83. package/dist/gui/assets/{trash-2-Da8F2gKd.js → trash-2-CtR35_eF.js} +1 -1
  84. package/dist/gui/assets/useAriaLabelledBy-DfRdwH8a.js +1 -0
  85. package/dist/gui/assets/useValueChanged-CStSGSsD.js +1 -0
  86. package/dist/gui/assets/vsc-Di05BTNr.js +1 -0
  87. package/dist/gui/assets/zap-CWG_Lvki.js +1 -0
  88. package/dist/gui/index.html +9 -7
  89. package/dist/index.js +22 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/mcp/tools.d.ts.map +1 -1
  92. package/dist/mcp/tools.js +47 -1
  93. package/dist/mcp/tools.js.map +1 -1
  94. package/dist/mcp/tools.test.d.ts +2 -0
  95. package/dist/mcp/tools.test.d.ts.map +1 -0
  96. package/dist/mcp/tools.test.js +70 -0
  97. package/dist/mcp/tools.test.js.map +1 -0
  98. package/dist/orchestration/orchestrator.js +2 -2
  99. package/dist/orchestration/orchestrator.js.map +1 -1
  100. package/dist/orchestration/orchestrator.test.js +1 -1
  101. package/dist/orchestration/orchestrator.test.js.map +1 -1
  102. package/dist/orchestration/runner.d.ts +5 -1
  103. package/dist/orchestration/runner.d.ts.map +1 -1
  104. package/dist/orchestration/runner.js +14 -4
  105. package/dist/orchestration/runner.js.map +1 -1
  106. package/dist/orchestration/runner.test.js +22 -16
  107. package/dist/orchestration/runner.test.js.map +1 -1
  108. package/dist/server.d.ts.map +1 -1
  109. package/dist/server.js +189 -27
  110. package/dist/server.js.map +1 -1
  111. package/dist/server.test.js +220 -7
  112. package/dist/server.test.js.map +1 -1
  113. package/dist/types.d.ts +17 -1
  114. package/dist/types.d.ts.map +1 -1
  115. package/dist/utils/detect-editors.d.ts +1 -7
  116. package/dist/utils/detect-editors.d.ts.map +1 -1
  117. package/dist/utils/detect-editors.js +12 -10
  118. package/dist/utils/detect-editors.js.map +1 -1
  119. package/dist/utils/detect-editors.test.js +58 -25
  120. package/dist/utils/detect-editors.test.js.map +1 -1
  121. package/dist/utils/feature.d.ts +10 -1
  122. package/dist/utils/feature.d.ts.map +1 -1
  123. package/dist/utils/feature.js +36 -4
  124. package/dist/utils/feature.js.map +1 -1
  125. package/dist/utils/open-editor.d.ts +1 -1
  126. package/dist/utils/open-editor.d.ts.map +1 -1
  127. package/dist/utils/open-editor.js +11 -2
  128. package/dist/utils/open-editor.js.map +1 -1
  129. package/dist/utils/session-finder.d.ts +11 -0
  130. package/dist/utils/session-finder.d.ts.map +1 -1
  131. package/dist/utils/session-finder.js +121 -48
  132. package/dist/utils/session-finder.js.map +1 -1
  133. package/dist/utils/session-finder.test.js +105 -1
  134. package/dist/utils/session-finder.test.js.map +1 -1
  135. package/dist/utils/terminal-launch.d.ts +39 -0
  136. package/dist/utils/terminal-launch.d.ts.map +1 -0
  137. package/dist/utils/terminal-launch.js +205 -0
  138. package/dist/utils/terminal-launch.js.map +1 -0
  139. package/dist/utils/terminal-launch.test.d.ts +2 -0
  140. package/dist/utils/terminal-launch.test.d.ts.map +1 -0
  141. package/dist/utils/terminal-launch.test.js +117 -0
  142. package/dist/utils/terminal-launch.test.js.map +1 -0
  143. package/dist/utils/workspace-launch.d.ts.map +1 -1
  144. package/dist/utils/workspace-launch.js +3 -1
  145. package/dist/utils/workspace-launch.js.map +1 -1
  146. package/package.json +5 -3
  147. package/dist/gui/assets/AgentsPage-B_3Vqn2y.js +0 -3
  148. package/dist/gui/assets/DashboardPage-W7KE2gn1.js +0 -1
  149. package/dist/gui/assets/ProjectsPage-CrZhKj85.js +0 -1
  150. package/dist/gui/assets/ScaffoldRepoInline-BSpQbVe7.js +0 -1
  151. package/dist/gui/assets/Separator-Chx6O62Y.js +0 -1
  152. package/dist/gui/assets/SettingsPage-Zvq-P6Hj.js +0 -1
  153. package/dist/gui/assets/SkillsPage-DR-Y5ZM1.js +0 -6
  154. package/dist/gui/assets/StartWorkPage-DO6t_zFb.js +0 -1
  155. package/dist/gui/assets/WorkspaceLauncher-CDtnv1IK.js +0 -1
  156. package/dist/gui/assets/WorkspacesPage-B9QOLnq_.js +0 -6
  157. package/dist/gui/assets/card-82INhRRE.js +0 -1
  158. package/dist/gui/assets/chevron-down-DDmhvRLr.js +0 -1
  159. package/dist/gui/assets/index-ofoYKpCG.js +0 -52
  160. package/dist/gui/assets/index-w-iQhEQv.css +0 -2
  161. package/dist/gui/assets/search-ChVovkOL.js +0 -1
  162. package/dist/gui/assets/skeleton-CCPbfn1L.js +0 -1
  163. package/dist/gui/assets/spinner-BCEaGbib.js +0 -1
  164. package/dist/gui/assets/textarea-D3-elOAa.js +0 -1
  165. package/dist/gui/assets/useAriaLabelledBy-DmwmZIqb.js +0 -1
  166. package/dist/gui/assets/useCompositeListItem-CZnlZ-eF.js +0 -1
  167. package/dist/gui/assets/useValueChanged-BfI2s7NX.js +0 -1
  168. package/dist/gui/assets/zap-DhYfYRlq.js +0 -1
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @module core/isolate
3
+ * Provides on-demand worktree isolation for repositories in in-place workspaces.
4
+ */
5
+ export interface IsolateRepoOptions {
6
+ /** Target feature branch name to create/checkout in the worktree. */
7
+ branchName?: string;
8
+ /** Base branch to branch off (defaults to repo's default branch). */
9
+ baseBranch?: string;
10
+ }
11
+ export interface IsolateRepoResult {
12
+ repoName: string;
13
+ sourcePath: string;
14
+ worktreePath: string;
15
+ branchName: string;
16
+ baseBranch: string;
17
+ alreadyIsolated: boolean;
18
+ }
19
+ /**
20
+ * Dynamically isolates a repository in an in-place workspace into a dedicated
21
+ * worktree directory inside the workspace.
22
+ *
23
+ * If the workspace is in worktree mode, or the repository is already isolated,
24
+ * this is a safe no-op that returns existing isolation details.
25
+ *
26
+ * @param workspacePath - Absolute path to the workspace directory.
27
+ * @param repoNameOrPath - Name or absolute path of the repository to isolate.
28
+ * @param options - Branch and base branch options.
29
+ */
30
+ export declare function isolateWorkspaceRepo(workspacePath: string, repoNameOrPath: string, options?: IsolateRepoOptions): Promise<IsolateRepoResult>;
31
+ //# sourceMappingURL=isolate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolate.d.ts","sourceRoot":"","sources":["../../src/core/isolate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAWD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA+J5B"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * @module core/isolate
3
+ * Provides on-demand worktree isolation for repositories in in-place workspaces.
4
+ */
5
+ import * as fs from 'node:fs/promises';
6
+ import * as path from 'node:path';
7
+ import { execa } from 'execa';
8
+ import { createWorktree, removeWorktree } from './worktree.js';
9
+ import { loadFeatureConfig, saveFeatureConfig } from './workspace.js';
10
+ import { refreshWorkspace } from './refresh.js';
11
+ import { detectDefaultBranch, isValidBranchName } from '../utils/git.js';
12
+ import { isInPlace } from '../utils/feature.js';
13
+ function assertWithin(baseDir, target) {
14
+ const base = path.resolve(baseDir);
15
+ const resolved = path.resolve(target);
16
+ if (resolved !== base && !resolved.startsWith(base + path.sep)) {
17
+ throw new Error(`Target path "${target}" escapes workspace base directory "${baseDir}".`);
18
+ }
19
+ return resolved;
20
+ }
21
+ /**
22
+ * Dynamically isolates a repository in an in-place workspace into a dedicated
23
+ * worktree directory inside the workspace.
24
+ *
25
+ * If the workspace is in worktree mode, or the repository is already isolated,
26
+ * this is a safe no-op that returns existing isolation details.
27
+ *
28
+ * @param workspacePath - Absolute path to the workspace directory.
29
+ * @param repoNameOrPath - Name or absolute path of the repository to isolate.
30
+ * @param options - Branch and base branch options.
31
+ */
32
+ export async function isolateWorkspaceRepo(workspacePath, repoNameOrPath, options = {}) {
33
+ const feature = await loadFeatureConfig(workspacePath);
34
+ if (!feature) {
35
+ throw new Error(`Workspace manifest not found at ${workspacePath}`);
36
+ }
37
+ const trimmed = repoNameOrPath.trim();
38
+ if (!trimmed || /[\r\n]/.test(trimmed)) {
39
+ throw new Error(`Invalid repository name or path: "${repoNameOrPath}".`);
40
+ }
41
+ const normalizedTarget = path.normalize(trimmed).toLowerCase();
42
+ const targetBasename = path.basename(trimmed).toLowerCase();
43
+ // Match against feature.repos (case-insensitive for Windows resilience)
44
+ const repoIndex = feature.repos.findIndex((r) => {
45
+ const norm = path.normalize(r).toLowerCase();
46
+ return norm === normalizedTarget || path.basename(r).toLowerCase() === targetBasename;
47
+ });
48
+ if (repoIndex === -1) {
49
+ throw new Error(`Repository "${repoNameOrPath}" is not part of workspace "${feature.id}".`);
50
+ }
51
+ const repoEntry = feature.repos[repoIndex];
52
+ const repoName = path.basename(repoEntry);
53
+ const sourcePath = feature.originalRepos?.[repoIndex] ?? repoEntry;
54
+ // If not in-place mode, all repos are already isolated worktrees
55
+ if (!isInPlace(feature)) {
56
+ const worktreePath = path.resolve(workspacePath, repoName);
57
+ return {
58
+ repoName,
59
+ sourcePath,
60
+ worktreePath,
61
+ branchName: feature.repoBranches?.[repoName] ?? feature.branchName,
62
+ baseBranch: await detectDefaultBranch(sourcePath),
63
+ alreadyIsolated: true,
64
+ };
65
+ }
66
+ // Case-insensitive lookup for existing isolation
67
+ const isolatedKey = Object.keys(feature.isolatedRepos || {}).find((k) => k.toLowerCase() === repoName.toLowerCase() || k.toLowerCase() === trimmed.toLowerCase());
68
+ const existingIsolation = isolatedKey ? feature.isolatedRepos?.[isolatedKey] : undefined;
69
+ if (existingIsolation) {
70
+ try {
71
+ await fs.access(existingIsolation.worktreePath);
72
+ return {
73
+ repoName,
74
+ sourcePath,
75
+ worktreePath: existingIsolation.worktreePath,
76
+ branchName: existingIsolation.branchName,
77
+ baseBranch: existingIsolation.baseBranch ?? (await detectDefaultBranch(sourcePath)),
78
+ alreadyIsolated: true,
79
+ };
80
+ }
81
+ catch {
82
+ // Directory no longer exists on disk; prune worktree registration and recreate
83
+ try {
84
+ await execa('git', ['worktree', 'prune'], { cwd: sourcePath });
85
+ }
86
+ catch { }
87
+ }
88
+ }
89
+ const defaultBranch = await detectDefaultBranch(sourcePath);
90
+ const baseBranch = options.baseBranch || defaultBranch || 'main';
91
+ const branchName = options.branchName ||
92
+ (feature.branchName && feature.branchName !== feature.id
93
+ ? feature.branchName
94
+ : `feat/${repoName}-${feature.id}`);
95
+ if (!isValidBranchName(branchName)) {
96
+ throw new Error(`Invalid branch name "${branchName}".`);
97
+ }
98
+ if (!isValidBranchName(baseBranch)) {
99
+ throw new Error(`Invalid base branch name "${baseBranch}".`);
100
+ }
101
+ const worktreePath = assertWithin(workspacePath, path.join(workspacePath, repoName));
102
+ // Prune any stale worktree registrations prior to creation
103
+ try {
104
+ await execa('git', ['worktree', 'prune'], { cwd: sourcePath });
105
+ }
106
+ catch { }
107
+ let worktreeCreated = false;
108
+ let branchCreated = false;
109
+ try {
110
+ // 1. Create the git worktree
111
+ const wtRes = await createWorktree(sourcePath, worktreePath, branchName, baseBranch);
112
+ worktreeCreated = true;
113
+ branchCreated = wtRes.createdBranch;
114
+ // 2. Update .gitignore in workspace root to ignore the newly created worktree folder
115
+ try {
116
+ const gitignorePath = path.join(workspacePath, '.gitignore');
117
+ let gitignoreContent = '';
118
+ try {
119
+ gitignoreContent = await fs.readFile(gitignorePath, 'utf-8');
120
+ }
121
+ catch { }
122
+ const entry = `/${repoName}/`;
123
+ if (!gitignoreContent.includes(entry)) {
124
+ await fs.writeFile(gitignorePath, gitignoreContent ? `${gitignoreContent.trimEnd()}\n${entry}\n` : `${entry}\n`, 'utf-8');
125
+ }
126
+ }
127
+ catch (error) {
128
+ console.warn(`Warning: failed to update .gitignore for isolated repo ${repoName}:`, error);
129
+ }
130
+ // 3. Atomically update manifest using freshest state
131
+ const freshFeature = (await loadFeatureConfig(workspacePath)) ?? feature;
132
+ if (!freshFeature.isolatedRepos) {
133
+ freshFeature.isolatedRepos = {};
134
+ }
135
+ const isolatedInfo = {
136
+ worktreePath,
137
+ branchName,
138
+ baseBranch,
139
+ isolatedAt: new Date().toISOString(),
140
+ };
141
+ freshFeature.isolatedRepos[repoName] = isolatedInfo;
142
+ await saveFeatureConfig(workspacePath, freshFeature);
143
+ // 4. Refresh workspace context files (.code-workspace, AGENTS.md, etc.)
144
+ try {
145
+ await refreshWorkspace(workspacePath);
146
+ }
147
+ catch (error) {
148
+ console.warn(`Warning: failed to refresh workspace context after isolating ${repoName}:`, error);
149
+ }
150
+ return {
151
+ repoName,
152
+ sourcePath,
153
+ worktreePath,
154
+ branchName,
155
+ baseBranch,
156
+ alreadyIsolated: false,
157
+ };
158
+ }
159
+ catch (error) {
160
+ if (worktreeCreated) {
161
+ try {
162
+ await removeWorktree(sourcePath, worktreePath, true);
163
+ }
164
+ catch { }
165
+ if (branchCreated) {
166
+ try {
167
+ await execa('git', ['branch', '-D', branchName], { cwd: sourcePath });
168
+ }
169
+ catch { }
170
+ }
171
+ }
172
+ throw error;
173
+ }
174
+ }
175
+ //# sourceMappingURL=isolate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolate.js","sourceRoot":"","sources":["../../src/core/isolate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=isolate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolate.test.d.ts","sourceRoot":"","sources":["../../src/core/isolate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,290 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import { describe, expect, it, beforeEach, afterEach } from 'vitest';
5
+ import { execa } from 'execa';
6
+ import { isolateWorkspaceRepo } from './isolate.js';
7
+ import { saveFeatureConfig, loadFeatureConfig, deleteWorkspace } from './workspace.js';
8
+ import { resolveFeatureRepoPath, isRepoIsolated } from '../utils/feature.js';
9
+ import { syncWorkspace } from './sync.js';
10
+ import { runDoctor } from './doctor.js';
11
+ async function initGitRepo(dir) {
12
+ await fs.mkdir(dir, { recursive: true });
13
+ await execa('git', ['init', '-b', 'main'], { cwd: dir });
14
+ await execa('git', ['config', 'user.name', 'Test User'], { cwd: dir });
15
+ await execa('git', ['config', 'user.email', 'test@example.com'], { cwd: dir });
16
+ await fs.writeFile(path.join(dir, 'README.md'), '# Test Repo\n', 'utf-8');
17
+ await execa('git', ['add', '.'], { cwd: dir });
18
+ await execa('git', ['commit', '-m', 'Initial commit'], { cwd: dir });
19
+ }
20
+ describe('isolateWorkspaceRepo & on-demand worktree isolation', { timeout: 30000 }, () => {
21
+ let tmpDir;
22
+ let repo1Dir;
23
+ let repo2Dir;
24
+ let workspaceDir;
25
+ beforeEach(async () => {
26
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'nf-isolate-test-'));
27
+ repo1Dir = path.join(tmpDir, 'repo1');
28
+ repo2Dir = path.join(tmpDir, 'repo2');
29
+ workspaceDir = path.join(tmpDir, 'workspace');
30
+ await initGitRepo(repo1Dir);
31
+ await initGitRepo(repo2Dir);
32
+ await fs.mkdir(workspaceDir, { recursive: true });
33
+ });
34
+ afterEach(async () => {
35
+ try {
36
+ await fs.rm(tmpDir, { recursive: true, force: true, maxRetries: 5 });
37
+ }
38
+ catch { }
39
+ });
40
+ it('throws when the workspace manifest does not exist', async () => {
41
+ await expect(isolateWorkspaceRepo(path.join(tmpDir, 'non-existent'), 'repo1')).rejects.toThrow('Workspace manifest not found');
42
+ });
43
+ it('throws when the target repo is not in the workspace', async () => {
44
+ const feature = {
45
+ id: 'test-ws',
46
+ mode: 'in-place',
47
+ branchName: 'test-ws',
48
+ description: 'test in-place',
49
+ repos: [repo1Dir],
50
+ originalRepos: [repo1Dir],
51
+ assistants: ['antigravity'],
52
+ workspacePath: workspaceDir,
53
+ createdAt: new Date().toISOString(),
54
+ };
55
+ await saveFeatureConfig(workspaceDir, feature);
56
+ await expect(isolateWorkspaceRepo(workspaceDir, 'unknown-repo')).rejects.toThrow('is not part of workspace');
57
+ });
58
+ it('returns alreadyIsolated: true if workspace is already in worktree mode', async () => {
59
+ const feature = {
60
+ id: 'test-worktree-ws',
61
+ mode: 'worktree',
62
+ branchName: 'feat/all-repos',
63
+ description: 'test worktree mode',
64
+ repos: [path.join(workspaceDir, 'repo1')],
65
+ originalRepos: [repo1Dir],
66
+ assistants: ['antigravity'],
67
+ workspacePath: workspaceDir,
68
+ createdAt: new Date().toISOString(),
69
+ };
70
+ await saveFeatureConfig(workspaceDir, feature);
71
+ const result = await isolateWorkspaceRepo(workspaceDir, 'repo1');
72
+ expect(result.alreadyIsolated).toBe(true);
73
+ expect(result.repoName).toBe('repo1');
74
+ expect(result.branchName).toBe('feat/all-repos');
75
+ });
76
+ it('dynamically isolates an in-place repo into a worktree on-demand', async () => {
77
+ const feature = {
78
+ id: 'my-feature',
79
+ mode: 'in-place',
80
+ branchName: 'my-feature',
81
+ description: 'In-place with lazy isolation',
82
+ repos: [repo1Dir, repo2Dir],
83
+ originalRepos: [repo1Dir, repo2Dir],
84
+ assistants: ['antigravity', 'claude'],
85
+ workspacePath: workspaceDir,
86
+ createdAt: new Date().toISOString(),
87
+ };
88
+ await saveFeatureConfig(workspaceDir, feature);
89
+ // Initial state: repos are NOT isolated
90
+ expect(isRepoIsolated(feature, 'repo1')).toBe(false);
91
+ expect(resolveFeatureRepoPath(feature, workspaceDir, repo1Dir)).toBe(repo1Dir);
92
+ // Isolate repo1
93
+ const result = await isolateWorkspaceRepo(workspaceDir, 'repo1', {
94
+ branchName: 'feat/repo1-custom',
95
+ });
96
+ expect(result.alreadyIsolated).toBe(false);
97
+ expect(result.repoName).toBe('repo1');
98
+ expect(result.branchName).toBe('feat/repo1-custom');
99
+ expect(result.worktreePath).toBe(path.join(workspaceDir, 'repo1'));
100
+ // Check that worktree directory exists on disk and is on the right branch
101
+ const { stdout: branchOut } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
102
+ cwd: result.worktreePath,
103
+ });
104
+ expect(branchOut.trim()).toBe('feat/repo1-custom');
105
+ // Check manifest was updated
106
+ const updated = await loadFeatureConfig(workspaceDir);
107
+ expect(updated?.isolatedRepos?.['repo1']).toBeDefined();
108
+ expect(updated?.isolatedRepos?.['repo1']?.branchName).toBe('feat/repo1-custom');
109
+ expect(updated?.isolatedRepos?.['repo1']?.worktreePath).toBe(result.worktreePath);
110
+ // Check that resolveFeatureRepoPath now points to worktree for repo1, and source for repo2
111
+ expect(isRepoIsolated(updated, 'repo1')).toBe(true);
112
+ expect(isRepoIsolated(updated, 'repo2')).toBe(false);
113
+ expect(resolveFeatureRepoPath(updated, workspaceDir, repo1Dir)).toBe(result.worktreePath);
114
+ expect(resolveFeatureRepoPath(updated, workspaceDir, repo2Dir)).toBe(repo2Dir);
115
+ // Check .gitignore in workspace ignores /repo1/
116
+ const gitignoreContent = await fs.readFile(path.join(workspaceDir, '.gitignore'), 'utf-8');
117
+ expect(gitignoreContent).toContain('/repo1/');
118
+ // Calling isolate again on repo1 is idempotent
119
+ const rerun = await isolateWorkspaceRepo(workspaceDir, 'repo1');
120
+ expect(rerun.alreadyIsolated).toBe(true);
121
+ expect(rerun.branchName).toBe('feat/repo1-custom');
122
+ });
123
+ it('syncs isolated worktree repos while skipping non-isolated repos in in-place mode', async () => {
124
+ const remote1Dir = path.join(tmpDir, 'remote1.git');
125
+ const syncRepo1Dir = path.join(tmpDir, 'syncRepo1');
126
+ await fs.mkdir(remote1Dir, { recursive: true });
127
+ await execa('git', ['init', '--bare', '-b', 'main'], { cwd: remote1Dir });
128
+ await fs.mkdir(syncRepo1Dir, { recursive: true });
129
+ await execa('git', ['init', '-b', 'main'], { cwd: syncRepo1Dir });
130
+ await execa('git', ['config', 'user.name', 'Test User'], { cwd: syncRepo1Dir });
131
+ await execa('git', ['config', 'user.email', 'test@example.com'], { cwd: syncRepo1Dir });
132
+ await fs.writeFile(path.join(syncRepo1Dir, 'README.md'), '# Sync Repo\n', 'utf-8');
133
+ await execa('git', ['add', '.'], { cwd: syncRepo1Dir });
134
+ await execa('git', ['commit', '-m', 'Initial commit'], { cwd: syncRepo1Dir });
135
+ await execa('git', ['remote', 'add', 'origin', remote1Dir], { cwd: syncRepo1Dir });
136
+ await execa('git', ['push', '-u', 'origin', 'main'], { cwd: syncRepo1Dir });
137
+ const feature = {
138
+ id: 'sync-test',
139
+ mode: 'in-place',
140
+ branchName: 'sync-test',
141
+ description: 'In-place sync test',
142
+ repos: [syncRepo1Dir, repo2Dir],
143
+ originalRepos: [syncRepo1Dir, repo2Dir],
144
+ assistants: ['antigravity'],
145
+ workspacePath: workspaceDir,
146
+ createdAt: new Date().toISOString(),
147
+ };
148
+ await saveFeatureConfig(workspaceDir, feature);
149
+ // Isolate syncRepo1
150
+ await isolateWorkspaceRepo(workspaceDir, 'syncRepo1', { branchName: 'feat/sync-repo1' });
151
+ // Commit and push a new change on origin main
152
+ await fs.writeFile(path.join(syncRepo1Dir, 'newfile.txt'), 'hello\n');
153
+ await execa('git', ['add', '.'], { cwd: syncRepo1Dir });
154
+ await execa('git', ['commit', '-m', 'Add newfile on main'], { cwd: syncRepo1Dir });
155
+ await execa('git', ['push', 'origin', 'main'], { cwd: syncRepo1Dir });
156
+ const syncReport = await syncWorkspace(workspaceDir);
157
+ expect(syncReport.repos).toHaveLength(2);
158
+ const repo1Sync = syncReport.repos.find((r) => r.name === 'syncRepo1');
159
+ const repo2Sync = syncReport.repos.find((r) => r.name === 'repo2');
160
+ expect(repo1Sync?.status).toBe('rebased');
161
+ expect(repo2Sync?.message).toContain('In-place repo — branches are managed by you');
162
+ });
163
+ it('cleans up isolated worktrees when deleting an in-place workspace', async () => {
164
+ const feature = {
165
+ id: 'cleanup-test',
166
+ mode: 'in-place',
167
+ branchName: 'cleanup-test',
168
+ description: 'In-place cleanup test',
169
+ repos: [repo1Dir],
170
+ originalRepos: [repo1Dir],
171
+ assistants: ['antigravity'],
172
+ workspacePath: workspaceDir,
173
+ createdAt: new Date().toISOString(),
174
+ };
175
+ await saveFeatureConfig(workspaceDir, feature);
176
+ await isolateWorkspaceRepo(workspaceDir, 'repo1');
177
+ const worktreeDir = path.join(workspaceDir, 'repo1');
178
+ expect(await fs.stat(worktreeDir)).toBeDefined();
179
+ await deleteWorkspace(workspaceDir);
180
+ // Workspace directory removed
181
+ await expect(fs.access(workspaceDir)).rejects.toThrow();
182
+ // Source repo intact
183
+ expect(await fs.stat(repo1Dir)).toBeDefined();
184
+ // Worktree list in source repo is clean
185
+ const { stdout: wtList } = await execa('git', ['worktree', 'list'], { cwd: repo1Dir });
186
+ expect(wtList).not.toContain(worktreeDir);
187
+ });
188
+ it('rejects invalid or option-injected branch names', async () => {
189
+ const feature = {
190
+ id: 'sec-test',
191
+ mode: 'in-place',
192
+ branchName: 'sec-test',
193
+ description: 'Security validation test',
194
+ repos: [repo1Dir],
195
+ originalRepos: [repo1Dir],
196
+ assistants: ['antigravity'],
197
+ workspacePath: workspaceDir,
198
+ createdAt: new Date().toISOString(),
199
+ };
200
+ await saveFeatureConfig(workspaceDir, feature);
201
+ await expect(isolateWorkspaceRepo(workspaceDir, 'repo1', { branchName: '--lock' })).rejects.toThrow('Invalid branch name');
202
+ await expect(isolateWorkspaceRepo(workspaceDir, 'repo1', { branchName: '-f' })).rejects.toThrow('Invalid branch name');
203
+ await expect(isolateWorkspaceRepo(workspaceDir, 'repo1', { branchName: 'invalid branch with spaces' })).rejects.toThrow('Invalid branch name');
204
+ });
205
+ it('recovers and recreates worktree if directory is deleted from disk', async () => {
206
+ const feature = {
207
+ id: 'recover-test',
208
+ mode: 'in-place',
209
+ branchName: 'recover-test',
210
+ description: 'Recovery test',
211
+ repos: [repo1Dir],
212
+ originalRepos: [repo1Dir],
213
+ assistants: ['antigravity'],
214
+ workspacePath: workspaceDir,
215
+ createdAt: new Date().toISOString(),
216
+ };
217
+ await saveFeatureConfig(workspaceDir, feature);
218
+ // Initial isolation
219
+ const res1 = await isolateWorkspaceRepo(workspaceDir, 'repo1', { branchName: 'feat/rec-1' });
220
+ expect(res1.alreadyIsolated).toBe(false);
221
+ // Simulate accidental deletion of worktree folder from disk
222
+ await fs.rm(res1.worktreePath, { recursive: true, force: true });
223
+ // Calling isolate again should prune stale git registration and recreate cleanly
224
+ const res2 = await isolateWorkspaceRepo(workspaceDir, 'repo1', { branchName: 'feat/rec-1' });
225
+ expect(res2.worktreePath).toBe(res1.worktreePath);
226
+ expect(await fs.stat(res2.worktreePath)).toBeDefined();
227
+ });
228
+ it('handles case-insensitive repository lookups on Windows', async () => {
229
+ const feature = {
230
+ id: 'case-test',
231
+ mode: 'in-place',
232
+ branchName: 'case-test',
233
+ description: 'Case sensitivity test',
234
+ repos: [repo1Dir],
235
+ originalRepos: [repo1Dir],
236
+ assistants: ['antigravity'],
237
+ workspacePath: workspaceDir,
238
+ createdAt: new Date().toISOString(),
239
+ };
240
+ await saveFeatureConfig(workspaceDir, feature);
241
+ // Pass uppercase repo name 'REPO1'
242
+ const result = await isolateWorkspaceRepo(workspaceDir, 'REPO1', { branchName: 'feat/case-test' });
243
+ expect(result.repoName).toBe('repo1');
244
+ expect(result.branchName).toBe('feat/case-test');
245
+ });
246
+ it('handles concurrent isolation operations without manifest clobbering', async () => {
247
+ const feature = {
248
+ id: 'concurrency-test',
249
+ mode: 'in-place',
250
+ branchName: 'concurrency-test',
251
+ description: 'Concurrency test',
252
+ repos: [repo1Dir, repo2Dir],
253
+ originalRepos: [repo1Dir, repo2Dir],
254
+ assistants: ['antigravity'],
255
+ workspacePath: workspaceDir,
256
+ createdAt: new Date().toISOString(),
257
+ };
258
+ await saveFeatureConfig(workspaceDir, feature);
259
+ // Isolate repo1 and repo2 concurrently
260
+ const [res1, res2] = await Promise.all([
261
+ isolateWorkspaceRepo(workspaceDir, 'repo1', { branchName: 'feat/concurrent-1' }),
262
+ isolateWorkspaceRepo(workspaceDir, 'repo2', { branchName: 'feat/concurrent-2' }),
263
+ ]);
264
+ expect(res1.repoName).toBe('repo1');
265
+ expect(res2.repoName).toBe('repo2');
266
+ const updated = await loadFeatureConfig(workspaceDir);
267
+ expect(updated?.isolatedRepos?.['repo1']).toBeDefined();
268
+ expect(updated?.isolatedRepos?.['repo2']).toBeDefined();
269
+ });
270
+ it('doctor passes cleanly on isolated in-place workspace without false branch mismatch warnings', async () => {
271
+ const feature = {
272
+ id: 'doc-test',
273
+ mode: 'in-place',
274
+ branchName: 'doc-test',
275
+ description: 'Doctor test',
276
+ repos: [repo1Dir],
277
+ originalRepos: [repo1Dir],
278
+ assistants: ['antigravity'],
279
+ workspacePath: workspaceDir,
280
+ createdAt: new Date().toISOString(),
281
+ };
282
+ await saveFeatureConfig(workspaceDir, feature);
283
+ await isolateWorkspaceRepo(workspaceDir, 'repo1', { branchName: 'feat/doc-isolated' });
284
+ const report = await runDoctor(workspaceDir);
285
+ const branchCheck = report.checks.find((c) => c.category === 'Branch Alignment & Git Status');
286
+ expect(branchCheck?.status).toBe('pass');
287
+ expect(report.errors).toHaveLength(0);
288
+ });
289
+ });
290
+ //# sourceMappingURL=isolate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolate.test.js","sourceRoot":"","sources":["../../src/core/isolate.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uDAAuD;IACvD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uDAAuD;IACvD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA4ExB"}
@@ -10,6 +10,7 @@
10
10
  import * as fs from 'node:fs/promises';
11
11
  import * as path from 'node:path';
12
12
  import { loadFeatureConfig, resolveRepoInfos } from './workspace.js';
13
+ import { resolveFeatureRepoPath } from '../utils/feature.js';
13
14
  import { analyzeAllReposCached } from '../analyzers/index.js';
14
15
  import { generateContextFiles } from '../generators/index.js';
15
16
  /**
@@ -30,10 +31,43 @@ export async function refreshWorkspace(workspacePath, options = {}) {
30
31
  if (!feature) {
31
32
  throw new Error(`Failed to load workspace configuration. Ensure nexusflow.json exists at ${workspacePath}.`);
32
33
  }
33
- const allRepos = await resolveRepoInfos(feature.repos);
34
+ const resolvedPaths = feature.repos.map((r) => resolveFeatureRepoPath(feature, workspacePath, r));
35
+ const allRepos = await resolveRepoInfos(resolvedPaths);
34
36
  const { analysis, analyzed, reused } = await analyzeAllReposCached(allRepos, workspacePath, { force: options.force });
35
37
  const ctx = { feature, repos: allRepos, analysis };
36
38
  await generateContextFiles(ctx, feature.assistants, workspacePath);
39
+ // Ensure .code-workspace and .vscode/settings.json exist and stay updated
40
+ try {
41
+ const workspaceName = path.basename(workspacePath);
42
+ const codeWorkspacePath = path.join(workspacePath, `${workspaceName}.code-workspace`);
43
+ const inPlace = feature.mode === 'in-place';
44
+ const codeWorkspace = {
45
+ folders: [
46
+ { path: '.', name: `${workspaceName} (workspace)` },
47
+ ...allRepos.map((repo) => {
48
+ const isIsolated = Boolean(feature.isolatedRepos?.[repo.name] ?? feature.isolatedRepos?.[repo.path]);
49
+ return {
50
+ path: inPlace && !isIsolated ? repo.path : repo.name,
51
+ name: repo.name,
52
+ };
53
+ }),
54
+ ],
55
+ settings: { 'search.useIgnoreFiles': false },
56
+ };
57
+ await fs.writeFile(codeWorkspacePath, JSON.stringify(codeWorkspace, null, 2) + '\n', 'utf-8');
58
+ const vscodeDir = path.join(workspacePath, '.vscode');
59
+ const settingsPath = path.join(vscodeDir, 'settings.json');
60
+ try {
61
+ await fs.access(settingsPath);
62
+ }
63
+ catch {
64
+ await fs.mkdir(vscodeDir, { recursive: true });
65
+ await fs.writeFile(settingsPath, JSON.stringify({ 'search.useIgnoreFiles': false }, null, 2) + '\n', 'utf-8');
66
+ }
67
+ }
68
+ catch (err) {
69
+ console.warn('Warning: Failed to ensure .code-workspace or .vscode/settings.json during refresh:', err);
70
+ }
37
71
  // If a handoff bundle exists, refresh it too — it reuses the cached
38
72
  // analysis, so this no longer triggers a second full analysis pass.
39
73
  let refreshedHandoff = false;
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAqB9D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,UAA0B,EAAE;IAE5B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,2EAA2E,aAAa,GAAG,CAC5F,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,qBAAqB,CAChE,QAAQ,EACR,aAAa,EACb,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CACzB,CAAC;IAEF,MAAM,GAAG,GAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAErE,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEnE,oEAAoE;IACpE,oEAAoE;IACpE,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IACrE,CAAC;QACC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAClE,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;YACpC,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa;QACb,aAAa,EAAE,QAAQ;QACvB,WAAW,EAAE,MAAM;QACnB,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAEhE,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAOD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0F9E"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAEhE,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAOD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4G9E"}