@visulima/vis 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (147) hide show
  1. package/CHANGELOG.md +830 -14
  2. package/LICENSE.md +7667 -0
  3. package/README.md +322 -19
  4. package/dist/bin.js +1 -146
  5. package/dist/config/index.d.ts +2795 -0
  6. package/dist/config/index.js +1 -0
  7. package/dist/generate/index.d.ts +157 -0
  8. package/dist/generate/index.js +1 -0
  9. package/dist/packem_chunks/bin.js +1295 -0
  10. package/dist/packem_chunks/config.js +19 -0
  11. package/dist/packem_chunks/doctor-probe.js +2 -0
  12. package/dist/packem_chunks/fix.js +11 -0
  13. package/dist/packem_chunks/handler.js +1 -0
  14. package/dist/packem_chunks/handler10.js +1 -0
  15. package/dist/packem_chunks/handler11.js +5 -0
  16. package/dist/packem_chunks/handler12.js +1 -0
  17. package/dist/packem_chunks/handler13.js +27 -0
  18. package/dist/packem_chunks/handler14.js +5 -0
  19. package/dist/packem_chunks/handler15.js +1 -0
  20. package/dist/packem_chunks/handler16.js +1 -0
  21. package/dist/packem_chunks/handler17.js +1 -0
  22. package/dist/packem_chunks/handler18.js +1 -0
  23. package/dist/packem_chunks/handler19.js +1 -0
  24. package/dist/packem_chunks/handler2.js +2 -0
  25. package/dist/packem_chunks/handler20.js +5 -0
  26. package/dist/packem_chunks/handler21.js +2 -0
  27. package/dist/packem_chunks/handler22.js +2 -0
  28. package/dist/packem_chunks/handler23.js +18 -0
  29. package/dist/packem_chunks/handler24.js +1 -0
  30. package/dist/packem_chunks/handler25.js +1 -0
  31. package/dist/packem_chunks/handler26.js +5 -0
  32. package/dist/packem_chunks/handler27.js +1 -0
  33. package/dist/packem_chunks/handler28.js +3 -0
  34. package/dist/packem_chunks/handler29.js +1 -0
  35. package/dist/packem_chunks/handler3.js +4 -0
  36. package/dist/packem_chunks/handler30.js +7 -0
  37. package/dist/packem_chunks/handler31.js +33 -0
  38. package/dist/packem_chunks/handler32.js +3 -0
  39. package/dist/packem_chunks/handler33.js +1 -0
  40. package/dist/packem_chunks/handler34.js +26 -0
  41. package/dist/packem_chunks/handler35.js +3 -0
  42. package/dist/packem_chunks/handler36.js +7 -0
  43. package/dist/packem_chunks/handler37.js +22 -0
  44. package/dist/packem_chunks/handler38.js +428 -0
  45. package/dist/packem_chunks/handler39.js +6 -0
  46. package/dist/packem_chunks/handler4.js +8 -0
  47. package/dist/packem_chunks/handler40.js +24 -0
  48. package/dist/packem_chunks/handler41.js +10 -0
  49. package/dist/packem_chunks/handler42.js +153 -0
  50. package/dist/packem_chunks/handler43.js +25 -0
  51. package/dist/packem_chunks/handler44.js +24 -0
  52. package/dist/packem_chunks/handler45.js +213 -0
  53. package/dist/packem_chunks/handler46.js +3 -0
  54. package/dist/packem_chunks/handler47.js +27 -0
  55. package/dist/packem_chunks/handler48.js +167 -0
  56. package/dist/packem_chunks/handler49.js +34 -0
  57. package/dist/packem_chunks/handler5.js +1 -0
  58. package/dist/packem_chunks/handler6.js +1 -0
  59. package/dist/packem_chunks/handler7.js +1 -0
  60. package/dist/packem_chunks/handler8.js +1 -0
  61. package/dist/packem_chunks/handler9.js +2 -0
  62. package/dist/packem_chunks/heal-accept.js +10 -0
  63. package/dist/packem_chunks/heal.js +14 -0
  64. package/dist/packem_chunks/help-command.js +18 -0
  65. package/dist/packem_chunks/index.js +7 -0
  66. package/dist/packem_chunks/keys-refresh.js +4 -0
  67. package/dist/packem_chunks/list.js +3 -0
  68. package/dist/packem_chunks/loader.js +1 -0
  69. package/dist/packem_chunks/prune.js +3 -0
  70. package/dist/packem_chunks/run.js +1 -0
  71. package/dist/packem_chunks/status.js +2 -0
  72. package/dist/packem_chunks/sync.js +2 -0
  73. package/dist/packem_chunks/sync2.js +2 -0
  74. package/dist/packem_chunks/tar.js +3 -0
  75. package/dist/packem_chunks/tripwire.js +2 -0
  76. package/dist/packem_shared/advisories-DsynpacV.js +1 -0
  77. package/dist/packem_shared/ai-analysis-uYuTIIXi.js +68 -0
  78. package/dist/packem_shared/ai-cache-DuwHYx2O.js +1 -0
  79. package/dist/packem_shared/ai-fix-DzrA-dVz.js +43 -0
  80. package/dist/packem_shared/applyDefaults-BOVDw1jD.js +1 -0
  81. package/dist/packem_shared/build-scripts-DsWMSWDs.js +1 -0
  82. package/dist/packem_shared/cache-directory-DQak1Vjc.js +1 -0
  83. package/dist/packem_shared/cyclonedx-CiHXuG8M.js +4 -0
  84. package/dist/packem_shared/definePlugin-CWm4Dv_t.js +1 -0
  85. package/dist/packem_shared/dependency-scan-DC3nAFHS.js +1 -0
  86. package/dist/packem_shared/docker-B-CIN_nj.js +60 -0
  87. package/dist/packem_shared/failure-log-C3LEMmkq.js +2 -0
  88. package/dist/packem_shared/flakiness-Dq6K4ymq.js +1 -0
  89. package/dist/packem_shared/giget-CcEy_Elm.js +2 -0
  90. package/dist/packem_shared/glob-MHJQjR39-CQ2GC0b_.js +1 -0
  91. package/dist/packem_shared/index-DH-5hsrC.js +1 -0
  92. package/dist/packem_shared/lifecycle-Dv3nAtoD.js +2 -0
  93. package/dist/packem_shared/lockfile-C5DYMHVq.js +1 -0
  94. package/dist/packem_shared/manifests-B0fMp872.js +1 -0
  95. package/dist/packem_shared/min-release-age-BFozFonQ.js +34 -0
  96. package/dist/packem_shared/native-config-sync-Dvi1g2nQ.js +21 -0
  97. package/dist/packem_shared/otelPlugin-CJR2T_lk.js +1 -0
  98. package/dist/packem_shared/registry-keys-CewRFW0e.js +1 -0
  99. package/dist/packem_shared/resolve-explicit-CC4Kifk5.js +5 -0
  100. package/dist/packem_shared/run-summary-utils-BaBGP3bo.js +1 -0
  101. package/dist/packem_shared/runtime-check-BusAwPb2.js +1 -0
  102. package/dist/packem_shared/scan-progress-CMynp3eA.js +2 -0
  103. package/dist/packem_shared/selectors-B2ISH581.js +3 -0
  104. package/dist/packem_shared/signatures-5ZdjJ2Pu.js +2 -0
  105. package/dist/packem_shared/symbols-CQmER5MT.js +1 -0
  106. package/dist/packem_shared/toolchain-Cc3cwyLP.js +5 -0
  107. package/dist/packem_shared/typosquats-BCeR-sLf.js +1 -0
  108. package/dist/packem_shared/use-measured-height-DjYgUOKk.js +1 -0
  109. package/dist/packem_shared/utils-DrNg0XTR.js +1 -0
  110. package/dist/packem_shared/verify-07kUNTuP.js +1 -0
  111. package/dist/packem_shared/vis-update-app-CFrlJ3mW.js +1 -0
  112. package/dist/packem_shared/xxh3-DrAUNq4n.js +1 -0
  113. package/index.d.ts +358 -0
  114. package/index.js +609 -0
  115. package/package.json +57 -22
  116. package/schemas/project.schema.json +872 -0
  117. package/schemas/vis-config.schema.json +4306 -0
  118. package/skills/vis/SKILL.md +96 -0
  119. package/templates/buildkite-ci/.buildkite/pipeline.yml.tera +85 -0
  120. package/templates/buildkite-ci/template.yml +20 -0
  121. package/dist/ai-analysis.d.ts +0 -40
  122. package/dist/ai-cache.d.ts +0 -21
  123. package/dist/bin.d.ts +0 -1
  124. package/dist/catalog.d.ts +0 -110
  125. package/dist/commands/affected.d.ts +0 -3
  126. package/dist/commands/ai.d.ts +0 -3
  127. package/dist/commands/analyze.d.ts +0 -3
  128. package/dist/commands/check.d.ts +0 -3
  129. package/dist/commands/graph.d.ts +0 -3
  130. package/dist/commands/hook/constants.d.ts +0 -8
  131. package/dist/commands/hook/index.d.ts +0 -3
  132. package/dist/commands/hook/install.d.ts +0 -7
  133. package/dist/commands/hook/migrate.d.ts +0 -27
  134. package/dist/commands/hook/uninstall.d.ts +0 -3
  135. package/dist/commands/migrate/constants.d.ts +0 -12
  136. package/dist/commands/migrate/deps.d.ts +0 -32
  137. package/dist/commands/migrate/index.d.ts +0 -3
  138. package/dist/commands/migrate/json.d.ts +0 -20
  139. package/dist/commands/migrate/lint-staged.d.ts +0 -62
  140. package/dist/commands/migrate/types.d.ts +0 -20
  141. package/dist/commands/run.d.ts +0 -3
  142. package/dist/commands/staged.d.ts +0 -3
  143. package/dist/commands/update.d.ts +0 -3
  144. package/dist/config.d.ts +0 -40
  145. package/dist/config.js +0 -1
  146. package/dist/package-manager.d.ts +0 -23
  147. package/dist/workspace.d.ts +0 -58
