@skaile/workspaces 6.13.1 → 6.14.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 (170) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{asset-feeds-HS4IUMUN.js → asset-feeds-DOG5FK7T.js} +6 -6
  3. package/dist/{asset-feeds-HS4IUMUN.js.map → asset-feeds-DOG5FK7T.js.map} +1 -1
  4. package/dist/asset-manager/index.js +1 -1
  5. package/dist/bridge/harnesses/claude-sdk.js +13 -15
  6. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  7. package/dist/bridge/harnesses/codex.js +4 -4
  8. package/dist/bridge/harnesses/continue.js +5 -5
  9. package/dist/bridge/harnesses/echo.js +2 -2
  10. package/dist/bridge/harnesses/gemini.js +7 -7
  11. package/dist/bridge/harnesses/goose.js +5 -5
  12. package/dist/bridge/harnesses/omp.js +7 -6
  13. package/dist/bridge/harnesses/omp.js.map +1 -1
  14. package/dist/bridge/harnesses/opencode.js +7 -88
  15. package/dist/bridge/harnesses/opencode.js.map +1 -1
  16. package/dist/bridge/harnesses/qwen.js +7 -7
  17. package/dist/bridge/index.js +11 -9
  18. package/dist/bridge/src/harness-binaries.d.ts +52 -5
  19. package/dist/bridge/src/harness-binaries.d.ts.map +1 -1
  20. package/dist/bridge/src/harness-detect.d.ts +73 -0
  21. package/dist/bridge/src/harness-detect.d.ts.map +1 -0
  22. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  23. package/dist/bridge/src/harness-model-discovery.d.ts +66 -0
  24. package/dist/bridge/src/harness-model-discovery.d.ts.map +1 -0
  25. package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -1
  26. package/dist/bridge/src/harnesses/claude-sdk.d.ts +4 -2
  27. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  28. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  29. package/dist/bridge/src/index.d.ts +3 -1
  30. package/dist/bridge/src/index.d.ts.map +1 -1
  31. package/dist/bridge/src/models.d.ts +9 -0
  32. package/dist/bridge/src/models.d.ts.map +1 -1
  33. package/dist/{chunk-YYQDSC7I.js → chunk-243Z3BNB.js} +3 -3
  34. package/dist/{chunk-YYQDSC7I.js.map → chunk-243Z3BNB.js.map} +1 -1
  35. package/dist/{chunk-R2P77YRM.js → chunk-2URJ7W5X.js} +3 -3
  36. package/dist/{chunk-R2P77YRM.js.map → chunk-2URJ7W5X.js.map} +1 -1
  37. package/dist/{chunk-MNED5ZCW.js → chunk-3BRBTQ6M.js} +2 -2
  38. package/dist/{chunk-MNED5ZCW.js.map → chunk-3BRBTQ6M.js.map} +1 -1
  39. package/dist/{chunk-UBN7HI4S.js → chunk-4SSTREBO.js} +3 -3
  40. package/dist/{chunk-UBN7HI4S.js.map → chunk-4SSTREBO.js.map} +1 -1
  41. package/dist/{chunk-Z56QSYGJ.js → chunk-5FO4U3OL.js} +4 -4
  42. package/dist/{chunk-Z56QSYGJ.js.map → chunk-5FO4U3OL.js.map} +1 -1
  43. package/dist/chunk-6ISJMEDX.js +88 -0
  44. package/dist/chunk-6ISJMEDX.js.map +1 -0
  45. package/dist/{chunk-HG2PDB3T.js → chunk-7UBCUKJO.js} +2 -2
  46. package/dist/{chunk-HG2PDB3T.js.map → chunk-7UBCUKJO.js.map} +1 -1
  47. package/dist/{chunk-GFBKUX3J.js → chunk-A7TM4PZZ.js} +7 -21
  48. package/dist/chunk-A7TM4PZZ.js.map +1 -0
  49. package/dist/{chunk-7MO23JPX.js → chunk-B6W5DCH5.js} +5 -5
  50. package/dist/{chunk-7MO23JPX.js.map → chunk-B6W5DCH5.js.map} +1 -1
  51. package/dist/{chunk-P6VNPRLD.js → chunk-CFRHYD4C.js} +8 -8
  52. package/dist/{chunk-P6VNPRLD.js.map → chunk-CFRHYD4C.js.map} +1 -1
  53. package/dist/{chunk-ZJMSX2T6.js → chunk-DYH3VSPU.js} +7 -7
  54. package/dist/{chunk-ZJMSX2T6.js.map → chunk-DYH3VSPU.js.map} +1 -1
  55. package/dist/{chunk-EISPUJ7D.js → chunk-F6LDWA2N.js} +3 -3
  56. package/dist/{chunk-EISPUJ7D.js.map → chunk-F6LDWA2N.js.map} +1 -1
  57. package/dist/{chunk-JXKT2QGT.js → chunk-F7WMHDTV.js} +10 -4
  58. package/dist/chunk-F7WMHDTV.js.map +1 -0
  59. package/dist/{chunk-HP62IELJ.js → chunk-J3FJTH3V.js} +3 -3
  60. package/dist/{chunk-HP62IELJ.js.map → chunk-J3FJTH3V.js.map} +1 -1
  61. package/dist/{chunk-GIMFNRNR.js → chunk-LMUNQYJQ.js} +418 -14
  62. package/dist/chunk-LMUNQYJQ.js.map +1 -0
  63. package/dist/{chunk-F6IEGYOI.js → chunk-LZCX2TCZ.js} +12 -12
  64. package/dist/{chunk-F6IEGYOI.js.map → chunk-LZCX2TCZ.js.map} +1 -1
  65. package/dist/{chunk-DUIZB6JM.js → chunk-NAAFRZTA.js} +3 -3
  66. package/dist/{chunk-DUIZB6JM.js.map → chunk-NAAFRZTA.js.map} +1 -1
  67. package/dist/{chunk-4OAUOH3A.js → chunk-OC3AIMZH.js} +5 -5
  68. package/dist/{chunk-4OAUOH3A.js.map → chunk-OC3AIMZH.js.map} +1 -1
  69. package/dist/{chunk-3NKXGAP4.js → chunk-OKPITFE3.js} +2 -2
  70. package/dist/{chunk-3NKXGAP4.js.map → chunk-OKPITFE3.js.map} +1 -1
  71. package/dist/{chunk-HTJPDSAC.js → chunk-QBLS7X3Z.js} +3 -3
  72. package/dist/{chunk-HTJPDSAC.js.map → chunk-QBLS7X3Z.js.map} +1 -1
  73. package/dist/{chunk-BALPY67W.js → chunk-QNHW26AT.js} +3 -3
  74. package/dist/{chunk-BALPY67W.js.map → chunk-QNHW26AT.js.map} +1 -1
  75. package/dist/{chunk-4KALKIWP.js → chunk-RLV3FF4I.js} +5 -5
  76. package/dist/{chunk-4KALKIWP.js.map → chunk-RLV3FF4I.js.map} +1 -1
  77. package/dist/{chunk-UZCAULGU.js → chunk-RRAXV5LE.js} +8 -8
  78. package/dist/{chunk-UZCAULGU.js.map → chunk-RRAXV5LE.js.map} +1 -1
  79. package/dist/{chunk-ESUF2ZYT.js → chunk-U7EZ2WSC.js} +2 -2
  80. package/dist/{chunk-ESUF2ZYT.js.map → chunk-U7EZ2WSC.js.map} +1 -1
  81. package/dist/{chunk-AONNQPPS.js → chunk-VKGNMXGZ.js} +3 -3
  82. package/dist/{chunk-AONNQPPS.js.map → chunk-VKGNMXGZ.js.map} +1 -1
  83. package/dist/{chunk-6EPNTAF3.js → chunk-WCUT3EQR.js} +3 -3
  84. package/dist/{chunk-6EPNTAF3.js.map → chunk-WCUT3EQR.js.map} +1 -1
  85. package/dist/{chunk-2O4QWC5S.js → chunk-X66KSHZF.js} +4 -4
  86. package/dist/{chunk-2O4QWC5S.js.map → chunk-X66KSHZF.js.map} +1 -1
  87. package/dist/{chunk-TBH6UXYN.js → chunk-XHLRMUMO.js} +3 -3
  88. package/dist/{chunk-TBH6UXYN.js.map → chunk-XHLRMUMO.js.map} +1 -1
  89. package/dist/{chunk-E6BXLB5Z.js → chunk-YJAKSCCN.js} +3 -3
  90. package/dist/{chunk-E6BXLB5Z.js.map → chunk-YJAKSCCN.js.map} +1 -1
  91. package/dist/chunk-YKD2MYLU.js +210 -0
  92. package/dist/chunk-YKD2MYLU.js.map +1 -0
  93. package/dist/{chunk-7YGOEJRD.js → chunk-YNQRVTXH.js} +4 -4
  94. package/dist/{chunk-7YGOEJRD.js.map → chunk-YNQRVTXH.js.map} +1 -1
  95. package/dist/{chunk-MECT5Z5D.js → chunk-ZQL6HGTW.js} +5 -5
  96. package/dist/{chunk-MECT5Z5D.js.map → chunk-ZQL6HGTW.js.map} +1 -1
  97. package/dist/{claude-code-G52B7TRB.js → claude-code-LFAOJ3UQ.js} +4 -4
  98. package/dist/{claude-code-G52B7TRB.js.map → claude-code-LFAOJ3UQ.js.map} +1 -1
  99. package/dist/cli/index.js +92 -54
  100. package/dist/cli/index.js.map +1 -1
  101. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -1
  102. package/dist/cli/src/commands/harness.d.ts +14 -0
  103. package/dist/cli/src/commands/harness.d.ts.map +1 -1
  104. package/dist/cli/src/commands/serve-preflight.d.ts +1 -6
  105. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  106. package/dist/connectors/index.js +12 -10
  107. package/dist/{connectors-TT6HTFH6.js → connectors-KPF4UUDS.js} +15 -13
  108. package/dist/{connectors-TT6HTFH6.js.map → connectors-KPF4UUDS.js.map} +1 -1
  109. package/dist/{ensure-sources-XZ3MUJOM.js → ensure-sources-FOMEGCQ5.js} +15 -13
  110. package/dist/ensure-sources-FOMEGCQ5.js.map +1 -0
  111. package/dist/factory-assets/connectors/box.js +12 -10
  112. package/dist/factory-assets/connectors/deploy.js +12 -10
  113. package/dist/factory-assets/connectors/devserver.js +12 -10
  114. package/dist/factory-assets/connectors/flow/adapter.js +12 -10
  115. package/dist/factory-assets/connectors/flow/run-flow.js +13 -11
  116. package/dist/factory-assets/connectors/flow.js +12 -10
  117. package/dist/factory-assets/connectors/git.js +12 -10
  118. package/dist/factory-assets/connectors/gmail.js +12 -10
  119. package/dist/factory-assets/connectors/googledrive.js +12 -10
  120. package/dist/factory-assets/connectors/local.js +12 -10
  121. package/dist/factory-assets/connectors/mattermost.js +12 -10
  122. package/dist/factory-assets/connectors/memory.js +12 -10
  123. package/dist/factory-assets/connectors/minio.js +12 -10
  124. package/dist/factory-assets/connectors/postgres.js +12 -10
  125. package/dist/factory-assets/connectors/s3.js +12 -10
  126. package/dist/factory-assets/connectors/sharepoint.js +12 -10
  127. package/dist/factory-assets/connectors/sqlite.js +12 -10
  128. package/dist/factory-assets/connectors/static-server.js +12 -10
  129. package/dist/factory-assets/connectors/tunnel.js +12 -10
  130. package/dist/factory-assets/connectors/webdav.js +12 -10
  131. package/dist/factory-assets/connectors/xstate-store.js +12 -10
  132. package/dist/factory-assets/connectors/xstate.js +12 -10
  133. package/dist/{helpers-Q6LFWGYT.js → helpers-ZJ67FO3Z.js} +15 -13
  134. package/dist/{helpers-Q6LFWGYT.js.map → helpers-ZJ67FO3Z.js.map} +1 -1
  135. package/dist/{library-publish-OADODIMW.js → library-publish-RGVXGTY4.js} +27 -25
  136. package/dist/library-publish-RGVXGTY4.js.map +1 -0
  137. package/dist/model-endpoint/index.js +3 -3
  138. package/dist/{open-library-MNCHOTAF.js → open-library-I5JHL37T.js} +16 -14
  139. package/dist/{open-library-MNCHOTAF.js.map → open-library-I5JHL37T.js.map} +1 -1
  140. package/dist/{project-PHO6JOVL.js → project-K5JWPIJ6.js} +23 -21
  141. package/dist/{project-PHO6JOVL.js.map → project-K5JWPIJ6.js.map} +1 -1
  142. package/dist/runner/index.js +18 -16
  143. package/dist/sdk/asset-manager.js +1 -1
  144. package/dist/sdk/bridge.js +11 -9
  145. package/dist/sdk/index.js +18 -16
  146. package/dist/sdk/index.js.map +1 -1
  147. package/dist/sdk/runner.js +18 -16
  148. package/dist/{serve-preflight-GLE2LPGT.js → serve-preflight-L6VVCDM5.js} +17 -15
  149. package/dist/{serve-preflight-GLE2LPGT.js.map → serve-preflight-L6VVCDM5.js.map} +1 -1
  150. package/dist/{setup-EPNOIKDM.js → setup-RXTNGML5.js} +16 -14
  151. package/dist/setup-RXTNGML5.js.map +1 -0
  152. package/dist/{source-CUSCY3KR.js → source-2LP5W3ST.js} +25 -23
  153. package/dist/{source-CUSCY3KR.js.map → source-2LP5W3ST.js.map} +1 -1
  154. package/dist/{source-manifest-publish-AHLDG4XS.js → source-manifest-publish-EZNCTSQF.js} +27 -25
  155. package/dist/source-manifest-publish-EZNCTSQF.js.map +1 -0
  156. package/dist/tui/index.js +18 -16
  157. package/dist/tui/index.js.map +1 -1
  158. package/dist/workspace-plugin/adapters/mcp.js +14 -12
  159. package/dist/workspace-plugin/adapters/omp.js +7 -7
  160. package/dist/workspace-plugin/index.js +1 -1
  161. package/package.json +1 -1
  162. package/dist/chunk-GFBKUX3J.js.map +0 -1
  163. package/dist/chunk-GIMFNRNR.js.map +0 -1
  164. package/dist/chunk-JXKT2QGT.js.map +0 -1
  165. package/dist/chunk-WWSRIT3J.js +0 -59
  166. package/dist/chunk-WWSRIT3J.js.map +0 -1
  167. package/dist/ensure-sources-XZ3MUJOM.js.map +0 -1
  168. package/dist/library-publish-OADODIMW.js.map +0 -1
  169. package/dist/setup-EPNOIKDM.js.map +0 -1
  170. package/dist/source-manifest-publish-AHLDG4XS.js.map +0 -1
