@duckmind/dm-windows-x64 0.60.6 → 0.60.9

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 (197) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +70 -123
  3. package/extensions/dm-9router-ext/src/index.js +410 -5
  4. package/extensions/dm-caveman/extensions/caveman.js +283 -12
  5. package/extensions/dm-cliproxy/index.js +182 -2
  6. package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
  7. package/extensions/dm-cliproxy/src/apply.js +228 -1
  8. package/extensions/dm-cliproxy/src/cache.js +42 -1
  9. package/extensions/dm-cliproxy/src/commands.js +50 -2
  10. package/extensions/dm-cliproxy/src/compat.js +81 -1
  11. package/extensions/dm-cliproxy/src/config.js +192 -2
  12. package/extensions/dm-cliproxy/src/conflicts.js +46 -1
  13. package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
  14. package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
  15. package/extensions/dm-cliproxy/src/log.js +23 -1
  16. package/extensions/dm-cliproxy/src/status-quota.js +77 -1
  17. package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
  18. package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
  19. package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
  20. package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
  21. package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
  22. package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
  23. package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
  24. package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
  25. package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
  26. package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
  27. package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
  28. package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
  29. package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
  30. package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
  31. package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
  32. package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
  33. package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
  34. package/extensions/dm-context/src/context.js +144 -1
  35. package/extensions/dm-context/src/index.js +339 -7
  36. package/extensions/dm-context/src/utils.js +9 -1
  37. package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
  38. package/extensions/dm-cua/index.js +75 -6
  39. package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
  40. package/extensions/dm-cua/src/browser-install.mjs +331 -2
  41. package/extensions/dm-fff/src/index.js +688 -12
  42. package/extensions/dm-fff/src/query.js +60 -1
  43. package/extensions/dm-goal/src/goal.js +894 -23
  44. package/extensions/dm-image2/index.js +103 -9
  45. package/extensions/dm-image2/src/image-lib.mjs +1275 -8
  46. package/extensions/dm-subagents/install.mjs +62 -8
  47. package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
  48. package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
  49. package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
  50. package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
  51. package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
  52. package/extensions/dm-subagents/src/agents/agents.js +1139 -11
  53. package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
  54. package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
  55. package/extensions/dm-subagents/src/agents/identity.js +29 -1
  56. package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
  57. package/extensions/dm-subagents/src/agents/skills.js +614 -6
  58. package/extensions/dm-subagents/src/extension/config.js +35 -2
  59. package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
  60. package/extensions/dm-subagents/src/extension/doctor.js +172 -15
  61. package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
  62. package/extensions/dm-subagents/src/extension/index.js +521 -359
  63. package/extensions/dm-subagents/src/extension/rpc.js +266 -7
  64. package/extensions/dm-subagents/src/extension/schemas.js +275 -1
  65. package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
  66. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
  67. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
  68. package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
  69. package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
  70. package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
  71. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
  72. package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
  73. package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
  74. package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
  75. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
  76. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
  77. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
  78. package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
  79. package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
  80. package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
  81. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
  82. package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
  83. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
  84. package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
  85. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
  86. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
  87. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
  88. package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
  89. package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
  90. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
  91. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
  92. package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
  93. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
  94. package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
  95. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
  96. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
  97. package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
  98. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
  99. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
  100. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
  101. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
  102. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
  103. package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
  104. package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
  105. package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
  106. package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
  107. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
  108. package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
  109. package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
  110. package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
  111. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
  112. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
  113. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
  114. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
  115. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
  116. package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
  117. package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
  118. package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
  119. package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
  120. package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
  121. package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
  122. package/extensions/dm-subagents/src/shared/formatters.js +98 -7
  123. package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
  124. package/extensions/dm-subagents/src/shared/model-info.js +62 -1
  125. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
  126. package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
  127. package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
  128. package/extensions/dm-subagents/src/shared/settings.js +198 -11
  129. package/extensions/dm-subagents/src/shared/status-format.js +53 -1
  130. package/extensions/dm-subagents/src/shared/types.js +184 -6
  131. package/extensions/dm-subagents/src/shared/utils.js +462 -2
  132. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
  133. package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
  134. package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
  135. package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
  136. package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
  137. package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
  138. package/extensions/dm-subagents/src/tui/render.js +1542 -4
  139. package/extensions/dm-usage/index.js +1294 -9
  140. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
  141. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
  142. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
  143. package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
  144. package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
  145. package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
  146. package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
  147. package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
  148. package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
  149. package/extensions/greedysearch-dm/bin/search.mjs +620 -540
  150. package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
  151. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
  152. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
  153. package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
  154. package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
  155. package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
  156. package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
  157. package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
  158. package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
  159. package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
  160. package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
  161. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
  162. package/extensions/greedysearch-dm/index.js +123 -23
  163. package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
  164. package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
  165. package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
  166. package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
  167. package/extensions/greedysearch-dm/src/github.mjs +222 -7
  168. package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
  169. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
  170. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
  171. package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
  172. package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
  173. package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
  174. package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
  175. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
  176. package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
  177. package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
  178. package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
  179. package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
  180. package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
  181. package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
  182. package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
  183. package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
  184. package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
  185. package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
  186. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
  187. package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
  188. package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
  189. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
  190. package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
  191. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
  192. package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
  193. package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
  194. package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
  195. package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
  196. package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
  197. package/package.json +1 -1
