@indigoai-us/hq-cloud 6.18.93 → 6.18.94

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.
@@ -81,11 +81,19 @@ export declare function requireWorkingRsync(env: NodeJS.ProcessEnv, err: (s: str
81
81
  * file whose bytes are the link target, e.g. a 17-byte `AGENTS.md` holding
82
82
  * `.claude/CLAUDE.md`. The overlay then copies that stub into the HQ root and
83
83
  * Codex starts with no charter (feedback_d0c2f082). Replace each stub in the
84
- * clone with a copy of its file target, or a junction/symlink for a directory
84
+ * clone with a copy of its file target, or a relative symlink for a directory
85
85
  * target, so the overlay lays down working content. Real symlinks are left
86
86
  * alone. Returns the repo-relative paths that were replaced.
87
+ *
88
+ * A directory stub is not turned into a junction. On Windows without
89
+ * Developer Mode `symlinkSync` throws EPERM, and a junction would store an
90
+ * absolute path inside this staging clone. The overlay then copies that
91
+ * absolute target into the HQ root, and deleting the clone leaves a dangling
92
+ * link (feedback_3e1a7445). The stub is left in place so
93
+ * {@link normalizeWindowsGitSymlinks} can write a junction at the final
94
+ * HQ-root path instead.
87
95
  */
88
- export declare function materializeGitSymlinkStubs(srcDir: string, env?: NodeJS.ProcessEnv): string[];
96
+ export declare function materializeGitSymlinkStubs(srcDir: string, env?: NodeJS.ProcessEnv, symlinkSync?: typeof fs.symlinkSync): string[];
89
97
  /**
90
98
  * True when `localPath` is a regular-file stand-in for a path git records as
91
99
  * a symlink at `ref`: either the raw stub text, or a copy of the link's target
@@ -217,7 +225,9 @@ export interface WindowsLinkOps {
217
225
  * filters exclude, and targets that are missing or leave `hqRoot`.
218
226
  * Returns the repo-relative paths that were rewritten and any that could not
219
227
  * be. `fallbackCount` is how many of those used a junction or file copy
220
- * because the account cannot create a symlink. No-op off Windows.
228
+ * because the account cannot create a symlink. `repointedFromStaging` is the
229
+ * subset whose previous target was the update staging folder. No-op off
230
+ * Windows.
221
231
  */
222
232
  export declare function normalizeWindowsGitSymlinks(srcDir: string, hqRoot: string, filters: string[], env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, ops?: WindowsLinkOps): {
223
233
  repaired: string[];
@@ -226,6 +236,11 @@ export declare function normalizeWindowsGitSymlinks(srcDir: string, hqRoot: stri
226
236
  reason: string;
227
237
  }>;
228
238
  fallbackCount: number;
239
+ repointedFromStaging: string[];
240
+ unresolved: Array<{
241
+ rel: string;
242
+ reason: string;
243
+ }>;
229
244
  };
230
245
  export type RescueDecision = {
231
246
  kind: "skip";
@@ -1 +1 @@
1
- {"version":3,"file":"rescue-core.d.ts","sourceRoot":"","sources":["../../src/cli/rescue-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rescue-core.d.ts","sourceRoot":"","sources":["../../src/cli/rescue-core.ts"],"names":[],"mappings":"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"}
@@ -637,6 +637,17 @@ function gitSymlinkPathsAtRef(repoDir, ref, env) {
637
637
  gitSymlinkPathsAtRefCache.set(key, found);
638
638
  return found;
639
639
  }
640
+ /** True when `child` is `parent` or a path under it, using path.relative. */
641
+ function pathContainedIn(child, parent) {
642
+ const parentAbs = path.resolve(parent);
643
+ const childAbs = path.resolve(child);
644
+ const rel = path.relative(parentAbs, childAbs);
645
+ if (rel === "")
646
+ return true;
647
+ if (path.isAbsolute(rel))
648
+ return false;
649
+ return rel !== ".." && !rel.startsWith(`..${path.sep}`);
650
+ }
640
651
  /** Resolve a link target against the link's dir; null if it leaves `root`. */
641
652
  function resolveContainedLinkTarget(root, rel, linkText) {
642
653
  if (!linkText || linkText.includes("\0") || path.isAbsolute(linkText)) {
@@ -644,7 +655,7 @@ function resolveContainedLinkTarget(root, rel, linkText) {
644
655
  }
645
656
  const rootAbs = path.resolve(root);
646
657
  const resolved = path.resolve(rootAbs, path.dirname(rel), linkText);
647
- return resolved.startsWith(rootAbs + path.sep) ? resolved : null;
658
+ return pathContainedIn(resolved, rootAbs) ? resolved : null;
648
659
  }
649
660
  /**
650
661
  * Git with `core.symlinks=false` (the Git for Windows default when the user
@@ -652,11 +663,19 @@ function resolveContainedLinkTarget(root, rel, linkText) {
652
663
  * file whose bytes are the link target, e.g. a 17-byte `AGENTS.md` holding
653
664
  * `.claude/CLAUDE.md`. The overlay then copies that stub into the HQ root and
654
665
  * Codex starts with no charter (feedback_d0c2f082). Replace each stub in the
655
- * clone with a copy of its file target, or a junction/symlink for a directory
666
+ * clone with a copy of its file target, or a relative symlink for a directory
656
667
  * target, so the overlay lays down working content. Real symlinks are left
657
668
  * alone. Returns the repo-relative paths that were replaced.
669
+ *
670
+ * A directory stub is not turned into a junction. On Windows without
671
+ * Developer Mode `symlinkSync` throws EPERM, and a junction would store an
672
+ * absolute path inside this staging clone. The overlay then copies that
673
+ * absolute target into the HQ root, and deleting the clone leaves a dangling
674
+ * link (feedback_3e1a7445). The stub is left in place so
675
+ * {@link normalizeWindowsGitSymlinks} can write a junction at the final
676
+ * HQ-root path instead.
658
677
  */
659
- export function materializeGitSymlinkStubs(srcDir, env = process.env) {
678
+ export function materializeGitSymlinkStubs(srcDir, env = process.env, symlinkSync = fs.symlinkSync) {
660
679
  const pending = gitSymlinkPaths(srcDir, env).filter((rel) => {
661
680
  const st = lstatOrNull(path.join(srcDir, rel));
662
681
  return st !== null && st.isFile();
@@ -690,7 +709,28 @@ export function materializeGitSymlinkStubs(srcDir, env = process.env) {
690
709
  }
691
710
  else if (isDir(resolved)) {
692
711
  fs.rmSync(stubPath, { force: true });
693
- createSymlinkOrJunction(linkText, stubPath, resolved);
712
+ try {
713
+ symlinkSync(linkText, stubPath);
714
+ }
715
+ catch (error) {
716
+ // Put the Git stub back. A junction here would store an absolute
717
+ // path inside this staging clone (feedback_3e1a7445).
718
+ try {
719
+ fs.writeFileSync(stubPath, linkText);
720
+ }
721
+ catch {
722
+ /* the original stub is already gone */
723
+ }
724
+ // Only the no-Developer-Mode case (EPERM) falls back. Any other
725
+ // failure (ENOSPC, EROFS, ...) aborts rescue before the destructive
726
+ // phase; off Windows no later pass would repair a stub copied over
727
+ // a working HQ-root link.
728
+ if (error?.code !== "EPERM")
729
+ throw error;
730
+ pending.splice(i, 1);
731
+ progressed = true;
732
+ continue;
733
+ }
694
734
  }
695
735
  else {
696
736
  pending.splice(i, 1);
@@ -1959,7 +1999,7 @@ function windowsLinkIsUsable(destination, resolvedTarget, targetIsDir) {
1959
1999
  * replace it; do not confuse it with a missing path, or the create step
1960
2000
  * fails with EEXIST and the broken link stays.
1961
2001
  */
1962
- function replaceWithNativeLink(destination, linkText, resolved, targetIsDir, ops) {
2002
+ function replaceWithNativeLink(destination, linkText, resolved, targetIsDir, ops, stagingDir) {
1963
2003
  let lst;
1964
2004
  let opaque = false;
1965
2005
  try {
@@ -1974,15 +2014,21 @@ function replaceWithNativeLink(destination, linkText, resolved, targetIsDir, ops
1974
2014
  opaque = true;
1975
2015
  }
1976
2016
  }
2017
+ // A symlink whose target is the update staging clone must be rewritten even
2018
+ // when its bytes still match. `windowsLinkIsUsable` follows the link, so a
2019
+ // file link at the staging copy looks healthy until that clone is deleted.
2020
+ const pointsAtStaging = lst !== undefined &&
2021
+ lst.isSymbolicLink() &&
2022
+ releaseLinkPointsAtStaging(destination, stagingDir);
1977
2023
  if (opaque) {
1978
2024
  removeLinkEntry(destination);
1979
2025
  }
1980
2026
  else if (lst) {
1981
2027
  if (lst.isDirectory() && !lst.isSymbolicLink())
1982
2028
  return false;
1983
- if (windowsLinkIsUsable(destination, resolved, targetIsDir))
2029
+ if (!pointsAtStaging && windowsLinkIsUsable(destination, resolved, targetIsDir))
1984
2030
  return false;
1985
- if (lst.isFile()) {
2031
+ if (!pointsAtStaging && lst.isFile()) {
1986
2032
  // A readable regular file that is neither the git stub text nor a
1987
2033
  // Cygwin cookie is user content; the release does not own it.
1988
2034
  const bytes = readFileOrNull(destination);
@@ -1999,17 +2045,32 @@ function replaceWithNativeLink(destination, linkText, resolved, targetIsDir, ops
1999
2045
  }
2000
2046
  const type = targetIsDir ? "dir" : "file";
2001
2047
  try {
2002
- ops.symlink(linkText, destination, type);
2048
+ try {
2049
+ ops.symlink(linkText, destination, type);
2050
+ }
2051
+ catch (error) {
2052
+ if (error.code !== "EPERM")
2053
+ throw error;
2054
+ // No symlink privilege: junctions need none, and a file copy is what
2055
+ // Git for Windows itself would give a core.symlinks=false checkout.
2056
+ if (targetIsDir)
2057
+ ops.junction(resolved, destination);
2058
+ else
2059
+ ops.copyFile(resolved, destination);
2060
+ }
2003
2061
  }
2004
2062
  catch (error) {
2005
- if (error.code !== "EPERM")
2006
- throw error;
2007
- // No symlink privilege: junctions need none, and a file copy is what
2008
- // Git for Windows itself would give a core.symlinks=false checkout.
2009
- if (targetIsDir)
2010
- ops.junction(resolved, destination);
2011
- else
2012
- ops.copyFile(resolved, destination);
2063
+ // The old entry is already gone. Put the Git stub text back so a
2064
+ // failed write cannot leave a dangling link or a missing path.
2065
+ if (!lstatOrNull(destination)) {
2066
+ try {
2067
+ fs.writeFileSync(destination, linkText);
2068
+ }
2069
+ catch {
2070
+ /* the caller reports the original write error */
2071
+ }
2072
+ }
2073
+ throw error;
2013
2074
  }
2014
2075
  return true;
2015
2076
  }
@@ -2027,14 +2088,19 @@ function replaceWithNativeLink(destination, linkText, resolved, targetIsDir, ops
2027
2088
  * filters exclude, and targets that are missing or leave `hqRoot`.
2028
2089
  * Returns the repo-relative paths that were rewritten and any that could not
2029
2090
  * be. `fallbackCount` is how many of those used a junction or file copy
2030
- * because the account cannot create a symlink. No-op off Windows.
2091
+ * because the account cannot create a symlink. `repointedFromStaging` is the
2092
+ * subset whose previous target was the update staging folder. No-op off
2093
+ * Windows.
2031
2094
  */
2032
2095
  export function normalizeWindowsGitSymlinks(srcDir, hqRoot, filters, env = process.env, platform = process.platform, ops = defaultWindowsLinkOps) {
2033
2096
  const repaired = [];
2034
2097
  const failed = [];
2098
+ const repointedFromStaging = [];
2099
+ const unresolved = [];
2035
2100
  let fallbackCount = 0;
2036
- if (platform !== "win32")
2037
- return { repaired, failed, fallbackCount };
2101
+ if (platform !== "win32") {
2102
+ return { repaired, failed, fallbackCount, repointedFromStaging, unresolved };
2103
+ }
2038
2104
  for (const { rel, sha } of gitSymlinkEntries(srcDir, env)) {
2039
2105
  if (!rsyncFiltersAdmit(filters, rel))
2040
2106
  continue;
@@ -2049,6 +2115,7 @@ export function normalizeWindowsGitSymlinks(srcDir, hqRoot, filters, env = proce
2049
2115
  if (!targetIsDir && !isFileFollow(resolved))
2050
2116
  continue;
2051
2117
  const destination = path.join(hqRoot, rel);
2118
+ const fromStaging = releaseLinkPointsAtStaging(destination, srcDir);
2052
2119
  const beforeCalls = {
2053
2120
  junction: 0,
2054
2121
  copyFile: 0,
@@ -2065,8 +2132,9 @@ export function normalizeWindowsGitSymlinks(srcDir, hqRoot, filters, env = proce
2065
2132
  },
2066
2133
  };
2067
2134
  try {
2068
- if (!replaceWithNativeLink(destination, linkText, resolved, targetIsDir, countingOps))
2135
+ if (!replaceWithNativeLink(destination, linkText, resolved, targetIsDir, countingOps, srcDir)) {
2069
2136
  continue;
2137
+ }
2070
2138
  }
2071
2139
  catch (error) {
2072
2140
  failed.push({ rel, reason: error instanceof Error ? error.message : String(error) });
@@ -2074,8 +2142,41 @@ export function normalizeWindowsGitSymlinks(srcDir, hqRoot, filters, env = proce
2074
2142
  }
2075
2143
  fallbackCount += beforeCalls.junction + beforeCalls.copyFile;
2076
2144
  repaired.push(rel);
2145
+ if (fromStaging)
2146
+ repointedFromStaging.push(rel);
2147
+ if (!windowsLinkIsUsable(destination, resolved, targetIsDir)) {
2148
+ unresolved.push({ rel, reason: "it still does not resolve after repair" });
2149
+ }
2150
+ }
2151
+ return {
2152
+ repaired: repaired.sort(),
2153
+ failed,
2154
+ fallbackCount,
2155
+ repointedFromStaging: repointedFromStaging.sort(),
2156
+ unresolved,
2157
+ };
2158
+ }
2159
+ function absolutePathIsInside(child, parent) {
2160
+ if (pathContainedIn(child, parent))
2161
+ return true;
2162
+ try {
2163
+ return pathContainedIn(fs.realpathSync.native(child), fs.realpathSync.native(parent));
2077
2164
  }
2078
- return { repaired: repaired.sort(), failed, fallbackCount };
2165
+ catch {
2166
+ return false;
2167
+ }
2168
+ }
2169
+ function releaseLinkPointsAtStaging(destination, srcDir) {
2170
+ let linkText;
2171
+ try {
2172
+ linkText = fs.readlinkSync(destination);
2173
+ }
2174
+ catch {
2175
+ return false;
2176
+ }
2177
+ if (path.isAbsolute(linkText) && absolutePathIsInside(linkText, srcDir))
2178
+ return true;
2179
+ return absolutePathIsInside(path.resolve(path.dirname(destination), linkText), srcDir);
2079
2180
  }
2080
2181
  function recoveryProof(unresolved, cfg, hqRoot, srcDir, srcSha, rsyncLauncher, rsyncExcludes, env) {
2081
2182
  const newest = [...unresolved].sort((left, right) => right.entry.completedMs - left.entry.completedMs ||
@@ -2875,8 +2976,14 @@ function doRescue(cfg, env, out, err, setTmp, retainTmp, gitReachabilityProbeTim
2875
2976
  if (nativeLinks.fallbackCount > 0) {
2876
2977
  err("warning: this Windows account cannot create symbolic links (Developer Mode is off, or HQ is not running elevated). Folder links were created as directory junctions, and file links as copies. Enable Developer Mode in Windows Settings so the next update can use normal links.\n");
2877
2978
  }
2979
+ if (nativeLinks.repointedFromStaging.length > 0) {
2980
+ out(`==> Repointed ${nativeLinks.repointedFromStaging.length} release link(s) at the HQ root instead of the update staging folder: ${nativeLinks.repointedFromStaging.join(", ")}\n`);
2981
+ }
2878
2982
  for (const failure of nativeLinks.failed) {
2879
- err(`warning: could not rewrite ${failure.rel} as a native Windows link: ${failure.reason}\n`);
2983
+ err(`warning: could not rewrite ${failure.rel} as a native Windows link: ${failure.reason}. Enable Developer Mode in Windows Settings so the next update can write a normal link.\n`);
2984
+ }
2985
+ for (const unresolved of nativeLinks.unresolved) {
2986
+ err(`warning: release link ${unresolved.rel} still does not resolve. Enable Developer Mode in Windows Settings so the next update can write a normal link.\n`);
2880
2987
  }
2881
2988
  // --- Restore preserved sub-paths ---
2882
2989
  if (preserveMap.length > 0) {