@@ -0,0 +1,27 @@
1
+ var Fe=Object.defineProperty;var f=(e,t)=>Fe(e,"name",{value:t,configurable:!0});import{createRequire as Ne}from"node:module";import{O as He,M as re,z as B,i as oe,Q as Te}from"./config.js";import{x as $e}from"tinyexec";import{o as xe}from"../packem_shared/index-DH-5hsrC.js";import{jsx as b,jsxs as C}from"react/jsx-runtime";import{render as Ue}from"@visulima/tui";import{Box as M}from"@visulima/tui/components/box";import{Spinner as ze}from"@visulima/tui/components/spinner";import{Text as $}from"@visulima/tui/components/text";import{C as Ce,D as q,T as Ie}from"../packem_shared/symbols-CQmER5MT.js";import{E as I,I as Ve,e as ce,q as J,a as X}from"./bin.js";const Ge=Ne(import.meta.url),F=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,z=f(e=>{if(typeof F<"u"&&F.versions&&F.versions.node){const[t,r]=F.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return F.getBuiltinModule(e)}return Ge(e)},"__cjs_getBuiltinModule"),{createRequire:_e}=z("node:module"),{readFileSync:De,writeFileSync:Be,unlinkSync:Le}=z("node:fs"),{randomBytes:qe}=z("node:crypto"),{availableParallelism:de}=z("node:os");var We=Object.defineProperty,Ke=f((e,t)=>We(e,"name",{value:t,configurable:!0}),"u$4"),Ye=Object.defineProperty,Ee=Ke((e,t)=>Ye(e,"name",{value:t,configurable:!0}),"c");const Qe=_e(import.meta.url),N=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,ne=Ee(e=>{if(typeof N<"u"&&N.versions&&N.versions.node){const[t,r]=N.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return N.getBuiltinModule(e)}return Qe(e)},"__cjs_getBuiltinModule"),Je=ne("fs"),Xe=ne("os"),Ze=ne("path");var et=Object.defineProperty,tt=Ee((e,t)=>et(e,"name",{value:t,configurable:!0}),"a"),rt=Object.defineProperty,V=tt((e,t)=>rt(e,"name",{value:t,configurable:!0}),"s");const Me=V(e=>{let t="";for(let r=0;r<e.length;r+=1){const s=e[r],n=s.toUpperCase();t+=s===n?s.toLowerCase():n}return t},"invertCase"),Z=new Map,le=V((e,t)=>{const r=Ze.join(e,`.is-fs-case-sensitive-test-${process.pid}`);try{return t.writeFileSync(r,""),!t.existsSync(Me(r))}finally{try{t.unlinkSync(r)}catch{}}},"checkDirectoryCaseWithWrite"),st=V((e,t,r)=>{try{return le(e,r)}catch(s){if(t===void 0)return le(Xe.tmpdir(),r);throw s}},"checkDirectoryCaseWithFallback"),nt=V((e,t=Je,r=!0)=>{const s=e??process.cwd();if(r&&Z.has(s))return Z.get(s);let n;const i=Me(s);return i!==s&&t.existsSync(s)?n=!t.existsSync(i):n=st(s,e,t),r&&Z.set(s,n),n},"isFsCaseSensitive");var at=Object.defineProperty,it=f((e,t)=>at(e,"name",{value:t,configurable:!0}),"s$3");class A extends Error{static{f(this,"StagedError")}static{it(this,"StagedError")}constructor(t,r){super(t,r),this.name=this.constructor.name}}var ot=Object.defineProperty,ct=f((e,t)=>ot(e,"name",{value:t,configurable:!0}),"o$6");class dt extends A{static{f(this,"ApplyEmptyCommitError")}static{ct(this,"ApplyEmptyCommitError")}}var lt=Object.defineProperty,ut=f((e,t)=>lt(e,"name",{value:t,configurable:!0}),"o$5");class S extends A{static{f(this,"ConfigError")}static{ut(this,"ConfigError")}}var ft=Object.defineProperty,ht=f((e,t)=>ft(e,"name",{value:t,configurable:!0}),"t$1");class ue extends A{static{f(this,"GetBackupStashError")}static{ht(this,"GetBackupStashError")}}var pt=Object.defineProperty,gt=f((e,t)=>pt(e,"name",{value:t,configurable:!0}),"s$2");class D extends A{static{f(this,"GitError")}static{gt(this,"GitError")}stderr;constructor(t,r,s){super(t,s),this.stderr=r}}var mt=Object.defineProperty,wt=f((e,t)=>mt(e,"name",{value:t,configurable:!0}),"e");class fe extends A{static{f(this,"RestoreOriginalStateError")}static{wt(this,"RestoreOriginalStateError")}}var vt=Object.defineProperty,yt=f((e,t)=>vt(e,"name",{value:t,configurable:!0}),"o$2");class O extends A{static{f(this,"TaskError")}static{yt(this,"TaskError")}commandTitle;constructor(t,r,s){super(r,s),this.commandTitle=t}}var kt=Object.defineProperty,W=f((e,t)=>kt(e,"name",{value:t,configurable:!0}),"i");const bt=W(async e=>{if(e.config!==void 0)return e.config;throw new S(`No staged config provided. Add \`staged\` to your vis.config.ts:
2
+
3
+ import { defineConfig } from "@visulima/vis/config";
4
+
5
+ export default defineConfig({
6
+ staged: { "*.ts": "eslint --fix" },
7
+ });
8
+
9
+ Coming from lint-staged or nano-staged? Run \`vis migrate lint-staged\` (or \`vis migrate nano-staged\`) to move the config in and remove the legacy files.`)},"resolveConfig"),he=W(e=>{if(typeof e!="object"||e===null)throw new S("Staged config must be an object mapping glob patterns to tasks.");const t=Object.entries(e);if(t.length===0)throw new S("Staged config is empty — at least one glob pattern is required.");for(const[r,s]of t){if(!r||r.trim()==="")throw new S("Staged config keys must be non-empty glob patterns.");Oe(r,s)}return e},"validateConfig"),Oe=W((e,t)=>{if(typeof t=="string"){if(t.trim()==="")throw new S(`Task for "${e}" is an empty string.`);return}if(Array.isArray(t)){if(t.length===0)throw new S(`Task array for "${e}" is empty.`);for(const r of t)Oe(e,r);return}if(typeof t!="function"&&!St(t))throw new S(`Invalid task for "${e}" — expected string, string[], function, or { title, task } object.`)},"validateTask"),St=W(e=>typeof e=="object"&&e!==null&&typeof e.title=="string"&&typeof e.task=="function","isCustomTask");var Tt=Object.defineProperty,x=f((e,t)=>Tt(e,"name",{value:t,configurable:!0}),"r$2");const pe=2048,g=x(async(e,t)=>{const r=t.input===void 0?void 0:typeof t.input=="string"?t.input:t.input.toString("utf8"),s=await $e("git",[...e],{nodeOptions:{cwd:t.cwd,env:t.env?{...process.env,...t.env}:void 0,stdio:r===void 0?["ignore","pipe","pipe"]:["pipe","pipe","pipe"]},stdin:r}),n=typeof s.exitCode=="number"?s.exitCode:1;if(n!==0&&!t.lenient){const{stderr:i}=s,o=i.length>pe?`${i.slice(0,pe)}…`:i;throw new D(`git ${e.join(" ")} failed with exit code ${n}: ${o.trim()}`,i)}return{exitCode:n,stderr:s.stderr,stdout:s.stdout}},"git"),R=x(async(e,t)=>{const{stdout:r}=await g(e,t);return r.trim()},"gitOut"),$t=x(async e=>{const t=await g(["rev-parse","--is-inside-work-tree"],{cwd:e,lenient:!0});return t.exitCode===0&&t.stdout.trim()==="true"},"isGitRepo"),xt=x(async e=>R(["rev-parse","--absolute-git-dir"],{cwd:e}),"getGitDirectory"),je=x(async e=>R(["rev-parse","--show-toplevel"],{cwd:e}),"getWorkTree"),ge=x(async e=>R(["write-tree"],{cwd:e}),"writeIndexTree"),Ct=x(async e=>{const t=await g(["rev-parse","HEAD^{tree}"],{cwd:e,lenient:!0});return t.exitCode===0?t.stdout.trim():""},"headTreeSha"),G={major:2,minor:32},It=x(e=>{const t=/git version (\d+)\.(\d+)/.exec(e);if(!t)return null;const r=Number.parseInt(t[1]??"",10),s=Number.parseInt(t[2]??"",10);return Number.isNaN(r)||Number.isNaN(s)?null:{major:r,minor:s}},"parseGitVersion"),Et=x(async e=>{const t=It(await R(["--version"],{cwd:e}));if(t!==null&&(t.major<G.major||t.major===G.major&&t.minor<G.minor))throw new D(`Git ${G.major}.${G.minor} or newer is required; found ${t.major}.${t.minor}.`)},"assertGitVersion");var Mt=Object.defineProperty,E=f((e,t)=>Mt(e,"name",{value:t,configurable:!0}),"a$2");const Ot="ACMR",me=500,jt=E(async e=>{const{stdout:t}=await g(["diff-files","--raw","-z"],{cwd:e}),r=t.split("\0").filter(n=>n.length>0),s=[];for(let n=0;n<r.length;n+=1){const i=r[n];if(!i?.startsWith(":"))continue;const o=i.slice(1).split(" "),a=o[3],c=o[4],d=r[n+1];n+=1,c==="A"&&a!==void 0&&/^0+$/.test(a)&&d!==void 0&&s.push(d)}return s},"getIntentToAddPaths"),we=E(async e=>{const{stdout:t}=await g(["ls-files","--others","--exclude-standard","-z"],{cwd:e});return t.split("\0").filter(r=>r.length>0)},"getUntrackedFiles"),At=E(async(e,t)=>{if(e.length===0)return;const r=`${e.join("\0")}\0`;await g(["rm","--cached","--quiet","--pathspec-from-file=-","--pathspec-file-nul","--"],{cwd:t.cwd,input:r})},"removeFromIndex"),Pt=E(async e=>{const t=e.diffFilter??Ot,r=e.diff===void 0?["diff","--name-only","-z",`--diff-filter=${t}`,"--staged"]:["diff","--name-only","-z",`--diff-filter=${t}`,...e.diff.split(/\s+/).filter(Boolean)],{stdout:s}=await g(r,{cwd:e.cwd}),n=s.split("\0").filter(o=>o.length>0);if(n.length===0)return[];const i=e.workTree??await je(e.cwd);return n.map(o=>He(o)?o:re(i,o))},"getFiles"),Rt=E(async(e,t)=>{if(e.length===0)return null;const r=[];for(let i=0;i<e.length;i+=me){const o=e.slice(i,i+me),{stdout:a}=await g(["diff","--binary","--unified=0","--no-color","--no-ext-diff","--src-prefix=a/","--dst-prefix=b/","--patch","--submodule=short","--",...o],{cwd:t.cwd});a.length>0&&r.push(a)}if(r.length===0)return null;const s=r.join(""),n=s.endsWith(`
10
+ `)?s:`${s}
11
+ `;return Buffer.from(n,"utf8")},"capturePatch"),Ft=E(async e=>{const{stdout:t}=await g(["status","--porcelain=v1","-z"],{cwd:e}),r=t.split("\0"),s=[];for(let n=0;n<r.length;n+=1){const i=r[n];if(i===void 0||i.length<4)continue;const o=i.charAt(0),a=i.charAt(1),c=i.slice(3),d=o==="R"||o==="C"||a==="R"||a==="C";o!==" "&&o!=="?"&&a!==" "&&a!=="?"&&s.push(c),d&&(n+=1)}return s},"getPartiallyStagedFiles"),Nt=E(async(e,t)=>{if(e.length===0)return;const r=`${e.join("\0")}\0`;await g(["checkout","--force","--pathspec-from-file=-","--pathspec-file-nul","--"],{cwd:t.cwd,input:r})},"checkoutPaths"),Gt=E(async(e,t)=>{if(await g(["update-index","--again"],{cwd:t.cwd,lenient:!0}),e.length===0)return;const r=`${e.join("\0")}\0`;await g(["add","-u","--pathspec-from-file=-","--pathspec-file-nul","--"],{cwd:t.cwd,input:r})},"updateIndexAgain");var _t=Object.defineProperty,P=f((e,t)=>_t(e,"name",{value:t,configurable:!0}),"r$1");const Dt="vis_staged_automatic_backup",Ae=P(()=>`${Dt}-${process.pid}-${Date.now()}-${qe(3).toString("hex")}`,"buildMessage"),Bt=P(async e=>{const t=await R(["stash","create"],{cwd:e});return t.length===0?null:(await g(["stash","store","-m",Ae(),t],{cwd:e}),t)},"createBackupStash"),Lt=P(async e=>{const t=Ae(),{exitCode:r,stdout:s}=await g(["stash","push","--keep-index","--include-untracked","--quiet","-m",t],{cwd:e,lenient:!0});if(r!==0)return null;const n=s.trim();return n.length>0&&/no local changes/i.test(n)?null:R(["rev-parse","stash@{0}"],{cwd:e})},"createHideAllStash"),ae=P(async(e,t)=>{const{exitCode:r,stdout:s}=await g(["reflog","--format=%H %gd","refs/stash"],{cwd:e,lenient:!0});if(r!==0)return null;for(const n of s.split(/\r?\n/)){const[i,o]=n.split(/\s+/,2);if(i===t&&o!==void 0)return o}return null},"findStashRefBySha"),ve=P(async(e,t)=>{if(t===null)return;const r=await ae(e,t);r!==null&&await g(["stash","drop","--quiet",r],{cwd:e})},"dropBackupStash"),Ht=P(async(e,t)=>{if(t===null)throw new ue("Backup stash was not found — can't revert working tree.");const r=await ae(e,t);if(r===null)throw new ue(`Backup stash ${t} is no longer reachable — can't revert working tree.`);await g(["reset","--hard","HEAD"],{cwd:e}),await g(["stash","apply","--index","--quiet",r],{cwd:e})},"applyBackupStash"),qt=P(async(e,t)=>{if(t===null)return;const r=await ae(e,t);r!==null&&await g(["stash","pop","--quiet",r],{cwd:e})},"popHideAllStash");var Ut=Object.defineProperty,zt=f((e,t)=>Ut(e,"name",{value:t,configurable:!0}),"l");class Vt{static{f(this,"GitWorkflow")}static{zt(this,"GitWorkflow")}stagedFiles=[];partiallyStaged=[];workTree="";gitDir="";preTaskIndexTree="";postTaskIndexTree="";headTree="";revertApplied=!1;warnings=[];cwd;options;patch=null;backupStashSha=null;merge=[];shouldStash;shouldHidePartial;shouldHideUnstaged;shouldHideAll;hideAllStashSha=null;intentToAddPaths=[];preTaskUntracked=new Set;constructor(t){this.cwd=t.cwd??process.cwd(),this.options=t,this.shouldStash=t.stash!==!1&&t.diff===void 0,this.shouldHidePartial=t.hidePartiallyStaged!==!1,this.shouldHideUnstaged=t.hideUnstaged===!0,this.shouldHideAll=t.hideAll===!0}async prepare(){if(!await $t(this.cwd))throw new D(`Not a git repository: ${this.cwd}`);await Et(this.cwd),this.workTree=await je(this.cwd),this.gitDir=await xt(this.cwd),this.stagedFiles=await Pt({cwd:this.cwd,diff:this.options.diff,diffFilter:this.options.diffFilter,workTree:this.workTree}),this.partiallyStaged=this.stagedFiles.length===0?[]:await Ft(this.cwd),this.snapshotMergeState(),this.intentToAddPaths=await jt(this.workTree),this.intentToAddPaths.length>0&&await At(this.intentToAddPaths,{cwd:this.workTree}),this.shouldStash?this.backupStashSha=await Bt(this.workTree):this.partiallyStaged.length>0&&this.warnings.push("Running with --no-stash on partially-staged files — unstaged deltas will be captured to a patch, but if re-applying the patch fails after tasks run the changes cannot be recovered."),this.shouldHideAll?this.hideAllStashSha=await Lt(this.workTree):await this.hideUnstagedChanges(),this.preTaskIndexTree=this.stagedFiles.length===0?"":await ge(this.workTree),this.postTaskIndexTree=this.preTaskIndexTree,this.headTree=await Ct(this.workTree),this.preTaskUntracked=new Set(await we(this.workTree))}async applyModifications({autoStage:t=!1}={}){if(this.stagedFiles.length===0)return;const r=this.stagedFiles.map(s=>B(this.workTree,s));if(await Gt(r,{cwd:this.workTree}),t){const s=(await we(this.workTree)).filter(n=>!this.preTaskUntracked.has(n));if(s.length>0){const n=`${s.join("\0")}\0`;await g(["add","--pathspec-from-file=-","--pathspec-file-nul","--"],{cwd:this.workTree,input:n})}}if(this.intentToAddPaths.length>0)try{await g(["add","--intent-to-add","--",...this.intentToAddPaths],{cwd:this.workTree})}catch{}this.postTaskIndexTree=await ge(this.workTree)}indexTreeChanged(){return this.preTaskIndexTree.length>0&&this.postTaskIndexTree.length>0&&this.preTaskIndexTree!==this.postTaskIndexTree}postTaskIndexMatchesHead(){return this.postTaskIndexTree.length>0&&this.headTree.length>0&&this.postTaskIndexTree===this.headTree}async restoreUnstagedChanges(){if(this.revertApplied||this.patch===null||this.shouldHideAll)return;const t=["apply","--whitespace=nowarn","--recount","--unidiff-zero"];let r;try{await g(t,{cwd:this.workTree,input:this.patch});return}catch(s){r=s instanceof D?s.stderr:String(s)}try{await g([...t,"--3way"],{cwd:this.workTree,input:this.patch})}catch(s){const n=s instanceof D&&s.stderr?s.stderr:String(s);throw new fe(`Failed to re-apply unstaged changes after running tasks. Original changes remain in the backup stash — recover with \`git stash list\` and \`git stash apply\`.
12
+ First attempt: ${r??"(no stderr)"}
13
+ Second attempt: ${n}`,{cause:s})}}async revert(){if(this.backupStashSha!==null){try{await Ht(this.workTree,this.backupStashSha)}catch(t){throw new fe("Revert failed while restoring the backup stash. Use `git stash list` to recover manually.",{cause:t})}if(await ve(this.workTree,this.backupStashSha),this.intentToAddPaths.length>0)try{await g(["add","--intent-to-add","--",...this.intentToAddPaths],{cwd:this.workTree})}catch{}this.revertApplied=!0}}async cleanup(t){if(this.restoreMergeState(),this.hideAllStashSha!==null)try{await qt(this.workTree,this.hideAllStashSha)}catch{}t&&this.backupStashSha!==null&&!this.revertApplied&&await ve(this.workTree,this.backupStashSha)}recoveryHint(){return this.backupStashSha===null?null:`Backup stash is preserved (sha ${this.backupStashSha.slice(0,7)}) — restore with: git stash apply --index ${this.backupStashSha}`}async hideUnstagedChanges(){const t=new Set(this.stagedFiles.map(s=>B(this.workTree,s))),r=this.shouldHideUnstaged?[...t]:this.shouldHidePartial?this.partiallyStaged.filter(s=>t.has(s)):[];r.length!==0&&(this.patch=await Rt(r,{cwd:this.workTree}),this.patch!==null&&await Nt(r,{cwd:this.workTree}))}snapshotMergeState(){this.gitDir.length!==0&&(this.merge=["MERGE_HEAD","MERGE_MODE","MERGE_MSG"].map(t=>{const r=re(this.gitDir,t);return oe(r)?{body:De(r),existed:!0,name:t}:{body:null,existed:!1,name:t}}))}restoreMergeState(){if(!(this.gitDir.length===0||this.merge.length===0))for(const t of this.merge){const r=re(this.gitDir,t.name);try{t.existed&&t.body!==null?Be(r,t.body):oe(r)&&Le(r)}catch{}}}}var Wt=Object.defineProperty,K=f((e,t)=>Wt(e,"name",{value:t,configurable:!0}),"r");const Pe=K(e=>e.includes("/"),"isPathStyle"),U=K((e,t)=>t?e.toLowerCase():e,"normalizeForMatch"),Kt=K((e,t,r,s={})=>{const n=Pe(e),i=s.caseInsensitive===!0,o=U(e,i),a=[];for(const c of t){const d=n?B(r,c):Te(c);xe(o,U(d,i))&&a.push(c)}return a},"matchFiles"),Yt=K((e,t,r,s={})=>{if(!t||t.length===0)return[...e];const n=s.caseInsensitive===!0;return e.filter(i=>{for(const o of t){const a=Pe(o)?B(r,i):Te(i),c=U(o,n);if(xe(c,U(a,n)))return!1}return!0})},"applyIgnore");var Qt=Object.defineProperty,L=f((e,t)=>Qt(e,"name",{value:t,configurable:!0}),"g$1");const Jt=L(e=>{switch(e){case"failed":return"red";case"running":return"cyan";case"skipped":return"yellow";case"success":return"green";default:return"gray"}},"colorForStatus"),ye=L(e=>{if(e==="running")return b(ze,{type:"dots"});const t=e==="failed"?Ce:e==="skipped"?q:e==="success"?Ie:q;return b($,{color:Jt(e),children:t})},"iconForStatus"),ke=L(({state:e,tick:t,verbose:r})=>C(M,{flexDirection:"column",children:[[...e.patterns.values()].map(s=>C(M,{flexDirection:"column",children:[C(M,{children:[ye(s.status),C($,{children:[" ",s.title]})]}),[...s.commands.values()].map(n=>C(M,{flexDirection:"column",marginLeft:2,children:[C(M,{children:[ye(n.status),C($,{children:[" ",n.title," "]}),n.status!=="pending"&&n.status!=="running"?C($,{color:"gray",children:["(",n.durationMs,"ms)"]}):null]}),r&&n.output?b(M,{flexDirection:"column",marginLeft:2,children:n.output.split(/\r?\n/).slice(0,20).map((i,o)=>b($,{color:"gray",children:i},`${n.id}-line-${o}`))}):null,n.status==="failed"&&n.error?b(M,{marginLeft:2,children:b($,{color:"red",children:n.error.message})}):null]},n.id))]},s.id)),e.infoMessages.map((s,n)=>b($,{color:"gray",children:s},`info-${n}`)),e.warnMessages.map((s,n)=>b($,{color:"yellow",children:s},`warn-${n}`)),e.errorMessages.map(({message:s},n)=>b($,{color:"red",children:s},`err-${n}`))]}),"App"),Xt=L((e={})=>{const t=e.verbose===!0,r={errorMessages:[],infoMessages:[],patterns:new Map,started:!1,warnMessages:[]};let s=0;const n=Ue(b(ke,{state:r,tick:s,verbose:t}),{exitOnCtrlC:!1,stdout:process.stderr}),i=L(()=>{s+=1,n.rerender(b(ke,{state:r,tick:s,verbose:t}))},"refresh");return{commandEnd({commandId:o,durationMs:a,error:c,output:d,patternId:u,status:l}){const p=r.patterns.get(u)?.commands.get(o);p&&(p.status=l,p.durationMs=a,p.output=d,p.error=c,i())},commandStart({commandId:o,patternId:a}){const c=r.patterns.get(a)?.commands.get(o);c&&(c.status="running",i())},error({error:o,message:a}){r.errorMessages.push({error:o,message:a}),i()},info({message:o}){r.infoMessages.push(o),i()},patternEnd({patternId:o,status:a}){const c=r.patterns.get(o);c&&(c.status=a,i())},patternStart({patternId:o}){const a=r.patterns.get(o);a&&(a.status="running",i())},start({patterns:o}){r.started=!0;for(const a of o){const c=new Map;for(const d of a.commands)c.set(d.id,{durationMs:0,id:d.id,status:"pending",title:d.title});r.patterns.set(a.id,{commands:c,id:a.id,status:"pending",title:a.title})}i()},async stop(){n.unmount(),await n.waitUntilExit()},warn({message:o}){r.warnMessages.push(o),i()}}},"createInkRenderer");var Zt=Object.defineProperty,ee=f((e,t)=>Zt(e,"name",{value:t,configurable:!0}),"a$1");const be=ee((e={})=>{const{quiet:t=!1,verbose:r=!1}=e,s=new Map,n=new Map,i=ee(a=>{t||process.stderr.write(`${a}
14
+ `)},"print"),o=ee(a=>{switch(a){case"failed":return X(Ce);case"running":return J(">");case"skipped":return ce(q);case"success":return Ve(Ie);default:return I(q)}},"iconFor");return{commandEnd({commandId:a,durationMs:c,error:d,output:u,status:l}){const p=n.get(a)??a,w=I(`(${c}ms)`);if(i(` ${o(l)} ${p} ${w}`),l==="failed"&&d&&i(I(d.message)),(l==="failed"||r)&&u&&u.trim().length>0)for(const h of u.split(/\r?\n/))i(` ${I(h)}`)},commandStart({commandId:a}){if(!r)return;const c=n.get(a)??a;i(` ${I("…")} ${c}`)},error({error:a,message:c}){t?process.stderr.write(`${X(c)}
15
+ `):i(X(c)),a?.stack&&(r||!t)&&process.stderr.write(`${I(a.stack)}
16
+ `)},info({message:a}){i(I(a))},patternEnd({patternId:a,status:c}){const d=s.get(a)??a;i(`${o(c)} ${d}`)},patternStart({patternId:a}){const c=s.get(a)??a;i(`${J(">")} ${c}`)},start({patterns:a}){if(a.length===0){i(I("No staged files matched any pattern."));return}const c=new Set(a.flatMap(d=>d.files)).size;i(`${J(">")} Running staged tasks on ${c} file${c===1?"":"s"} across ${a.length} pattern${a.length===1?"":"s"}`);for(const d of a){s.set(d.id,d.title);for(const u of d.commands)n.set(u.id,u.title)}},stop(){},warn({message:a}){i(ce(a))}}},"createPlainRenderer");var er=Object.defineProperty,tr=f((e,t)=>er(e,"name",{value:t,configurable:!0}),"t");const rr=tr(async e=>{const{env:t}=process;if(e.debug===!0||e.quiet===!0||t.NODE_ENV==="test"||t.TERM==="dumb"||t.CI!==void 0||!process.stderr.isTTY)return be({quiet:e.quiet,verbose:e.verbose});try{return Xt({verbose:e.verbose})}catch{return be({quiet:e.quiet,verbose:e.verbose})}},"pickRenderer");var sr=Object.defineProperty,_=f((e,t)=>sr(e,"name",{value:t,configurable:!0}),"a");const te=_(e=>typeof e=="object"&&e!==null&&typeof e.title=="string"&&typeof e.task=="function","isCustomTask"),nr=_(async e=>{let t=0,r=0;const s=_(()=>(t+=1,`pattern-${t}`),"nextPatternId"),n=_(()=>(r+=1,`cmd-${r}`),"nextCommandId"),i=_(async(a,c,d)=>{if(typeof a=="string"){d.push({command:a,files:c,id:n(),source:"string",title:a});return}if(Array.isArray(a)){for(const u of a)await i(u,c,d);return}if(typeof a=="function"){const u=await a([...c]);if(typeof u=="string"){d.push({command:u,files:c,id:n(),source:"function",title:u});return}if(Array.isArray(u)){for(const l of u)if(typeof l=="string")d.push({command:l,files:c,id:n(),source:"function",title:l});else if(te(l))d.push({files:c,id:n(),run:l.task,source:"custom",title:l.title});else throw new S("Task function returned an array with an unsupported entry — expected strings or { title, task }.");return}if(te(u)){d.push({files:c,id:n(),run:u.task,source:"custom",title:u.title});return}throw new S("Task function returned an unsupported value — expected string, string[], or { title, task }.")}if(te(a)){d.push({files:c,id:n(),run:a.task,source:"custom",title:a.title});return}throw new S("Unsupported task value — expected string, string[], function, or { title, task }.")},"expandTask"),o=[];for(const[a,c]of Object.entries(e.config)){const d=Kt(a,e.files,e.cwd,{caseInsensitive:e.caseInsensitive===!0});if(d.length===0)continue;const u=e.relative?d.map(p=>B(e.cwd,p)):d,l=[];await i(c,u,l),l.length!==0&&o.push({commands:l,files:u,id:s(),pattern:a,title:`${a} — ${d.length} file${d.length===1?"":"s"}`})}return o},"buildTaskGraph");var ar=Object.defineProperty,Y=f((e,t)=>ar(e,"name",{value:t,configurable:!0}),"g");const ir=Y(e=>{const t=[];let r="",s=!1,n=!1;for(let i=0;i<e.length;i+=1){const o=e[i];if(o===void 0)break;if(o==="\\"&&!s&&i+1<e.length){const a=e[i+1];if(a!==void 0){n&&a!=='"'&&a!=="\\"&&(r+=o),r+=a,i+=1;continue}}if(o==='"'&&!s){n=!n;continue}if(o==="'"&&!n){s=!s;continue}if(!s&&!n&&/\s/.test(o)){r.length>0&&(t.push(r),r="");continue}r+=o}if(s||n)throw new S(`Unterminated ${s?"single":"double"} quote in command: ${e}`);return r.length>0&&t.push(r),t},"parseCommandString"),Re=process.platform==="win32"?28e3:131072,or=Y((e,t,r)=>{const s=[];let n=[],i=t;const o=r<=0?Re:r;for(const a of e){const c=Buffer.byteLength(a)+1;n.length>0&&i+c>o&&(s.push(n),n=[],i=t),n.push(a),i+=c}return n.length>0&&s.push(n),s},"chunkFiles"),cr=Y(async(e,t,r)=>{const s=ir(e);if(s.length===0)throw new O(e,"Empty command for staged task.");const[n,...i]=s;if(n===void 0)throw new O(e,"Empty command for staged task.");const o=Buffer.byteLength(n)+i.reduce((u,l)=>u+Buffer.byteLength(l)+1,0),a=or(t,o,r.maxArgLength??Re),c=Date.now(),d=[];for(const u of a){if(r.signal?.aborted===!0)throw new O(e,"Task aborted by earlier failure.");const l=$e(n,[...i,...u],{nodeOptions:{cwd:r.cwd,env:dr(r.env),killSignal:r.killSignal??"SIGTERM",stdio:["ignore","pipe","pipe"]},...r.signal===void 0?{}:{signal:r.signal}}),p=await l,w=[p.stdout,p.stderr].filter(m=>m.length>0).join(`
17
+ `);w.length>0&&d.push(w);const h=l.process?.signalCode??null;if(l.aborted||h!==null||p.exitCode===void 0){const m=l.aborted?"Task aborted by earlier failure.":h===null?w.trim()||"Task exited without a numeric status code.":`Task killed by signal ${h}.`;throw new O(e,m)}if(p.exitCode!==0)throw new O(e,w.trim()||`Exit code ${p.exitCode} from ${n}`)}return{durationMs:Date.now()-c,output:d.join(`
18
+ `)}},"execCommand"),dr=Y(e=>{const t={...process.env};return process.stderr.isTTY&&t.FORCE_COLOR===void 0&&t.NO_COLOR===void 0&&(t.FORCE_COLOR="1"),e?{...t,...e}:t},"buildTaskEnv");var lr=Object.defineProperty,j=f((e,t)=>lr(e,"name",{value:t,configurable:!0}),"o");const ur=j(async(e,t,r)=>{const s=hr(r.concurrent,e.length),n=[],i=new AbortController;let o=!1,a=0;const c=j(()=>{o||(o=!0,r.continueOnError||i.abort())},"cancel");r.externalSignal&&(r.externalSignal.aborted?c():r.externalSignal.addEventListener("abort",()=>{c()},{once:!0}));const d=j(h=>{for(const m of h.commands)t.commandEnd({commandId:m.id,durationMs:0,patternId:h.id,status:"skipped"})},"emitSkippedCommands"),u=j(async h=>{if(o){d(h),t.patternEnd({patternId:h.id,status:"skipped"});return}t.patternStart({patternId:h.id});let m="success";for(const y of h.commands){if(o){t.commandEnd({commandId:y.id,durationMs:0,patternId:h.id,status:"skipped"}),m=m==="success"?"skipped":m;continue}t.commandStart({commandId:y.id,patternId:h.id});const k=await fr(y,r,i.signal),T=k.status==="failed"&&i.signal.aborted?{...k,status:"skipped"}:k;if(t.commandEnd({commandId:y.id,durationMs:T.durationMs,error:T.error,output:T.output,patternId:h.id,status:T.status}),T.status==="failed"){n.push(y.title),m="failed",c();break}if(T.status==="skipped"){m=m==="success"?"skipped":m;break}}t.patternEnd({patternId:h.id,status:m})},"runOne"),l=j(async()=>{for(;a<e.length;){const h=e[a];a+=1,h&&await u(h)}},"pickNext"),p=[];for(let h=0;h<Math.min(s,e.length);h+=1)p.push(l());await Promise.all(p);const w=r.externalSignal?.aborted===!0;return{failedCommands:n,success:n.length===0&&!w}},"runTasks"),fr=j(async(e,t,r)=>{const s=Date.now();try{if(e.source==="custom"&&e.run)return await e.run([...e.files]),{durationMs:Date.now()-s,status:"success"};if(e.command){const n=await cr(e.command,e.files,{cwd:t.cwd,killSignal:t.killSignal,maxArgLength:t.maxArgLength,signal:r});return{durationMs:n.durationMs,output:t.verbose?n.output:void 0,status:"success"}}return{durationMs:Date.now()-s,error:new O(e.title,"Command has no invocation target."),status:"failed"}}catch(n){const i=n instanceof Error?n:new Error(String(n));return{durationMs:Date.now()-s,error:i,output:i instanceof O?i.message:void 0,status:"failed"}}},"runCommand"),hr=j((e,t)=>{if(e===!1)return 1;if(e===!0){const s=Math.max(1,typeof de=="function"?de():4);return Math.min(Math.max(1,t),s)}const r=Math.floor(e);return r>0?r:1},"concurrencyLimit");var pr=Object.defineProperty,se=f((e,t)=>pr(e,"name",{value:t,configurable:!0}),"u");const gr=!0,mr=se(e=>{try{return!nt(e)}catch{return!1}},"detectCaseInsensitive"),wr=se(async(e={})=>{const t=e.cwd??process.cwd(),r=await rr(e),s=await bt(e);typeof s!="function"&&he(s);const n=new Vt({...e,cwd:t}),i=new AbortController;let o=!1;const a=se(l=>{if(o){process.removeListener("SIGINT",a),process.removeListener("SIGTERM",a),process.kill(process.pid,l);return}o=!0,r.warn({message:`Received ${l} — cancelling staged tasks and restoring state. Press Ctrl+C again to abort.`}),i.abort()},"onInterrupt");process.on("SIGINT",a),process.on("SIGTERM",a);let c={failedCommands:[],ranTasks:!1,success:!0},d=!1,u=!1;try{await n.prepare(),d=!0;for(const k of n.warnings)r.warn({message:k});if(n.stagedFiles.length===0)return e.allowEmpty!==!0&&r.info({message:"No staged files found."}),u=!0,{failedCommands:[],ranTasks:!1,success:!0};const l=mr(t),p=Yt(n.stagedFiles,e.ignore,t,{caseInsensitive:l});if(p.length===0&&n.stagedFiles.length>0)return r.info({message:"Every staged file was excluded by the `ignore` list."}),u=!0,{failedCommands:[],ranTasks:!1,success:!0};const w=typeof s=="function"?he(await s([...p])):s,h=await nr({caseInsensitive:l,config:w,cwd:t,files:p,relative:e.relative});if(r.start({patterns:h}),h.length===0)return r.info({message:"No staged files matched any pattern."}),u=!0,{failedCommands:[],ranTasks:!1,success:!0};const{failedCommands:m,success:y}=await ur(h,r,{concurrent:e.concurrent??gr,continueOnError:e.continueOnError===!0,cwd:t,externalSignal:i.signal,killSignal:e.killSignal,maxArgLength:e.maxArgLength,verbose:e.verbose});if(c={failedCommands:m,ranTasks:!0,success:y},y){if(e.diff===void 0&&(await n.applyModifications({autoStage:e.autoStage===!0}),e.failOnChanges===!0&&n.indexTreeChanged()&&(r.warn({message:"Tasks modified staged content — failing because --fail-on-changes is set."}),c={failedCommands:[...m],ranTasks:!0,success:!1}),e.allowEmpty!==!0&&n.postTaskIndexMatchesHead()))throw new dt("All staged changes were reverted by tasks. Re-stage changes or rerun with --allow-empty.")}else if(e.revert===!0)r.info({message:"Reverting working tree from backup stash."}),await n.revert();else{const k=n.recoveryHint();k&&r.warn({message:k})}return await n.restoreUnstagedChanges(),u=c.success,c}catch(l){const p=l instanceof Error?l.message:String(l),w=l instanceof Error?l:new Error(p);if(r.error({error:w,message:p}),l instanceof A)return{failedCommands:c.failedCommands,ranTasks:c.ranTasks,success:!1};throw l}finally{if(process.removeListener("SIGINT",a),process.removeListener("SIGTERM",a),d)try{await n.cleanup(u)}catch(l){r.error({error:l,message:"Cleanup failed."})}await r.stop()}},"runStaged");var vr=Object.defineProperty,yr=f((e,t)=>vr(e,"name",{value:t,configurable:!0}),"n");const kr="VIS_STAGED_CONCURRENT",Se=yr(e=>{const t=e.trim();if(t==="true"||t==="")return!0;if(t==="false")return!1;const r=Number(t);return Number.isNaN(r)?!0:r},"parseConcurrent");var br=Object.defineProperty,H=f((e,t)=>br(e,"name",{value:t,configurable:!0}),"d");const Sr=H((e,t)=>{const r={};t!==void 0&&(r.config=t);const s=H(v=>e[v]===void 0?void 0:!!e[v],"readBool"),n=H(v=>{const Q=e[v];return typeof Q=="string"&&Q.length>0?Q:void 0},"readString"),i=s("allow-empty");i!==void 0&&(r.allowEmpty=i);const o=s("auto-stage");o!==void 0&&(r.autoStage=o);const a=s("continue-on-error");a!==void 0&&(r.continueOnError=a);const c=s("debug");c!==void 0&&(r.debug=c);const d=s("fail-on-changes");d!==void 0&&(r.failOnChanges=d);const u=s("hide-partially-staged");u!==void 0&&(r.hidePartiallyStaged=u);const l=s("hide-unstaged");l!==void 0&&(r.hideUnstaged=l);const p=s("quiet");p!==void 0&&(r.quiet=p);const w=s("relative");w!==void 0&&(r.relative=w);const h=s("revert");h!==void 0&&(r.revert=h);const m=s("stash");m!==void 0&&(r.stash=m);const y=s("verbose");y!==void 0&&(r.verbose=y);const k=n("cwd");k!==void 0&&(r.cwd=k);const T=n("diff");T!==void 0&&(r.diff=T);const ie=n("diff-filter");if(ie!==void 0&&(r.diffFilter=ie),s("force-kill")===!0&&(r.killSignal="SIGKILL"),e.concurrent===void 0){const v=process.env[kr];v!==void 0&&(r.concurrent=Se(v.trim()))}else{const{concurrent:v}=e;r.concurrent=Se(typeof v=="string"?v:typeof v=="number"||typeof v=="boolean"?String(v):"")}return r},"buildRunOptions"),Fr=H(async({options:e,visConfig:t})=>{const r=(t??{}).staged;if(!r)throw new Error(`No "staged" config found in vis.config.ts. Add one:
19
+
20
+ // vis.config.ts
21
+ import { defineConfig } from "@visulima/vis/config";
22
+
23
+ export default defineConfig({
24
+ staged: { '*': 'vis check --fix' },
25
+ });
26
+
27
+ Migrating from lint-staged or nano-staged? Run \`vis migrate lint-staged\` (or \`vis migrate nano-staged\`) to move the config in and remove the legacy files.`);(await wr(Sr(e,r))).success||(process.exitCode=1)},"execute");export{Sr as buildRunOptions,Fr as default};
@@ -0,0 +1,167 @@
1
+ var Zr=Object.defineProperty;var _=(r,e)=>Zr(r,"name",{value:e,configurable:!0});import{createRequire as es}from"node:module";import{M as ve,Q as rs,g as ss,C as Ir,z as is,B as Cr,$ as os}from"./config.js";import{aT as ns,p as er,a2 as Tt,a3 as It,bv as as,bw as cs,Y as at,bx as ls,a1 as ds,y as us,m as hs,by as fs,bz as ps,s as rt,bA as gs}from"./bin.js";import{runConcurrently as ct,TerminalBuffer as xr,readLastRunSummary as ms,getLastRunSummaryPath as ws,enforceProjectConstraints as vs,expandTokensInString as tr,parsePartition as ys,TaskScheduler as ks,createTaskGraph as bs,reverseTaskGraph as Ss,generateRunSummary as rr,writeChromeTrace as $s,resolveTurboEnvCompat as Ts,CompositeLifeCycle as sr,defaultTaskRunner as ir,createLogReporter as Is,writeRunSummary as Cs}from"@visulima/task-runner";import{E as xs,a as Ms}from"../packem_shared/cache-directory-DQak1Vjc.js";import{F as Ds}from"../packem_shared/failure-log-C3LEMmkq.js";import{f as As,l as Ls,c as Bs,a as Ns,b as Gs}from"../packem_shared/flakiness-Dq6K4ymq.js";import{r as _s}from"../packem_shared/toolchain-Cc3cwyLP.js";import{i as qs,a as Hs,b as zs,s as Vs,d as Us,c as Ws,r as Ks,H as Ys,f as Xs,e as Js}from"../packem_shared/lifecycle-Dv3nAtoD.js";import{p as Qs,r as Zs,f as ei}from"../packem_shared/selectors-B2ISH581.js";import{renderToString as fe,render as si}from"@visulima/tui";import{Text as a}from"@visulima/tui/components/text";import J,{useSyncExternalStore as ot,useCallback as st,useState as Ye,useRef as Xe,useEffect as wt,useMemo as or}from"react";import{jsxs as u,jsx as l,Fragment as Mr}from"react/jsx-runtime";import{Box as g}from"@visulima/tui/components/box";import{StaticRender as nr}from"@visulima/tui/components/static-render";import{T as Er,C as xt,D as ht,E as Rr}from"../packem_shared/symbols-CQmER5MT.js";import{Dialog as ii}from"@visulima/tui/components/dialog";import{useApp as oi}from"@visulima/tui/hooks/use-app";import{useInput as ar}from"@visulima/tui/hooks/use-input";import{useWindowSize as ni}from"@visulima/tui/hooks/use-window-size";import{ScrollView as Fr}from"@visulima/tui/components/scroll-view";import{Spinner as Pr}from"@visulima/tui/components/spinner";const ts=es(import.meta.url),Ke=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,ze=_(r=>{if(typeof Ke<"u"&&Ke.versions&&Ke.versions.node){const[e,t]=Ke.versions.node.split(".").map(Number);if(e>22||e===22&&t>=3||e===20&&t>=16)return Ke.getBuiltinModule(r)}return ts(r)},"__cjs_getBuiltinModule"),{existsSync:Ct,statSync:lt,watch:Es,openSync:Rs,readSync:Fs,closeSync:Ps,readFileSync:js,mkdtempSync:Os}=ze("node:fs"),{createInterface:ti,emitKeypressEvents:ri}=ze("node:readline"),{createHash:ai}=ze("node:crypto"),{appendFile:Mt}=ze("node:fs/promises"),{platform:ci,homedir:Et,tmpdir:li}=ze("node:os"),{spawn:di}=ze("node:child_process");var ui=Object.defineProperty,ft=_((r,e)=>ui(r,"name",{value:e,configurable:!0}),"s$3");const hi={bun:["bun.lock","bun.lockb"],npm:["package-lock.json"],pnpm:["pnpm-lock.yaml"],yarn:["yarn.lock"]},fi={bun:["node_modules/.bun-tag"],npm:["node_modules/.package-lock.json"],pnpm:["node_modules/.modules.yaml","node_modules/.pnpm/lock.yaml"],yarn:["node_modules/.yarn-integrity","node_modules/.yarn-state.yml",".yarn/install-state.gz"]},pi={ci:{bun:"bun install --frozen-lockfile",npm:"npm ci",pnpm:"pnpm install --frozen-lockfile",yarn:"yarn install --immutable"},tty:{bun:"bun install",npm:"npm install",pnpm:"pnpm install",yarn:"yarn install"}},gi=1e3,mi=ft(r=>{for(const[e,t]of Object.entries(hi))for(const s of t)if(Ct(ve(r,s)))return{lockfileFile:s,manager:e}},"detectPackageManager"),wi=ft((r,e)=>{let t;for(const s of fi[e]){const o=ve(r,s);if(!Ct(o))continue;const{mtimeMs:n}=lt(o);(!t||n>t.mtimeMs)&&(t={mtimeMs:n,path:s})}return t},"findFreshestMarker"),vi=ft((r,e={})=>{const t=mi(r);if(!t)return{checked:!1};const{lockfileFile:s,manager:o}=t,n=lt(ve(r,s)).mtimeMs,i=wi(r,o),d=pi[e.inCi?"ci":"tty"][o],f={installMarkerMtimeMs:i?.mtimeMs,lockfileMtimeMs:n,lockfilePath:s,marker:i?.path,packageManager:o};return i?n>i.mtimeMs+gi?{checked:!0,detail:f,failure:"stale-install",message:`${s} is newer than node_modules (${i.path}) — run \`${d}\` to sync.`}:{checked:!0,detail:f}:{checked:!0,detail:f,failure:"missing-install",message:`lockfile detected but node_modules looks uninitialised — run \`${d}\` before \`vis run\`.`}},"checkLockfileFreshness"),yi=ft((r,e,t,s={})=>{if(s.skip)return{checked:!1,shouldContinue:!0};const o=vi(r,{inCi:e});if(!o.failure)return{...o,shouldContinue:!0};const n=`preflight: ${o.message??"lockfile drift detected"}`;return e&&!s.ciAsWarning?{...o,formattedMessage:n,shouldContinue:!1}:(t.warn(n),{...o,formattedMessage:n,shouldContinue:!0})},"runLockfilePreflight");var ki=Object.defineProperty,bi=_((r,e)=>ki(r,"name",{value:e,configurable:!0}),"u$1"),Si=Object.defineProperty,$i=bi((r,e)=>Si(r,"name",{value:e,configurable:!0}),"v"),Ti=Object.defineProperty,Ii=$i((r,e)=>Ti(r,"name",{value:e,configurable:!0}),"D");const Ci=Ii((r,e,t,s,o,n,i,d,f,p,h,m,c,$)=>{const E={d:s,h:o,m:n,mo:e,ms:d,s:i,w:t,y:r};return f!==void 0&&(E.future=f),p!==void 0&&(E.past=p),h!==void 0&&(E.decimal=h),m!==void 0&&(E.unitMap=m),c!==void 0&&(E.groupSeparator=c),$!==void 0&&(E.placeholderSeparator=$),E},"createDurationLanguage"),xi={d:"d",day:"d",days:"d",h:"h",hour:"h",hours:"h",hr:"h",hrs:"h",m:"m",millisecond:"ms",milliseconds:"ms",min:"m",mins:"m",minute:"m",minutes:"m",mo:"mo",month:"mo",months:"mo",ms:"ms",s:"s",sec:"s",second:"s",seconds:"s",secs:"s",w:"w",week:"w",weeks:"w",y:"y",year:"y",years:"y",yr:"y",yrs:"y"},Mi=Ci(r=>`year${r===1?"":"s"}`,r=>`month${r===1?"":"s"}`,r=>`week${r===1?"":"s"}`,r=>`day${r===1?"":"s"}`,r=>`hour${r===1?"":"s"}`,r=>`minute${r===1?"":"s"}`,r=>`second${r===1?"":"s"}`,r=>`millisecond${r===1?"":"s"}`,"in %s","%s ago",".",xi,",","_");var Ei=Object.defineProperty,Ri=_((r,e)=>Ei(r,"name",{value:e,configurable:!0}),"o$4"),Fi=Object.defineProperty,Pi=Ri((r,e)=>Fi(r,"name",{value:e,configurable:!0}),"o"),ji=Object.defineProperty,Oi=Pi((r,e)=>ji(r,"name",{value:e,configurable:!0}),"o");const Di=Oi(r=>{const e=["y","mo","w","d","h","m","s","ms","future","past"];for(const s of e)if(!Object.hasOwn(r,s))throw new TypeError(`Missing required property: ${s}`);if(typeof r.future!="string"||typeof r.past!="string")throw new TypeError("Properties future and past must be of type string");const t=["y","mo","w","d","h","m","s","ms"];for(const s of t)if(typeof r[s]!="string"&&typeof r[s]!="function")throw new TypeError(`Property ${s} must be of type string or function`);if(r.decimal&&typeof r.decimal!="string")throw new TypeError("Property decimal must be of type string");if(r.delimiter&&typeof r.delimiter!="string")throw new TypeError("Property delimiter must be of type string");if(r._digitReplacements&&!Array.isArray(r._digitReplacements))throw new TypeError("Property _digitReplacements must be an array");if(r._numberFirst&&typeof r._numberFirst!="boolean")throw new TypeError("Property _numberFirst must be of type boolean");if(r.unitMap&&typeof r.unitMap!="object")throw new TypeError("Property unitMap must be an object");if(r.unitMap&&Object.values(r.unitMap).some(s=>typeof s!="string"))throw new TypeError("All values in unitMap must be of type string")},"validateDurationLanguage");var Ai=Object.defineProperty,Li=_((r,e)=>Ai(r,"name",{value:e,configurable:!0}),"b$1"),Bi=Object.defineProperty,Ni=Li((r,e)=>Bi(r,"name",{value:e,configurable:!0}),"b"),Gi=Object.defineProperty,Qe=Ni((r,e)=>Gi(r,"name",{value:e,configurable:!0}),"g");const jr=Qe((r,e)=>{e=e||-1;const t=new RegExp(String.raw`^-?\d+(?:.\d{0,${String(e)}})?`).exec(r.toString());return t===null?r:Number.parseFloat(t[0])},"toFixed"),cr=Qe(({unitCount:r,unitName:e},t,s)=>{let{spacer:o}=s;const{maxDecimalPoints:n}=s;let i=".";s.decimal!==void 0?i=s.decimal:t.decimal!==void 0&&(i=t.decimal);let d;"digitReplacements"in s?d=s.digitReplacements:"_digitReplacements"in t&&(d=t._digitReplacements);let f,p=r;n!==void 0&&(p=jr(r,n));const h=p.toString();if(!t._hideCountIf2||r!==2)if(d){f="";for(const $ of h)f+=$==="."?i:d[$]}else f=h.replace(".",i);else f="";const m=t[e];let c=m;return typeof m=="function"&&(c=m(r)),t._hideCountIf2&&r===2&&(o=""),t._numberFirst?c+o+f:f+o+c},"renderPiece"),_i=Qe((r,e)=>{const{units:t}=e;if(t.length===0)return[];const{unitMeasures:s}=e,o=e.largest??Number.POSITIVE_INFINITY,n={};let i,d,f,p=r;for(d=0;d<t.length;d++){i=t[d];const m=s[i];f=d===t.length-1?p/m:Math.floor(p/m),n[i]=f,p-=f*m}if(e.round){let m=o;for(d=0;d<t.length;d++)if(i=t[d],f=n[i],f!==0&&(m--,m===0)){for(let c=d+1;c<t.length;c++){const $=t[c],E=n[$];n[i]=(n[i]??0)+E*s[$]/s[i],n[$]=0}break}for(d=t.length-1;d>=0;d--){if(i=t[d],f=n[i],f===0)continue;const c=Math.round(f);if(n[i]=c,d===0)break;const $=t[d-1],E=s[$],D=Math.floor(c*s[i]/E);if(D)n[$]=(n[$]??0)+D,n[i]=0;else break}}const h=[];for(d=0;d<t.length&&h.length<o;d++){if(i=t[d],f=n[i],f&&!e.round&&h.length===o-1){let m,c=0;for(m=d+1,t.length;m<t.length;m++){const $=t[m];c+=n[$]*(e.unitMeasures[$]/e.unitMeasures[i])}f+=c,e.maxDecimalPoints!==void 0&&(f=jr(f,e.maxDecimalPoints))}f&&h.push({unitCount:f,unitName:i})}return h},"getPieces"),qi=Qe((r,e,t)=>{const{language:s,units:o}=e;if(r.length===0){const m=o.at(-1);return cr({unitCount:0,unitName:m},s,e)}const{conjunction:n,serialComma:i}=e;let d=", ";e.delimiter!==void 0?d=e.delimiter:s.delimiter!==void 0&&(d=s.delimiter);let f="";e.timeAdverb&&t!==0&&(f=s.future??"",t<0&&(f=s.past??""));const p=r.map(m=>cr(m,s,e));let h;return!n||r.length===1?h=p.join(d):r.length===2?h=p.join(n):h=p.slice(0,-1).join(d)+(i?",":"")+n+(p.at(-1)??""),f&&(h=f.replace("%s",h)),h},"formatPieces"),Or=Qe((r,e)=>{if(Number.isNaN(r))throw new TypeError("Expected a valid number");if(typeof r!="number")throw new TypeError("Expected a number for milliseconds input");const t={conjunction:"",language:Mi,round:!1,serialComma:!0,spacer:" ",timeAdverb:!1,unitMeasures:{d:864e5,h:36e5,m:6e4,mo:2629746e3,ms:1,s:1e3,w:6048e5,y:31556952e3},units:["w","d","h","m","s"],...e};Di(t.language);const s=Math.abs(r),o=_i(s,t);return qi(o,t,r)},"duration");var Hi=Object.defineProperty,Dr=_((r,e)=>Hi(r,"name",{value:e,configurable:!0}),"f$6");const zi=Dr(r=>r.split(",").map(e=>e.trim()).filter(e=>e!==""),"splitPatterns"),Vi=Dr((r,e,t)=>{const s=new Set,o=[];if(r===void 0||r.trim()==="")return{skipTaskIds:s,unmatchedPatterns:o};const n=[...t],i=new Set(n),d=new Map;for(const f of n){const p=f.lastIndexOf(":");if(p===-1)continue;const h=f.slice(p+1),m=d.get(h);m===void 0?d.set(h,[f]):m.push(f)}for(const f of zi(r)){if(f.startsWith("~:"))throw new Error(`--skip-cache does not support the closest-project selector "~:" (received "${f}"). Use \`pkg:target\`, \`:target\`, or \`#tag:target\`.`);if(i.has(f)){s.add(f);continue}const p=Qs(f);if(!p){o.push(f);continue}let h=!1;switch(p.kind){case"all":{const m=d.get(p.target)??[];for(const c of m)s.add(c),h=!0;break}case"project":{const m=p.projects?.[0];if(m!==void 0){const c=`${m}:${p.target}`;i.has(c)&&(s.add(c),h=!0)}break}case"tag":{const{tag:m}=p;if(m!==void 0){const c=d.get(p.target)??[];for(const $ of c){const E=$.slice(0,$.lastIndexOf(":"));e.projects[E]?.tags?.includes(m)===!0&&(s.add($),h=!0)}}break}}h||o.push(f)}return{skipTaskIds:s,unmatchedPatterns:o}},"resolveSkipCachePatterns");var Ui=Object.defineProperty,Rt=_((r,e)=>Ui(r,"name",{value:e,configurable:!0}),"a$1");const Wi=/\$(?:\{([A-Z_]\w*)(:-[^}]*)?\}|([A-Z_]\w*))/gi,Ki=new Set(["0","!","#","$","*","-","?","@","_"]),Yi=Rt(r=>{const e=new Map;for(const t of r.matchAll(Wi)){const s=t[1],o=t[3],n=t[2],i=s??o;if(i===void 0||Ki.has(i))continue;const d=n!==void 0,f=e.get(i);f===void 0?e.set(i,d):f&&!d&&e.set(i,!1)}return[...e.entries()].map(([t,s])=>({hasDefault:s,name:t}))},"extractEnvReferences"),Xi=Rt(r=>{const{command:e,processEnv:t,taskEnv:s,taskId:o}=r,n=Yi(e);if(n.length===0)return;const i=[];for(const{hasDefault:d,name:f}of n){if(d)continue;const p=s[f],h=t[f];p===void 0&&h===void 0&&i.push(f)}if(i.length!==0)return{missing:i.toSorted(),taskId:o}},"checkStrictEnv"),Ji=Rt(r=>{const e=r.missing.map(t=>`$${t}`).join(", ");return`Strict env: ${r.taskId} references unset variable${r.missing.length===1?"":"s"} ${e}. Set ${r.missing.length===1?"it":"them"} in the task env, an envFile, or the parent shell — or opt out with options.strictEnv: false.`},"formatStrictEnvError");var Qi=Object.defineProperty,je=_((r,e)=>Qi(r,"name",{value:e,configurable:!0}),"i$2");const lr=je(r=>{const e=new Set;for(const t of Object.values(r.projects))for(const s of Object.keys(t.targets??{}))e.add(s);return[...e].sort()},"collectAvailableTargets"),Zi=je(r=>{const e=new Map;for(const t of r.values())for(const[s,o]of Object.entries(t))for(const n of o.aliases??[])e.has(n)||e.set(n,s);return e},"buildAliasMap"),eo=je((r,e)=>e.get(r)??r,"resolveTargetAlias"),to=je((r,e)=>{if(r.length===0)return e.length;if(e.length===0)return r.length;const t=[];for(let s=0;s<=e.length;s++)t[s]=[s];for(let s=0;s<=r.length;s++)t[0][s]=s;for(let s=1;s<=e.length;s++)for(let o=1;o<=r.length;o++){const n=e[s-1]===r[o-1]?0:1;t[s][o]=Math.min(t[s-1][o]+1,t[s][o-1]+1,t[s-1][o-1]+n)}return t[e.length][r.length]},"levenshtein"),ro=je((r,e,t=3)=>Ar(r,e,1,t)[0],"suggestTarget"),Ar=je((r,e,t=3,s=3)=>{const o=[];for(const n of e){const i=to(r.toLowerCase(),n.toLowerCase());i<=s&&o.push({distance:i,name:n})}return o.sort((n,i)=>n.distance-i.distance||n.name.localeCompare(i.name)),o.slice(0,t).map(n=>n.name)},"suggestTargets"),so=je(r=>r.length===0?" (no targets found)":r.map(e=>` - ${e}`).join(`
2
+ `),"formatTargetList"),io=je(async r=>{if(r.length===0||!process.stdin.isTTY||!process.stdout.isTTY)return;const e=ti({input:process.stdin,output:process.stdout});try{process.stdout.write(`Available targets:
3
+ `);for(const[o,n]of r.entries())process.stdout.write(` ${String(o+1).padStart(2," ")}. ${n}
4
+ `);process.stdout.write(`
5
+ `);const t=(await new Promise(o=>{e.question("Select a target (number or name, blank to cancel): ",o)})).trim();if(t.length===0)return;const s=Number.parseInt(t,10);return Number.isFinite(s)&&s>=1&&s<=r.length?r[s-1]:r.includes(t)?t:ro(t,r)}finally{e.close()}},"promptTargetInteractively");var oo=Object.defineProperty,nt=_((r,e)=>oo(r,"name",{value:e,configurable:!0}),"n$1");const no=new RegExp("[\x1B›]\\[[0-?]*[ -/]*[@-~]","g"),vt=nt(r=>r.replaceAll(no,"").replaceAll("\r",""),"sanitizeLogLine");class dr{static{_(this,"ServiceDockStore")}static{nt(this,"ServiceDockStore")}#e=[];#s=new Set;#r=new Map;#i=new Map;constructor(e=[]){for(const t of e)this.#i.set(t,{id:t,status:"pending",tailLines:[]});this.#e=[...e],this.#o()}getSnapshot=nt(()=>this.#r,"getSnapshot");subscribe=nt(e=>(this.#s.add(e),()=>{this.#s.delete(e)}),"subscribe");getIds(){return this.#e}getState(e){return this.#i.get(e)}getDockState(){let e=!1,t=!1;for(const s of this.#i.values())s.status==="crashed"||s.status==="failed"?e=!0:(s.status==="pending"||s.status==="starting")&&(t=!0);return e?"crash":t?"boot":"ready"}registerService(e){this.#i.has(e)||(this.#i.set(e,{id:e,status:"pending",tailLines:[]}),this.#e=[...this.#e,e],this.#n())}markStarting(e){this.#t(e,t=>({...t,errorMessage:void 0,startedAt:t.startedAt??Date.now(),status:"starting"}))}markStarted(e,t){this.#t(e,s=>({...s,startedAt:s.startedAt??Date.now(),status:s.status==="ready"?"ready":"starting"}))}markReady(e,t){this.#t(e,s=>({...s,errorMessage:void 0,port:t.port,readyAt:Date.now(),status:"ready"}))}markFailed(e,t,s){const o=s?.message;this.#t(e,n=>({...n,errorMessage:vt(o??t),status:"failed"}))}markCrashed(e,t){const s=t.slice(-256).map(o=>vt(o));this.#t(e,o=>({...o,errorMessage:s.length>0?s[s.length-1]:"process exited",status:"crashed",tailLines:s}))}appendLog(e,t){const s=t.split(`
6
+ `).map(o=>vt(o)).filter(o=>o.length>0);s.length!==0&&this.#t(e,o=>{const n=[...o.tailLines,...s];for(;n.length>256;)n.shift();let i=0;for(let d=n.length-1;d>=0;d--)if(i+=n[d].length+1,i>65536){n.splice(0,d+1);break}return{...o,lastLine:s[s.length-1],tailLines:n}})}abortBoot(e){let t=!1;const s=new Map(this.#i);for(const[o,n]of s)(n.status==="pending"||n.status==="starting")&&(s.set(o,{...n,errorMessage:e,status:"failed"}),t=!0);t&&(this.#i=s,this.#o(),this.#n())}#t(e,t){const s=this.#i.get(e);s&&(this.#i.set(e,t(s)),this.#o(),this.#n())}#o(){this.#r=new Map(this.#i)}#n(){for(const e of this.#s)try{e()}catch{}}}var ao=Object.defineProperty,Ft=_((r,e)=>ao(r,"name",{value:e,configurable:!0}),"i$1");const co=Ft(r=>Array.isArray(r)?`[${r.join(",")}]`:typeof r=="object"&&r!==null?JSON.stringify(r):String(r),"formatValue"),lo=Ft((r,e,t)=>e==="_"?`${r}${Array.isArray(t)?t.join(" "):String(t)}`:`${r}--${e}=${co(t)}`,"formatFlags"),Pt=Ft((r,e,t)=>{const s=new Set(new Set(t.map(c=>c.target.target))),o=new Set(new Set(t.map(c=>c.target.project))),n=e.filter(c=>s.has(c)),i=r.filter(c=>o.has(c)),d=t.length-i.length*n.length,f=n.length===1?"target":"targets",p=n.join(", "),h=i.length===1?`project ${i[0]}`:`${i.length} projects`;let m=`${f} ${p} for ${h}`;return d>0&&(m+=` and ${d} ${d===1?"task":"tasks"} ${d===1?"it depends":"they depend"} on`),m},"formatTargetsAndProjects");var uo=Object.defineProperty,ho=_((r,e)=>uo(r,"name",{value:e,configurable:!0}),"c$3");const fo={error:"red",info:"white",success:"green"},bt=ho(({children:r,title:e,variant:t})=>{const s=fo[t];return u(g,{flexDirection:"column",children:[u(g,{gap:1,children:[l(a,{bold:!0,inverse:!0,children:" VIS "}),l(a,{bold:!0,color:s,children:"•"}),l(a,{children:e})]}),r]})},"Header");var po=Object.defineProperty,go=_((r,e)=>po(r,"name",{value:e,configurable:!0}),"T$3");const Lr=go(({cached:r,failed:e,failedIds:t,projectNames:s,retriedIds:o,skippedIds:n,succeeded:i,targets:d,tasks:f,took:p})=>{const h=Pt(s,d,f),m=o??[];if(e===0&&(!n||n.length===0)){const c=r>0?` (${r} read from cache)`:"";return l(nr,{children:_(()=>l(bt,{title:`Successfully ran ${h}`,variant:"success",children:u(g,{flexDirection:"column",marginTop:1,paddingLeft:3,children:[u(a,{children:[l(a,{color:"green",children:Er})," ",i+r," tasks completed",c?l(a,{dimColor:!0,children:c}):null,l(a,{dimColor:!0,children:` · Took ${p}`})]}),m.length>0&&u(g,{flexDirection:"column",marginTop:1,children:[u(a,{children:[l(a,{color:"yellow",children:"↻"})," ",l(a,{color:"yellow",children:String(m.length)})," task",m.length===1?"":"s"," succeeded after retry:"]}),m.map($=>u(a,{children:[" ",l(a,{color:"yellow",children:"↻"})," ",$]},$))]})]})}),"children")})}return l(nr,{children:_(()=>l(bt,{title:`Ran ${h}`,variant:"error",children:u(g,{flexDirection:"column",marginTop:1,paddingLeft:3,children:[n&&n.length>0&&u(g,{flexDirection:"column",children:[u(a,{dimColor:!0,children:[n.length," ","task",n.length===1?"":"s"," ","skipped (dependency failed or --bail)"]}),n.map(c=>u(a,{dimColor:!0,children:[" - ",c]},c)),l(a,{})]}),e>0&&u(g,{flexDirection:"column",children:[u(a,{children:[l(a,{color:"red",children:String(e)})," ","task",e===1?"":"s"," ","failed:"]}),t.map(c=>u(a,{children:[" ",l(a,{color:"red",children:xt})," ",c]},c)),l(a,{})]}),m.length>0&&u(g,{flexDirection:"column",children:[u(a,{children:[l(a,{color:"yellow",children:String(m.length)})," ","task",m.length===1?"":"s"," ","finished after retry:"]}),m.map(c=>u(a,{children:[" ",l(a,{color:"yellow",children:"↻"})," ",c]},c)),l(a,{})]}),l(a,{dimColor:!0,children:` Took ${p}`})]})}),"children")})},"CommandSummary");var mo=Object.defineProperty,yt=_((r,e)=>mo(r,"name",{value:e,configurable:!0}),"o$3");class dt{static{_(this,"TaskStore")}static{yt(this,"TaskStore")}#e;#s=new Set;#r=new Map;constructor(e){this.#e={autoExitCountdown:null,cached:0,completed:0,done:!1,endTime:null,failed:0,filterActive:!1,filterText:"",focusedPanel:"tasks",interactiveMode:!1,outputs:new Map,pinnedTaskIds:[null,null],rerunRequested:!1,retriedIds:[],retryTaskId:null,rows:e.map(t=>({persistent:!!t.overrides.visOptions?.persistent,status:"pending",taskId:t.id})),selectedIndex:0,startTime:Date.now(),statusFilter:"all",succeeded:0,viewMode:"list"}}getSnapshot=yt(()=>this.#e,"getSnapshot");subscribe=yt(e=>(this.#s.add(e),()=>{this.#s.delete(e)}),"subscribe");startTasks(e){const t=[...this.#e.rows];for(const s of e){const o=t.findIndex(n=>n.taskId===s.id);o!==-1&&(t[o]={...t[o],elapsed:0,status:"running"},this.#r.set(s.id,process.hrtime()))}this.#t({...this.#e,rows:t})}endTasks(e){const t=[...this.#e.rows];let{cached:s,completed:o,failed:n,succeeded:i}=this.#e;const d=new Map(this.#e.outputs),f=[...this.#e.retriedIds];for(const h of e){const m=t.findIndex(c=>c.taskId===h.task.id);switch(m!==-1&&(t[m]={...t[m],duration:h.startTime&&h.endTime?h.endTime-h.startTime:void 0,retryAttempts:h.retryAttempts,status:h.status}),h.retryAttempts&&h.retryAttempts>0&&f.push(h.task.id),o++,h.status){case"failure":{n++;break}case"local-cache":case"local-cache-kept-existing":case"remote-cache":{s++;break}case"success":{i++;break}}h.terminalOutput&&!d.has(h.task.id)&&d.set(h.task.id,h.terminalOutput),this.#r.delete(h.task.id)}let{selectedIndex:p}=this.#e;if(n>this.#e.failed){const h=t.findIndex(m=>m.status==="failure");h!==-1&&(p=h)}this.#t({...this.#e,cached:s,completed:o,failed:n,outputs:d,retriedIds:f,rows:t,selectedIndex:p,succeeded:i})}static#i=256*1024;addOutput(e,t){if(!t.trim())return;let s=(this.#e.outputs.get(e)??"")+t;s.length>dt.#i&&(s=s.slice(-dt.#i)),this.#e.outputs.set(e,s),this.#t({...this.#e})}setOutput(e,t){this.#e.outputs.set(e,t),this.#t({...this.#e})}markDone(){this.#t({...this.#e,done:!0,endTime:Date.now()})}unmarkDone(){this.#t({...this.#e,autoExitCountdown:null,done:!1,endTime:null})}tick(){if(this.#r.size===0)return;let e=!1;const t=[...this.#e.rows];for(let s=0;s<t.length;s++){const o=t[s];if(o.status==="running"){const n=this.#r.get(o.taskId);if(n){const i=process.hrtime(n),d=i[0]*1e3+i[1]/1e6;t[s]={...o,elapsed:d},e=!0}}}e&&this.#t({...this.#e,rows:t})}setSelectedIndex(e){e!==this.#e.selectedIndex&&this.#t({...this.#e,selectedIndex:e})}setFocusedPanel(e){e!==this.#e.focusedPanel&&this.#t({...this.#e,focusedPanel:e})}setFilter(e){this.#t({...this.#e,filterText:e,selectedIndex:0})}setFilterActive(e){e!==this.#e.filterActive&&this.#t({...this.#e,filterActive:e,filterText:e?this.#e.filterText:"",selectedIndex:0})}pinTask(e,t){const s=[...this.#e.pinnedTaskIds];s[e]=t,this.#t({...this.#e,pinnedTaskIds:s})}clearPins(){this.#t({...this.#e,pinnedTaskIds:[null,null]})}requestRetry(e){const t=[...this.#e.rows],s=t.findIndex(d=>d.taskId===e);let{completed:o,failed:n,succeeded:i}=this.#e;if(s!==-1){const d=t[s].status;d==="failure"?(n=Math.max(0,n-1),o=Math.max(0,o-1)):d==="success"&&(i=Math.max(0,i-1),o=Math.max(0,o-1)),t[s]={...t[s],elapsed:0,retryAttempts:void 0,status:"running"},this.#r.set(e,process.hrtime())}this.#t({...this.#e,completed:o,done:!1,endTime:null,failed:n,interactiveMode:!1,retriedIds:this.#e.retriedIds.filter(d=>d!==e),retryTaskId:e,rows:t,succeeded:i})}acknowledgeRetry(){const e=this.#e.retryTaskId;return e&&this.#t({...this.#e,retryTaskId:null}),e}setInteractiveMode(e){e!==this.#e.interactiveMode&&this.#t({...this.#e,interactiveMode:e})}setViewMode(e){e!==this.#e.viewMode&&this.#t({...this.#e,viewMode:e})}setStatusFilter(e){this.#t({...this.#e,selectedIndex:0,statusFilter:e})}requestRerun(){this.#r.clear(),this.#t({...this.#e,autoExitCountdown:null,cached:0,completed:0,done:!1,endTime:null,failed:0,interactiveMode:!1,outputs:new Map,rerunRequested:!0,retriedIds:[],rows:this.#e.rows.map(e=>({persistent:e.persistent,status:"pending",taskId:e.taskId})),startTime:Date.now(),succeeded:0,viewMode:"list"})}acknowledgeRerun(){this.#e.rerunRequested&&this.#t({...this.#e,rerunRequested:!1})}#t(e){this.#e=e;for(const t of this.#s)try{t()}catch{}}}var wo=Object.defineProperty,Te=_((r,e)=>wo(r,"name",{value:e,configurable:!0}),"t");const Br={delimiter:" ",language:{d:Te(()=>" d","d"),future:"in %s",h:Te(()=>" h","h"),m:Te(()=>" m","m"),mo:Te(()=>" mo","mo"),ms:Te(()=>" ms","ms"),past:"%s ago",s:Te(()=>" s","s"),w:Te(()=>" w","w"),y:Te(()=>" y","y")},largest:2,round:!0,spacer:"",units:["h","m","s","ms"]};Te(r=>{const e=r[0]*1e3+r[1]/1e6;return Or(e,Br)},"formatHrtime");const Le=Te(r=>Or(r,Br),"formatMs");var vo=Object.defineProperty,Be=_((r,e)=>vo(r,"name",{value:e,configurable:!0}),"s$1");const qe=Be(r=>r==="local-cache"||r==="local-cache-kept-existing"||r==="remote-cache","isCacheStatus"),Ze=Be(r=>{switch(r){case"failure":return{color:"red",icon:xt};case"local-cache":case"local-cache-kept-existing":case"remote-cache":case"success":return{color:"green",icon:Er};case"skipped":return{color:"gray",icon:ht};default:return{color:"gray",icon:"?"}}},"getStatusInfo"),Je=Be(r=>{const{color:e,icon:t}=Ze(r);return fe(J.createElement(a,{color:e},t),{columns:10}).trim()},"getStatusIcon"),yo=Be(r=>{const{color:e,icon:t}=Ze(r);switch(r){case"local-cache":case"local-cache-kept-existing":case"remote-cache":return fe(J.createElement(a,null,J.createElement(a,{color:e},t)," ",J.createElement(a,{color:"cyan"},"[cache]")),{columns:30}).trim();case"skipped":return fe(J.createElement(a,null,J.createElement(a,{dimColor:!0},t)," ",J.createElement(a,{dimColor:!0},"[skipped]")),{columns:30}).trim();default:return fe(J.createElement(a,{color:e},t),{columns:10}).trim()}},"getStatusPrefix"),ko=Be(r=>r==="azure"||r==="buildkite"||r==="github"||r==="gitlab"||r==="off"?r:process.env.GITHUB_ACTIONS==="true"?"github":process.env.GITLAB_CI==="true"?"gitlab":process.env.BUILDKITE==="true"?"buildkite":process.env.TF_BUILD?.toLowerCase()==="true"?"azure":"off","resolveCiGroupingMode"),bo=Be(r=>{const e=r.replaceAll(/\W+/g,"_"),t=ai("sha256").update(r).digest("hex").slice(0,6);return`${e}_${t}`},"toGitLabSectionKey"),So=Be((r,e,t,s="auto")=>{const o=t.trim();if(!o)return;const n=`
7
+ `,i=ko(s);if(i==="github"&&e!=="failure"){process.stdout.write(`::group::${Je(e)} ${r}${n}`),process.stdout.write(o+n),process.stdout.write(`::endgroup::${n}`);return}if(i==="gitlab"&&e!=="failure"){const m=Math.floor(Date.now()/1e3),c=bo(r),$="\x1B[0K";process.stdout.write(`${$}section_start:${String(m)}:${c}[collapsed=true]\r${$}${Je(e)} ${r}${n}`),process.stdout.write(o+n);const E=Math.floor(Date.now()/1e3);process.stdout.write(`${$}section_end:${String(E)}:${c}\r${$}${n}`);return}if(i==="buildkite"&&e!=="failure"){process.stdout.write(`--- ${Je(e)} ${r}${n}`),process.stdout.write(o+n);return}if(i==="azure"&&e!=="failure"){process.stdout.write(`##[group]${Je(e)} ${r}${n}`),process.stdout.write(o+n),process.stdout.write(`##[endgroup]${n}`);return}const d=process.stdout.columns||80,f=fe(J.createElement(a,{dimColor:!0},ht.repeat(d)),{columns:d}).trim(),p=yo(e),h=fe(J.createElement(a,{bold:!0},r),{columns:d}).trim();process.stdout.write(`${f}${n}`),process.stdout.write(`${p} ${h}${n}`),process.stdout.write(o+n),process.stdout.write(`${f}${n}`)},"logCommandOutputCI");var $o=Object.defineProperty,jt=_((r,e)=>$o(r,"name",{value:e,configurable:!0}),"d$2");const To=jt(r=>r==="running"?{color:"white",icon:"•"}:r==="pending"?{color:"gray",icon:"·"}:Ze(r),"getDisplayInfo"),Io=jt(({autoScroll:r,focused:e,interactiveMode:t,showFullscreenHint:s,statusValue:o,supportsInteractive:n,taskId:i})=>{if(!i)return;if(t)return"Esc cancel | Enter send";const d=r?"":" PAUSED (f resume)",f=n?" i INPUT":"";return e&&o==="running"&&s?`⏎ FULLSCREEN${f} f FOLLOW${d}`:e&&o==="running"?`f FOLLOW${f}${d}`:e&&s?`<enter> full screen${d}`:e?d||void 0:"<tab> or <enter> to focus"},"deriveBottomTitle"),ur=jt(({autoScroll:r=!0,duration:e,focused:t,interactiveMode:s,output:o,scrollRef:n,showFullscreenHint:i,status:d,supportsInteractive:f=!0,taskId:p})=>{const h=d??"pending",{icon:m}=To(h),c=t?"bold":"single",$=h==="failure"?"red":h==="success"||qe(h)?t?"green":"gray":h==="running"?t?"white":"cyan":t?"white":"gray",E=p?`${m} ${p}`:void 0,D=e===void 0?void 0:Le(e),R=Io({autoScroll:r,focused:t,interactiveMode:s??!1,showFullscreenHint:i??!1,statusValue:h,supportsInteractive:f,taskId:p});if(!p)return u(g,{alignItems:"center",borderColor:"gray",borderStyle:"single",flexDirection:"column",flexGrow:1,justifyContent:"center",paddingX:2,paddingY:1,children:[l(a,{dimColor:!0,children:"Select a task to view output"}),l(a,{dimColor:!0,children:"Press Enter or 1/2 to pin"})]});const S=[];if(o)for(const y of o.split(`
8
+ `))S.push(y.endsWith("\r")?y.slice(0,-1):y);return!o&&(h==="running"||h==="pending")?l(g,{borderBottomTitle:R,borderColor:$,borderStyle:c,borderTopRightTitle:D,borderTopTitle:E,flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:l(g,{alignItems:"center",flexGrow:1,justifyContent:"center",children:l(a,{dimColor:!0,children:"Waiting for task output…"})})}):u(g,{borderBottomTitle:R,borderColor:s?"yellow":$,borderStyle:c,borderTopRightTitle:D,borderTopTitle:E,flexDirection:"column",flexGrow:1,children:[l(g,{flexGrow:1,flexShrink:1,paddingY:1,children:l(Fr,{flexGrow:1,followOutput:r,paddingX:2,ref:n,scrollbar:!0,scrollbarColor:"gray",scrollbarStyle:"block",children:l(a,{children:S.join(`
9
+ `)})})}),s&&l(g,{flexShrink:0,justifyContent:"center",paddingX:1,children:l(a,{bold:!0,color:"yellow",children:"INTERACTIVE | keystrokes forwarded to task | Esc to exit"})})]})},"OutputPanel");var Co=Object.defineProperty,Ve=_((r,e)=>Co(r,"name",{value:e,configurable:!0}),"d$1");const xo={crashed:"✖",failed:"✖",pending:"·",ready:"●",starting:"•"},Nr=Ve(r=>r==="ready"?"green":r==="crashed"||r==="failed"?"red":r==="starting"?"cyan":"gray","statusColor"),Mo=Ve(({status:r})=>r==="starting"?l(a,{color:"cyan",children:l(Pr,{type:"dots"})}):l(a,{bold:!0,color:Nr(r),children:xo[r]}),"StatusGlyph"),Eo=Ve(({active:r,focused:e,state:t})=>{const s=e&&r,o=s?">":" ",n=t.status==="ready"?t.port?`running, port ${String(t.port)}`:"running":t.status==="failed"||t.status==="crashed"?t.errorMessage??"exited":t.lastLine??"booting…";return u(g,{flexDirection:"row",flexShrink:0,overflow:"hidden",children:[l(a,{children:o}),l(a,{children:" "}),l(g,{flexShrink:0,width:3,children:l(Mo,{status:t.status})}),l(g,{flexGrow:0,flexShrink:0,width:28,children:l(a,{bold:s,inverse:s,children:t.id})}),l(g,{flexGrow:1,flexShrink:1,overflow:"hidden",children:u(a,{color:Nr(t.status),dimColor:t.status!=="crashed"&&t.status!=="failed",wrap:"truncate-end",children:[" ",n]})})]})},"ServiceRow"),Ro=Ve(({states:r})=>{const e=[];for(const s of r)s.status==="ready"&&e.push(s.id);const t=e.join(", ");return u(g,{paddingX:1,children:[u(a,{bold:!0,color:"green",children:["● ","Services"]}),u(a,{children:[" ",String(e.length)," / ",String(r.length)," running"]}),t.length>0&&u(a,{dimColor:!0,children:[" ",t]}),l(a,{dimColor:!0,children:" [Tab ↓]"})]})},"StatusPill"),Fo=Ve(({states:r})=>{const e=r.find(t=>t.status==="crashed"||t.status==="failed");return e?u(g,{flexDirection:"column",paddingX:1,children:[u(a,{bold:!0,color:"red",children:["✖ ","Service crashed:"," ",e.id]}),e.tailLines.slice(-3).map((t,s)=>u(a,{color:"red",dimColor:!0,children:[" ",t]},`crash-${String(s)}`))]}):l(Mr,{})},"CrashHeader"),Po=Ve(({activeIndex:r,focused:e,store:t})=>{const s=ot(t.subscribe,t.getSnapshot),o=t.getIds();if(o.length===0)return l(Mr,{});const n=o.map(h=>s.get(h)).filter(h=>h!==void 0),i=t.getDockState(),d=i==="crash"?"red":i==="ready"?"gray":e?"white":"cyan";return i==="ready"&&!e?l(g,{borderColor:d,borderStyle:"single",flexDirection:"row",flexShrink:0,children:l(Ro,{states:n})}):u(g,{borderBottomTitle:e?i==="crash"?"↑↓ select Enter logs R retry Esc back":"↑↓ select Enter logs Esc back":"Tab to focus services",borderColor:d,borderStyle:e?"bold":"single",borderTopTitle:i==="crash"?"Services (crashed)":i==="ready"?"Services":"Services (starting)",flexDirection:"column",flexGrow:2,flexShrink:0,minHeight:6,paddingX:1,children:[i==="crash"&&l(Fo,{states:n}),n.map((h,m)=>l(Eo,{active:m===r,focused:e,state:h},h.id))]})},"ServiceDock");var jo=Object.defineProperty,pt=_((r,e)=>jo(r,"name",{value:e,configurable:!0}),"T$1");const Gr=6,_r=8,qr=12,Oo=pt(r=>r==="running"||r==="pending"?Rr:r==="local-cache"||r==="local-cache-kept-existing"?"Local":r==="remote-cache"?"Remote":ht,"getCacheLabel"),hr=pt((r,e)=>e[0]===r?"[1]":e[1]===r?"[2]":"","getPinLabel"),fr=pt(({compact:r,focused:e,isSelected:t,pinLabel:s,row:o})=>{const{persistent:n,status:i,taskId:d}=o,f=e&&t,p=f?">":" ",h=i==="running"&&n===!0;let m;if(h)m=l(a,{bold:!0,color:"green",children:" ● "});else if(i==="running")m=u(a,{bold:!0,color:"white",children:[" ",l(Pr,{type:"dots"})," "]});else if(i==="pending")m=l(a,{bold:!0,color:"gray",children:" · "});else{const{color:$,icon:E}=Ze(i);m=u(a,{bold:!0,color:$,children:[" ",E," "]})}let c=Rr;return h?c="running":i!=="running"&&i!=="pending"?c=o.duration===void 0?ht:Le(o.duration):i==="running"&&o.elapsed!==void 0&&(c=Le(o.elapsed)),u(g,{children:[l(a,{children:p}),l(g,{width:Gr,children:m}),u(g,{flexGrow:1,children:[l(a,{bold:f,inverse:f,children:d}),s?l(a,{dimColor:!0,children:` ${s}`}):null]}),!r&&l(g,{justifyContent:"flex-end",width:_r,children:l(a,{dimColor:!qe(i),children:Oo(i)})}),!r&&l(g,{justifyContent:"flex-end",width:qr,children:l(a,{color:h?"green":void 0,dimColor:i==="pending"||h,children:c})})]})},"TaskListRow"),pr=pt(({compact:r,filterActive:e,filterText:t,focused:s,headerStatus:o,parallelSlots:n=3,pinnedTaskIds:i,rows:d,scrollRef:f,selectedIndex:p,title:h})=>{const m=o==="error"?"red":o==="success"?"green":s?"white":"gray",c=d[p]?.taskId,$=[];let E=0;for(const y of d)y.status==="running"?$.push(y):y.status==="pending"&&(E+=1);const D=Math.min(n,$.length+E),R=D>1,S=[];if(R)for(let y=0;y<D;y++){const F=$[y];F?S.push(l(fr,{compact:r,focused:s,isSelected:F.taskId===c,pinLabel:hr(F.taskId,i),row:F},`par-${F.taskId}`)):S.push(u(g,{children:[l(a,{children:" "}),l(g,{width:Gr,children:l(a,{bold:!0,color:"gray",children:" · "})}),l(a,{dimColor:!0,children:"Waiting for task..."})]},`par-empty-${String(y)}`))}return u(g,{borderColor:m,borderStyle:"single",flexDirection:"column",flexGrow:1,children:[u(g,{flexShrink:0,paddingX:1,children:[l(a,{bold:!0,inverse:!0,children:" VIS "}),l(a,{children:` ${h}`}),!r&&u(g,{flexGrow:1,gap:0,justifyContent:"flex-end",children:[l(g,{justifyContent:"flex-end",width:_r,children:l(a,{dimColor:!0,children:"Cache"})}),l(g,{justifyContent:"flex-end",width:qr,children:l(a,{dimColor:!0,children:"Duration"})})]})]}),l(Fr,{flexGrow:1,flexShrink:1,paddingX:1,paddingY:1,ref:f,scrollbar:!0,scrollbarColor:"gray",scrollbarStyle:"block",children:d.map(y=>l(fr,{compact:r,focused:s,isSelected:y.taskId===c,pinLabel:hr(y.taskId,i),row:y},y.taskId))}),R&&l(g,{borderBottom:!1,borderColor:"gray",borderLeft:!1,borderRight:!1,borderStyle:"single",borderTop:!0,flexDirection:"column",flexShrink:0,paddingX:1,paddingY:1,children:S}),e&&u(g,{borderBottom:!1,borderColor:"gray",borderLeft:!1,borderRight:!1,borderStyle:"single",borderTop:!0,flexShrink:0,paddingX:1,children:[l(a,{bold:!0,color:"white",children:"/ "}),l(a,{children:t}),l(a,{inverse:!0,children:" "})]})]})},"TaskListPanel");var Do=Object.defineProperty,Ao=_((r,e)=>Do(r,"name",{value:e,configurable:!0}),"ne");const gr=40,mr=10,wr=100,Lo=Object.freeze([]),Bo=Ao(({autoExitSeconds:r,onRetryService:e,parallelSlots:t,projectNames:s,serviceDockStore:o,stdinRegistry:n,store:i,targets:d,tasks:f})=>{const{exit:p}=oi(),{columns:h,rows:m}=ni(),c=ot(i.subscribe,i.getSnapshot),$=st(T=>o?o.subscribe(T):()=>{},[o]);ot($,()=>o?o.getDockState():"ready");const E=o?o.getIds():Lo,D=E.length>0,[R,S]=Ye(0),[y,F]=Ye(null),X=ot($,()=>y&&o?o.getState(y):void 0),[V,v]=Ye(!1),I=Xe(null),U=Xe(null),j=Xe(null),[Y,ie]=Ye(!1),[N,A]=Ye(!0),Z=Xe({list:0,splitList:0,splitOutput:0}),oe=st(()=>{c.viewMode==="list"?Z.current.list=U.current?.getScrollOffset()??0:c.viewMode==="split"&&(Z.current.splitList=U.current?.getScrollOffset()??0,Z.current.splitOutput=j.current?.getScrollOffset()??0)},[c.viewMode]),O=st(T=>{setTimeout(()=>{if(T==="list"){const k=Z.current.list;U.current?.scrollTo(k)}else if(T==="split"){const k=Z.current.splitList;k>0?U.current?.scrollTo(k):U.current?.scrollTo(Math.max(0,i.getSnapshot().selectedIndex-2)),j.current?.scrollTo(Z.current.splitOutput)}},0)},[i]),ae=Xe(!1);wt(()=>{c.done&&!ae.current&&(ae.current=!0,r>0&&ie(!0)),!c.done&&ae.current&&(ae.current=!1,ie(!1))},[c.done,r]);const le=or(()=>{const T=E.length>0?new Set(E):null,k=c.filterText?c.filterText.toLowerCase():null,x=[];for(const ee of c.rows)T?.has(ee.taskId)||c.statusFilter==="failed"&&ee.status!=="failure"||c.statusFilter==="running"&&ee.status!=="running"&&ee.status!=="pending"||c.statusFilter==="passed"&&ee.status!=="success"&&!qe(ee.status)||k&&!ee.taskId.toLowerCase().includes(k)||x.push(ee);return x},[c.rows,c.filterText,c.statusFilter,E]),Re=or(()=>{let T=0;for(const k of c.rows)k.status==="running"&&(T+=1);return T},[c.rows]),se=(le[c.selectedIndex]??null)?.taskId??null,L=y?null:c.pinnedTaskIds[0]??se,q=L?c.rows.find(T=>T.taskId===L):null,ye=X??null,Ie=y?(ye?.tailLines??[]).join(`
10
+ `):L?c.outputs.get(L)??"":"",pe=y??L,ke=y?ye?.status==="crashed"||ye?.status==="failed"?"failure":"running":q?.status,Ce=Pt(s,d,f),Fe=c.done?`Completed ${Ce} (${Le((c.endTime??Date.now())-c.startTime)})`:`Running ${Ce}...`,Pe=c.done?c.failed>0?"error":"success":"running",we=st(T=>{U.current?.scrollTo(Math.max(0,T-2))},[]);if(wt(()=>{c.interactiveMode&&q?.status!=="running"&&i.setInteractiveMode(!1)},[c.interactiveMode,q?.status,i]),wt(()=>{if(!L)return;let T=h;c.viewMode==="split"&&h>=wr?T=h-Math.floor(h*.4)-2:(c.viewMode==="split"||c.viewMode==="fullscreen")&&(T=h-2);const k=Math.max(1,m-4);n.get(L)?.resize?.(T,k)},[h,m,c.viewMode,L]),ar((T,k)=>{if(k.escape){i.setInteractiveMode(!1);return}if(!L)return;const x=n.get(L);if(!x){i.setInteractiveMode(!1);return}if(k.return)x.write("\r");else if(k.upArrow)x.write("\x1B[A");else if(k.downArrow)x.write("\x1B[B");else if(k.rightArrow)x.write("\x1B[C");else if(k.leftArrow)x.write("\x1B[D");else if(k.backspace)x.write("");else if(k.delete)x.write("\x1B[3~");else if(k.tab)x.write(" ");else if(k.home)x.write("\x1B[H");else if(k.end)x.write("\x1B[F");else if(k.pageUp)x.write("\x1B[5~");else if(k.pageDown)x.write("\x1B[6~");else if(k.ctrl&&T){const ee=T.toUpperCase().codePointAt(0);ee!==void 0&&ee>=65&&ee<=90&&x.write(String.fromCodePoint(ee-64))}else T&&x.write(T)},{isActive:c.interactiveMode}),ar((T,k)=>{if(T==="c"&&k.ctrl){p();return}if(!Y){if(V){k.escape||T==="?"?v(!1):T==="q"?(v(!1),ie(!0)):k.downArrow||T==="j"?I.current?.scrollBy(1):k.upArrow||T==="k"?I.current?.scrollBy(-1):k.pageDown?I.current?.scrollBy(5):k.pageUp?I.current?.scrollBy(-5):k.home?I.current?.scrollToTop():k.end&&I.current?.scrollToBottom();return}if(T==="?"){v(!0);return}if(T==="q"){ie(!0);return}if(T==="r"&&c.done){i.requestRerun();return}if(T==="R"&&c.done){const x=le[c.selectedIndex];x?.status==="failure"&&i.requestRetry(x.taskId);return}if(T==="F"&&!c.filterActive){const x=["all","failed","running","passed"],ee=x.indexOf(c.statusFilter);i.setStatusFilter(x[(ee+1)%x.length]);return}if(c.filterActive){if(k.escape){i.setFilterActive(!1);return}if(k.return){i.setFilterActive(!1);return}if(k.backspace){i.setFilter(c.filterText.slice(0,-1));return}if(T&&!k.ctrl&&!k.meta){i.setFilter(c.filterText+T);return}return}if(T==="i"&&q?.status==="running"&&(c.viewMode==="fullscreen"||c.viewMode==="split"&&c.focusedPanel==="output")){i.setInteractiveMode(!0);return}if(c.viewMode==="fullscreen"){if(k.escape){i.setViewMode("split"),O("split");return}if(T==="f"){const x=!N;A(x),x&&j.current?.scrollToBottom();return}if(k.downArrow||T==="j"){A(!1),j.current?.scrollBy(1);return}if(k.upArrow||T==="k"){A(!1),j.current?.scrollBy(-1);return}if(k.pageDown||k.ctrl&&T==="d"){A(!1),j.current?.scrollBy(12);return}if(k.pageUp||k.ctrl&&T==="u"){A(!1),j.current?.scrollBy(-12);return}if(k.home){A(!1),j.current?.scrollToTop();return}if(k.end){A(!0),j.current?.scrollToBottom();return}return}if(c.focusedPanel==="dock"&&D&&o){if(k.tab){F(null),i.setFocusedPanel("tasks");return}if(k.escape){i.setFocusedPanel("tasks"),F(null),c.viewMode==="split"&&(i.setViewMode("list"),O("list"));return}if(k.downArrow||T==="j"){S(x=>Math.min(x+1,E.length-1));return}if(k.upArrow||T==="k"){S(x=>Math.max(x-1,0));return}if(k.return){const x=E[R];x&&(F(x),A(!0),oe(),Z.current.splitList=0,Z.current.splitOutput=0,i.setViewMode("split"),i.setFocusedPanel("output"),O("split"));return}if((T==="r"||T==="R")&&e){const x=E[R],ee=x?o.getState(x)?.status:void 0;if(x&&(ee==="crashed"||ee==="failed")){const Ne=e(x);Ne instanceof Promise&&Ne.catch(()=>{})}return}return}if(c.viewMode==="split"){if(k.tab){c.focusedPanel==="tasks"?i.setFocusedPanel("output"):D?i.setFocusedPanel("dock"):(F(null),i.setFocusedPanel("tasks"));return}if(c.focusedPanel==="output"){if(k.escape){if(y&&D){F(null),i.setViewMode("list"),i.setFocusedPanel("dock"),O("list");return}F(null),i.setFocusedPanel("tasks");return}if(k.return){oe(),i.setViewMode("fullscreen");return}if(T==="f"){const x=!N;A(x),x&&j.current?.scrollToBottom();return}if(k.downArrow||T==="j"){A(!1),j.current?.scrollBy(1);return}if(k.upArrow||T==="k"){A(!1),j.current?.scrollBy(-1);return}if(k.pageDown||k.ctrl&&T==="d"){A(!1),j.current?.scrollBy(12);return}if(k.pageUp||k.ctrl&&T==="u"){A(!1),j.current?.scrollBy(-12);return}if(k.home){A(!1),j.current?.scrollToTop();return}if(k.end){A(!0),j.current?.scrollToBottom();return}return}if(k.escape){i.setViewMode("list"),O("list");return}if(k.return){i.setFocusedPanel("output");return}}if(c.viewMode==="list"||c.viewMode==="split"&&c.focusedPanel==="tasks"){if(k.tab&&c.viewMode==="list"&&D){i.setFocusedPanel("dock");return}if(k.downArrow||T==="j"){const x=Math.min(c.selectedIndex+1,Math.max(0,le.length-1));i.setSelectedIndex(x),we(x);return}if(k.upArrow||T==="k"){const x=Math.max(c.selectedIndex-1,0);i.setSelectedIndex(x),we(x);return}if(k.return&&c.viewMode==="list"){A(!0),oe(),Z.current.splitList=0,Z.current.splitOutput=0,i.setViewMode("split"),i.setFocusedPanel("output"),O("split");return}if(T==="/"){i.setFilterActive(!0);return}if(T==="1"&&se){i.pinTask(0,se);return}if(T==="2"&&se){i.pinTask(1,se);return}if(T==="0"){i.clearPins();return}k.escape&&c.filterText&&i.setFilter("")}}},{isActive:!c.interactiveMode}),h<gr||m<mr)return l(g,{alignItems:"center",height:m,justifyContent:"center",width:h,children:u(a,{color:"yellow",children:["Terminal too small (",h,"x",m,"). Minimum:"," ",gr,"x",mr]})});const de=u(g,{gap:1,children:[c.succeeded>0&&u(a,{bold:!0,color:"green",children:["✓"," ",c.succeeded]}),c.failed>0&&u(a,{bold:!0,color:"red",children:["✗"," ",c.failed]}),Re>0&&u(a,{color:"cyan",children:["◷"," ",Re]}),u(a,{dimColor:!0,children:[c.rows.length," ","total"]}),c.statusFilter!=="all"&&u(a,{color:"yellow",children:["[",c.statusFilter,"]"]})]});let ge;if(c.viewMode==="fullscreen")ge=[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"Esc"}),l(a,{dimColor:!0,children:"BACK"})]},"esc"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"↑↓"}),l(a,{dimColor:!0,children:"SCROLL"})]},"scroll"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"^u ^d"}),l(a,{dimColor:!0,children:"PAGE"})]},"page"),...q?.status==="running"?[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"i"}),l(a,{dimColor:!0,children:"INPUT"})]},"i")]:[],u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"q"}),l(a,{dimColor:!0,children:"QUIT"})]},"q")];else if(c.done){const T=le[c.selectedIndex]?.status==="failure";ge=[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"q"}),l(a,{dimColor:!0,children:"QUIT"})]},"q"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"r"}),l(a,{dimColor:!0,children:"RERUN"})]},"r"),...T?[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"R"}),l(a,{dimColor:!0,children:"RETRY"})]},"R")]:[],u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"?"}),l(a,{dimColor:!0,children:"HELP"})]},"?"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"↑↓"}),l(a,{dimColor:!0,children:"NAV"})]},"nav"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"F"}),l(a,{dimColor:!0,children:"FILTER"})]},"F"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"⏎"}),l(a,{dimColor:!0,children:c.viewMode==="list"?"OUTPUT":"FULLSCREEN"})]},"enter")]}else c.viewMode==="split"&&c.focusedPanel==="output"?ge=[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"q"}),l(a,{dimColor:!0,children:"QUIT"})]},"q"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"Esc"}),l(a,{dimColor:!0,children:"BACK"})]},"esc"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"↑↓"}),l(a,{dimColor:!0,children:"SCROLL"})]},"scroll"),...q?.status==="running"?[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"i"}),l(a,{dimColor:!0,children:"INPUT"})]},"i")]:[],u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"⏎"}),l(a,{dimColor:!0,children:"FULLSCREEN"})]},"enter"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"Tab"}),l(a,{dimColor:!0,children:"PANEL"})]},"tab"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"?"}),l(a,{dimColor:!0,children:"HELP"})]},"?")]:ge=[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"q"}),l(a,{dimColor:!0,children:"QUIT"})]},"q"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"?"}),l(a,{dimColor:!0,children:"HELP"})]},"?"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"↑↓"}),l(a,{dimColor:!0,children:"NAV"})]},"nav"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"/"}),l(a,{dimColor:!0,children:"FILTER"})]},"/"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"F"}),l(a,{dimColor:!0,children:"STATUS"})]},"F"),u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"⏎"}),l(a,{dimColor:!0,children:c.viewMode==="list"?"OUTPUT":"FULLSCREEN"})]},"enter"),...c.viewMode==="split"?[u(g,{gap:1,children:[l(a,{bold:!0,color:"white",children:"Tab"}),l(a,{dimColor:!0,children:"PANEL"})]},"tab")]:[]];const be=u(g,{borderBottom:!1,borderColor:"gray",borderLeft:!1,borderRight:!1,borderStyle:"single",flexShrink:0,justifyContent:"space-between",children:[l(g,{flexGrow:1,flexWrap:"wrap",gap:2,paddingX:1,children:ge}),l(g,{flexShrink:0,paddingX:1,children:de})]}),xe=u(ii,{backgroundColor:"#1e1e1e",footer:u(a,{dimColor:!0,children:[l(a,{bold:!0,color:"white",children:"↑↓"})," ","scroll"," ",l(a,{bold:!0,color:"white",children:"?"}),"/",l(a,{bold:!0,color:"white",children:"Esc"})," ","close"]}),scrollRef:I,title:"KEYBOARD SHORTCUTS",visible:V,width:52,children:[u(g,{flexDirection:"column",marginBottom:1,children:[u(g,{marginBottom:1,children:[l(a,{dimColor:!0,children:"── "}),l(a,{bold:!0,color:"white",children:"NAVIGATION"})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","↑","/k"]}),l(a,{dimColor:!0,children:" Move up"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","↓","/j"]}),l(a,{dimColor:!0,children:" Move down"})]})]}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","Tab"]}),l(a,{dimColor:!0,children:" Switch panel (split)"})]}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","Esc"]}),l(a,{dimColor:!0,children:" Back / close"})]}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","Enter"]}),l(a,{dimColor:!0,children:" Show output / fullscreen"})]})]}),u(g,{flexDirection:"column",marginBottom:1,children:[u(g,{marginBottom:1,children:[l(a,{dimColor:!0,children:"── "}),l(a,{bold:!0,color:"white",children:"VIEWS"})]}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","Enter"]}),u(a,{dimColor:!0,children:[" ","List"," ","→"," ","Split"," ","→"," ","Fullscreen"]})]}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","Esc"]}),u(a,{dimColor:!0,children:[" ","Fullscreen"," ","→"," ","Split"," ","→"," ","List"]})]})]}),u(g,{flexDirection:"column",marginBottom:1,children:[u(g,{marginBottom:1,children:[l(a,{dimColor:!0,children:"── "}),l(a,{bold:!0,color:"white",children:"ACTIONS"})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","/"]}),l(a,{dimColor:!0,children:" Filter by text"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","F"]}),l(a,{dimColor:!0,children:" Filter by status"})]})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","1"]}),l(a,{dimColor:!0,children:"/"}),l(a,{bold:!0,color:"white",children:"2"}),l(a,{dimColor:!0,children:" Pin to output pane"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","0"]}),l(a,{dimColor:!0,children:" Clear pins"})]})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","r"]}),l(a,{dimColor:!0,children:" Rerun all (done)"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","R"]}),l(a,{dimColor:!0,children:" Retry failed task"})]})]}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","i"]}),l(a,{dimColor:!0,children:" Interactive input (running task)"})]})]}),u(g,{flexDirection:"column",marginBottom:1,children:[u(g,{marginBottom:1,children:[l(a,{dimColor:!0,children:"── "}),l(a,{bold:!0,color:"white",children:"SCROLLING"}),l(a,{dimColor:!0,children:" (output panel)"})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","↑","/k"]}),l(a,{dimColor:!0,children:" Scroll up"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","↓","/j"]}),l(a,{dimColor:!0,children:" Scroll down"})]})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","^u"]}),l(a,{dimColor:!0,children:" Page up"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","^d"]}),l(a,{dimColor:!0,children:" Page down"})]})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","Home"]}),l(a,{dimColor:!0,children:" Top"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","End"]}),l(a,{dimColor:!0,children:" Bottom (resume follow)"})]})]}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","f"]}),l(a,{dimColor:!0,children:" Toggle auto-scroll (tail mode)"})]})]}),u(g,{flexDirection:"column",children:[u(g,{marginBottom:1,children:[l(a,{dimColor:!0,children:"── "}),l(a,{bold:!0,color:"white",children:"GENERAL"})]}),u(g,{children:[l(g,{width:24,children:u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","q"]}),l(a,{dimColor:!0,children:" Quit"})]})}),u(a,{children:[u(a,{bold:!0,color:"white",children:[" ","?"]}),l(a,{dimColor:!0,children:" Toggle help"})]})]})]})]}),ue=l(ns,{autoExitSeconds:r>0?r:3,onCancel:_(()=>{ie(!1)},"onCancel"),visible:Y}),Oe=D&&o?l(Po,{activeIndex:R,focused:c.focusedPanel==="dock",store:o}):null;if(c.viewMode==="fullscreen")return u(g,{flexDirection:"column",height:m,width:h,children:[l(g,{flexGrow:1,children:l(ur,{autoScroll:N,duration:q?.duration??q?.elapsed,focused:!0,interactiveMode:c.interactiveMode,output:Ie,scrollRef:j,status:ke,supportsInteractive:!y,taskId:pe})}),Oe,be,ue,xe]});if(c.viewMode==="split"){const T=h>=wr,k=l(pr,{compact:!0,filterActive:c.filterActive,filterText:c.filterText,focused:c.focusedPanel==="tasks",headerStatus:Pe,parallelSlots:t,pinnedTaskIds:c.pinnedTaskIds,rows:le,scrollRef:U,selectedIndex:c.selectedIndex,title:Fe}),x=l(ur,{autoScroll:N,duration:q?.duration??q?.elapsed,focused:c.focusedPanel==="output",interactiveMode:c.interactiveMode,output:Ie,scrollRef:j,showFullscreenHint:!0,status:ke,supportsInteractive:!y,taskId:pe});if(T){const Ne=Math.floor(h*.4);return u(g,{flexDirection:"column",height:m,width:h,children:[u(g,{flexDirection:"row",flexGrow:1,children:[l(g,{width:Ne,children:k}),l(g,{flexGrow:1,children:x})]}),Oe,be,ue,xe]})}const ee=Math.floor(m*.45);return u(g,{flexDirection:"column",height:m,width:h,children:[l(g,{height:ee,children:k}),l(g,{flexGrow:1,children:x}),Oe,be,ue,xe]})}return u(g,{flexDirection:"column",height:m,width:h,children:[l(g,{flexGrow:1,children:l(pr,{filterActive:c.filterActive,filterText:c.filterText,focused:c.focusedPanel!=="dock",headerStatus:Pe,parallelSlots:t,pinnedTaskIds:c.pinnedTaskIds,rows:le,scrollRef:U,selectedIndex:c.selectedIndex,title:Fe})}),Oe,be,ue,xe]})},"VisTaskRunnerApp");var No=Object.defineProperty,Ae=_((r,e)=>No(r,"name",{value:e,configurable:!0}),"r$1");const Go=Ae(r=>{const{args:e,autoExit:t=!1,onRetryService:s,outputStyle:o="normal",projectNames:n,serviceDockStore:i,stdinRegistry:d,tasks:f}=r,p=new dt(f),h=typeof e.parallel=="number"?e.parallel:3,m=t===!0?3:typeof t=="number"?t:0;let c,$;const E=new Promise(I=>{$=I});let D;const R=Ae(()=>{D&&(clearInterval(D),D=void 0)},"cleanup"),S=Ae(()=>{if(process.stdin.isTTY&&typeof process.stdin.setRawMode=="function")try{process.stdin.setRawMode(!1)}catch{}process.stdin.pause(),process.stdin.unref()},"releaseStdin"),y=Ae(()=>{if(d){for(const I of d.values())I.kill?.();d.clear()}},"killAllPtyProcesses"),F=Ae(()=>{R(),v(),y(),S(),process.stdout.write("\x1B[?1049l\x1B[?25h"),c?.cleanup(),process.exit(1)},"onSignal"),X=Ae(()=>{const I=p.getSnapshot(),U=Le(Date.now()-I.startTime),j=I.rows.filter(N=>N.status==="failure").map(N=>N.taskId),Y=process.stdout.columns||80;process.stdout.write(`
11
+ `);for(const N of I.rows){const{persistent:A,status:Z,taskId:oe}=N,O=Z==="running"||Z==="pending",ae=Ze(Z),le=O&&A?"■":ae.icon,Re=O&&A?"gray":ae.color;let se="";switch(Z){case"local-cache":case"local-cache-kept-existing":{se=" [local cache]";break}case"remote-cache":{se=" [remote cache]";break}case"skipped":{se=" [skipped]";break}default:{O&&A?se=" [stopped]":O&&(se=" [skipped]");break}}const L=N.retryAttempts&&N.retryAttempts>0?` [retried ${N.retryAttempts}x]`:"",q=fe(J.createElement(a,null," ",J.createElement(a,{color:Re},le),` vis run ${oe}`,se?J.createElement(a,{dimColor:!0},` ${se}`):null,L?J.createElement(a,{color:"yellow"},L):null),{columns:Y});process.stdout.write(`${q}
12
+ `)}process.stdout.write(`
13
+ `);const ie=fe(J.createElement(Lr,{cached:I.cached,failed:I.failed,failedIds:j,projectNames:n,retriedIds:I.retriedIds.length>0?I.retriedIds:void 0,succeeded:I.succeeded,targets:e.targets,tasks:f,took:U}),{columns:Y});if(process.stdout.write(`${ie}
14
+ `),j.length>0&&o!=="quiet")for(const N of j){const A=I.outputs.get(N);if(A?.trim()){const Z=fe(J.createElement(a,null,`
15
+ `,J.createElement(a,{bold:!0,color:"red"},` ${xt} vis run ${N}`)),{columns:Y});process.stdout.write(`${Z}
16
+
17
+ `);const oe=A.trim().split(`
18
+ `).map(O=>` ${O}`).join(`
19
+ `);process.stdout.write(`${oe}
20
+ `)}}},"printExitSummary");let V;const v=Ae(()=>{V&&(clearInterval(V),V=void 0)},"clearKeepAlive");return{lifeCycle:{endCommand(){R(),p.markDone(),V||(V=setInterval(()=>{},1e3))},endTasks(I){p.endTasks(I)},printTaskTerminalOutput(I,U,j){p.getSnapshot().outputs.has(I.id)||p.addOutput(I.id,j)},startCommand(){process.on("SIGINT",F),process.on("SIGTERM",F),V||(V=setInterval(()=>{},1e3)),c=si(J.createElement(Bo,{autoExitSeconds:m,onRetryService:s,parallelSlots:h,projectNames:n,serviceDockStore:i,stdinRegistry:d??new Map,store:p,targets:e.targets,tasks:f}),{alternateScreen:!0,exitOnCtrlC:!1,interactive:!0,patchConsole:!0}),c.waitUntilExit().then(()=>{v(),y(),S(),process.removeListener("SIGINT",F),process.removeListener("SIGTERM",F),X(),$()}).catch(()=>{v(),y(),S(),process.removeListener("SIGINT",F),process.removeListener("SIGTERM",F),$()})},startTasks(I){p.startTasks(I),D||(D=setInterval(()=>{p.tick()},100))}},renderIsDone:E,store:p}},"createDynamicOutputRenderer");var _o=Object.defineProperty,Ot=_((r,e)=>_o(r,"name",{value:e,configurable:!0}),"c$2");const qo=Ot(r=>r==="quiet"?"quiet":"normal","parseOutputStyle"),Ho=Ot((r,e)=>{const t=r.overrides.visOptions;return t?.outputStyle==="normal"||t?.outputStyle==="quiet"?t.outputStyle:e},"resolveTaskOutputStyle");class zo{static{_(this,"StaticOutputLifeCycle")}static{Ot(this,"StaticOutputLifeCycle")}#e;#s;#r;#i=[];#t=[];#o=[];#n=new Map;#a;#c;#l;#d=0;constructor(e){this.#e=e.projectNames,this.#s=e.args.targets,this.#r=e.tasks,this.#a=e.logReporter,this.#c=e.outputStyle??"normal",this.#l=e.ciGrouping??"auto"}startCommand(){this.#d=Date.now();const e=process.stdout.columns||80,t=`Running ${Pt(this.#e,this.#s,this.#r)}`,s=fe(J.createElement(bt,{title:t,variant:"info"}),{columns:e});process.stdout.write(s);const o=this.#r[0],n=o?.overrides?Object.entries(o.overrides).filter(([i])=>i!=="command"):[];if(n.length>0){process.stdout.write(`
21
+ With additional flags:
22
+ `);for(const[i,d]of n)process.stdout.write(`${lo(" ",i,d)}
23
+ `)}process.stdout.write(`
24
+ `)}startTasks(e){const t=process.stdout.columns||80;for(const s of e){const o=fe(J.createElement(a,null,J.createElement(a,{dimColor:!0},">"),` ${s.id}`),{columns:t});process.stdout.write(`${o}
25
+ `)}}endTasks(e){const t=process.stdout.columns||80;for(const s of e){this.#n.set(s.task.id,s),s.status==="failure"?this.#i.push(s):qe(s.status)&&this.#t.push(s),s.retryAttempts&&s.retryAttempts>0&&this.#o.push(s);const o=Je(s.status),n=s.startTime&&s.endTime?` (${Le(s.endTime-s.startTime)})`:"",i=qe(s.status)?" [cache]":"",d=s.retryAttempts&&s.retryAttempts>0?` [retried ${s.retryAttempts}x]`:"",f=fe(J.createElement(a,null,o,` ${s.task.id}`,i?J.createElement(a,{color:"cyan"},i):null,d?J.createElement(a,{color:"yellow"},d):null,n?J.createElement(a,{dimColor:!0},n):null),{columns:t});process.stdout.write(`${f}
26
+ `)}}printTaskTerminalOutput(e,t,s){if(!(Ho(e,this.#c)==="quiet"&&(t==="success"||qe(t)))){if(this.#a){this.#a.printTaskTerminalOutput(e,t,s);return}So(e.id,t,s,this.#l)}}endCommand(){const e=Le(Date.now()-this.#d),t=this.#r.filter(n=>!this.#n.has(n.id)).map(n=>n.id);process.stdout.write(`
27
+ `);const s=process.stdout.columns||80,o=fe(J.createElement(Lr,{cached:this.#t.length,failed:this.#i.length,failedIds:this.#i.map(n=>n.task.id),projectNames:this.#e,retriedIds:this.#o.length>0?this.#o.map(n=>n.task.id):void 0,skippedIds:t.length>0?t:void 0,succeeded:this.#n.size-this.#i.length-this.#t.length,targets:this.#s,tasks:this.#r,took:e}),{columns:s});process.stdout.write(`${o}
28
+ `)}}var Vo=Object.defineProperty,gt=_((r,e)=>Vo(r,"name",{value:e,configurable:!0}),"o$1");const Uo=gt(async r=>{if(process.env.VIS_NO_SHELL_HISTORY||ci()==="win32")return;const e=process.env.SHELL;if(!e)return;const t=rs(e);try{if(t==="zsh"){await Wo(r);return}if(t==="bash"){await Ko(r);return}t==="fish"&&await Yo(r)}catch{}},"appendToShellHistory"),Wo=gt(async r=>{const e=process.env.HISTFILE??ve(process.env.ZDOTDIR??Et(),".zsh_history"),t=`: ${Math.floor(Date.now()/1e3)}:0;${r}
29
+ `;await Mt(e,t)},"writeZshHistory"),Ko=gt(async r=>{const e=process.env.HISTFILE??ve(Et(),".bash_history");await Mt(e,`${r}
30
+ `)},"writeBashHistory"),Yo=gt(async r=>{const e=ve(Et(),".local","share","fish","fish_history"),t=`- cmd: ${r.replaceAll("\\","\\\\").replaceAll(`
31
+ `,String.raw`\n`)}
32
+ when: ${Math.floor(Date.now()/1e3)}
33
+ `;await Mt(e,t)},"writeFishHistory");var Xo=Object.defineProperty,kt=_((r,e)=>Xo(r,"name",{value:e,configurable:!0}),"e");const Jo=kt(r=>{const{killGracePeriodMs:e=5e3,onTimeout:t,sendSignal:s,timeoutMs:o}=r;if(o<=0)return{cancel:kt(()=>{},"cancel")};const n=Math.max(e,0);let i;const d=setTimeout(()=>{t?.(),s("SIGTERM"),n>0&&(i=setTimeout(()=>{s("SIGKILL")},n))},o);return{cancel:kt(()=>{clearTimeout(d),i&&clearTimeout(i)},"cancel")}},"scheduleTimeoutKill");var Qo=Object.defineProperty,He=_((r,e)=>Qo(r,"name",{value:e,configurable:!0}),"l$1");const Zo=[/node_modules(?:\/|$)/,/\.git(?:\/|$)/,/\.vis(?:\/|$)/],vr=He((r,e)=>{const t=new Set,s=new Set;for(const[,i]of r){const d=i.task.hashDetails?.nodes;if(d)for(const f of Object.keys(d))t.add(f),s.add(ss(Ir(e,f)))}const o=[...s].sort(),n=[];for(const i of o)n.some(d=>i===d||i.startsWith(`${d}/`))||n.push(i);return{directories:n,files:t}},"collectTrackedWatchTargets"),en=He((r,e,t)=>{const s=new Set;for(const o of r){const n=Ir(e,o);for(const i of t)if(n===i||n.startsWith(`${i}/`)){const d=is(i,n);d.length>0&&s.add(d)}}return o=>{const n=o.replaceAll("\\","/");return s.has(n)}},"createTrackedFileFilter"),tn=He(r=>{const e=r.replaceAll("\\","/");return Zo.some(t=>t.test(e))},"shouldIgnore"),yr=He(r=>{const{debounceMs:e=150,filter:t,onChange:s,paths:o}=r,n=[];let i=new Set,d;const f=He(()=>{d=void 0;const p=[...i];i=new Set,p.length!==0&&Promise.resolve(s(p)).catch(h=>{er.error("[vis watch] onChange handler failed:",h)})},"flush");for(const p of o)try{const h=Es(p,{recursive:!0},(m,c)=>{c&&(tn(c)||t&&!t(c)||(i.add(c),d&&clearTimeout(d),d=setTimeout(f,e)))});n.push(h)}catch(h){er.warn(`[vis watch] unable to watch ${p}: ${h.message}`)}return{close:He(()=>{d&&clearTimeout(d);for(const p of n)try{p.close()}catch{}},"close")}},"startWatcher");var rn=Object.defineProperty,sn=_((r,e)=>rn(r,"name",{value:e,configurable:!0}),"n");const on=sn((r,e)=>{const t=e?.trim();if(!t)return{filter:void 0,tasks:[...r]};const s=t.toLowerCase();return{filter:t,tasks:r.filter(o=>o.target.project.toLowerCase().includes(s))}},"applyProjectFilter");var nn=Object.defineProperty,Ee=_((r,e)=>nn(r,"name",{value:e,configurable:!0}),"a");const an=[""," Watch keybinds:"," r, Enter rerun"," a rerun all (clear filter)"," p filter by project name"," q, Ctrl+C quit"," h, ? show this help",""].join(`
34
+ `),cn=Ee(r=>{r.write(`${an}
35
+ `)},"writeHelp"),ln=Ee(async(r,e)=>{e.write("filter projects (empty to cancel) > ");const t=r,s=t.isRaw===!0;if(s)try{t.setRawMode?.(!1)}catch{}return await new Promise(o=>{let n="";const i=Ee(d=>{n+=typeof d=="string"?d:d.toString("utf8");const f=n.indexOf(`
36
+ `);if(f===-1)return;const p=n.slice(0,f).replace(/\r$/,"").trim();if(r.off("data",i),s)try{t.setRawMode?.(!0)}catch{}o(p.length>0?p:void 0)},"onData");r.on("data",i)})},"defaultPromptFilter"),dn=Ee(r=>{const{handlers:e}=r,t=r.input??process.stdin,s=r.output??process.stdout,o=r.promptFilter??ln;if(!t||t.isTTY===!1)return{close:Ee(()=>{},"close")};ri(t);const n=t.isRaw===!0;try{t.setRawMode?.(!0)}catch{return{close:Ee(()=>{},"close")}}typeof t.resume=="function"&&t.resume();let i=!1;const d=Ee(async h=>{if(h.ctrl===!0&&h.name==="c"){await e.onQuit();return}if(!i)switch(h.name){case"?":case"h":{await e.onHelp();break}case"a":{await e.onClearFilter();break}case"p":{i=!0;try{const m=await o(t,s);m===void 0?s.write(`filter cancelled.
37
+ `):await e.onFilter(m)}finally{i=!1}break}case"q":{await e.onQuit();break}case"r":{await e.onRerun();break}case"return":{await e.onRerun();break}}},"dispatch"),f=Ee((h,m)=>{d(m).catch(c=>{s.write(`[vis watch] keybind handler failed: ${c.message}
38
+ `)})},"onKeypress"),p=t;return p.on("keypress",f),{close:Ee(()=>{if(p.off("keypress",f),!n)try{t.setRawMode?.(!1)}catch{}const h=t;if(typeof h.pause=="function")try{h.pause()}catch{}},"close")}},"installKeybinds");var un=Object.defineProperty,St=_((r,e)=>un(r,"name",{value:e,configurable:!0}),"y");const hn=St(r=>{const e=r.overrides.visOptions;return e&&typeof e=="object"?e:void 0},"getVisOptions"),fn=St(async r=>{const{initialTasks:e,probe:t,registeredEntries:s,taskGraph:o,visVersion:n}=r,i=new Map,d=new Map,f=new Map;for(const v of s)if(qs(v.pid)){if(v.visVersion!==n){d.set(v.id,v);continue}i.set(v.id,v)}if(t){const v=[...i.values()],I=await Promise.all(v.map(async U=>{try{return[U.id,await t(U)]}catch{return[U.id,!1]}}));for(const[U,j]of I)if(!j){const Y=i.get(U);i.delete(U),Y&&f.set(U,Y)}}const p=new Set(e.map(v=>v.id)),h=new Set,m=[],c=[],$=new Set;for(const v of Object.values(o.dependencies))for(const I of v)$.add(I);for(const[v,I]of Object.entries(o.tasks)){if(!hn(I)?.service)continue;if(i.has(v)){h.add(v),c.push(i.get(v));continue}if(p.has(v)||!$.has(v))continue;const U=d.get(v),j=f.get(v);let Y;U?Y=`Service ${v} is registered with vis ${U.visVersion}, but this invocation is vis ${n}. Restart with \`vis service restart ${v}\` to pick up the new version.`:j?Y=`Service ${v} is registered (PID ${String(j.pid)}) but failed its readiness probe — the wrapper process is alive but the underlying server is not responding. Run \`vis service restart ${v}\` to recover.`:Y=`Target depends on the service ${v}, which is not running. Run \`vis service start ${v}\` first, or invoke \`${v}\` directly.`,m.push({message:Y,targetId:v})}if(h.size===0)return{diagnostics:m,initialTasks:e,satisfiedServices:c,serviceDependentsByServiceId:new Map,serviceEnvByTaskId:new Map,taskGraph:o};const E=new Map,D=St(v=>{const I=new Set,U=[...o.dependencies[v]??[]],j=new Set;for(;U.length>0;){const Y=U.pop();if(!j.has(Y)){j.add(Y),h.has(Y)&&I.add(Y);for(const ie of o.dependencies[Y]??[])j.has(ie)||U.push(ie)}}return[...I].sort()},"collectTransitiveServices"),R=new Map;for(const v of Object.keys(o.dependencies)){if(h.has(v))continue;const I=D(v);if(I.length===0)continue;const U={};for(const j of I){const Y=i.get(j);if(!Y)continue;Object.assign(U,Y.env);const ie=R.get(j);ie?ie.push(v):R.set(j,[v])}Object.keys(U).length>0&&E.set(v,U)}for(const v of R.values())v.sort();const S={};for(const[v,I]of Object.entries(o.tasks))h.has(v)||(S[v]=I);const y={};for(const[v,I]of Object.entries(o.dependencies))h.has(v)||(y[v]=I.filter(U=>!h.has(U)));const F=new Map;for(const v of Object.keys(S))F.set(v,0);for(const v of Object.values(y))for(const I of v)F.has(I)&&F.set(I,(F.get(I)??0)+1);const X=[];for(const v of o.roots)!h.has(v)&&S[v]&&X.push(v);for(const[v,I]of F)I===0&&!X.includes(v)&&S[v]&&X.push(v);const V=e.filter(v=>!h.has(v.id));return{diagnostics:m,initialTasks:V,satisfiedServices:c,serviceDependentsByServiceId:R,serviceEnvByTaskId:E,taskGraph:{dependencies:y,roots:X,tasks:S}}},"applyServiceRegistry");var pn=Object.defineProperty,ut=_((r,e)=>pn(r,"name",{value:e,configurable:!0}),"c");const it="[[VIS_BOOT]]",gn=250,mn=1e3,kr=3,wn=ut(r=>{try{return process.kill(r,0),!0}catch{return!1}},"isAlive"),br=ut(r=>{try{const e=js(r,"utf8").trim(),t=Number.parseInt(e,10);return Number.isFinite(t)&&t>0?t:null}catch{return null}},"readPidFile");class vn{static{_(this,"ServiceEventBridge")}static{ut(this,"ServiceEventBridge")}#e;#s;#r;#i;#t=new Map;#o=new Map;#n=new Map;#a=new Map;constructor(e){this.#e=e.indexToId,this.#s=new Map(e.services),this.#r=e.sink,this.#i=e.workspaceRoot}onProcessEvent=ut(e=>{if(e.kind!=="stdout"&&e.kind!=="stderr")return;const t=this.#e.get(e.index);t===void 0||e.text===void 0||this.onTaskOutput(t,e.text)},"onProcessEvent");onTaskOutput(e,t){if(!this.#s.has(e))return;const s=((this.#t.get(e)??"")+t).split(`
39
+ `),o=s.pop()??"";this.#t.set(e,o);for(const n of s)this.#c(e,n)}notifyRegistryStarting(e){this.#r.starting(e)}notifyRegistryStarted(e,t){this.#r.started(e,t)}onRegistryTaskStarted(e){this.#s.get(e)?.mode==="registry"&&this.notifyRegistryStarting(e)}async onRegistryTaskClosed(e,t,s){if(this.#s.get(e)?.mode!=="registry")return;if(s||t!==0){this.notifyRegistryFailed(e,"exit-code",{exitCode:t,killed:s});return}const o=await Hs(this.#i,e);if(!o){this.notifyRegistryFailed(e,"missing-registry-entry");return}const{config:n}=o,i=n.readiness?.tcp?.port??n.port??0,d=n.readiness?.tcp?.host??"127.0.0.1";this.notifyRegistryReady(e,{host:d,logFile:o.logFile,pid:o.pid,port:i})}notifyRegistryReady(e,t){this.#r.ready(e,{host:t.host,port:t.port}),this.#h(e,t.logFile),t.pid!==null&&this.#f(e,t.pid)}notifyRegistryFailed(e,t,s){this.#r.failed(e,t,s)}async retry(e){const t=this.#s.get(e);if(t){if(this.#u(e),this.#t.delete(e),this.#o.delete(e),this.#r.starting(e),t.mode==="registry"){await this.#v(e,t.registry);return}t.mode==="ephemeral"&&this.#w(e,t.ephemeral)}}async dispose(){for(const e of[...this.#n.keys(),...this.#a.keys()])this.#u(e);this.#t.clear(),this.#o.clear()}#c(e,t){if(t.startsWith(it)){this.#l(e,t.slice(it.length));return}const s=this.#o.get(e)??[];s.push(t),s.length>kr&&s.shift(),this.#o.set(e,s),this.#r.log(e,`${t}
40
+ `)}#l(e,t){let s;try{s=JSON.parse(t)}catch{this.#r.log(e,`${it+t}
41
+ `);return}switch(s.event){case"failed":{const o=typeof s.reason=="string"?s.reason:"unknown",n={};for(const[i,d]of Object.entries(s))i!=="event"&&i!=="id"&&i!=="reason"&&(n[i]=d);this.#r.failed(e,o,n);break}case"ready":{const o=typeof s.host=="string"?s.host:"127.0.0.1",n=typeof s.port=="number"?s.port:0;this.#r.ready(e,{host:o,port:n}),this.#d(e);break}case"started":{const o=typeof s.pid=="number"?s.pid:null;this.#r.started(e,o);break}default:this.#r.log(e,`${it+t}
42
+ `)}}#d(e){const t=this.#s.get(e);if(t?.ephemeral===void 0)return;this.#h(e,t.ephemeral.logFile);const s=br(t.ephemeral.pidFile);s!==null&&this.#f(e,s)}#h(e,t){if(this.#n.has(e)||!Ct(t))return;const s=Rs(t,"r"),o=(()=>{try{return lt(t).size}catch{return 0}})(),n={fd:s,logFile:t,pollTimer:setInterval(()=>{this.#g(e)},gn),position:o};this.#n.set(e,n)}#g(e){const t=this.#n.get(e);if(t)try{const s=lt(t.logFile);if(s.size<=t.position)return;const o=Buffer.alloc(s.size-t.position),n=Fs(t.fd,o,0,o.length,t.position);if(n>0){t.position+=n;const i=o.subarray(0,n).toString("utf8");for(const d of i.split(`
43
+ `))d.length!==0&&this.#m(e,d);this.#r.log(e,i)}}catch{}}#m(e,t){const s=this.#o.get(e)??[];for(s.push(t);s.length>kr;)s.shift();this.#o.set(e,s)}#f(e,t){if(this.#a.has(e))return;const s={pid:t,timer:setInterval(()=>{if(!wn(t)){const o=[...this.#o.get(e)??[]];this.#u(e),this.#r.crashed(e,o)}},mn)};this.#a.set(e,s)}#u(e){const t=this.#n.get(e);if(t){clearInterval(t.pollTimer);try{Ps(t.fd)}catch{}this.#n.delete(e)}const s=this.#a.get(e);s&&(clearInterval(s.timer),this.#a.delete(e))}#w(e,t){if(t===void 0)return;const s=br(t.pidFile);if(s!==null)try{process.kill(-s,"SIGTERM")}catch{}const o=di("node",[t.scriptPath,t.configFile],{cwd:t.cwd,stdio:["ignore","pipe","pipe"]});o.stdout.on("data",n=>{this.#p(e,n)}),o.stderr.on("data",n=>{this.#p(e,n)}),o.on("error",n=>{this.#r.failed(e,"respawn-error",{message:n.message})})}#p(e,t){const s=((this.#t.get(e)??"")+t.toString("utf8")).split(`
44
+ `),o=s.pop()??"";this.#t.set(e,o);for(const n of s)this.#c(e,n)}async#v(e,t){if(t!==void 0){try{await zs({id:e,workspaceRoot:this.#i})}catch{}try{const s=await Vs({command:t.command,config:t.config,cwd:t.cwd,env:t.env,id:e,workspaceRoot:this.#i}),o=t.config.readiness?.tcp?.port??t.config.port??0,n=t.config.readiness?.tcp?.host??"127.0.0.1";this.#r.started(e,s.entry.pid),this.notifyRegistryReady(e,{host:n,logFile:s.entry.logFile,pid:s.entry.pid,port:o})}catch(s){const o=s instanceof Error?s.message:String(s);this.#r.failed(e,"retry-failed",{message:o})}}}}var yn=Object.defineProperty,me=_((r,e)=>yn(r,"name",{value:e,configurable:!0}),"p");const kn=me(r=>{const e=r.overrides.visOptions;return e&&typeof e=="object"?e:void 0},"getVisOptions"),Hr=me((r,e,t)=>{const s=[],o=[];for(const n of e){const i=t.tasks[n];if(!i){o.push({id:n,reason:"task not in graph"});continue}const d=i.overrides.command;if(!d){o.push({id:n,reason:"no command resolved"});continue}const f=kn(i);if(!f?.service){o.push({id:n,reason:"no service config"});continue}const p=Tt(r,i.projectRoot,!!f.runFromWorkspaceRoot),{envFile:h}=f,m=h===void 0||h===!1?{}:It(p,h),c=f.service.env??{};s.push({command:d,config:f.service,cwd:p,env:{...m,...c},id:n})}return{services:s,skipped:o}},"extractPreflightTasks"),bn=me((r,e)=>{const t=new Set(r),s=new Map;for(const i of r){const d=(e.dependencies[i]??[]).filter(f=>t.has(f));s.set(i,new Set(d))}const o=[],n=new Set;for(;s.size>0;){const i=[];for(const[d,f]of s){for(const p of f)n.has(p)&&f.delete(p);f.size===0&&i.push(d)}i.length===0&&i.push(...s.keys());for(const d of i)n.add(d),s.delete(d);i.sort(),o.push({ids:i})}return o},"planTopoLevels"),Sn=me((r,e)=>{const t=[];for(const s of bn(r,e))t.push(...s.ids);return t},"linearize"),$n=String.raw`import { spawn } from "node:child_process";
45
+ import { closeSync, openSync, readFileSync, readSync, statSync, writeFileSync } from "node:fs";
46
+ import { createConnection } from "node:net";
47
+
48
+ const cfgPath = process.argv[2];
49
+
50
+ if (!cfgPath) {
51
+ console.error("[vis-service-bootstrap] missing config path");
52
+ process.exit(2);
53
+ }
54
+
55
+ const cfg = JSON.parse(readFileSync(cfgPath, "utf8"));
56
+
57
+ // Structured marker for service-event-bridge.ts to consume. Plain
58
+ // process.stdout.write keeps the line atomic and on the same stream
59
+ // as the tailed child log, so the parser sees one stream.
60
+ const emit = (event) => {
61
+ process.stdout.write("[[VIS_BOOT]]" + JSON.stringify({ ...event, id: cfg.id }) + "\n");
62
+ };
63
+
64
+ // Spawn the child with its stdio bound to a real file descriptor on
65
+ // disk — NOT inherited from the bootstrap. If the child inherited
66
+ // our stdio, it would inherit vis run's task pipes, and vis run would
67
+ // block waiting for those pipes to close even after this bootstrap
68
+ // exits. The logfile gives the grandchild a stable target it can keep
69
+ // writing to long after this bootstrap is gone.
70
+ const childLogFd = openSync(cfg.logFile, "a");
71
+
72
+ const child = spawn(cfg.command, {
73
+ cwd: cfg.cwd,
74
+ detached: true,
75
+ env: { ...process.env, ...cfg.env },
76
+ shell: true,
77
+ stdio: ["ignore", childLogFd, childLogFd],
78
+ });
79
+
80
+ // Close the bootstrap's copy of the fd; the child kept its own.
81
+ closeSync(childLogFd);
82
+
83
+ if (child.pid !== undefined) {
84
+ try {
85
+ writeFileSync(cfg.pidFile, String(child.pid));
86
+ } catch (error) {
87
+ console.error("[vis] failed to write pid file: " + (error?.message ?? String(error)));
88
+ }
89
+ }
90
+
91
+ emit({ event: "started", pid: child.pid ?? null });
92
+
93
+ let exitedEarly = false;
94
+
95
+ child.once("exit", (code, signal) => {
96
+ exitedEarly = true;
97
+ emit({ code, event: "failed", reason: "exited-before-ready", signal });
98
+ });
99
+
100
+ // Forward new bytes from the logfile to our stdout while we're alive.
101
+ // Polling-based tail; preflight is short, ~200ms per cycle is fine.
102
+ let tailPos = 0;
103
+ const tailFd = openSync(cfg.logFile, "r");
104
+
105
+ const flushTail = () => {
106
+ try {
107
+ const stat = statSync(cfg.logFile);
108
+ if (stat.size <= tailPos) return;
109
+ const remaining = stat.size - tailPos;
110
+ const buf = Buffer.alloc(remaining);
111
+ const n = readSync(tailFd, buf, 0, remaining, tailPos);
112
+ if (n > 0) {
113
+ process.stdout.write(buf.subarray(0, n));
114
+ tailPos += n;
115
+ }
116
+ } catch {}
117
+ };
118
+
119
+ const probeOnce = () => new Promise((resolve) => {
120
+ const socket = createConnection({ host: cfg.host || "127.0.0.1", port: cfg.port });
121
+ let settled = false;
122
+ const finish = (ok) => {
123
+ if (settled) return;
124
+ settled = true;
125
+ try { socket.destroy(); } catch {}
126
+ resolve(ok);
127
+ };
128
+ socket.once("connect", () => finish(true));
129
+ socket.once("error", () => finish(false));
130
+ socket.setTimeout(1000, () => finish(false));
131
+ });
132
+
133
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
134
+
135
+ (async () => {
136
+ const deadline = Date.now() + (cfg.timeoutMs ?? 30000);
137
+ while (Date.now() < deadline) {
138
+ flushTail();
139
+ if (exitedEarly) {
140
+ try { closeSync(tailFd); } catch {}
141
+ process.exit(1);
142
+ }
143
+ if (await probeOnce()) {
144
+ flushTail();
145
+ emit({ event: "ready", host: cfg.host || "127.0.0.1", port: cfg.port });
146
+ try { closeSync(tailFd); } catch {}
147
+ child.unref();
148
+ process.exit(0);
149
+ }
150
+ await sleep(200);
151
+ }
152
+ flushTail();
153
+ emit({ event: "failed", reason: "timeout", timeoutMs: cfg.timeoutMs ?? 30000 });
154
+ try { closeSync(tailFd); } catch {}
155
+ try { process.kill(-child.pid, "SIGTERM"); } catch {}
156
+ process.exit(1);
157
+ })();
158
+ `,Tn=me(()=>{const r=Os(ve(li(),"vis-services-")),e=ve(r,"bootstrap.mjs");return Cr(e,$n),{runDir:r,scriptPath:e}},"prepareBootstrap"),zr=me((r,e,t)=>{const s=t.replaceAll(/[^\w-]/g,"_");return{configFile:ve(r,`${s}.json`),logFile:ve(r,`${s}.log`),pidFile:ve(r,`${s}.pid`),scriptPath:e}},"buildBootstrapPaths"),In=me(r=>{const{paths:e,service:t}=r,s=t.config.readiness?.tcp?.port??t.config.port;if(typeof s!="number")throw new TypeError(`Service ${t.id} has no TCP readiness port — declare \`service.port\` or \`service.readiness.tcp.port\`.`);return{command:t.command,cwd:t.cwd,env:t.env,host:t.config.readiness?.tcp?.host??"127.0.0.1",id:t.id,logFile:e.logFile,pidFile:e.pidFile,port:s,timeoutMs:t.config.readiness?.tcp?.timeoutMs??3e4}},"buildEphemeralConfig"),Cn=me(r=>`node ${JSON.stringify(r.scriptPath)} ${JSON.stringify(r.configFile)}`,"buildEphemeralCommand"),xn=me(r=>{const{id:e,visBin:t,workspaceRoot:s}=r;return`node ${JSON.stringify(t)} service start ${JSON.stringify(e)} --cwd ${JSON.stringify(s)}`},"buildRegistryCommand"),Mn=me(r=>{const{missingServiceIds:e,mode:t,taskGraph:s,visBin:o,workspaceRoot:n}=r,{services:i,skipped:d}=Hr(n,e,s);if(i.length===0)return{chain:[],ephemeralPidFiles:[],runDir:void 0,serviceEnvByTaskId:new Map,skipped:d};const f=Sn(i.map(S=>S.id),s),p=new Map(i.map(S=>[S.id,S])),h=[],m=[];if(t==="ephemeral")for(const S of f){const y=p.get(S);y&&m.push({id:S,payload:In({paths:{logFile:"",pidFile:""},service:y})})}let c;t==="ephemeral"&&(c=Tn());let $;for(const S of f){const y=p.get(S),F=s.tasks[S];if(!y||!F)continue;let X;if(t==="ephemeral"){const V=zr(c.runDir,c.scriptPath,S),v={...m.find(I=>I.id===S).payload,logFile:V.logFile,pidFile:V.pidFile};Cr(V.configFile,JSON.stringify(v)),X=Cn(V),h.push(V.pidFile)}else X=xn({id:S,visBin:o,workspaceRoot:n});if(F.overrides={...F.overrides,command:X},F.cache=!1,s.tasks[S]=F,$!==void 0){const V=s.dependencies[S]??[];V.includes($)||(s.dependencies[S]=[...V,$])}$=S}const E=new Set(f),D=new Map,R=me(S=>{const y=new Set,F=[...s.dependencies[S]??[]],X=new Set;for(;F.length>0;){const V=F.pop();if(!X.has(V)){X.add(V),E.has(V)&&y.add(V);for(const v of s.dependencies[V]??[])X.has(v)||F.push(v)}}return[...y].sort()},"collectTransitive");for(const S of Object.keys(s.dependencies)){if(E.has(S))continue;const y=R(S);if(y.length===0)continue;const F={};for(const X of y){const V=p.get(X);V?.config.env&&Object.assign(F,V.config.env)}Object.keys(F).length>0&&D.set(S,F)}return{chain:f,ephemeralPidFiles:h,runDir:c?.runDir,serviceEnvByTaskId:D,skipped:d}},"injectServiceTasks"),En=new Set(["auto","ephemeral","off","persistent"]),Rn=me(r=>{const{cli:e,config:t,isCi:s,isPersistentTarget:o,isTty:n,target:i}=r;if(e!==void 0&&!En.has(e))throw new Error(`--services: expected one of auto|ephemeral|persistent|off, got "${e}"`);const d=e??t??(n&&!s?"auto":"off");return d==="off"?"off":d==="ephemeral"?"ephemeral":d==="persistent"?"registry":o||i==="dev"?"ephemeral":"registry"},"resolveServicesPolicy");var Fn=Object.defineProperty,C=_((r,e)=>Fn(r,"name",{value:e,configurable:!0}),"o");const Dt="VIS_AFFECTED_FILES",Pn=2e3,Sr=C(async(r,e,t,s,o,n)=>{const i=r.map(R=>{const S=R.overrides.command;if(!S)return;const y=R.overrides.visOptions,F=Tt(e,R.projectRoot,!!y?.runFromWorkspaceRoot),X=y?.envFile?It(F,y.envFile):{},V=t&&(y?.affectedFiles==="env"||y?.affectedFiles==="both")?{[Dt]:t.join(`
159
+ `)}:{},v=n?.get(R.id)??{};return{command:S,cwd:F,env:{INIT_CWD:s,...X,...v,...V},name:R.id}}).filter(R=>R!==void 0);if(i.length===0)return;if(!o){await ct(i,{killOthers:["failure"],onEvent:C(()=>{},"onEvent")});return}const{abortSignal:d,lifeCycle:f,store:p}=o,h=i.map(R=>r.find(S=>S.id===R.name)).filter(Boolean);p.unmarkDone(),f.startTasks?.(h);const m=new Map,c=new Map;let $;const E=C(()=>{for(const R of c.values())try{R("SIGTERM")}catch{}$||($=setTimeout(()=>{for(const R of c.values())try{R("SIGKILL")}catch{}c.clear()},2e3),$.unref?.())},"killAll");let D;d&&(D=C(()=>{E()},"abortListener"),d.then(()=>{D?.()}).catch(()=>{D?.()}));try{await ct(i,{killOthers:["failure"],onEvent:C(R=>{const S=h[R.index];if(S)switch(R.kind){case"close":{const y=m.get(S.id)??Date.now(),F=R.killed||R.exitCode===0?"success":"failure";f.endTasks?.([{code:R.exitCode??0,endTime:Date.now(),startTime:y,status:F,task:S,terminalOutput:p.getSnapshot().outputs.get(S.id)??""}]),c.delete(R.index);break}case"error":{R.message&&p.addOutput(S.id,`${R.message}
160
+ `);break}case"started":{m.set(S.id,Date.now()),R.kill&&c.set(R.index,R.kill);break}case"stderr":case"stdout":{R.text&&p.addOutput(S.id,`${R.text}
161
+ `);break}}},"onEvent")})}finally{$&&(clearTimeout($),$=void 0),p.markDone()}},"runPersistentTasks"),$r=C(r=>{try{return process.kill(-r,0),!0}catch{try{return process.kill(r,0),!0}catch{return!1}}},"isPidAlive"),jn=C(r=>{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,r)},"sleepSyncMs"),On=C(r=>{const{extraPids:e=[],pidFiles:t,runDir:s}=r,o=[],n=C(i=>{try{process.kill(-i,"SIGTERM")}catch{try{process.kill(i,"SIGTERM")}catch{}}},"sendSigterm");for(const i of t){let d;try{const f=os(i),p=Number.parseInt(f.trim(),10);d=Number.isFinite(p)&&p>0?p:void 0}catch{continue}d!==void 0&&(o.push(d),n(d))}for(const i of e)!Number.isFinite(i)||i<=0||(o.push(i),n(i));if(o.length>0){const i=Date.now()+1500;for(;Date.now()<i;){let d=!0;for(const f of o)if($r(f)){d=!1;break}if(d)break;jn(100)}for(const d of o)if($r(d))try{process.kill(-d,"SIGKILL")}catch{try{process.kill(d,"SIGKILL")}catch{}}}s&&as(s)},"cleanupEphemeralServices"),$t=256*1024;class Dn{static{_(this,"Bn")}static{C(this,"OutputRingBuffer")}#e;#s="";#r=!1;constructor(e){this.#e=e}append(e){this.#s+=e,this.#s.length>this.#e&&(this.#s=this.#s.slice(-this.#e),this.#r=!0)}toString(){return this.#r?`[...output truncated, showing last ${Math.round(this.#e/1024)}KB...]
162
+ ${this.#s}`:this.#s}}const Vr=C(r=>{const e=r.overrides.visOptions;if(e&&typeof e=="object")return e},"getTaskOptions"),At=C(r=>`'${r.replaceAll("'",String.raw`'\''`)}'`,"singleQuoteEscape"),An=C((r,e,t)=>{if(!e||e.length===0||t===!1||t===void 0)return r;if(t==="args"||t==="both"){const s=e.map(o=>At(o)).join(" ");return`${r} ${s}`}return r},"buildAffectedFilesArgs"),Ur="visForwardedArgs",Ln=C((r,e)=>{const t=e.overrides[Ur];if(!Array.isArray(t)||t.length===0)return r;const s=t.map(o=>At(o)).join(" ");return`${r} ${s}`},"appendForwardedArgs"),Bn=C(async(r,e,t)=>{if(!e)return t();const s=r.get(e)??Promise.resolve();let o;const n=new Promise(d=>{o=d}),i=s.then(()=>n);r.set(e,i),await s;try{return await t()}finally{o(),r.get(e)===i&&r.delete(e)}},"withMutex"),Nn=C(r=>{let e=Math.max(0,Math.floor(r));return{claim(t){const s=Math.max(0,Math.min(t,e));return e-=s,s},get remaining(){return e}}},"createRetryBudget"),Gn=C((r,e,t)=>{const s=`${e}\0${typeof t=="string"?t:String(t)}`,o=r.get(s);if(o)return o;const n=It(e,t);return r.set(s,n),n},"loadEnvFileCached"),Tr=C(r=>{const e=new Map;return async(t,s)=>{const{affectedFiles:o,currentOs:n,hooks:i,initCwd:d,lifeCycle:f,mutexPool:p,onOutput:h,onOutputReplace:m,retryBudget:c,serviceEnvByTaskId:$,serviceEventBridge:E,stdinRegistry:D,strictEnv:R,workspaceRoot:S}=r,y=Vr(t),F=Tt(S,s.cwd??t.projectRoot,y?.runFromWorkspaceRoot===!0),X=t.overrides.command;if(!X)return{code:0,terminalOutput:`No command configured for ${t.target.project}:${t.target.target}`};const V=Ln(X,t),v=An(V,o,y?.affectedFiles),I=cs(y,n),U=I?`${I} -c ${At(v)}`:v,j=y?.envFile?Gn(e,F,y.envFile):void 0,Y={};o&&o.length>0&&(y?.affectedFiles==="env"||y?.affectedFiles==="both")&&(Y[Dt]=o.join(`
163
+ `));const ie=$?.get(t.id),N={INIT_CWD:d,...j,...ie,...s.env,...Y};if(y?.strictEnv??R??!1){const L=Xi({command:v,processEnv:process.env,taskEnv:N,taskId:t.id});if(L){const q=Ji(L);return f?.onTaskStderr?.(t,q),{code:1,terminalOutput:q}}}const A=y?.pty===!0,Z=!!D,oe=Z||A;oe&&(t.cache=!1);const O=oe?void 0:new Dn($t),ae=oe?new xr($t):void 0;let le;const Re=C(L=>{if(L.kind==="started"&&(le=L.kill,L.write&&D&&D.set(t.id,{kill:L.kill,resize:L.resize,write:L.write}),E?.onRegistryTaskStarted(t.id)),(L.kind==="stdout"||L.kind==="stderr")&&L.text!==void 0)if(L.kind==="stdout"?f?.onTaskStdout?.(t,L.text):f?.onTaskStderr?.(t,L.text),ae)ae.write(L.text),Z&&m?.(t.id,ae.toString()),E&&E.onTaskOutput(t.id,L.text);else{const q=`${L.text}
164
+ `;O.append(q),h?.(t.id,q)}L.kind==="close"&&(D&&D.delete(t.id),E&&E.onRegistryTaskClosed(t.id,L.exitCode??0,!!L.killed).catch(()=>{}))},"onEvent"),se=C(async()=>{const L=y?.retryCount??0,q=y?.retryDelay,ye=c?c.claim(L):L,Ie=typeof y?.timeout=="number"&&y.timeout>0?y.timeout:0,pe=typeof y?.killGracePeriodMs=="number"&&y.killGracePeriodMs>=0?y.killGracePeriodMs:5e3;let ke=!1,Ce=0;const Fe=Jo({killGracePeriodMs:pe,onTimeout:C(()=>{ke=!0},"onTimeout"),sendSignal:C(ge=>{le?.(ge)},"sendSignal"),timeoutMs:Ie});let Pe;try{Pe=await ct([{command:U,cwd:F,env:N,name:t.id,...oe?{ptySize:{cols:process.stdout.columns??80,rows:process.stdout.rows??24},stdin:"pty"}:{}}],{killOthers:["failure"],onEvent:Re,...ye>0?{restart:{delay:q??"exponential",onRetry:C(async(ge,be,xe)=>{Ce=ge,i&&await i.callHook("task:retry",t,ge,xe)},"onRetry"),tries:ye}}:{}})}finally{Fe.cancel()}const we=Pe.closeEvents[0],de=ae?ae.toString():O.toString();return ke?{code:124,retryAttempts:Ce,terminalOutput:`${de}
165
+ [timeout] Task "${t.id}" exceeded ${Ie}ms budget.
166
+ `}:{code:we?.exitCode??1,retryAttempts:Ce,terminalOutput:de}},"runOnce");return p?Bn(p,y?.mutex,se):se()}},"createConcurrentExecutor"),_n=C(r=>{if(!r||r.trim().length===0)return;const e=Number.parseFloat(r);return!Number.isFinite(e)||e<=0?{invalid:r}:{value:Math.floor(e)}},"parseEnvConcurrency"),qn=C(async(r,e)=>{const t=await ms(r,{dataDirectory:at(r)});if(!t){e.warn(`No previous run recorded yet. Run a task at least once to populate ${ws(r,{dataDirectory:at(r)})}.`);return}const s=(t.duration/1e3).toFixed(2);if(e.info(""),e.info(`Last run — ${t.startTime} (${s}s)`),e.info(""),e.info(` Total: ${String(t.stats.total)}`),e.info(` Succeeded: ${String(t.stats.succeeded)}`),e.info(` Cached: ${String(t.stats.cached)}`),e.info(` Failed: ${String(t.stats.failed)}`),e.info(` Skipped: ${String(t.stats.skipped)}`),e.info(""),t.stats.failed>0){const n=t.tasks.filter(i=>i.exitCode!==void 0&&i.exitCode!==0);e.info("Failed tasks:");for(const i of n){const d=i.duration??0;e.info(` × ${i.taskId} (exit ${String(i.exitCode??-1)}, ${d}ms)`)}e.info("")}const o=[...t.tasks].filter(n=>typeof n.duration=="number").sort((n,i)=>(i.duration??0)-(n.duration??0)).slice(0,5);if(o.length>0){e.info("Slowest tasks:");for(const n of o)e.info(` ${n.taskId.padEnd(40)} ${String(n.duration??0).padStart(6)}ms [${n.cacheStatus}]`);e.info("")}},"renderLastRunSummary"),Hn=C(r=>{if(!(r===void 0||r==="")){if(r!=="read"&&r!=="write"&&r!=="readwrite")throw new Error(`--cache-mode must be one of: read, write, readwrite (received "${r}")`);return r}},"parseCacheMode"),zn=C(r=>{if(!(r===void 0||r==="")){if(r!=="http"&&r!=="reapi")throw new Error(`--cache-backend must be one of: http, reapi (received "${r}")`);return r}},"parseCacheBackend"),ga=C(async({argument:r,logger:e,options:t,runtime:s,visConfig:o,workspaceRoot:n})=>{if(!n)throw new Error("Could not determine workspace root. Run this command inside a monorepo.");const i=n;if(ls(i),t.lastDetails===!0){await qn(i,e);return}const d=process.cwd(),f=await ds(i),{config:p,packageJsons:h,projectOptions:m,workspace:c}=us(i,o,f),$=hs(i,c,h);let E=r[0];if(!E){const w=lr(c);if(process.stdout.isTTY&&process.stdin.isTTY){const b=await io(w);if(!b){e.info("No target selected.");return}E=b,await Uo(`vis run ${b}`)}else{e.info("Available targets:"),e.info(""),e.info(so(w)),e.info(""),e.info("Usage: vis run <target>");return}}if(p.constraints&&!t.skipConstraints){const w=vs($,p.constraints);if(w.length>0){for(const b of w)e.error(`[${b.rule}] ${b.message}`);throw new Error(`${w.length} project constraint violation(s) found. Use --skip-constraints to bypass.`)}}if(t.affected){const w=[E];t.parallel!==void 0&&w.push(`--parallel=${String(t.parallel)}`),t.cache||w.push("--no-cache"),t.query&&w.push(`--query=${String(t.query)}`),t.reverse&&w.push("--reverse"),typeof t.runnerTags=="string"&&t.runnerTags!==""&&w.push(`--runner-tags=${t.runnerTags}`),await s.runCommand("affected",{argv:w});return}const D=await Zs(E,c,process.cwd(),i),R=Zi(m),S=eo(D.target,R);S!==D.target&&e.debug?.(`Resolved alias "${D.target}" → "${S}"`);let y=D.projects;const F=r.slice(1).map(String);if(t.projects){const w=new Set(t.projects.split(",").map(b=>b.trim()));if(y=y.filter(b=>w.has(b)),y.length===0)throw new Error(`No matching projects found for: ${String(t.projects)}`)}if(t.query&&(y=ei(y,c,t.query),y.length===0)){e.info(`Query "${String(t.query)}" matched no projects.`);return}const X=fs(),V=process.env[Dt],v=V?V.split(`
167
+ `).filter(Boolean):void 0,I=(typeof t.runnerTags=="string"?t.runnerTags:process.env.VIS_RUNNER_TAGS)??void 0,U=I?new Set(I.split(",").map(w=>w.trim()).filter(Boolean)):void 0,j=[],Y=new Map;for(const w of y){const b=m.get(w)?.[S];if(!b)continue;const M=b.options;if(!M?.internal){if(!ps(M,!!rt)){e.debug?.(`Skipping ${w}:${S} — runInCI filter`);continue}if(!gs(M,U)){e.debug?.(`Skipping ${w}:${S} — runner-tags filter`);continue}j.push(w),Y.set(w,b)}}if(j.length===0){const w=lr(c),b=Object.entries(c.projects).filter(([,M])=>M.targets?.[S]!==void 0).map(([M])=>M);if(e.error(`No projects have the "${S}" target.`),b.length>0){e.info(""),e.info(`Target "${S}" exists in these projects but was filtered out:`);for(const M of b.slice(0,5))e.info(` - ${M}`);b.length>5&&e.info(` …and ${b.length-5} more`)}else{const M=Ar(S,w,3);M.length>0&&(e.info(""),e.info(M.length===1?`Did you mean "${M[0]}"?`:`Did you mean one of: ${M.map(W=>`"${W}"`).join(", ")}?`)),e.info(""),e.info("Run `vis run` without arguments to see all available targets.")}return}const ie=t.pty===!0;let N=j.map(w=>{const b=c.projects[w],M=Y.get(w),W={project:w,target:S},K=`${w}:${S}`,Q=ie?{...M.options,pty:M.options?.pty??!0}:M.options,G=M.command?tr(M.command,{affectedFiles:v,projectRoot:b?.root}):M.command;return{cache:M.cache,id:K,outputs:M.outputs??[],overrides:{command:G,...F.length>0?{[Ur]:F}:{},...Q?{visOptions:Q}:{}},parallelism:M.parallelism,projectRoot:b?.root,target:W}});const A=[],Z=[];for(const w of N)Vr(w)?.persistent?(w.cache=!1,A.push(w)):Z.push(w);N=Z;const oe=ys(t.partition);if(oe&&(N=ks.partitionTasks(N,oe),e.info(`Partition ${oe.index}/${oe.total}: running ${N.length} task(s)`),N.length===0)){e.info("No tasks assigned to this partition.");return}let O=bs([...N,...A],{projectGraph:$,targetDefaults:p.tasks,workspace:c});for(const[w,b]of Object.entries(O.tasks)){const M=b.target.project,W=b.target.target,K=m.get(M)?.[W];if(!K)continue;const Q=c.projects[M];let G=!1;const B={...b.overrides};B.visOptions===void 0&&K.options&&(B.visOptions=K.options,G=!0),B.command===void 0&&K.command&&(B.command=tr(K.command,{affectedFiles:v,projectRoot:Q?.root}),G=!0),G&&(b.overrides=B,O.tasks[w]=b)}if(typeof t.skipCache=="string"&&t.skipCache.trim()!=="")if(t.cache){const w=Vi(t.skipCache,c,Object.keys(O.tasks));for(const b of w.skipTaskIds){const M=O.tasks[b];M!==void 0&&(M.cache=!1)}w.unmatchedPatterns.length>0&&e.warn(`--skip-cache: no tasks matched ${w.unmatchedPatterns.map(b=>`"${b}"`).join(", ")}`),w.skipTaskIds.size>0&&e.debug?.(`--skip-cache: bypassing cache for ${String(w.skipTaskIds.size)} task(s)`)}else e.debug?.("--skip-cache ignored: --no-cache already disables caching for the whole run");await _s(i,p.toolchain,{error:C(w=>{e.error(w)},"error"),info:C(w=>{e.info(w)},"info"),warn:C(w=>{e.warn(w)},"warn")},!!t.skipToolchain);const ae=t.preflight!==!1&&p.preflight?.lockfile!==!1,le=yi(i,rt,{warn:C(w=>{e.warn(w)},"warn")},{skip:!ae});if(!le.shouldContinue)throw new Error(`${le.formattedMessage??"preflight: lockfile drift detected"} (pass --no-preflight to bypass)`);const Re=process.env.VIS_VERSION??"0.0.0",se=t.dryRun?void 0:async w=>{try{return await Js(w.config,{timeoutMs:Pn}),!0}catch{return!1}},L=await Us(i),q=await fn({initialTasks:[...N,...A],probe:se,registeredEntries:L,taskGraph:O,visVersion:Re}),ye=[];let Ie,pe=0;const ke=[],Ce=new Map;let Fe=[];const Pe=new Set;let we=null,de=null;if(q.diagnostics.length>0){const w=!!(process.stdout.isTTY&&process.stdin.isTTY),b=t.dryRun?"off":Rn({cli:t.services,config:p.run?.services,isCi:!!rt,isPersistentTarget:A.length>0,isTty:w,target:S});if(b==="off"){for(const B of q.diagnostics)e.error(B.message);throw new Error(`${q.diagnostics.length} service dependency error(s) — start the missing services or invoke them directly.`)}const M=q.diagnostics.map(B=>B.targetId),W=b,K=W==="registry"?Hr(i,M,O):void 0,Q=process.argv[1]??"vis",G=Mn({missingServiceIds:M,mode:W,taskGraph:O,visBin:Q,workspaceRoot:i});if(G.skipped.length>0){for(const{id:B,reason:ne}of G.skipped)e.error(`Cannot auto-start ${B}: ${ne}`);throw new Error(`${G.skipped.length} service(s) cannot be auto-started — invoke them directly or add a service config.`)}ye.push(...G.ephemeralPidFiles),Ie=G.runDir,Fe=G.chain;for(const B of G.chain)Pe.add(B);if(W==="registry"&&(pe=G.chain.length,ke.push(...G.chain)),G.chain.length>0){const B=new dr(G.chain),ne=new Map;if(W==="ephemeral"&&G.runDir)for(const P of G.chain){const H=zr(G.runDir,`${G.runDir}/bootstrap.mjs`,P);ne.set(P,{ephemeral:{configFile:H.configFile,cwd:i,logFile:H.logFile,pidFile:H.pidFile,scriptPath:H.scriptPath},mode:"ephemeral"})}else if(W==="registry"&&K)for(const P of K.services)ne.set(P.id,{mode:"registry",registry:{command:P.command,config:P.config,cwd:P.cwd,env:P.env}});if(ne.size>0){const P=new vn({indexToId:new Map,services:ne,sink:{crashed:C((H,z)=>{B.markCrashed(H,z)},"crashed"),failed:C((H,z,te)=>{B.markFailed(H,z,te)},"failed"),log:C((H,z)=>{B.appendLog(H,z)},"log"),ready:C((H,z)=>{B.markReady(H,z)},"ready"),started:C((H,z)=>{B.markStarted(H,z),W==="registry"&&z!==null&&Ce.set(H,z)},"started"),starting:C(H=>{B.markStarting(H)},"starting")},workspaceRoot:i});we=B,de=P}}for(const[B,ne]of G.serviceEnvByTaskId){const P=q.serviceEnvByTaskId.get(B)??{};q.serviceEnvByTaskId.set(B,{...P,...ne})}}const ge=new Set(A.map(w=>w.id));if(N=q.initialTasks.filter(w=>!ge.has(w.id)),O=q.taskGraph,Fe.length>0&&(N=[...Fe.map(w=>O.tasks[w]).filter(w=>w!==void 0),...N]),A.length>0){const w=new Set(A.map(Q=>Q.id)),b={};for(const[Q,G]of Object.entries(O.tasks))w.has(Q)||(b[Q]=G);const M={};for(const[Q,G]of Object.entries(O.dependencies))w.has(Q)||(M[Q]=G.filter(B=>!w.has(B)));const W=new Set;for(const Q of Object.values(M))for(const G of Q)W.add(G);const K=Object.keys(b).filter(Q=>!W.has(Q));O={dependencies:M,roots:K,tasks:b}}const{serviceEnvByTaskId:be}=q;if(q.satisfiedServices.length>0){const w=q.satisfiedServices.map(b=>b.id).join(", ");if(e.debug?.(`Auto-attached to running services: ${w}`),we)for(const b of q.satisfiedServices)we.registerService(b.id);else we=new dr(q.satisfiedServices.map(b=>b.id));for(const b of q.satisfiedServices){const M=b.config.readiness?.tcp?.port??b.config.port??0,W=b.config.readiness?.tcp?.host??"127.0.0.1";we.markReady(b.id,{host:W,port:M})}}if(t.reverse&&(O=Ss(O),e.debug?.(`Reversed task graph: ${String(O.roots.length)} new root(s) (originally leaves)`)),t.dryRun){const w=Object.keys(O.tasks).length,b=O.roots.length;e.info(`Execution plan (${String(w)} task(s), ${String(b)} root(s)):`),e.info("");const M=new Set,W=C((K,Q)=>{if(M.has(K))return;M.add(K);for(const ne of O.dependencies[K]??[])W(ne,Q+1);const G=O.tasks[K],B=" ".repeat(Q+1);e.info(`${B}${K}${G?.cache===!1?" (no-cache)":""}`)},"walkPlan");for(const K of O.roots)W(K,0);for(const K of Object.keys(O.tasks))W(K,0);A.length>0&&(e.info(""),e.info(` + ${String(A.length)} persistent task(s) (run after graph completes)`)),e.info("");return}const xe=Date.now(),ue=Ws(),Oe=C((w,b)=>{const M=b instanceof Error?b.message:String(b);e.warn(`Plugin error in ${w}: ${M}`)},"onHookError");await Ks(ue,p.plugins);const T=typeof t.profile=="string"?t.profile:void 0,k=C(async w=>{if(!T)return;const b=rr(w,O,xe),M=T.startsWith("/")?T:`${i}/${T}`;await $s(b,M),e.info(`Profile written to ${T}`)},"maybeWriteProfile"),x=p.taskRunner??{},ee=xs(i,t.cacheDir,x.cacheDirectory,p.sharedWorktreeCache),Ne=Ms(ee,i,p.branchScopedCache),Ge=_n(process.env.VIS_RUN_CONCURRENCY_LIMIT);Ge&&"invalid"in Ge&&e.warn(`VIS_RUN_CONCURRENCY_LIMIT=${Ge.invalid} is not a positive number; falling back to default concurrency.`);const Wr=Ge&&"value"in Ge?Ge.value:void 0,Kr=t.parallel??Wr??3,Lt=t.strictEnv??p.strictEnv??!1,et={dryRun:t.dryRun??!1,parallel:Kr,skipNxCache:!t.cache,summarize:t.summarize??!1,...x,cacheDirectory:Ne,dataDirectory:x.dataDirectory??at(i),onFingerprint:C(async(w,b)=>{await ue.callHook("task:fingerprint",w,b)},"onFingerprint")},Bt=Ts(x.remoteCache);if(Bt){const w=Hn(t.cacheMode),b=zn(t.cacheBackend);et.remoteCache={...Bt,...w?{mode:w}:{},...b?{backend:b}:{}}}else(t.cacheMode||t.cacheBackend)&&e.warn("[vis run] --cache-mode and --cache-backend require a `remoteCache` block in vis.config.ts (or TURBO_API env); ignoring.");const Yr=process.stdout.isTTY&&!rt,Xr=p.tui?.autoExit??!1,Nt={args:{parallel:et.parallel,targets:[S]},autoExit:Xr,projectNames:j,tasks:[...N,...A]},Gt=typeof t.retryBudget=="number"?t.retryBudget:void 0,_t=Gt===void 0?void 0:Nn(Gt),qt=new Ys(ue,Oe),Ht=new Ds(i),zt=qo(typeof t.outputStyle=="string"?t.outputStyle.toLowerCase():void 0);if(q.satisfiedServices.length>0)for(const w of q.satisfiedServices){const b=q.serviceDependentsByServiceId.get(w.id)??[];try{await ue.callHook("service:attach",w,b)}catch(M){Oe("service:attach",M)}}await ue.callHook("run:before",{tasks:N,workspaceRoot:i});const Ue=t.stopServices===!0;let Vt=!1;const Ut=C(()=>{if(Vt)return;Vt=!0,de&&de.dispose().catch(()=>{});const w=Ue?[...Ce.values()]:void 0;On({extraPids:w,pidFiles:ye,runDir:Ie})},"runCleanupOnce"),tt=C(()=>{Ut()},"onCleanupSignal"),Wt=ye.length>0||Ie!==void 0||Ue&&ke.length>0;Wt&&(process.on("SIGINT",tt),process.on("SIGTERM",tt));try{if(Yr){const w=new Map,b=Go({...Nt,onRetryService:de?P=>de.retry(P):void 0,outputStyle:zt,serviceDockStore:we,stdinRegistry:w}),{lifeCycle:M,store:W}=b,K=new sr([M,qt,Ht]),Q=Tr({affectedFiles:v,currentOs:X,hooks:ue,initCwd:d,lifeCycle:K,mutexPool:new Map,onOutput:C((P,H)=>{de&&Pe.has(P)?de.onTaskOutput(P,H):W.addOutput(P,H)},"onOutput"),onOutputReplace:C((P,H)=>{W.setOutput(P,H)},"onOutputReplace"),retryBudget:_t,serviceEnvByTaskId:be,serviceEventBridge:de??void 0,stdinRegistry:w,strictEnv:Lt,workspaceRoot:i});let G="rerun",B=null,ne=new Map;for(;G!=="quit";){if(G==="rerun"){if(ne=await ir(N,et,{lifeCycle:K,projectGraph:$,taskExecutor:Q,taskGraph:O,workspaceRoot:i}),A.length>0&&!t.failFast){const P=new Promise(H=>{const z=W.subscribe(()=>{const te=W.getSnapshot();(te.rerunRequested||te.retryTaskId)&&(z(),H())});b.renderIsDone.then(()=>{z(),H()}).catch(()=>{z(),H()})});await Sr(A,i,v,d,{abortSignal:P,lifeCycle:K,store:W},be)}}else if(G==="retry"&&B){const P=N.find(z=>z.id===B),H=P?.overrides.command;if(P&&H){const z=P.projectRoot??i,te=z.startsWith("/")?z:`${i}/${z}`;K.startTasks?.([P]);const Se=new xr($t),Me=(await ct([{command:H,cwd:te,name:P.id,ptySize:{cols:process.stdout.columns??80,rows:process.stdout.rows??24},stdin:"pty"}],{onEvent:C(re=>{re.kind==="started"&&re.write&&w.set(P.id,{kill:re.kill,resize:re.resize,write:re.write}),(re.kind==="stdout"||re.kind==="stderr")&&re.text&&(Se.write(re.text),W.setOutput(P.id,Se.toString())),re.kind==="close"&&w.delete(P.id)},"onEvent")})).closeEvents[0];K.endTasks?.([{code:Me?.exitCode??1,status:Me?.exitCode===0?"success":"failure",task:P,terminalOutput:W.getSnapshot().outputs.get(P.id)}])}else P&&K.endTasks?.([{code:1,status:"failure",task:P,terminalOutput:`No command configured for ${P.id}`}]);B=null,W.markDone()}G=await new Promise(P=>{const H=W.subscribe(()=>{const z=W.getSnapshot();z.rerunRequested&&(W.acknowledgeRerun(),H(),P("rerun")),z.retryTaskId&&(B=W.acknowledgeRetry(),H(),P("retry"))});b.renderIsDone.then(()=>{H(),P("quit")}).catch(()=>{H(),P("quit")})})}await b.renderIsDone,await ue.callHook("run:after",ne),await k(ne),pe>0&&(e.info(""),Ue?e.info(`${String(pe)} service(s) stopped (--stop-services).`):e.info(`${String(pe)} service(s) started in the background. Run \`vis service stop --all\` to clean up.`))}else{const w=new Map,b=typeof t.log=="string"?t.log.toLowerCase():"",M=b==="labeled"||b==="grouped"||b==="interleaved"?b:void 0,W=M?Is(M):void 0,K=new sr([new zo({...Nt,ciGrouping:o?.run?.ciGrouping??"auto",logReporter:W,outputStyle:zt}),qt,Ht]),Q=Tr({affectedFiles:v,currentOs:X,hooks:ue,initCwd:d,lifeCycle:K,mutexPool:w,retryBudget:_t,serviceEnvByTaskId:be,serviceEventBridge:de??void 0,strictEnv:Lt,workspaceRoot:i}),G=C(async()=>{const z=Date.now(),te=await ir(N,et,{lifeCycle:K,projectGraph:$,taskExecutor:Q,taskGraph:O,workspaceRoot:i}),Se=Date.now()-z;if(t.summarize){const $e=rr(te,O,xe);await Cs($e,i,{dataDirectory:at(i)})}let Me=!1;for(const[,$e]of te)$e.status==="failure"&&(Me=!0);const re=As(te,Se),De=Ls(i),_e=Bs(i,Se,De);return e.info(""),e.info(` ${re}${_e?` ${_e}`:""}`),{hasFailure:Me,results:te,runHistory:De}},"runOnce"),B=await G();await ue.callHook("run:after",B.results),await k(B.results);const{hasFailure:ne}=B;if(t.watch){const z=j.map(ce=>{const he=c.projects[ce]?.root;if(he)return he.startsWith("/")?he:`${i}/${he}`}).filter(ce=>ce!==void 0),te=N;let Se;const Me=C(ce=>{const he=on(te,ce);return Se=he.filter,N=he.tasks,he.tasks.length},"applyFilter");let re=!1,De=B.results;const _e=C(()=>{const ce=vr(De,i);if(ce.directories.length>0&&ce.files.size>0){const he=en(ce.files,i,ce.directories);return{handle:yr({filter:he,onChange:Kt,paths:ce.directories}),mode:"tracked"}}return{handle:yr({onChange:Kt,paths:z}),mode:"roots"}},"buildHandle");let $e;const Kt=C(async ce=>{if(!re){re=!0;try{e.info(`Change detected in ${ce.length} file(s), rerunning…`),De=(await G()).results,$e?.close(),$e=_e().handle}finally{re=!1}}},"onChangeHandler"),Yt=_e();$e=Yt.handle;const Jr=Yt.mode==="tracked"?`Watching ${String(vr(De,i).files.size)} tracked file(s)`:`Watching ${String(z.length)} project root(s)`;e.info(`${Jr} — edit a file to rerun, press h for keybinds, q to quit.`);const mt=C(async()=>{if(!re){re=!0;try{if(N.length===0){e.info("No tasks match the active filter — press a to clear it.");return}De=(await G()).results,$e?.close(),$e=_e().handle}finally{re=!1}}},"triggerRerun");await new Promise(ce=>{let he=!1,Xt;const Jt=C(()=>{Qt()},"onSigint"),Qt=C(()=>{he||(he=!0,Xt?.close(),process.off("SIGINT",Jt),$e?.close(),ce())},"exit");process.on("SIGINT",Jt),Xt=dn({handlers:{onClearFilter:C(async()=>{const We=Me(void 0);e.info(`Filter cleared — running ${String(We)} task(s).`),await mt()},"onClearFilter"),onFilter:C(async We=>{const Qr=Se,Zt=Me(We);if(Zt===0){e.info(`Filter "${We}" matched no projects — keeping previous filter.`),Me(Qr);return}e.info(`Filter "${We}" matched ${String(Zt)} task(s).`),await mt()},"onFilter"),onHelp:C(()=>{cn(process.stdout)},"onHelp"),onQuit:C(()=>{Qt()},"onQuit"),onRerun:mt}})});return}if(t.flaky!==!1){const z=Ns(i,{minRuns:2},B.runHistory);if(z.length>0){e.info(""),e.info("Flaky tasks (based on historical runs):"),e.info("");for(const te of Gs(z))e.info(` ${te}`);e.info("")}}const P=[];for(const[z,te]of B.results)te.retryAttempts&&te.retryAttempts>0&&P.push(z);const H=t.failOnRetry===!0&&P.length>0;if(H){const z=P.slice(0,5),te=P.length-z.length,Se=te>0?`${z.join(", ")}, and ${String(te)} more`:z.join(", ");e.warn(""),e.warn(`--fail-on-retry: ${String(P.length)} task(s) succeeded only after retry: ${Se}`)}if(ne||H)throw new Error(H&&!ne?"Some tasks succeeded only after retry (--fail-on-retry).":"Some tasks failed.");A.length>0&&!t.failFast&&await Sr(A,i,v,d,void 0,be),pe>0&&(e.info(""),Ue?e.info(`${String(pe)} service(s) stopped (--stop-services).`):e.info(`${String(pe)} service(s) started in the background. Run \`vis service stop --all\` to clean up.`))}}finally{Ut(),Wt&&(process.off("SIGINT",tt),process.off("SIGTERM",tt)),Ue&&ke.length>0&&await Promise.all(ke.map(async w=>{try{await Xs(i,w)}catch{}}))}},"execute");export{Nn as createRetryBudget,ga as default};