@@ -1,2 +1,331 @@
1
- import{spawn as y}from"node:child_process";import{existsSync as P}from"node:fs";import{homedir as _,platform as A}from"node:os";import g from"node:path";var S=900000,T=16384,x=5,M=1000;function w(...e){return g.win32.join(...e)}function d(e,o){if(o&&!e.includes(o))e.push(o)}function b(e,o,n){let l=e.PATH??e.Path??e.path??"",r=o==="win32"?";":g.delimiter,s=o==="win32"?(e.PATHEXT??".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean):[""],i=[];for(let m of l.split(r).filter(Boolean))for(let a of n){if(o==="win32"&&g.win32.extname(a)){d(i,w(m,a));continue}for(let h of s){let t=o==="win32"?`${a}${h.toLowerCase()}`:a;d(i,o==="win32"?w(m,t):g.join(m,t))}}return i}function $({env:e=process.env,platformName:o=A(),homeDir:n=_(),exists:l=P}={}){let r=[];if(o==="win32"){for(let s of[e.LOCALAPPDATA,e.ProgramFiles,e["ProgramFiles(x86)"]]){if(!s)continue;d(r,w(s,"Google","Chrome","Application","chrome.exe")),d(r,w(s,"Chromium","Application","chrome.exe"))}d(r,n?w(n,"AppData","Local","Google","Chrome","Application","chrome.exe"):void 0),r.push(...b(e,o,["chrome","chromium"]))}else if(o==="darwin"){for(let s of["/Applications",g.join(n,"Applications")])d(r,g.join(s,"Google Chrome.app","Contents","MacOS","Google Chrome")),d(r,g.join(s,"Chromium.app","Contents","MacOS","Chromium"));r.push(...b(e,o,["google-chrome-stable","google-chrome","chromium","chromium-browser"]))}else if(o==="linux"){for(let s of["/usr/bin/google-chrome-stable","/usr/bin/google-chrome","/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium","/usr/local/bin/google-chrome","/usr/local/bin/chromium"])d(r,s);r.push(...b(e,o,["google-chrome-stable","google-chrome","chromium","chromium-browser"]))}return r.find((s)=>l(s))}function c(e,...o){return{command:e,args:o}}function f(e,o){if(o===0)return e;return e.map(({command:n,args:l})=>c("sudo","-n",n,...l))}function E({platformName:e=A(),uid:o=typeof process.getuid==="function"?process.getuid():void 0}={}){if(e==="darwin")return[{id:"homebrew-google-chrome",commands:[c("brew","install","--cask","google-chrome")]}];if(e==="win32"){let n=["install","--id","Google.Chrome","-e","--silent","--accept-package-agreements","--accept-source-agreements","--disable-interactivity"];return[{id:"winget-user-google-chrome",commands:[c("winget",...n.slice(0,4),"--scope","user",...n.slice(4))]},{id:"winget-machine-google-chrome",commands:[c("winget",...n)]},{id:"chocolatey-google-chrome",commands:[c("choco","install","googlechrome","-y","--no-progress")]}]}if(e==="linux")return[{id:"apt-chromium",commands:f([c("apt-get","update"),c("apt-get","install","-y","chromium")],o)},{id:"apt-chromium-browser",commands:f([c("apt-get","update"),c("apt-get","install","-y","chromium-browser")],o)},{id:"dnf-chromium",commands:f([c("dnf","install","-y","chromium")],o)},{id:"yum-chromium",commands:f([c("yum","install","-y","chromium")],o)},{id:"pacman-chromium",commands:f([c("pacman","-S","--noconfirm","--needed","chromium")],o)},{id:"zypper-chromium",commands:f([c("zypper","--non-interactive","install","chromium")],o)},{id:"apk-chromium",commands:f([c("apk","add","chromium")],o)}];return[]}function O(e=process.env){let o=e.DM_CUA_AUTO_INSTALL;if(o===void 0)return!0;return!["0","false","no","off"].includes(o.trim().toLowerCase())}function k(e){let o=Number(e.DM_CUA_INSTALL_TIMEOUT_MS);return Number.isFinite(o)&&o>0?o:S}function L(e,o){let n=`${e}${o}`;if(Buffer.byteLength(n)<=T)return n;return n.slice(-T)}function I(e,o,{env:n=process.env,timeoutMs:l=k(n)}={}){return new Promise((r)=>{let s=!1,i="",m,a=y(e,o,{env:n,shell:!1,stdio:["ignore","pipe","pipe"],windowsHide:!0}),h=(t)=>{if(s)return;s=!0,clearTimeout(m),r(t)};a.stdout?.on("data",(t)=>{i=L(i,t.toString())}),a.stderr?.on("data",(t)=>{i=L(i,t.toString())}),a.on("error",(t)=>{h({status:t.code==="ENOENT"?"unavailable":"failed",exitCode:null,message:`${t.message}${i?`
2
- ${i.trim()}`:""}`})}),a.on("close",(t,u)=>{h({status:t===0?"ok":"failed",exitCode:t,message:i.trim()||(u?`installer terminated by signal ${u}`:"")})}),m=setTimeout(()=>{a.kill(),h({status:"timeout",exitCode:null,message:`installer timed out after ${l}ms`})},l)})}function U(e){if(e.startsWith("homebrew-"))return"Homebrew";if(e.startsWith("winget-"))return"winget";return e.split("-")[0]}function D(e){let o=e.message?`: ${e.message}`:"";return`${e.id} ${e.status}${o}`}async function H({env:e=process.env,platformName:o=A(),uid:n=typeof process.getuid==="function"?process.getuid():void 0,findExecutable:l=()=>$({env:e,platformName:o,homeDir:_()}),runCommand:r=(i,m)=>I(i,m,{env:e}),sleep:s=(i)=>new Promise((m)=>{setTimeout(m,i)})}={}){let i=l();if(i)return{status:"existing",path:i,method:null,attempts:[]};if(!O(e))throw Error("Chrome was not found and automatic installation is disabled by DM_CUA_AUTO_INSTALL.");let m=E({platformName:o,uid:n});if(m.length===0)throw Error(`Chrome was not found and no automatic Chrome installer is defined for ${o}.`);let a=[];for(let t of m){let u={status:"ok",exitCode:0,message:""};for(let p of t.commands)if(u=await r(p.command,p.args),u.status!=="ok")break;if(u.status!=="ok"){a.push({id:t.id,status:u.status,exitCode:u.exitCode,message:u.message});continue}let C;for(let p=0;p<x;p+=1){if(C=l(),C)break;if(p<x-1)await s(M)}if(C)return a.push({id:t.id,status:"installed",exitCode:u.exitCode,message:u.message}),{status:"installed",path:C,method:t.id,attempts:a};a.push({id:t.id,status:"missing-after-success",exitCode:u.exitCode,message:`${U(t.id)} reported success, but Chrome was not found`})}let h=a.map(D).join("; ");throw Error(`Chrome automatic installation failed. ${h}`)}export{I as runInstallCommand,E as resolveChromeInstallCandidates,$ as resolveChromeExecutable,O as isChromeAutoInstallEnabled,H as ensureChromeAvailable};
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { homedir, platform } from "node:os";
4
+ import path from "node:path";
5
+ const DEFAULT_INSTALL_TIMEOUT_MS = 15 * 60 * 1000;
6
+ const MAX_COMMAND_OUTPUT_BYTES = 16 * 1024;
7
+ const INSTALL_POLL_ATTEMPTS = 5;
8
+ const INSTALL_POLL_DELAY_MS = 1000;
9
+ function windowsJoin(...parts) {
10
+ return path.win32.join(...parts);
11
+ }
12
+ function addCandidate(candidates, candidate) {
13
+ if (candidate && !candidates.includes(candidate)) {
14
+ candidates.push(candidate);
15
+ }
16
+ }
17
+ function pathCandidates(env, platformName, executableNames) {
18
+ const searchPath = env.PATH ?? env.Path ?? env.path ?? "";
19
+ const separator = platformName === "win32" ? ";" : path.delimiter;
20
+ const extensions = platformName === "win32" ? (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean) : [""];
21
+ const candidates = [];
22
+ for (const directory of searchPath.split(separator).filter(Boolean)) {
23
+ for (const executableName of executableNames) {
24
+ if (platformName === "win32" && path.win32.extname(executableName)) {
25
+ addCandidate(candidates, windowsJoin(directory, executableName));
26
+ continue;
27
+ }
28
+ for (const extension of extensions) {
29
+ const name = platformName === "win32" ? `${executableName}${extension.toLowerCase()}` : executableName;
30
+ addCandidate(candidates, platformName === "win32" ? windowsJoin(directory, name) : path.join(directory, name));
31
+ }
32
+ }
33
+ }
34
+ return candidates;
35
+ }
36
+ export function resolveChromeExecutable({
37
+ env = process.env,
38
+ platformName = platform(),
39
+ homeDir = homedir(),
40
+ exists = existsSync
41
+ } = {}) {
42
+ const candidates = [];
43
+ if (platformName === "win32") {
44
+ for (const root of [
45
+ env.LOCALAPPDATA,
46
+ env.ProgramFiles,
47
+ env["ProgramFiles(x86)"]
48
+ ]) {
49
+ if (!root)
50
+ continue;
51
+ addCandidate(candidates, windowsJoin(root, "Google", "Chrome", "Application", "chrome.exe"));
52
+ addCandidate(candidates, windowsJoin(root, "Chromium", "Application", "chrome.exe"));
53
+ }
54
+ addCandidate(candidates, homeDir ? windowsJoin(homeDir, "AppData", "Local", "Google", "Chrome", "Application", "chrome.exe") : undefined);
55
+ candidates.push(...pathCandidates(env, platformName, ["chrome", "chromium"]));
56
+ } else if (platformName === "darwin") {
57
+ for (const appRoot of ["/Applications", path.join(homeDir, "Applications")]) {
58
+ addCandidate(candidates, path.join(appRoot, "Google Chrome.app", "Contents", "MacOS", "Google Chrome"));
59
+ addCandidate(candidates, path.join(appRoot, "Chromium.app", "Contents", "MacOS", "Chromium"));
60
+ }
61
+ candidates.push(...pathCandidates(env, platformName, [
62
+ "google-chrome-stable",
63
+ "google-chrome",
64
+ "chromium",
65
+ "chromium-browser"
66
+ ]));
67
+ } else if (platformName === "linux") {
68
+ for (const candidate of [
69
+ "/usr/bin/google-chrome-stable",
70
+ "/usr/bin/google-chrome",
71
+ "/usr/bin/chromium",
72
+ "/usr/bin/chromium-browser",
73
+ "/snap/bin/chromium",
74
+ "/usr/local/bin/google-chrome",
75
+ "/usr/local/bin/chromium"
76
+ ]) {
77
+ addCandidate(candidates, candidate);
78
+ }
79
+ candidates.push(...pathCandidates(env, platformName, [
80
+ "google-chrome-stable",
81
+ "google-chrome",
82
+ "chromium",
83
+ "chromium-browser"
84
+ ]));
85
+ }
86
+ return candidates.find((candidate) => exists(candidate));
87
+ }
88
+ function command(commandName, ...args) {
89
+ return { command: commandName, args };
90
+ }
91
+ function withLinuxPrivilege(commands, uid) {
92
+ if (uid === 0)
93
+ return commands;
94
+ return commands.map(({ command: commandName, args }) => command("sudo", "-n", commandName, ...args));
95
+ }
96
+ export function resolveChromeInstallCandidates({
97
+ platformName = platform(),
98
+ uid = typeof process.getuid === "function" ? process.getuid() : undefined
99
+ } = {}) {
100
+ if (platformName === "darwin") {
101
+ return [
102
+ {
103
+ id: "homebrew-google-chrome",
104
+ commands: [command("brew", "install", "--cask", "google-chrome")]
105
+ }
106
+ ];
107
+ }
108
+ if (platformName === "win32") {
109
+ const wingetArgs = [
110
+ "install",
111
+ "--id",
112
+ "Google.Chrome",
113
+ "-e",
114
+ "--silent",
115
+ "--accept-package-agreements",
116
+ "--accept-source-agreements",
117
+ "--disable-interactivity"
118
+ ];
119
+ return [
120
+ {
121
+ id: "winget-user-google-chrome",
122
+ commands: [
123
+ command("winget", ...wingetArgs.slice(0, 4), "--scope", "user", ...wingetArgs.slice(4))
124
+ ]
125
+ },
126
+ {
127
+ id: "winget-machine-google-chrome",
128
+ commands: [command("winget", ...wingetArgs)]
129
+ },
130
+ {
131
+ id: "chocolatey-google-chrome",
132
+ commands: [
133
+ command("choco", "install", "googlechrome", "-y", "--no-progress")
134
+ ]
135
+ }
136
+ ];
137
+ }
138
+ if (platformName === "linux") {
139
+ return [
140
+ {
141
+ id: "apt-chromium",
142
+ commands: withLinuxPrivilege([
143
+ command("apt-get", "update"),
144
+ command("apt-get", "install", "-y", "chromium")
145
+ ], uid)
146
+ },
147
+ {
148
+ id: "apt-chromium-browser",
149
+ commands: withLinuxPrivilege([
150
+ command("apt-get", "update"),
151
+ command("apt-get", "install", "-y", "chromium-browser")
152
+ ], uid)
153
+ },
154
+ {
155
+ id: "dnf-chromium",
156
+ commands: withLinuxPrivilege([command("dnf", "install", "-y", "chromium")], uid)
157
+ },
158
+ {
159
+ id: "yum-chromium",
160
+ commands: withLinuxPrivilege([command("yum", "install", "-y", "chromium")], uid)
161
+ },
162
+ {
163
+ id: "pacman-chromium",
164
+ commands: withLinuxPrivilege([command("pacman", "-S", "--noconfirm", "--needed", "chromium")], uid)
165
+ },
166
+ {
167
+ id: "zypper-chromium",
168
+ commands: withLinuxPrivilege([
169
+ command("zypper", "--non-interactive", "install", "chromium")
170
+ ], uid)
171
+ },
172
+ {
173
+ id: "apk-chromium",
174
+ commands: withLinuxPrivilege([command("apk", "add", "chromium")], uid)
175
+ }
176
+ ];
177
+ }
178
+ return [];
179
+ }
180
+ export function isChromeAutoInstallEnabled(env = process.env) {
181
+ const value = env.DM_CUA_AUTO_INSTALL;
182
+ if (value === undefined)
183
+ return true;
184
+ return !["0", "false", "no", "off"].includes(value.trim().toLowerCase());
185
+ }
186
+ function parseInstallTimeout(env) {
187
+ const configured = Number(env.DM_CUA_INSTALL_TIMEOUT_MS);
188
+ return Number.isFinite(configured) && configured > 0 ? configured : DEFAULT_INSTALL_TIMEOUT_MS;
189
+ }
190
+ function appendBounded(current, chunk) {
191
+ const combined = `${current}${chunk}`;
192
+ if (Buffer.byteLength(combined) <= MAX_COMMAND_OUTPUT_BYTES)
193
+ return combined;
194
+ return combined.slice(-MAX_COMMAND_OUTPUT_BYTES);
195
+ }
196
+ export function runInstallCommand(commandName, args, { env = process.env, timeoutMs = parseInstallTimeout(env) } = {}) {
197
+ return new Promise((resolve) => {
198
+ let settled = false;
199
+ let output = "";
200
+ let timer;
201
+ const child = spawn(commandName, args, {
202
+ env,
203
+ shell: false,
204
+ stdio: ["ignore", "pipe", "pipe"],
205
+ windowsHide: true
206
+ });
207
+ const finish = (result) => {
208
+ if (settled)
209
+ return;
210
+ settled = true;
211
+ clearTimeout(timer);
212
+ resolve(result);
213
+ };
214
+ child.stdout?.on("data", (chunk) => {
215
+ output = appendBounded(output, chunk.toString());
216
+ });
217
+ child.stderr?.on("data", (chunk) => {
218
+ output = appendBounded(output, chunk.toString());
219
+ });
220
+ child.on("error", (error) => {
221
+ finish({
222
+ status: error.code === "ENOENT" ? "unavailable" : "failed",
223
+ exitCode: null,
224
+ message: `${error.message}${output ? `
225
+ ${output.trim()}` : ""}`
226
+ });
227
+ });
228
+ child.on("close", (exitCode, signal) => {
229
+ finish({
230
+ status: exitCode === 0 ? "ok" : "failed",
231
+ exitCode,
232
+ message: output.trim() || (signal ? `installer terminated by signal ${signal}` : "")
233
+ });
234
+ });
235
+ timer = setTimeout(() => {
236
+ child.kill();
237
+ finish({
238
+ status: "timeout",
239
+ exitCode: null,
240
+ message: `installer timed out after ${timeoutMs}ms`
241
+ });
242
+ }, timeoutMs);
243
+ });
244
+ }
245
+ function installerLabel(candidateId) {
246
+ if (candidateId.startsWith("homebrew-"))
247
+ return "Homebrew";
248
+ if (candidateId.startsWith("winget-"))
249
+ return "winget";
250
+ return candidateId.split("-")[0];
251
+ }
252
+ function attemptFailureMessage(attempt) {
253
+ const evidence = attempt.message ? `: ${attempt.message}` : "";
254
+ return `${attempt.id} ${attempt.status}${evidence}`;
255
+ }
256
+ export async function ensureChromeAvailable({
257
+ env = process.env,
258
+ platformName = platform(),
259
+ uid = typeof process.getuid === "function" ? process.getuid() : undefined,
260
+ findExecutable = () => resolveChromeExecutable({ env, platformName, homeDir: homedir() }),
261
+ runCommand = (commandName, args) => runInstallCommand(commandName, args, { env }),
262
+ sleep = (delayMs) => new Promise((resolve) => {
263
+ setTimeout(resolve, delayMs);
264
+ })
265
+ } = {}) {
266
+ const existingPath = findExecutable();
267
+ if (existingPath) {
268
+ return {
269
+ status: "existing",
270
+ path: existingPath,
271
+ method: null,
272
+ attempts: []
273
+ };
274
+ }
275
+ if (!isChromeAutoInstallEnabled(env)) {
276
+ throw new Error("Chrome was not found and automatic installation is disabled by DM_CUA_AUTO_INSTALL.");
277
+ }
278
+ const candidates = resolveChromeInstallCandidates({ platformName, uid });
279
+ if (candidates.length === 0) {
280
+ throw new Error(`Chrome was not found and no automatic Chrome installer is defined for ${platformName}.`);
281
+ }
282
+ const attempts = [];
283
+ for (const candidate of candidates) {
284
+ let commandResult = { status: "ok", exitCode: 0, message: "" };
285
+ for (const installCommand of candidate.commands) {
286
+ commandResult = await runCommand(installCommand.command, installCommand.args);
287
+ if (commandResult.status !== "ok")
288
+ break;
289
+ }
290
+ if (commandResult.status !== "ok") {
291
+ attempts.push({
292
+ id: candidate.id,
293
+ status: commandResult.status,
294
+ exitCode: commandResult.exitCode,
295
+ message: commandResult.message
296
+ });
297
+ continue;
298
+ }
299
+ let installedPath;
300
+ for (let pollAttempt = 0;pollAttempt < INSTALL_POLL_ATTEMPTS; pollAttempt += 1) {
301
+ installedPath = findExecutable();
302
+ if (installedPath)
303
+ break;
304
+ if (pollAttempt < INSTALL_POLL_ATTEMPTS - 1) {
305
+ await sleep(INSTALL_POLL_DELAY_MS);
306
+ }
307
+ }
308
+ if (installedPath) {
309
+ attempts.push({
310
+ id: candidate.id,
311
+ status: "installed",
312
+ exitCode: commandResult.exitCode,
313
+ message: commandResult.message
314
+ });
315
+ return {
316
+ status: "installed",
317
+ path: installedPath,
318
+ method: candidate.id,
319
+ attempts
320
+ };
321
+ }
322
+ attempts.push({
323
+ id: candidate.id,
324
+ status: "missing-after-success",
325
+ exitCode: commandResult.exitCode,
326
+ message: `${installerLabel(candidate.id)} reported success, but Chrome was not found`
327
+ });
328
+ }
329
+ const evidence = attempts.map(attemptFailureMessage).join("; ");
330
+ throw new Error(`Chrome automatic installation failed. ${evidence}`);
331
+ }