@@ -0,0 +1,210 @@
1
+ import { statSync, accessSync, constants, readdirSync } from 'fs';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import semver from 'semver';
5
+
6
+ // bridge/src/harness-binaries.ts
7
+ var HARNESS_BINARIES = {
8
+ omp: {
9
+ bin: "omp",
10
+ envPrefix: "OMP",
11
+ hint: "The omp agent is not installed or not on your PATH. Install it and try again."
12
+ },
13
+ gemini: {
14
+ bin: "gemini",
15
+ envPrefix: "GEMINI",
16
+ hint: "Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (\u2265 v0.6.1).",
17
+ minVersion: "0.6.1"
18
+ },
19
+ qwen: {
20
+ bin: "qwen",
21
+ envPrefix: "QWEN",
22
+ hint: "Qwen Code is not installed or not on your PATH. Install it with `npm i -g @qwen-code/qwen-code`."
23
+ },
24
+ opencode: {
25
+ bin: "opencode",
26
+ envPrefix: "OPENCODE",
27
+ hint: "OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`."
28
+ },
29
+ goose: {
30
+ bin: "goose",
31
+ envPrefix: "GOOSE",
32
+ hint: "Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew)."
33
+ },
34
+ continue: {
35
+ bin: "cn",
36
+ envPrefix: "CONTINUE",
37
+ hint: "Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`."
38
+ }
39
+ };
40
+ var SDK_CLI_BINARIES = {
41
+ "claude-sdk": {
42
+ bin: "claude",
43
+ envPrefix: "CLAUDE",
44
+ overrideEnv: "CLAUDE_CODE_PATH",
45
+ // Container images point `CLAUDE_CODE_PATH` at a `cli.js` extracted from the SDK (mode 0644).
46
+ overrideMayBeScript: true,
47
+ hint: "Claude Code CLI not found; the Claude Agent SDK falls back to its bundled CLI. Install it with `npm i -g @anthropic-ai/claude-code` to see its login state."
48
+ },
49
+ codex: {
50
+ bin: "codex",
51
+ envPrefix: "CODEX",
52
+ hint: "Codex CLI not found on PATH; the Codex SDK runs its bundled binary. Install `npm i -g @openai/codex` to see its login state."
53
+ }
54
+ };
55
+ function isExecutableFile(file) {
56
+ try {
57
+ if (!statSync(file).isFile()) return false;
58
+ accessSync(file, process.platform === "win32" ? constants.F_OK : constants.X_OK);
59
+ return true;
60
+ } catch {
61
+ return false;
62
+ }
63
+ }
64
+ function isRegularFile(file) {
65
+ try {
66
+ return statSync(file).isFile();
67
+ } catch {
68
+ return false;
69
+ }
70
+ }
71
+ var TOOLCHAIN_DIR_CACHE_TTL_MS = 5e3;
72
+ var toolchainCache;
73
+ function versionedDirs(parent, ...suffix) {
74
+ let names;
75
+ try {
76
+ names = readdirSync(parent, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
77
+ } catch {
78
+ return [];
79
+ }
80
+ const parsed = names.map((name) => ({ name, version: semver.coerce(name) }));
81
+ parsed.sort((a, b) => {
82
+ if (a.version && b.version) return semver.rcompare(a.version, b.version);
83
+ if (a.version) return -1;
84
+ if (b.version) return 1;
85
+ return a.name.localeCompare(b.name);
86
+ });
87
+ return parsed.map((p) => path.join(parent, p.name, ...suffix));
88
+ }
89
+ function computeToolchainBinDirs(env, home) {
90
+ const win = process.platform === "win32";
91
+ const dirs = [];
92
+ const npmPrefix = (env.NPM_CONFIG_PREFIX ?? env.npm_config_prefix)?.trim();
93
+ if (npmPrefix) {
94
+ dirs.push(path.join(npmPrefix, "bin"));
95
+ if (win) dirs.push(npmPrefix);
96
+ }
97
+ if (win && env.APPDATA) dirs.push(path.join(env.APPDATA, "npm"));
98
+ dirs.push(
99
+ path.join(home, ".local", "bin"),
100
+ path.join(home, ".bun", "bin"),
101
+ path.join(home, ".volta", "bin"),
102
+ path.join(home, ".asdf", "shims"),
103
+ path.join(home, "Library", "pnpm"),
104
+ path.join(home, ".cargo", "bin"),
105
+ path.join(home, ".npm-global", "bin"),
106
+ path.join(home, ".npm-packages", "bin"),
107
+ path.join(home, ".deno", "bin"),
108
+ path.join(home, "go", "bin"),
109
+ path.join(home, ".pyenv", "shims")
110
+ );
111
+ if (win) dirs.push(path.join(home, "scoop", "shims"));
112
+ const miseData = env.MISE_DATA_DIR?.trim();
113
+ const miseRoot = miseData || path.join(home, ".local", "share", "mise");
114
+ dirs.push(path.join(miseRoot, "shims"));
115
+ if (!miseData) dirs.push(path.join(home, ".mise", "shims"));
116
+ dirs.push(path.join(home, ".nix-profile", "bin"));
117
+ if (!win) {
118
+ dirs.push(
119
+ "/opt/homebrew/bin",
120
+ "/usr/local/bin",
121
+ "/run/current-system/sw/bin",
122
+ "/nix/var/nix/profiles/default/bin"
123
+ );
124
+ }
125
+ dirs.push(...versionedDirs(path.join(miseRoot, "installs", "node"), "bin"));
126
+ dirs.push(
127
+ ...versionedDirs(
128
+ path.join(env.NVM_DIR?.trim() || path.join(home, ".nvm"), "versions", "node"),
129
+ "bin"
130
+ )
131
+ );
132
+ dirs.push(
133
+ ...versionedDirs(
134
+ path.join(home, ".local", "share", "fnm", "node-versions"),
135
+ "installation",
136
+ "bin"
137
+ )
138
+ );
139
+ dirs.push(...versionedDirs(path.join(home, ".fnm", "node-versions"), "installation", "bin"));
140
+ if (win) {
141
+ const fnmDir = env.FNM_DIR?.trim() || env.LOCALAPPDATA || env.APPDATA;
142
+ if (fnmDir) {
143
+ const root = env.FNM_DIR?.trim() ? fnmDir : path.join(fnmDir, "fnm");
144
+ dirs.push(...versionedDirs(path.join(root, "node-versions"), "installation"));
145
+ }
146
+ }
147
+ return dirs;
148
+ }
149
+ function toolchainBinDirs(env = process.env, home = os.homedir()) {
150
+ const key = JSON.stringify([
151
+ home,
152
+ env.NPM_CONFIG_PREFIX,
153
+ env.npm_config_prefix,
154
+ env.MISE_DATA_DIR,
155
+ env.NVM_DIR,
156
+ env.FNM_DIR,
157
+ env.APPDATA,
158
+ env.LOCALAPPDATA
159
+ ]);
160
+ const now = Date.now();
161
+ if (toolchainCache && toolchainCache.key === key && now - toolchainCache.at < TOOLCHAIN_DIR_CACHE_TTL_MS) {
162
+ return [...toolchainCache.dirs];
163
+ }
164
+ const dirs = computeToolchainBinDirs(env, home);
165
+ toolchainCache = { key, at: now, dirs };
166
+ return [...dirs];
167
+ }
168
+ function harnessSearchDirs(env = process.env) {
169
+ const seen = /* @__PURE__ */ new Set();
170
+ const out = [];
171
+ const home = env.HOME || os.homedir();
172
+ for (const dir of [...(env.PATH ?? "").split(path.delimiter), ...toolchainBinDirs(env, home)]) {
173
+ if (!dir || seen.has(dir)) continue;
174
+ seen.add(dir);
175
+ out.push(dir);
176
+ }
177
+ return out;
178
+ }
179
+ function harnessSpawnPath(env = process.env) {
180
+ return harnessSearchDirs(env).join(path.delimiter);
181
+ }
182
+ function resolveHarnessBinary(harness, env = process.env) {
183
+ const override = env[overrideVar(harness)];
184
+ if (override && harness.overrideMayBeScript && /[\\/]/.test(override)) {
185
+ if (isRegularFile(override)) return path.resolve(override);
186
+ return resolveHarnessBinary(harness, { ...env, [overrideVar(harness)]: "" });
187
+ }
188
+ const name = override || harness.bin;
189
+ if (name.includes("/") || name.includes(path.sep)) {
190
+ return isExecutableFile(name) ? path.resolve(name) : void 0;
191
+ }
192
+ const exts = process.platform === "win32" ? ["", ...(env.PATHEXT ?? ".EXE;.CMD;.BAT").split(";").filter(Boolean)] : [""];
193
+ for (const dir of harnessSearchDirs(env)) {
194
+ for (const ext of exts) {
195
+ const candidate = path.join(dir, name + ext);
196
+ if (isExecutableFile(candidate)) return path.resolve(candidate);
197
+ }
198
+ }
199
+ return void 0;
200
+ }
201
+ function overrideVar(harness) {
202
+ return harness.overrideEnv ?? `${harness.envPrefix}_BRIDGE_BIN`;
203
+ }
204
+ function findHarnessBinary(harness, env = process.env) {
205
+ return resolveHarnessBinary(harness, env) !== void 0;
206
+ }
207
+
208
+ export { HARNESS_BINARIES, SDK_CLI_BINARIES, findHarnessBinary, harnessSearchDirs, harnessSpawnPath, isExecutableFile, overrideVar, resolveHarnessBinary, toolchainBinDirs };
209
+ //# sourceMappingURL=chunk-YKD2MYLU.js.map
210
+ //# sourceMappingURL=chunk-YKD2MYLU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/harness-binaries.ts"],"names":[],"mappings":"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","file":"chunk-YKD2MYLU.js","sourcesContent":["/**\n * The external program each CLI harness spawns, and the one line the user gets when it is\n * missing. The harnesses print `hint` when the spawn fails; `skaile run` and `--dry-run` print\n * it before a turn starts ({@link resolveHarnessBinary}).\n *\n * One resolver serves detection and every spawn: it searches `PATH` and then the well-known\n * install dirs of the user's toolchains (nvm, volta, bun, mise, fnm, pnpm, Homebrew, cargo,\n * nix, a custom npm prefix), so a harness installed there is found even when the parent\n * process runs with a minimal `PATH`. Spawns pass {@link harnessSpawnPath} as the child's\n * `PATH` so the program and the helpers it launches (`node`, shims) resolve the same way.\n */\nimport { accessSync, constants, readdirSync, statSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport semver from \"semver\";\n\n/** One CLI harness's program. */\nexport interface HarnessBinary {\n /** Program name looked up on `PATH`. */\n bin: string;\n /** Test-seam prefix: `<PREFIX>_BRIDGE_BIN` replaces the program (the harness reads the same). */\n envPrefix: string;\n /** The install line. */\n hint: string;\n /** Env var naming the program instead of `<envPrefix>_BRIDGE_BIN` (e.g. `CLAUDE_CODE_PATH`). */\n overrideEnv?: string;\n /** Lowest supported version (semver). Detection reports an older program as outdated. */\n minVersion?: string;\n /**\n * The override path may be a script without the exec bit (the SDK runs it through `node`); a\n * missing override path then falls back to looking up `bin`. Only for programs that are not\n * spawned directly.\n */\n overrideMayBeScript?: boolean;\n}\n\n/** The CLI harnesses that spawn a program, by harness id. */\nexport const HARNESS_BINARIES: Readonly<Record<string, HarnessBinary>> = {\n omp: {\n bin: \"omp\",\n envPrefix: \"OMP\",\n hint: \"The omp agent is not installed or not on your PATH. Install it and try again.\",\n },\n gemini: {\n bin: \"gemini\",\n envPrefix: \"GEMINI\",\n hint: \"Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (≥ v0.6.1).\",\n minVersion: \"0.6.1\",\n },\n qwen: {\n bin: \"qwen\",\n envPrefix: \"QWEN\",\n hint: \"Qwen Code is not installed or not on your PATH. Install it with `npm i -g @qwen-code/qwen-code`.\",\n },\n opencode: {\n bin: \"opencode\",\n envPrefix: \"OPENCODE\",\n hint: \"OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.\",\n },\n goose: {\n bin: \"goose\",\n envPrefix: \"GOOSE\",\n hint: \"Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).\",\n },\n continue: {\n bin: \"cn\",\n envPrefix: \"CONTINUE\",\n hint: \"Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`.\",\n },\n};\n\n/**\n * The CLIs next to the SDK harnesses. The SDKs run without them (they bundle a binary); the\n * CLI is only looked up to report its version and the account login.\n */\nexport const SDK_CLI_BINARIES: Readonly<Record<\"claude-sdk\" | \"codex\", HarnessBinary>> = {\n \"claude-sdk\": {\n bin: \"claude\",\n envPrefix: \"CLAUDE\",\n overrideEnv: \"CLAUDE_CODE_PATH\",\n // Container images point `CLAUDE_CODE_PATH` at a `cli.js` extracted from the SDK (mode 0644).\n overrideMayBeScript: true,\n hint: \"Claude Code CLI not found; the Claude Agent SDK falls back to its bundled CLI. Install it with `npm i -g @anthropic-ai/claude-code` to see its login state.\",\n },\n codex: {\n bin: \"codex\",\n envPrefix: \"CODEX\",\n hint: \"Codex CLI not found on PATH; the Codex SDK runs its bundled binary. Install `npm i -g @openai/codex` to see its login state.\",\n },\n};\n\n/** Whether `file` is a regular file the process may execute (existence only on Windows). */\nexport function isExecutableFile(file: string): boolean {\n try {\n if (!statSync(file).isFile()) return false;\n accessSync(file, process.platform === \"win32\" ? constants.F_OK : constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isRegularFile(file: string): boolean {\n try {\n return statSync(file).isFile();\n } catch {\n return false;\n }\n}\n\ntype Env = Record<string, string | undefined>;\n\n/** How long a computed toolchain dir list is reused (the dirs are read from disk). */\nconst TOOLCHAIN_DIR_CACHE_TTL_MS = 5000;\nlet toolchainCache: { key: string; at: number; dirs: string[] } | undefined;\n\n/** Subdirectories of `parent`, newest semver first (unparsable names last), joined with `suffix`. */\nfunction versionedDirs(parent: string, ...suffix: string[]): string[] {\n let names: string[];\n try {\n names = readdirSync(parent, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name);\n } catch {\n return [];\n }\n const parsed = names.map((name) => ({ name, version: semver.coerce(name) }));\n parsed.sort((a, b) => {\n if (a.version && b.version) return semver.rcompare(a.version, b.version);\n if (a.version) return -1;\n if (b.version) return 1;\n return a.name.localeCompare(b.name);\n });\n return parsed.map((p) => path.join(parent, p.name, ...suffix));\n}\n\nfunction computeToolchainBinDirs(env: Env, home: string): string[] {\n const win = process.platform === \"win32\";\n const dirs: string[] = [];\n\n const npmPrefix = (env.NPM_CONFIG_PREFIX ?? env.npm_config_prefix)?.trim();\n if (npmPrefix) {\n dirs.push(path.join(npmPrefix, \"bin\"));\n if (win) dirs.push(npmPrefix);\n }\n if (win && env.APPDATA) dirs.push(path.join(env.APPDATA, \"npm\"));\n\n dirs.push(\n path.join(home, \".local\", \"bin\"),\n path.join(home, \".bun\", \"bin\"),\n path.join(home, \".volta\", \"bin\"),\n path.join(home, \".asdf\", \"shims\"),\n path.join(home, \"Library\", \"pnpm\"),\n path.join(home, \".cargo\", \"bin\"),\n path.join(home, \".npm-global\", \"bin\"),\n path.join(home, \".npm-packages\", \"bin\"),\n path.join(home, \".deno\", \"bin\"),\n path.join(home, \"go\", \"bin\"),\n path.join(home, \".pyenv\", \"shims\"),\n );\n if (win) dirs.push(path.join(home, \"scoop\", \"shims\"));\n\n const miseData = env.MISE_DATA_DIR?.trim();\n const miseRoot = miseData || path.join(home, \".local\", \"share\", \"mise\");\n dirs.push(path.join(miseRoot, \"shims\"));\n if (!miseData) dirs.push(path.join(home, \".mise\", \"shims\"));\n\n dirs.push(path.join(home, \".nix-profile\", \"bin\"));\n if (!win) {\n dirs.push(\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n \"/run/current-system/sw/bin\",\n \"/nix/var/nix/profiles/default/bin\",\n );\n }\n\n // Per-version node roots: the version in use is whichever the user's shell would pick, which\n // we cannot know here, so the newest installed version of each manager comes first.\n dirs.push(...versionedDirs(path.join(miseRoot, \"installs\", \"node\"), \"bin\"));\n dirs.push(\n ...versionedDirs(\n path.join(env.NVM_DIR?.trim() || path.join(home, \".nvm\"), \"versions\", \"node\"),\n \"bin\",\n ),\n );\n dirs.push(\n ...versionedDirs(\n path.join(home, \".local\", \"share\", \"fnm\", \"node-versions\"),\n \"installation\",\n \"bin\",\n ),\n );\n dirs.push(...versionedDirs(path.join(home, \".fnm\", \"node-versions\"), \"installation\", \"bin\"));\n if (win) {\n const fnmDir = env.FNM_DIR?.trim() || env.LOCALAPPDATA || env.APPDATA;\n if (fnmDir) {\n const root = env.FNM_DIR?.trim() ? fnmDir : path.join(fnmDir, \"fnm\");\n dirs.push(...versionedDirs(path.join(root, \"node-versions\"), \"installation\"));\n }\n }\n return dirs;\n}\n\n/**\n * Well-known install dirs of the user's toolchains, in lookup order. Dirs need not exist except\n * the per-version node roots, which are listed from disk (newest version first). The result is\n * cached for 5 s per `home` (and per the env values it reads).\n *\n * @param env - Environment read for `NPM_CONFIG_PREFIX`, `MISE_DATA_DIR`, `NVM_DIR`, `FNM_DIR`, `APPDATA`, `LOCALAPPDATA` (default `process.env`).\n * @param home - The home dir the per-user dirs hang off (default `os.homedir()`).\n */\nexport function toolchainBinDirs(env: Env = process.env, home: string = os.homedir()): string[] {\n const key = JSON.stringify([\n home,\n env.NPM_CONFIG_PREFIX,\n env.npm_config_prefix,\n env.MISE_DATA_DIR,\n env.NVM_DIR,\n env.FNM_DIR,\n env.APPDATA,\n env.LOCALAPPDATA,\n ]);\n const now = Date.now();\n if (\n toolchainCache &&\n toolchainCache.key === key &&\n now - toolchainCache.at < TOOLCHAIN_DIR_CACHE_TTL_MS\n ) {\n return [...toolchainCache.dirs];\n }\n const dirs = computeToolchainBinDirs(env, home);\n toolchainCache = { key, at: now, dirs };\n return [...dirs];\n}\n\n/**\n * `PATH` entries, then {@link toolchainBinDirs} (rooted at `env.HOME`, else `os.homedir()`);\n * empty entries dropped, duplicates removed in order.\n */\nexport function harnessSearchDirs(env: Env = process.env): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n const home = env.HOME || os.homedir();\n for (const dir of [...(env.PATH ?? \"\").split(path.delimiter), ...toolchainBinDirs(env, home)]) {\n if (!dir || seen.has(dir)) continue;\n seen.add(dir);\n out.push(dir);\n }\n return out;\n}\n\n/** The `PATH` a harness child runs with: {@link harnessSearchDirs} joined. */\nexport function harnessSpawnPath(env: Env = process.env): string {\n return harnessSearchDirs(env).join(path.delimiter);\n}\n\n/**\n * The absolute path of the program a harness spawns, or `undefined` when it cannot be found.\n * The override env var (`<PREFIX>_BRIDGE_BIN`, or the row's `overrideEnv`) replaces `bin`. A name\n * with a path separator is checked as a path; any other name is searched in `PATH`, then the\n * toolchain dirs. The project's `node_modules/.bin` is never searched: it is repo-controlled.\n *\n * A row with `overrideMayBeScript` accepts an override path that is a regular file without the\n * exec bit (a `cli.js`), and falls back to the normal lookup of `bin` when that path is missing.\n *\n * @param harness - The harness's {@link HARNESS_BINARIES} (or {@link SDK_CLI_BINARIES}) row.\n * @param env - Environment to read `PATH` and the override from (default `process.env`).\n */\nexport function resolveHarnessBinary(\n harness: HarnessBinary,\n env: Env = process.env,\n): string | undefined {\n const override = env[overrideVar(harness)];\n if (override && harness.overrideMayBeScript && /[\\\\/]/.test(override)) {\n if (isRegularFile(override)) return path.resolve(override);\n return resolveHarnessBinary(harness, { ...env, [overrideVar(harness)]: \"\" });\n }\n const name = override || harness.bin;\n if (name.includes(\"/\") || name.includes(path.sep)) {\n return isExecutableFile(name) ? path.resolve(name) : undefined;\n }\n const exts =\n process.platform === \"win32\"\n ? [\"\", ...(env.PATHEXT ?? \".EXE;.CMD;.BAT\").split(\";\").filter(Boolean)]\n : [\"\"];\n for (const dir of harnessSearchDirs(env)) {\n for (const ext of exts) {\n const candidate = path.join(dir, name + ext);\n if (isExecutableFile(candidate)) return path.resolve(candidate);\n }\n }\n return undefined;\n}\n\n/** The env var that overrides `harness`'s program. */\nexport function overrideVar(harness: HarnessBinary): string {\n return harness.overrideEnv ?? `${harness.envPrefix}_BRIDGE_BIN`;\n}\n\n/**\n * Whether the harness's program is found (now also in the toolchain dirs).\n *\n * @deprecated Use `resolveHarnessBinary(row, env) !== undefined`. Kept for hosts that still call it.\n */\nexport function findHarnessBinary(harness: HarnessBinary, env: Env = process.env): boolean {\n return resolveHarnessBinary(harness, env) !== undefined;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { registeredAssetKeys, unresolvedManifestDependencies, warnIgnoredDomainFiles, warnLegacyBundleFiles, removedDomainOption, rejectRemovedDomainOption, reportLibrarySymlinks, composeRefContext, rootSkillExtraAssetProblems, readOnlyLibraryAt, assetEntryRef, manifestPublisherProblems, manifestRootProblems, manifestFilesProblems, manifestEntryNameProblems, manifestRequiresProblems, checkAssetFile, findEntryManifestFile, declaredVersion, invalidSemverText, manifestVersionMismatchMessage, MANIFEST_GLOBS, manifestParseErrorText, checkAsset, invalidPublisherMessage, DEFAULT_VERSION } from './chunk-4OAUOH3A.js';
1
+ import { registeredAssetKeys, unresolvedManifestDependencies, warnIgnoredDomainFiles, warnLegacyBundleFiles, removedDomainOption, rejectRemovedDomainOption, reportLibrarySymlinks, composeRefContext, rootSkillExtraAssetProblems, readOnlyLibraryAt, assetEntryRef, manifestPublisherProblems, manifestRootProblems, manifestFilesProblems, manifestEntryNameProblems, manifestRequiresProblems, checkAssetFile, findEntryManifestFile, declaredVersion, invalidSemverText, manifestVersionMismatchMessage, MANIFEST_GLOBS, manifestParseErrorText, checkAsset, invalidPublisherMessage, DEFAULT_VERSION } from './chunk-OC3AIMZH.js';
2
2
  import { getKindRegistry } from './chunk-HPQ2WDYC.js';
3
- import { logErr, logInfo, logWarn, logOk, checkAgentInstances, connectorErrorLines, unknownKeyWarnings, unknownHarnessErrors, connectorMountPathChecks, unknownConnectorDriverErrors } from './chunk-Z56QSYGJ.js';
3
+ import { logErr, logInfo, logWarn, logOk, checkAgentInstances, connectorErrorLines, unknownKeyWarnings, unknownHarnessErrors, connectorMountPathChecks, unknownConnectorDriverErrors } from './chunk-5FO4U3OL.js';
4
4
  import { validateFlowVersions } from './chunk-KOI7QFDH.js';
5
5
  import { loadFlow } from './chunk-WDG5IVEA.js';
6
6
  import { flowSkillVersionPins } from './chunk-7RGTAEG6.js';
@@ -884,5 +884,5 @@ function makeValidateCommand() {
884
884
  }
885
885
 
886
886
  export { makeValidateCommand, scanIdentities };
887
- //# sourceMappingURL=chunk-7YGOEJRD.js.map
888
- //# sourceMappingURL=chunk-7YGOEJRD.js.map
887
+ //# sourceMappingURL=chunk-YNQRVTXH.js.map
888
+ //# sourceMappingURL=chunk-YNQRVTXH.js.map