@flisk-sh/flisk 1.3.190 → 1.3.192

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 (153) hide show
  1. package/CHANGELOG.md +9 -9
  2. package/LICENSE +1 -1
  3. package/README.md +41 -41
  4. package/Tiltfile +2 -2
  5. package/cli/bin/{flisk.js → tdk.js} +1 -1
  6. package/cli/dist/cli.js +59 -0
  7. package/cli/dist/commands/__tests__/project-e2e-helpers.js +2 -2
  8. package/cli/dist/commands/completion.js +26 -26
  9. package/cli/dist/commands/config.js +1 -1
  10. package/cli/dist/commands/import.js +4 -4
  11. package/cli/dist/commands/maintainers.js +1 -1
  12. package/cli/dist/commands/mcp.js +1 -4
  13. package/cli/dist/commands/project.js +10 -2
  14. package/cli/dist/commands/resource.js +1 -1
  15. package/cli/dist/commands/ui.js +1 -1
  16. package/cli/dist/commands/up.js +77 -3
  17. package/cli/dist/commands/upgrade.js +28 -14
  18. package/cli/dist/generator/extension-fetch.js +3 -3
  19. package/cli/dist/generator/template-engine.js +8 -8
  20. package/cli/dist/mcp/tools.js +2 -5
  21. package/cli/dist/program.js +2 -0
  22. package/cli/dist/utils/cli-command.js +107 -0
  23. package/cli/dist/utils/cold-preflight.js +2 -1
  24. package/cli/dist/utils/constants.js +1 -1
  25. package/cli/dist/utils/doctor-fix.js +4 -5
  26. package/cli/dist/utils/doctor-runtime.js +1 -1
  27. package/cli/dist/utils/doctor-starlark.js +1 -1
  28. package/cli/dist/utils/doctor-wiring.js +2 -2
  29. package/cli/dist/utils/env-selection.js +201 -0
  30. package/cli/dist/utils/env-validator.js +6 -0
  31. package/cli/dist/utils/one-command.js +50 -0
  32. package/cli/dist/utils/platform.js +2 -6
  33. package/cli/dist/utils/project-templates.js +11 -7
  34. package/cli/dist/utils/secret-redaction.js +15 -6
  35. package/cli/dist/utils/service-manifest.js +1 -1
  36. package/cli/dist/utils/smoke.js +2 -2
  37. package/cli/dist/utils/tar.js +1 -1
  38. package/cli/dist-bundle/{chunk-BZ4H7MM4.js → chunk-42IVF3YT.js} +2 -2
  39. package/cli/dist-bundle/chunk-GOEBYLFN.js +2 -0
  40. package/cli/dist-bundle/chunk-KGKKDD4K.js +2 -0
  41. package/cli/dist-bundle/chunk-QR6O2A7L.js +34 -0
  42. package/cli/dist-bundle/chunk-RHSMS45X.js +438 -0
  43. package/cli/dist-bundle/chunk-XYFVXSEO.js +75 -0
  44. package/cli/dist-bundle/cli.js +342 -370
  45. package/cli/dist-bundle/cold-preflight-ZJAU3E7K.js +2 -0
  46. package/cli/dist-bundle/{extension-fetch-J4FFH7TJ.js → extension-fetch-6XNTDF44.js} +1 -1
  47. package/cli/dist-bundle/one-command-A4R272U3.js +4 -0
  48. package/cli/dist-bundle/project-FOAR7E55.js +2 -0
  49. package/cli/dist-bundle/project-templates-BHURA3LT.js +2 -0
  50. package/cli/dist-bundle/url-actions-D6ROTHZG.js +2 -0
  51. package/cli/package.json +2 -4
  52. package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +1 -1
  53. package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +1 -1
  54. package/cli/shared-platform-engineering/docker-templates/install-deps.sh +1 -1
  55. package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +1 -1
  56. package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +1 -1
  57. package/cli/templates/Tiltfile.hbs +1 -1
  58. package/discovery/AGENTS.md +1 -1
  59. package/discovery/TILT_DISCOVERY.star +3 -3
  60. package/discovery/Tiltfile +3 -3
  61. package/discovery/config.star +1 -1
  62. package/discovery/constants.star +1 -1
  63. package/discovery/discovery_orchestrator.star +1 -1
  64. package/discovery/identity-management-frontend/service.yaml +1 -1
  65. package/discovery/json_manifest_scanner.star +1 -1
  66. package/discovery/manifest/constants.star +1 -1
  67. package/discovery/manifest/loading.star +2 -2
  68. package/discovery/manifest/normalize.star +1 -1
  69. package/discovery/registry.star +1 -1
  70. package/discovery/resource_snapshot.py +1 -1
  71. package/discovery/resource_snapshot.star +1 -1
  72. package/discovery/test_resource_snapshot.py +2 -2
  73. package/engine/AGENTS.md +7 -7
  74. package/engine/README.md +1 -1
  75. package/engine/Tiltfile +3 -3
  76. package/engine/assets/docker/wake-gateway/decide.ts +1 -1
  77. package/engine/assets/docker/wake-gateway/server.ts +1 -1
  78. package/engine/assets/scripts/mac-m1-resource-monitor.sh +8 -8
  79. package/engine/lifecycle/orchestrator.star +6 -6
  80. package/engine/paths.star +1 -1
  81. package/engine/schemas/project-schema.json +2 -2
  82. package/engine/schemas/service-schema.json +3 -3
  83. package/engine/scripts/debug-container.sh +2 -2
  84. package/engine/spec.master +1 -1
  85. package/engine/topologies/platform/docker/compose/compose.star +1 -1
  86. package/engine/topologies/platform/docker/compose/traefik_standalone.star +1 -1
  87. package/engine/topologies/platform/docker/config/healthcheck.star +1 -1
  88. package/engine/topologies/platform/docker/constants.star +2 -2
  89. package/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +3 -3
  90. package/engine/topologies/platform/docker/layers/l1_base_layers.star +1 -1
  91. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +1 -1
  92. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +1 -1
  93. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +1 -1
  94. package/engine/topologies/platform/docker/layers/prisma/constants.star +1 -1
  95. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +2 -2
  96. package/engine/topologies/platform/docker/networking/api_path_constants.star +1 -1
  97. package/engine/topologies/platform/docker/networking/traefik_static_routes.star +1 -1
  98. package/engine/topologies/platform/docker/secrets/env_secrets.star +1 -1
  99. package/engine/topologies/platform/docker/secrets/infisical.star +1 -1
  100. package/engine/topologies/platform/security/secrets.star +1 -1
  101. package/engine/topologies/tilt/common/utils.star +5 -3
  102. package/engine/topologies/tilt/common/utils_debug.star +1 -1
  103. package/engine/topologies/tilt/common/utils_deterministic.star +1 -1
  104. package/engine/topologies/tilt/common/utils_env.star +23 -3
  105. package/engine/topologies/tilt/config/profiles.star +1 -1
  106. package/engine/topologies/tilt/generators/infisical/organization.star +1 -1
  107. package/engine/topologies/tilt/generators/npmrc.star +4 -4
  108. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +1 -1
  109. package/engine/topologies/tilt/generators/vite/helpers.star +1 -1
  110. package/engine/topologies/tilt/generators/vite/templates.star +1 -1
  111. package/engine/topologies/tilt/manifest/json_to_yaml.py +2 -2
  112. package/engine/topologies/tilt/manifest/loader.star +1 -1
  113. package/engine/topologies/tilt/manifest/schema.star +2 -2
  114. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +3 -3
  115. package/engine/topologies/tilt/manifest/tests/test_validator.star +2 -2
  116. package/engine/topologies/tilt/manifest/yaml_to_json.py +1 -1
  117. package/engine/topologies/tilt/resources/databases.star +1 -1
  118. package/engine/topologies/tilt/resources/infra-loader.star +8 -6
  119. package/engine/topologies/tilt/resources/libs_paths.star +1 -1
  120. package/engine/topologies/tilt/resources/libs_resource_definition.star +1 -1
  121. package/engine/topologies/tilt/resources/libs_setup.star +1 -1
  122. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +13 -8
  123. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +1 -1
  124. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +1 -1
  125. package/engine/topologies/tilt/resources/watchers.star +7 -7
  126. package/engine/where-things-live.star +1 -1
  127. package/examples/tdk-example/LICENSE +1 -1
  128. package/examples/tdk-example/Tiltfile +7 -7
  129. package/examples/tdk-example/services/shop/orders-api/service.json +1 -1
  130. package/examples/tdk-example/services/shop/orders-app/index.html +1 -1
  131. package/examples/tdk-example/services/shop/orders-app/service.json +1 -1
  132. package/examples/tdk-example/services/shop/orders-worker/service.json +1 -1
  133. package/ext/Tiltfile +3 -3
  134. package/ext/ide-components/code_viewer/server.py +1 -1
  135. package/ext/ide-components/config_inspector/server.py +1 -1
  136. package/ext/ide-components/file_browser/server.py +1 -1
  137. package/ext/ide-components/shared/config_service.py +2 -2
  138. package/ext/ide-components/shared/file_utils.py +2 -2
  139. package/ext/ide-components/shared/http_utils.py +1 -1
  140. package/ext/ide-components/shared/syntax_highlighter.py +1 -1
  141. package/ext/ide-components/shared/template_engine.py +1 -1
  142. package/ext/ide-components/shared/templates/base.html +1 -1
  143. package/ext/ide-components/shared/test_config_service.py +1 -1
  144. package/ext/ide-components/shared/tilt_integration.py +1 -1
  145. package/ext/ui-enhancements/tiltfile.py +1 -1
  146. package/package.json +6 -10
  147. package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +1 -1
  148. package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +1 -1
  149. package/shared-platform-engineering/docker-templates/install-deps.sh +1 -1
  150. package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +1 -1
  151. package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +1 -1
  152. package/cli/dist-bundle/chunk-CLCUIDBH.js +0 -510
  153. package/cli/dist-bundle/cold-preflight-SY26O2IG.js +0 -2
@@ -0,0 +1,75 @@
1
+ import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
+ import{c as xt,e as vt}from"./chunk-42IVF3YT.js";import{a as Ce}from"./chunk-6EA4DGCY.js";function wt(e,t,r){let n=e.indexOf(t);if(n===-1)return e;let o=t.length,s=0,i="";do i+=e.slice(s,n)+t+r,s=n+o,n=e.indexOf(t,s);while(n!==-1);return i+=e.slice(s),i}function _t(e,t,r,n){let o=0,s="";do{let i=e[n-1]==="\r";s+=e.slice(o,i?n-1:n)+t+(i?`\r
3
+ `:`
4
+ `)+r,o=n+1,n=e.indexOf(`
5
+ `,o)}while(n!==-1);return s+=e.slice(o),s}var At=(e=0)=>t=>`\x1B[${t+e}m`,Ie=(e=0)=>t=>`\x1B[${38+e};5;${t}m`,De=(e=0)=>(t,r,n)=>`\x1B[${38+e};2;${t};${r};${n}m`,Wr=e=>`\x1B[58;5;${e<90?e-30:e-90+8}m`,g={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],underlineDouble:["4:2",24],underlineCurly:["4:3",24],underlineDotted:["4:4",24],underlineDashed:["4:5",24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]},underlineColor:{underlineBlack:["58;5;0",59],underlineRed:["58;5;1",59],underlineGreen:["58;5;2",59],underlineYellow:["58;5;3",59],underlineBlue:["58;5;4",59],underlineMagenta:["58;5;5",59],underlineCyan:["58;5;6",59],underlineWhite:["58;5;7",59],underlineBlackBright:["58;5;8",59],underlineGray:["58;5;8",59],underlineGrey:["58;5;8",59],underlineRedBright:["58;5;9",59],underlineGreenBright:["58;5;10",59],underlineYellowBright:["58;5;11",59],underlineBlueBright:["58;5;12",59],underlineMagentaBright:["58;5;13",59],underlineCyanBright:["58;5;14",59],underlineWhiteBright:["58;5;15",59]}},Rt=Object.keys(g.modifier),Ne=Object.keys(g.color),Fe=Object.keys(g.bgColor),Hr=Object.keys(g.underlineColor),$t=[...Ne,...Fe];function Yr(){let e=new Map;for(let[t,r]of Object.entries(g)){for(let[n,o]of Object.entries(r))g[n]={open:`\x1B[${o[0]}m`,close:`\x1B[${o[1]}m`},r[n]=g[n],e.set(Number.parseInt(o[0],10),o[1]);Object.defineProperty(g,t,{value:r,enumerable:!1})}return Object.defineProperty(g,"codes",{value:e,enumerable:!1}),g.color.close="\x1B[39m",g.bgColor.close="\x1B[49m",g.underlineColor.close="\x1B[59m",g.color.ansi=At(),g.color.ansi256=Ie(),g.color.ansi16m=De(),g.bgColor.ansi=At(10),g.bgColor.ansi256=Ie(10),g.bgColor.ansi16m=De(10),g.underlineColor.ansi=Wr,g.underlineColor.ansi256=Ie(20),g.underlineColor.ansi16m=De(20),Object.defineProperties(g,{rgbToAnsi256:{value(t,r,n){return t===r&&r===n?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)},enumerable:!1},hexToRgb:{value(t){let r=/[\da-f]{6}|[\da-f]{3}/i.exec(t.toString(16));if(!r)return[0,0,0];let[n]=r;n.length===3&&(n=[...n].map(s=>s+s).join(""));let o=Number.parseInt(n,16);return[o>>16&255,o>>8&255,o&255]},enumerable:!1},hexToAnsi256:{value:t=>g.rgbToAnsi256(...g.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let r,n,o;if(t>=232)r=((t-232)*10+8)/255,n=r,o=r;else{t-=16;let a=t%36;r=Math.floor(t/36)/5,n=Math.floor(a/6)/5,o=a%6/5}let s=Math.max(r,n,o)*2;if(s===0)return 30;let i=30+(Math.round(o)<<2|Math.round(n)<<1|Math.round(r));return s===2&&(i+=60),i},enumerable:!1},rgbToAnsi:{value:(t,r,n)=>g.ansi256ToAnsi(g.rgbToAnsi256(t,r,n)),enumerable:!1},hexToAnsi:{value:t=>g.ansi256ToAnsi(g.hexToAnsi256(t)),enumerable:!1}}),g}var qr=Yr(),O=qr;import je from"node:process";import Jr from"node:os";import Ot from"node:tty";function _(e,t=globalThis.Deno?globalThis.Deno.args:je.argv){let r=e.startsWith("-")?"":e.length===1?"-":"--",n=t.indexOf(r+e),o=t.indexOf("--");return n!==-1&&(o===-1||n<o)}var{env:S}=je,de;_("no-color")||_("no-colors")||_("color=false")||_("color=never")?de=0:(_("color")||_("colors")||_("color=true")||_("color=always"))&&(de=1);function It(){return/^\d+$/.test(S.FORCE_COLOR)}function zr(){if("FORCE_COLOR"in S){if(S.FORCE_COLOR==="false")return 0;if(S.FORCE_COLOR==="true"||S.FORCE_COLOR.length===0)return 1;if(It())return Math.min(Number.parseInt(S.FORCE_COLOR,10),3)}}function Xr(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function Qr(e,{streamIsTTY:t,sniffFlags:r=!0}={}){let n=zr();n!==void 0&&(de=n);let o=r?de:n;if(o===0)return 0;if(r){if(_("color=16m")||_("color=full")||_("color=truecolor"))return 3;if(_("color=256"))return 2}if(o!==void 0&&It())return o;if("TF_BUILD"in S&&"AGENT_NAME"in S)return 1;if(e&&!t&&o===void 0)return 0;let s=o||0;if(S.TERM==="dumb")return s;if(je.platform==="win32"){let i=Jr.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in S)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(i=>i in S)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(i=>i in S)||S.CI_NAME==="codeship"?1:s;if("TEAMCITY_VERSION"in S)return/^(?:9\.0*[1-9]\d*\.|\d{2,}\.)/.test(S.TEAMCITY_VERSION)?1:0;if(S.COLORTERM==="truecolor"||S.TERM==="xterm-kitty"||S.TERM==="xterm-ghostty"||S.TERM==="wezterm")return 3;if("TERM_PROGRAM"in S){let i=Number.parseInt((S.TERM_PROGRAM_VERSION||"").split(".",1)[0],10);switch(S.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(?:color)?$/i.test(S.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(S.TERM)||"COLORTERM"in S?1:s}function Ct(e,t={}){let r=Qr(e,{streamIsTTY:e&&e.isTTY,...t});return Xr(r)}var Zr={stdout:Ct({isTTY:Ot.isatty(1)}),stderr:Ct({isTTY:Ot.isatty(2)})},Dt=Zr;var{stdout:Nt,stderr:Ft}=Dt,te=Symbol("GENERATOR"),re=Symbol("STYLER"),me=Symbol("IS_EMPTY"),pe=Symbol("LEVEL"),ne=Object.create(null),jt=e=>{if(!Number.isSafeInteger(e)||e<0||e>3)throw new Error("The `level` should be an integer from 0 to 3")},en={enumerable:!0,get(){return this[pe]},set(e){jt(e),this[pe]=e}},tn=(e,t={})=>{t.level!==void 0&&jt(t.level);let r=Nt?Nt.level:0;e[pe]=t.level===void 0?r:t.level};var rn=e=>{let t=(...r)=>r.join(" ");return tn(t,e),Object.setPrototypeOf(t,oe.prototype),t};function oe(e){return rn(e)}Object.setPrototypeOf(oe.prototype,Function.prototype);for(let[e,t]of Object.entries(O))ne[e]={get(){let r=Le(this,Pt(t.open,t.close,this[re]),this[me]);return Object.defineProperty(this,e,{value:r}),r}};ne.visible={get(){let e=Le(this,this[re],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var nn=(e,t)=>{let r=O[t];if(e==="rgb"){let o=(i,a,l)=>r.ansi(O.rgbToAnsi(i,a,l));return[o,o,(i,a,l)=>r.ansi256(O.rgbToAnsi256(i,a,l)),r.ansi16m]}if(e==="hex"){let o=i=>r.ansi(O.hexToAnsi(i));return[o,o,i=>r.ansi256(O.hexToAnsi256(i)),i=>r.ansi16m(...O.hexToRgb(i))]}let n=o=>r.ansi(O.ansi256ToAnsi(o));return[n,n,r.ansi256,r.ansi256]},on=["rgb","hex","ansi256"];for(let e of on){let t=e[0].toUpperCase()+e.slice(1);for(let[r,n]of[[e,"color"],["bg"+t,"bgColor"],["underline"+t,"underlineColor"]]){let{close:o}=O[n],s=nn(e,n);ne[r]={get(){let i=function(a,l,d){let m=s[this.level](a,l,d);return Le(this,Pt(m,o,this[re]),this[me])};return Object.defineProperty(this,r,{value:i}),i}}}}var sn=Object.defineProperties(()=>{},{...ne,level:{enumerable:!0,get(){return this[te].level},set(e){this[te].level=e}}}),Pt=(e,t,r)=>{let n,o;return r===void 0?(n=e,o=t):(n=r.openAll+e,o=t+r.closeAll),{open:e,close:t,openAll:n,closeAll:o,parent:r}},Le=(e,t,r)=>{let n=(...o)=>o.length===1?Pe(n,""+o[0]):o.length===2?Pe(n,`${o[0]??""} ${o[1]??""}`):Pe(n,o.join(" "));return Object.setPrototypeOf(n,sn),n[te]=e[te]??e,n[re]=t,n[me]=r,n},Pe=(e,t)=>{if(e[te][pe]<=0||!t)return e[me]?"":t;let r=e[re];if(r===void 0)return t;let{openAll:n,closeAll:o}=r;if(t.includes("\x1B"))for(;r!==void 0;)t=wt(t,r.close,r.open),r=r.parent;let s=t.indexOf(`
6
+ `);return s!==-1&&(t=_t(t,o,n,s)),n+t+o};Object.defineProperties(oe.prototype,{...ne,level:en});var an=oe(),Ks=oe({level:Ft?Ft.level:0});var p=an;var Ys="Container Runtime",W="bring-your-own";var j="database-management",C=".tiltignore",Lt="service.json",se="docker-compose.yml",ie=".autogenerated",he="TILT_TECH_STACK.star",ge="TILT_RESOURCE_DEFAULTS.star",H="project.json",B="package.json",qs=[he,ge,"spec.master"],Js=["backend","frontend","library","sdk","worker","migrator","mcp","agent",W],zs={backend:["dev","build","start"],worker:["dev","build","start"],migrator:["dev","build","start"],mcp:["dev","build","start"],agent:["dev","build","start"],frontend:["dev","build"],library:["dev","build"],sdk:["dev","build"],[W]:[]};var Me=["monitoring","elk","debezium","golden_image","verdaccio"],E={frontend:{base:3e3,min:3e3,max:3999,range:"3000-3999"},backend:{base:4e3,min:4e3,max:4999,range:"4000-4999"},mcp:{base:4e3,min:4e3,max:5999,range:"4000-5999"},agent:{base:4e3,min:4e3,max:5999,range:"4000-5999"},[W]:{base:4e3,min:4e3,max:5999,range:"4000-5999"},worker:{base:6e3,min:6e3,max:6999,range:"6000-6999"},health:{base:5e3,min:5e3,max:5999,range:"5000-5999"},migrator:{base:7e3,min:7e3,max:7999,range:"7000-7999"}},Ue={tiltUi:10350,traefik:8080},Be="https://flisk.sh/docs/quickstart/";var Mt=["node_modules",".git",".tilt",".tilt-engine","dist","build",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests",".github",".vscode","docs"],Ut=["Dockerfile",se,"docker-compose.yaml","Tiltfile","vite.config.ts","tsconfig.json","tsconfig.build.json"],cn={infra:"\u{1F3D7}\uFE0F",core:"\u{1F527}",api:"\u26A1",app:"\u{1F3A8}",orchestrator:"\u2699\uFE0F"};function Xs(e){let t=e.toLowerCase();for(let[r,n]of Object.entries(cn))if(t.includes(r))return n;return"\u{1F4E6}"}import{existsSync as un}from"node:fs";import{dirname as fn,join as dn,resolve as Gt}from"node:path";import{cwd as pn}from"node:process";var Bt={name:"tdk-cli-internal",private:!0,version:"1.3.192",description:"Flisk CLI \u2014 start services on your machine.",keywords:["flisk","tilt","cli","local-dev","microservices"],homepage:"https://github.com/flisk-sh/flisk#readme",bugs:{url:"https://github.com/flisk-sh/flisk/issues"},repository:{type:"git",url:"git+https://github.com/flisk-sh/flisk.git",directory:"cli"},license:"MIT",author:"Flisk Team",type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",bin:{flisk:"bin/tdk.js"},files:["dist","dist-bundle","bin","templates","README.md","Tiltfile","engine","discovery","specs","ext","!ext/ide-components/code_executor","shared-platform-engineering/docker-templates"],scripts:{build:"tsc && node scripts/bundle.mjs","build:watch":"tsc --watch","check:dist":"npm run build && ../scripts/check-cli-dist.sh",lint:"biome check .","lint:fix":"biome check . --write",typecheck:"tsc --project tsconfig.typecheck.json",clean:"rm -rf dist",dev:"bun run build:watch",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage --coverage.reportOnFailure --coverage.reporter=text --coverage.reporter=html --coverage.reporter=json-summary --coverage.reporter=json --coverage.reportsDirectory=coverage --reporter=default --reporter=json --outputFile.json=test-results/vitest.json",prepack:"../scripts/stage-npm-engine.sh && npm run build"},dependencies:{commander:"^15.0.0",handlebars:"^4.7.8"},devDependencies:{"@biomejs/biome":"^2.5.13","@types/node":"^22.0.0","@types/react":"^19.3.0","@vitest/coverage-v8":"^5.0.2",ajv:"^8.17.1",chalk:"^6.0.1",esbuild:"^0.28.2",ink:"^8.0.0",knip:"^6.38.0",react:"^19.3.0","react-devtools-core":"^8.0.0",typescript:"^7.0.2",vite:"^8.3.3",vitest:"^5.0.0"},engines:{node:">=22.12.0"}};function D(e=pn()){let t=Gt(e),r=Gt("/");for(;t!==r;){if(un(dn(t,".tdk",H)))return t;let n=fn(t);if(n===t)break;t=n}return null}var Se=null;function mn(){if(Se)return Se;let e=Bt;if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Invalid package.json: expected object");let t=e;return Se={name:String(t.name??"@flisk-sh/flisk"),version:String(t.version??"0.0.0"),fullPackage:t},Se}function si(){return mn().version}import{existsSync as Vt}from"node:fs";import{delimiter as Kt,extname as Wt,join as Ht}from"node:path";import{delimiter as ci,extname as hn}from"node:path";function ae(){return process.platform==="win32"}function gn(e){return e==="linux"?"linux":e==="darwin"?"darwin":e==="win32"?"windows":null}function Sn(e){return e==="x64"?"amd64":e==="arm64"?"arm64":null}function yn(e,t){let r=gn(e),n=Sn(t);if(!r||!n||r==="windows"&&n!=="amd64")return null;let o=`tdk-${r}-${n}`;return r==="windows"?`${o}.exe`:o}function li(){return yn(process.platform,process.arch)}function ui(){return ae()?"tdk.exe":"flisk"}function Ge(e,t=ae()){return t?hn(e)?[e]:[e,`${e}.exe`,`${e}.cmd`,`${e}.bat`]:[e]}function ye(e){let t=process.env.PATH??process.env.Path??"",r=ae(),n=Ge(e,r);if(r&&!Wt(e))for(let o of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let s=o.toLowerCase();s&&!n.includes(`${e}${s}`)&&n.push(`${e}${s}`)}for(let o of t.split(Kt))if(o)for(let s of n){let i=Ht(o,s);if(Vt(i))return i}return null}function hi(e){let t=process.env.PATH??process.env.Path??"",r=ae(),n=Ge(e,r);if(r&&!Wt(e))for(let i of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let a=i.toLowerCase();a&&!n.includes(`${e}${a}`)&&n.push(`${e}${a}`)}let o=[],s=new Set;for(let i of t.split(Kt))if(i)for(let a of n){let l=Ht(i,a);if(!Vt(l))continue;let d=r?l.toLowerCase():l;s.has(d)||(s.add(d),o.push(l))}return o}import{execFileSync as En,execSync as kn}from"node:child_process";var Yt=1e4;function qt(){let e=!1;if(process.platform==="win32")try{return En(ye("docker")??"docker",["ps"],{stdio:"ignore",timeout:Yt,windowsHide:!0}),"running"}catch(t){return t.code==="ETIMEDOUT"?"unresponsive":"missing"}for(let t of["docker ps","colima status","podman ps"])try{return kn(t,{stdio:"ignore",timeout:Yt}),"running"}catch(r){r.code==="ETIMEDOUT"&&(e=!0)}return e?"unresponsive":"missing"}function Ee(e,t){return e[t]??0}function Tn(e,t){let r=Array.from({length:t.length+1},(n,o)=>o);for(let n=1;n<=e.length;n++){let o=[n];for(let s=1;s<=t.length;s++){let i=e[n-1]===t[s-1]?0:1;o[s]=Math.min(Ee(o,s-1)+1,Ee(r,s)+1,Ee(r,s-1)+i)}r=o}return Ee(r,t.length)}function bn(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length-1;r++)if(e[r]!==t[r]&&e[r]===t[r+1]&&e[r+1]===t[r]&&e.slice(0,r)===t.slice(0,r)&&e.slice(r+2)===t.slice(r+2))return!0;return!1}function Jt(e,t){if(e.length<2||t.length===0||t.includes(e))return;let r=e.toLowerCase(),n,o=Number.POSITIVE_INFINITY;for(let s of t){if(s.length===0)continue;let i=s.toLowerCase(),a=bn(r,i)?1:Tn(r,i),l=Math.max(1,Math.min(2,Math.floor(Math.max(r.length,i.length)/3)));a>l||(a<o||a===o&&(n===void 0||s<n))&&(n=s,o=a)}return n}import{spawn as xn}from"node:child_process";import{join as vn}from"node:path";function wn(e,t=[],r={}){return new Promise((n,o)=>{let s=[e,...t];r.verbose&&console.log(`Executing: tilt ${s.join(" ")}`);let i=xn(ye("tilt")??"tilt",s,{stdio:r.inheritStdio?"inherit":"pipe",shell:!1,windowsHide:process.platform==="win32",timeout:r.timeoutMs}),a="",l="";r.inheritStdio||(i.stdout?.on("data",d=>{a+=d.toString()}),i.stderr?.on("data",d=>{l+=d.toString()})),i.on("close",d=>{n({exitCode:d??1,stdout:a,stderr:l})}),i.on("error",d=>{o(new Error(`Failed to spawn tilt: ${d.message}`))})})}async function zt(){try{return(await wn("version",[],{inheritStdio:!1,timeoutMs:1e4})).exitCode===0}catch{return!1}}function _n(){let e=D();if(!e)throw N.notInProject();return vn(e,".tdk",".tdk-out","Tiltfile")}function Xt(e){let t=_n();e.push("-f",t)}function _i(e,t={}){let r=[];return Xt(r),t.focusTargets&&t.focusTargets.length>0&&r.push("--",`--focus=${t.focusTargets.join(",")}`),r.push(...e),t.verbose&&!t.quiet&&r.push("--verbose"),t.watch&&r.push("--watch"),r}function Ai(e={}){let t=[];return Xt(t),e.focusTargets&&e.focusTargets.length>0&&t.push("--",`--focus=${e.focusTargets.join(",")}`),t}function Qt(e){return e instanceof Error?e.message:String(e)}function Fi(e,t){if(process.env.TDK_VERBOSE){let r=t!==void 0?`: ${Qt(t)}`:"";console.warn(p.gray(`${e}${r}`))}}var A=class extends Error{suggestions;exitCode;constructor(t,r=[],n=1){super(t),this.name="TdkError",this.suggestions=r,this.exitCode=n}display(){We(this.message,void 0,this.suggestions)}exit(){this.display(),process.exit(this.exitCode)}},Ke=class extends Error{code;constructor(t=1){super(`process.exit(${t})`),this.name="ProcessExitError",this.code=t}};function Ve(e,t,r=!1){let n=new Set;for(let o of e){let s=Jt(o,t);s&&n.add(r?`Did you mean "${s}" for "${o}"?`:`Did you mean "${s}"?`)}return[...n]}var N={tiltNotInstalled:()=>new A("Tilt CLI is not installed",["Install Tilt: `brew install tilt` (macOS)","Or download from: https://docs.tilt.dev/install.html","Verify with: `tilt version`",`Setup guide: ${Be}`]),dockerNotAvailable:()=>new A("Docker (or a compatible container runtime) is not running",["Start Docker Desktop, then verify with: `docker ps`","Or start Colima: `colima start`","Or start the Docker service on Linux: `sudo systemctl start docker`",`Setup guide: ${Be}`]),dockerNotResponding:()=>new A("Docker is running but not responding (`docker ps` hung for 10s)",["Quit and reopen Docker Desktop, or run `colima restart`","Then verify with: `docker ps`"]),stackNotFound:(e,t=[])=>new A(`Stack "${e}" not found`,[...Ve([e],t),"Run `flisk stacks` to see available stacks","Run `flisk stack` to assign resources to a stack"]),resourceNotFound:(e,t=[])=>new A(`Resource "${e}" not found`,[...Ve([e],t),"Run `flisk resources` to list all resources","Check the resource name spelling"]),unknownServices:(e,t)=>{let r=Ve(e,t,e.length>1);return new A(`Unknown service ${e.join(", ")}. Valid names: ${t.join(", ")}`,r,2)},directoryExists:e=>new A(`Directory already exists: ${e}`,["Use `--path` to specify a different location","Remove the existing directory if no longer needed"]),invalidPath:e=>new A(`Invalid path: ${e}`,["Path must be within the project directory",'Path cannot contain special characters like <>:"|?*']),notInProject:()=>new A("Could not find project root (no .tdk/project.json found)",["Run this from within a Flisk project","Run `flisk project --yes` to initialize a new project"])};function ji(){let e=D();return e||N.notInProject().exit()}function An(e){e instanceof A&&e.exit(),We(Qt(e)),process.exit(1)}async function Rn(e,t){try{return await e()}catch(r){if(r instanceof Ke)throw r;return t?.verbose&&r instanceof Error&&r.stack&&console.error(p.gray(r.stack)),An(r)}}async function Pi(e,t){let r=[],n=qt();return n==="unresponsive"?r.push(N.dockerNotResponding()):n==="missing"&&r.push(N.dockerNotAvailable()),await zt()||r.push(N.tiltNotInstalled()),r.length>0&&(console.error(p.red(`
7
+ Flisk can't start - missing prerequisites:
8
+ `)),r.forEach((o,s)=>{s>0&&console.error(""),o.display()}),console.error(p.gray("\nRun `flisk doctor` for a full environment check.")),process.exit(1)),Rn(e,t)}function Li(e,t=1,r){We(e,void 0,r),process.exit(t)}function We(e,t,r){if(console.error(p.red(`\u274C ${e}`)),t&&console.error(p.gray(` ${t}`)),r&&r.length>0){console.error(p.yellow(`
9
+ \u{1F4A1} Suggestions:`));for(let n of r)console.error(p.cyan(` \u2192 ${n}`))}}function Mi(e,t){console.error(p.red(`
10
+ tilt ${e} failed with exit code ${t}`)),process.exit(t)}function $n(e,t,r){return e===1?t:r||`${t}s`}function er(e,t,r){return`${e} ${$n(e,t,r)}`}var On={month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"};function Gi(e){return new Date(e).toLocaleString("en-US",On)}function Vi(e){return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric"})}var He={success:{color:"green",icon:"\u2713",chalkFn:p.green},error:{color:"red",icon:"\u2717",chalkFn:p.red},warning:{color:"yellow",icon:"\u25CB",chalkFn:p.yellow},unknown:{color:"gray",icon:"?",chalkFn:p.gray}};function Ye(e){if(!e)return"unknown";let t=e.toLowerCase();return t==="ready"||t==="healthy"||t==="active"||t==="running"?"success":t==="error"||t==="failed"||t==="critical"||t==="stopped"?"error":t==="pending"||t==="starting"||t==="building"||t==="degraded"?"warning":"unknown"}function Ki(e){return He[Ye(e)].color}function Wi(e){return He[Ye(e)].icon}function Hi(e,t){return He[Ye(t)].chalkFn(e)}var Cn={resources:{singular:"resource",command:"flisk resource <name>",context:`
11
+ To create a resource:`},stacks:{singular:"stack",command:"flisk stack <stack-name>",context:`
12
+ To create a stack, use:`},services:{singular:"service",command:"flisk resource <name>",context:`
13
+ To create a service:`},"stack-services":{singular:"service",command:"flisk resource <name> --stack <stack-name>",context:`
14
+ To add services to this stack:`}};function Yi(e,t){let r=Cn[e];console.log(t?p.yellow(`No ${r.singular}s found${t}.`):p.yellow(`No ${r.singular}s found.`)),console.log(p.gray(r.context)),console.log(p.gray(` ${r.command}`)),e==="stacks"&&(console.log(p.gray(`
15
+ Or create a new resource with a stack:`)),console.log(p.gray(" flisk resource <name> --stack <stack-name>")))}function qi(e){console.log(p.yellow(e||"Cancelled."))}function Ji(e){console.log(p.blue(`Flisk ${e}
16
+ `))}function zi(e,t){console.log(p.green(`All ${e} are ${t}!`))}var qe=62;function Xi(e="\u2500",t=qe){return e.repeat(t)}function Zt(e,t=qe-2){let r=Math.max(0,t-e.length),n=Math.floor(r/2),o=r-n;return" ".repeat(n)+e+" ".repeat(o)}function Qi(e,t){return e.length>t?`${e.slice(0,t-1)}\u2026`:e.padEnd(t)}function Zi(e,t){return e.length<=t?e:`${e.slice(0,t-3)}...`}function ea(e){console.log(p.green(`\u2713 ${e}`))}function ta(e){console.log(p.blue(e))}function ra(e,t=2){console.log(p.gray(`${" ".repeat(t)}${e}`))}function na(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function oa(e,t,r=qe){let n=r-2,o="\u2500".repeat(n);console.log(),console.log(p.cyan(`\u256D${o}\u256E`)),console.log(p.cyan("\u2502")+p.bold.white(Zt(e,n))+p.cyan("\u2502")),t&&(console.log(p.cyan(`\u251C${o}\u2524`)),console.log(p.cyan("\u2502")+p.gray(Zt(t,n))+p.cyan("\u2502"))),console.log(p.cyan(`\u2570${o}\u256F`))}import{randomBytes as tr}from"node:crypto";import{existsSync as ze,readFileSync as rr,writeFileSync as nr}from"node:fs";import{join as Xe}from"node:path";import{randomBytes as In}from"node:crypto";import{closeSync as Dn,fchmodSync as Nn,fsyncSync as Fn,openSync as jn,renameSync as Pn,rmSync as Ln,statSync as Mn,writeFileSync as Un}from"node:fs";import{basename as Bn,dirname as Gn,join as Vn}from"node:path";function ce(e,t){let r=Vn(Gn(e),`.${Bn(e)}.${process.pid}.${In(4).toString("hex")}.tmp`),n;try{n=Mn(e).mode&511}catch{n=void 0}try{let o=jn(r,"wx");try{n!==void 0&&Nn(o,n),Un(o,t,"utf-8"),Fn(o)}finally{Dn(o)}Pn(r,e)}catch(o){throw Ln(r,{force:!0}),o}}var G=[{name:"VERDACCIO_URL_DOCKER",description:"Docker-internal URL of the private npm registry (Verdaccio, a paid feature)",required:!1,default:"http://verdaccio:4873",example:"http://verdaccio:4873"},{name:"VERDACCIO_URL",description:"Local URL of the private npm registry (Verdaccio, a paid feature)",required:!1,default:"http://localhost:4873"},{name:"TILT_ENV",description:"Tilt environment name",required:!0,default:"dev",example:"dev",complete:!0},{name:"DATABASE_URL",description:"PostgreSQL connection string (uses the generated DB_PASSWORD below)",required:!1},{name:"DB_PASSWORD",description:"PostgreSQL superuser password (docker-compose POSTGRES_PASSWORD)",required:!0,example:"postgres",complete:!0},{name:"JWT_SECRET",description:"Secret that signs local-jwt tokens (generated once per project; never shared between projects)",required:!1,complete:!0}],or=()=>tr(16).toString("hex"),Kn=()=>tr(32).toString("hex"),ma=G.filter(e=>e.complete).map(e=>e.name);function Je(e,t){return e==="DB_PASSWORD"?t:e==="JWT_SECRET"?Kn():e==="DATABASE_URL"?`postgresql://postgres:${t}@postgres:5432/app_dev`:G.find(r=>r.name===e)?.default??""}function Wn(e){let t=e.trim(),r=t[0];if(r==='"'||r==="'"){let o=!1;for(let s=1;s<t.length;s+=1){let i=t[s];if(o){o=!1;continue}if(i==="\\"){o=!0;continue}if(i===r){let a=t.slice(1,s);if(r==='"'){let l={n:`
17
+ `,r:"\r",t:" ",'"':'"',"\\":"\\",$:"$"};return a.replace(/\\([nrt"\\$])/g,(d,m)=>l[m]??m)}return a.replace(/\\'/g,"'")}}return t}let n=e.search(/\s#/);return(n===-1?e:e.slice(0,n)).trim()}function Y(e){let t=new Map,r=e.startsWith("\uFEFF")?e.slice(1):e;for(let n of r.split(/\r?\n/)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.startsWith("export ")?o.slice(7).trim():o,i=s.indexOf("=");if(i<=0)continue;let a=s.slice(0,i).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(a)&&t.set(a,Wn(s.slice(i+1)))}return t}function sr(e){let t=[`# ${e.description}`];return e.required&&t.push("# Required (the value below is a working default)"),e.example&&t.push(`# Example: ${e.example}`),t}function ir(){let e=or(),t=["# \u{1F527} Flisk Environment Configuration","# Generated by `flisk project`. The defaults work as-is; edit only to change them.","# Keep this file out of git: it holds a generated database password and JWT secret.","#","# After editing, run: flisk config regenerate && flisk up",""];for(let r of G)t.push(...sr(r)),t.push(`${r.name}=${Je(r.name,e)}`),t.push("");return t.join(`
18
+ `)}function Hn(e){let t=e.match(/^[a-z][a-z0-9+.-]*:\/\/[^:/@\s]+:([^@\s]*)@/i);if(!(!t||t[1].includes("$")))return t[1]}function ha(e){let t=Xe(e,".env"),r={missing:[],invalid:[],warnings:[]};if(!ze(t))return{missing:G.filter(i=>i.required).map(i=>i.name),invalid:[],warnings:[".env file not found - will be auto-generated"]};let n=Y(rr(t,"utf-8"));for(let i of G)i.required&&!n.has(i.name)&&r.missing.push(i.name),n.has(i.name)&&!(n.get(i.name)??"").trim()&&r.invalid.push(`${i.name} is set but empty`);let o=n.get("DATABASE_URL"),s=n.get("DB_PASSWORD");if(o&&s){let i=Hn(o);i!==void 0&&i!==s&&r.warnings.push("DATABASE_URL carries a different password than DB_PASSWORD; the database container uses DB_PASSWORD")}return r}function Yn(e,t,r){if(!Y(e).has(t))return e;let o=e.indexOf("=");if(o<0)return e;let s=e.slice(o+1),i=s.search(/\s#/),a=i<0?"":s.slice(i);return e.slice(0,o+1)+r+a}function ga(e){let t=Xe(e,".env");if(!ze(t))return nr(t,ir(),{mode:384}),G.map(c=>c.name);let r=rr(t,"utf-8"),n=Y(r),o=G.filter(c=>c.complete?n.has(c.name)?!(n.get(c.name)??"").trim():!0:!1);if(o.length===0)return[];let s=o.filter(c=>!n.has(c.name)),i=o.filter(c=>n.has(c.name)),a=n.get("DB_PASSWORD"),l=a?.trim()?a:or(),d=r.split(/(\r\n|\n|\r)/);for(let c of i){let h=-1;for(let y=0;y<d.length;y+=2)Y(d[y]).has(c.name)&&(h=y);if(h<0)throw new Error(`Could not locate empty .env assignment for ${c.name}`);d[h]=Yn(d[h],c.name,Je(c.name,l))}let m=d.join("");if(s.length>0){let c=["","# Added by Flisk: keys this version expects. Existing values above were not changed.",""];for(let y of s)c.push(...sr(y)),c.push(`${y.name}=${Je(y.name,l)}`),c.push("");let h=m.endsWith(`
19
+ `)||m.endsWith("\r")?"":`
20
+ `;m+=h+c.join(`
21
+ `)}return ce(t,m),o.map(c=>c.name)}function Sa(e){let t=Xe(e,".env");return ze(t)?!1:(nr(t,ir(),{mode:384}),!0)}var qn=/^[a-z0-9-]+$/;function ar(e){return qn.test(e)}var Jn="Use lowercase letters, numbers, and hyphens only";function cr(e,t){return`${e} "${t}" is not valid. ${Jn}, e.g. "${e==="Resource name"?"my-service":"my-stack"}".`}function zn(e){return e.trim()?ar(e)?{valid:!0}:{valid:!1,error:cr("Resource name",e)}:{valid:!1,error:"Resource name is required"}}function Xn(e){return e.trim()?ar(e)?{valid:!0}:{valid:!1,error:cr("Stack name",e)}:{valid:!1,error:"Stack name is required"}}function ka(e){let t=e==="resource"?zn:Xn;return r=>{let n=t(r);return n.valid?!0:n.error??"Invalid name"}}function Ta(e){return Qe(Me,e)?{valid:!0}:{valid:!1,error:`Invalid service. Must be one of: ${Me.join(", ")}`}}function ba(e){return Number.isInteger(e)&&e>0&&e<=65535}function xa(e){return!e.includes("\0")&&!/[<>:"|?*]/.test(e)}function va(e,t="_"){return e.replace(/[^a-zA-Z0-9-]/g,t).substring(0,100)}function Qe(e,t){return e.includes(t)}import Ir,{existsSync as z,readdirSync as wo,readFileSync as _o,statSync as at}from"node:fs";import{dirname as Ao,join as M}from"node:path";var le=class{data;options;constructor(t){this.data=new Map,this.options=t}has(t){let r=this.data.get(t);return r?Date.now()-r.timestamp>this.options.ttlMs?(this.data.delete(t),!1):!0:!1}get(t){if(this.has(t))return this.data.get(t)?.value}set(t,r){this.data.set(t,{value:r,timestamp:Date.now()})}delete(t){this.data.delete(t)}clear(){this.data.clear()}keys(){let t=[];for(let r of this.data.keys())this.has(r)&&t.push(r);return t}size(){return this.keys().length}};function lr(e){let t=0;return{isValid(){return Date.now()-t<e},markUpdated(){t=Date.now()},reset(){t=0}}}import{existsSync as Ar,readFileSync as Rr}from"node:fs";import{copyFileSync as hr,mkdirSync as lo,rmSync as gr,writeFileSync as Sr}from"node:fs";import{join as J}from"node:path";function q(e){return e==="backend"||e==="mcp"||e==="agent"}import{existsSync as Qn,readFileSync as Zn}from"node:fs";import{join as eo}from"node:path";var to="[REDACTED]",Ze=class extends Error{path;constructor(t,r){super(`Could not read ${t}: ${r}`),this.path=t,this.name="EnvUnreadableError"}},ro=8;function no(e,t=[]){let r=[...ur(eo(e,".env")),...t.flatMap(n=>ur(n))];return[...new Set(r)].sort((n,o)=>o.length-n.length)}function ur(e){if(!Qn(e))return[];let t;try{t=Zn(e,"utf-8")}catch(r){throw new Ze(e,r instanceof Error?r.message:String(r))}return[...Y(t).values()].filter(r=>r.length>=ro)}function dr(e,t){let r=e;for(let n of t)r=r.split(n).join(to);return r}function fr(e,t){return t.length===0?e:typeof e=="string"?dr(e,t):Array.isArray(e)?e.map(r=>fr(r,t)):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,fr(n,t)])):e}function pr(e,t=[]){let r;try{r=no(e,t)}catch(n){return()=>{throw n}}return n=>dr(n,r)}import{readFileSync as oo}from"node:fs";import{join as so}from"node:path";function io(){let e=D();if(e)try{let t=oo(so(e,".tdk",H),"utf-8"),r=JSON.parse(t);if(r?.project?.name)return r.project.name}catch{}return"tdk-project"}function et(e){let t=io(),r=process.env.TDK_SERVICE_BASE_URL??`http://${t}.localhost${e?`:${e}`:""}`;try{let n=new URL(r.includes("://")?r:`http://${r}`),o=n.hostname,s=n.protocol==="https:"?"443":"80",i=n.port||(e?String(e):""),a=i===s?"":i;if(o==="localhost"||/^\d+\.\d+\.\d+\.\d+$/.test(o))return{appBase:`${n.protocol}//${o}${a?`:${a}`:""}`,apiBase:`${n.protocol}//${o}${a?`:${a}`:""}`};let l=o.replace(/^(app|api)\./,"");return{appBase:`${n.protocol}//app.${l}${a?`:${a}`:""}`,apiBase:`${n.protocol}//api.${l}${a?`:${a}`:""}`}}catch{return{appBase:`http://app.${t}.localhost`,apiBase:`http://api.${t}.localhost`}}}function ao(e){return`${e.replace(/\/+$/,"")}/health`}function tt(e){if(q(e.config?.appType)){let t=e.name.replace(/-api$/,"");return e.config?.apiPath??`/api/${t}`}return e.config?.basePath??`/${e.name}`}function Pa(e,t){return mr(e,t,r=>ao(r))}function La(e,t){return mr(e,t,r=>r)}function mr(e,t,r){let{appBase:n,apiBase:o}=et(t);return e.filter(s=>s.config?.appType==="frontend"||q(s.config?.appType)).map(s=>{let i=q(s.config.appType)?o:n;return{name:s.name,appType:s.config.appType,url:`${i}${r(tt(s))}`}})}async function co(e,t){try{let r=await fetch(e.url,{method:"GET",redirect:"manual",signal:AbortSignal.timeout(t)});return{...e,ok:r.ok,status:r.status}}catch(r){let n=r instanceof Error&&r.name==="TimeoutError"?`no response within ${t}ms`:r instanceof Error?r.message:String(r);return{...e,ok:!1,error:n}}}async function Ma(e,t){return Promise.all(e.map(r=>co(r,t)))}var xr=60,yr=1e3,Er=1e4,kr=200,Tr=64*1024,br=new Set([404,502,503,504]),uo=new Set(["ECONNREFUSED","ENOTFOUND","EAI_AGAIN","EHOSTUNREACH","ENETUNREACH"]),fo=new Set(["GET","HEAD","OPTIONS"]);function P(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function po(e,t){if(fo.has(t))return!0;if(!P(e))return!1;let r=P(e.cause)?e.cause:void 0,n=e.code??r?.code;return typeof n=="string"&&uo.has(n)}function nt(e){if(!P(e))return['smoke: must be an object with "via" and "steps"'];let t=[];return e.via!=="proxy"&&t.push('smoke.via: only "proxy" is supported (the check must go through the public URL)'),e.timeoutSeconds!==void 0&&!(typeof e.timeoutSeconds=="number"&&e.timeoutSeconds>0)&&t.push("smoke.timeoutSeconds: must be a number greater than 0"),!Array.isArray(e.steps)||e.steps.length===0?(t.push("smoke.steps: needs at least one step"),t):(e.steps.forEach((r,n)=>{let o=`smoke.steps[${n}]`;if(!P(r)){t.push(`${o}: must be an object`);return}let s=r.path;(typeof s!="string"||!s.startsWith("/")||s.startsWith("//"))&&t.push(`${o}.path: must start with "/" and is appended to the public URL; a full URL or relative path would skip the proxy`),r.expect!==void 0&&!(typeof r.expect=="number"&&Number.isInteger(r.expect)&&r.expect>=100&&r.expect<=599)&&t.push(`${o}.expect: must be an HTTP status between 100 and 599`),r.bodyContains!==void 0&&typeof r.bodyContains!="string"&&t.push(`${o}.bodyContains: must be a string`),r.save!==void 0&&(P(r.save)&&Object.values(r.save).every(a=>typeof a=="string"&&a.startsWith("$."))||t.push(`${o}.save: must map names to paths such as "$.id"`))}),t)}function Ya(e,t){let{appBase:r,apiBase:n}=et(t),o=[];for(let s of e){let i=s.config;if(!i?.smoke)continue;let a=i.appType,l=q(a)||a===W;if(!l&&a!=="frontend"||i.exposeViaProxy===!1)continue;let d=l?n:r,m=i.healthCheckPath||(l&&a!==W?"/health":void 0);o.push({name:s.name,baseUrl:`${d}${tt(s).replace(/\/+$/,"")}`,...m?.startsWith("/")?{readyPath:m}:{},smoke:i.smoke})}return o}var mo=10;function qa(e,t={}){let r=t.timeoutSeconds??mo;return e.flatMap(n=>{let o=n.smoke.steps.filter(i=>(i.method??"GET").toUpperCase()==="GET"&&i.body===void 0&&!i.path.includes("{{")).map(i=>({...i,bodyContains:void 0}));if(o.length===0)return[];let s=Math.min(n.smoke.timeoutSeconds??xr,r);return[{name:n.name,baseUrl:n.baseUrl,smoke:{via:n.smoke.via,timeoutSeconds:s,steps:o}}]})}function ho(e,t){let r=t.replace(/^\$\.?/,"").match(/[^.[\]]+/g)??[],n=e;for(let o of r){if(n==null||o==="__proto__"||o==="constructor"||o==="prototype"||!Object.hasOwn(n,o))return;let s=Object.getOwnPropertyDescriptor(n,o);if(!s||!("value"in s))return;n=s.value}return n}function vr(e,t){return e.replace(/\{\{(\w+)\}\}/g,(r,n)=>t[n]??r)}function rt(e,t){return typeof e=="string"?vr(e,t):Array.isArray(e)?e.map(r=>rt(r,t)):P(e)?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,rt(n,t)])):e}function ke(e){let t=e.replace(/\s+/g," ").trim();return t.length>kr?`${t.slice(0,kr)}...`:t}function wr(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"step"}function go(e,t){let r=wr(t),n=(e.get(r)??0)+1;return e.set(r,n),n===1?r:`${r}-${n}`}function So(e,t,r,n,o){try{let s=J(e,wr(r.service),t);lo(s,{recursive:!0});let i=J(s,"latest.json"),a=J(s,"body.txt");return n===void 0?gr(a,{force:!0}):Sr(a,n),Sr(i,`${JSON.stringify({...r,bodyPath:n===void 0?null:"body.txt"},null,2)}
22
+ `),o&&(hr(i,J(s,"last-success.json")),n===void 0?gr(J(s,"last-success-body.txt"),{force:!0}):hr(a,J(s,"last-success-body.txt"))),i}catch{return}}function yo(e){let t=Buffer.from(e,"utf8");if(t.length<=Tr)return{body:e,truncated:!1,bytes:t.length};let r=t.subarray(0,Tr).toString("utf8").replace(/\uFFFD$/,"");return{body:r,truncated:!0,bytes:Buffer.byteLength(r,"utf8")}}async function Eo(e,t={}){let r=t.fetch??((m,c)=>fetch(m,c)),n=t.now??Date.now,o=t.sleep??(m=>new Promise(c=>setTimeout(c,m))),s=(e.smoke.timeoutSeconds??xr)*1e3,i=n()+s,a={},l=nt(e.smoke);if(l.length>0)return{name:e.name,ok:!1,failure:`${e.name}: invalid smoke block: ${l.join("; ")}`};if(e.readyPath){let m=`${e.baseUrl}${e.readyPath}`;for(;;){try{let c=await r(m,{method:"GET",signal:AbortSignal.timeout(Er)});if(await c.text(),!br.has(c.status)&&c.status<500)break}catch{}if(n()>=i)break;await o(yr)}}i=n()+s;let d=new Map;for(let[m,c]of e.smoke.steps.entries()){let h=c.name??`step ${m+1}`,y=(c.method??"GET").toUpperCase(),k=`${e.baseUrl}${vr(c.path,a)}`,w=c.expect??200,R=c.body!==void 0,b,Q="",F,Re;for(;;){F=void 0,Re=void 0,b=void 0;let x=!1;try{let T=await r(k,{method:y,headers:R?{"content-type":"application/json"}:void 0,body:R?JSON.stringify(rt(c.body,a)):void 0,signal:AbortSignal.timeout(Er)});b=T.status,Q=await T.text()}catch(T){x=po(T,y),F=T instanceof Error?T.message:String(T);let U=P(T)?T.code??(P(T.cause)?T.cause.code:void 0):void 0;Re=typeof U=="string"?U:void 0}if(!(F!==void 0&&x||b!==void 0&&b!==w&&br.has(b))||n()>=i)break;await o(yr)}let Et=!1,$e=x=>{if(!Et){if(!t.redact)return x;try{return t.redact(x)}catch(I){Et=!0;let T=I instanceof Error?I.message:String(I);t.warn?.(`${e.name}: ${h}: the response text was neither shown nor stored: ${T}`);return}}},Oe=$e(k),$=b===void 0?void 0:$e(Q),kt=F===void 0?void 0:$e(F),Tt=F===void 0?void 0:Re??kt,Z=`${e.name}: ${h}: ${y} ${Oe??"(url withheld)"}`,bt;if(t.recordDir){let x=$===void 0?void 0:yo($),I=F===void 0&&b===w&&(c.bodyContains===void 0||Q.includes(c.bodyContains));bt=So(t.recordDir,go(d,h),{service:e.name,step:h,method:y,...Oe===void 0?{}:{url:Oe},expectedStatus:w,status:b??null,...Tt===void 0?{}:{error:Tt},truncated:x?.truncated??!1,bodyBytes:x?.bytes??0},x?.body,I)}let ee=x=>({name:e.name,ok:!1,failure:x,recordPath:bt});if(F!==void 0)return ee(`${Z} never answered (${kt??"the error was withheld"})`);if(b!==w)return ee(`${Z} returned ${b}, expected ${w}${$?`: ${ke($)}`:""}`);if(c.bodyContains!==void 0&&!Q.includes(c.bodyContains))return ee(`${Z} returned ${b} but the body does not contain "${c.bodyContains}"${$?`: ${ke($)}`:""}`);if(c.save){let x;try{x=JSON.parse(Q)}catch{return ee(`${Z} returned a body that is not JSON, cannot save${$?`: ${ke($)}`:""}`)}for(let[I,T]of Object.entries(c.save)){let U=ho(x,T);if(U==null||typeof U=="object")return ee(`${Z} response has no ${T} to save as {{${I}}}${$?`: ${ke($)}`:""}`);a[I]=String(U)}}}return{name:e.name,ok:!0}}function Ja(e){return`Smoke check failed: ${e.failure}${e.recordPath?` (record: ${e.recordPath})`:""}`}function za(e,t,r={}){return{redact:pr(e,r.envFiles??[]),...t?{warn:t}:{}}}async function Xa(e,t={}){return Promise.all(e.map(r=>Eo(r,t)))}var _r=1,tc="https://flisk.sh/schema.service.json",ko={dependencies:"deprecated, use dependsOn (still read for now)",envVars:"deprecated, use params (still read when params is absent)",jwtSecret:"ignored. A secret must not be committed: remove it and set JWT_SECRET in the project .env"},To=new Set(["$schema","agent","apiBasePath","apiPath","appName","appType","backendName","basePath","build","buildContext","databaseName","dependencies","dev","dependsOn","dockerfile","enabled","exposeViaProxy","featuresEnabled","framework","healthCheckPath","image","language","name","nats","params","playwright","port","replicas","restart","runtime","sablier","schemaVersion","secrets","smoke","stack","syncs","traefik","type"]),bo=[{path:["healthCheckPath"],pattern:/^\/[a-z0-9/-]*$/,expected:"a path such as /health"},{path:["traefik","host"],pattern:/^[A-Za-z0-9.-]+$/,expected:"a hostname such as shop.backend.myproject.local"},{path:["traefik","pathPrefix"],pattern:/^\/[a-z0-9/-]*$/,expected:"a path such as /api/v1/shop-management"},{path:["traefik","healthCheck"],pattern:/^\/[a-z0-9/-]*$/,expected:"a path such as /health"},{path:["nats","queueGroup"],pattern:/^[A-Za-z0-9_.-]+$/,expected:"letters, digits, '_', '.' or '-'"},{path:["databaseName"],pattern:/^[A-Za-z0-9_-]+$/,expected:"letters, digits, '_' or '-'"},{path:["stack"],pattern:/^[A-Za-z0-9_-]+$/,expected:"letters, digits, '_' or '-'"},{path:["image"],pattern:/^[A-Za-z0-9._/:@-]+$/,expected:"an image reference such as ghcr.io/acme/app:1.0"}];function Te(e,t){let r=[],n=new Set;for(let{path:o,pattern:s,expected:i}of bo){let a=e;for(let d of o)a=a&&typeof a=="object"&&!Array.isArray(a)?a[d]:void 0;if(a==null||a==="")continue;let l=`${t}.${o.join(".")}`;(typeof a!="string"||!s.test(a))&&n.add(l),typeof a!="string"?r.push(`${l}: expected a string`):s.test(a)||r.push(`${l}: must be ${i} (no spaces, line breaks or YAML syntax)`)}for(let[o,s]of xo(e,t))n.has(o)||r.push(`${o}: ${s}`);return r}function ot(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<32||r===127||r===133||r===8232||r===8233)return!0}return!1}function xo(e,t){let r=[],n=Object.entries(e).filter(([o])=>o!=="smoke").map(([o,s])=>[s,`${t}.${o}`]);for(let o of Object.keys(e))ot(o)&&r.push([t,"a key contains a line break"]);for(;n.length>0;){let[o,s]=n.pop();if(typeof o=="string")ot(o)&&r.push([s,"must not contain line breaks or control characters"]);else if(Array.isArray(o))for(let[i,a]of o.entries())n.push([a,`${s}[${i}]`]);else if(o&&typeof o=="object")for(let[i,a]of Object.entries(o))ot(i)?r.push([s,"a key contains a line break"]):n.push([a,`${s}.${i}`])}return r.sort(([o],[s])=>o.localeCompare(s))}var vo=["apiPath","basePath"];function st(e){if(!e||typeof e!="object"||Array.isArray(e))return[];let t=e;return vo.filter(r=>r in t&&typeof t[r]!="string")}function it(e,t){if(!e||typeof e!="object"||Array.isArray(e))return{errors:[`${t}: expected a JSON object`],warnings:[]};let r=e,n=[];for(let a of["appName","appType","stack","schemaVersion"])a in r||n.push(`${t}.${a}: required field is missing`);for(let a of["appName","appType","stack"])a in r&&typeof r[a]!="string"&&n.push(`${t}.${a}: expected a string`);"schemaVersion"in r&&r.schemaVersion!==_r&&n.push(`${t}.schemaVersion: unsupported version ${String(r.schemaVersion)} (supported: ${_r})`);for(let a of st(r))n.push(`${t}.${a}: expected a string`);let o=r.dev,s=o&&typeof o=="object"&&!Array.isArray(o)?o.liveReload:void 0;if(s!==void 0&&typeof s!="boolean"&&n.push(`${t}.dev.liveReload: expected true or false`),n.push(...Te(r,t)),"smoke"in r)for(let a of nt(r.smoke))n.push(`${t}.${a}`);let i=Object.keys(r).flatMap(a=>{let l=ko[a];return l?[`${t}.${a}: ${l}`]:To.has(a)?[]:[`${t}.${a}: unknown field is preserved`]});return s===!0&&r.language!=="go"&&i.push(`${t}.dev.liveReload: only applies to Go services (language "go"); it is ignored here`),{errors:n,warnings:i,manifest:r}}function $r(e,t){if(!Ar(e))return[];try{let r=JSON.parse(Rr(e,"utf-8"));return!r||typeof r!="object"||Array.isArray(r)?[]:Te(r,t)}catch{return[]}}function Or(e,t){if(!Ar(e))return{errors:[`${t}: file is missing`],warnings:[]};try{let r=JSON.parse(Rr(e,"utf-8"));return it(r,t)}catch(r){let n=r instanceof Error?r.message:String(r);return{errors:[`${t}: invalid JSON (${n})`],warnings:[]}}}function Cr(e){if(e.length===0||e.every(r=>r==="unknown"))return"unknown";let t=e.filter(r=>r==="ready").length/e.length;return t>.9?"healthy":t>.5?"degraded":"error"}var Ro=Lt;function ft(e,t=5,r=0){let n=[];if(r>t)return n;let o=Ir.readdirSync(e,{withFileTypes:!0});for(let s of o){let i=M(e,s.name);if(s.isDirectory()){if($o(s.name))continue;n.push(...ft(i,t,r+1))}else s.isFile()&&s.name===Ro&&n.push(i)}return n}function dt(e){return ft(e)}function $o(e){return Qe(Mt,e)||e.startsWith(".")}function Oo(e){if(!e||typeof e!="object")return!1;let t=e,r=typeof t.runtime=="string"||typeof t.appType=="string"||typeof t.type=="string";return typeof t.appName=="string"&&r}var be=new Set;var L=class extends Error{reason;constructor(t){super(t),this.reason=t,this.name="InvalidServiceJsonError"}};function ct(e){return e instanceof Error?e.message:String(e)}function Co(e){let t;try{t=Ir.readFileSync(e,"utf-8")}catch(l){throw new L(`could not read file: ${ct(l)}`)}let r;try{r=JSON.parse(t)}catch(l){throw new L(`invalid JSON: ${ct(l)}`)}if(!Oo(r))throw new L("missing required fields (appName, runtime or appType)");let n=st(r);if(n.length>0)throw new L(n.map(l=>`${l}: expected a string`).join("; "));let o=Te(r,e);if(o.length>0)throw new L(o.join("; "));let s=r;for(let l of it(r,e).warnings)be.has(l)||(be.add(l),console.warn(`\u26A0\uFE0F ${l}`));let i={...s,appType:s.appType||s.type},a=Ao(e);return{name:i.appName,path:a,configPath:e,config:i,stack:i.stack,port:i.port,type:i.appType}}function Dr(e){let t=ft(e),r=[],n=[];for(let o of t)try{r.push(Co(o))}catch(s){n.push({path:o,reason:s instanceof L?s.reason:ct(s)})}return{resources:r,problems:n}}function Io(e){for(let t of e){let r=`skipped ${t.path}: ${t.reason}`;be.has(r)||(be.add(r),console.warn(`\u26A0\uFE0F ${r}`))}}function xe(e){let{resources:t,problems:r}=Dr(e);return Io(r),t}function ve(){let e=D();if(!e)throw N.notInProject();return xe(e)}function mc(e){let t=e;if(!t){let r=D();if(!r)throw N.notInProject();t=Dr(r)}if(t.problems.length>0)throw new Error(t.problems.map(r=>`Invalid service.json at ${r.path}: ${r.reason}`).join(`
23
+ `));return t.resources}function hc(e,t){let r=t??xe(e);return Do(r)}function Do(e){let t=e||ve(),r=new Set;for(let n of t)n.stack&&r.add(n.stack);return Array.from(r).sort()}function gc(e=ve()){let t=new Map;for(let n of e)if(n.stack){let o=t.get(n.stack);o?o.push(n):t.set(n.stack,[n])}let r=[];for(let[n,o]of t)r.push({name:n,description:er(o.length,"resource"),resources:o,resourceCount:o.length});return r.sort((n,o)=>n.name.localeCompare(o.name))}function Sc(e,t){return(t??ve()).filter(n=>n.stack===e)}function yc(e,t){return(t??ve()).some(n=>n.stack===e)}var pt=5e3,lt=new le({ttlMs:pt}),ut=new le({ttlMs:pt}),ue=lr(pt);function Ec(){lt.clear(),ut.clear(),ue.reset()}function No(e,t){if(e==="Dockerfile"||e.startsWith("docker-compose"))return"docker";if(e==="Tiltfile"||e.endsWith(".star"))return"tilt";if(e==="vite.config.ts"||e==="tsconfig.json"||e===B)return"config";if(e==="schema.prisma"||e.includes("migration"))return"prisma";if(t){let r=t.split(`
24
+ `).slice(0,10).join(`
25
+ `);if(r.includes("GENERATED BY Flisk")||r.includes("AUTOGENERATED"))return"generated"}return"unknown"}function Fo(e){let t=e.configPath;if(ue.isValid()){let y=lt.get(t);if(y)return y}let r=e.path,n=at(e.configPath),o=n.mtime.toISOString(),s=n.mtime.toISOString(),i=jo(r),a=z(M(r,"Dockerfile")),l=z(M(r,"Tiltfile")),d=z(M(r,se))||z(M(r,"docker-compose.yaml")),m=e.config?.appType,c=m||"backend";m||(e.name.includes("frontend")?c="frontend":(e.name.includes("sdk")||e.name.includes("lib")||e.name.includes("infra"))&&(c="library"));let h={name:e.name,stack:e.stack,type:c,port:e.config?.port,createdAt:o,lastModified:s,dependencies:e.config?.dependsOn??[],hasDockerfile:a,hasTiltfile:l,hasDockerCompose:d,autogeneratedFiles:i,status:"unknown"};return lt.set(t,h),ue.markUpdated(),h}function jo(e){let t=[];for(let n of Ut){let o=M(e,n);if(z(o)){let s=at(o),i=_o(o,"utf-8");t.push({name:n,path:o,type:No(n,i),size:s.size,lastModified:s.mtime.toISOString()})}}let r=M(e,"prisma");if(z(r)){let n=wo(r);for(let o of n)if(o==="schema.prisma"||o.includes("migration")){let s=M(r,o),i=at(s);t.push({name:`prisma/${o}`,path:s,type:"prisma",size:i.size,lastModified:i.mtime.toISOString()})}}return t.sort((n,o)=>n.name.localeCompare(o.name))}function kc(e){let t=e.name;if(ue.isValid()){let l=ut.get(t);if(l)return l}let r=e.resources.map(l=>Fo(l)),n=r.map(l=>new Date(l.createdAt).getTime()),o=Math.min(...n),s=Math.max(...n),i=Cr(r.map(l=>l.status)),a={name:e.name,resourceCount:r.length,createdAt:new Date(o).toISOString(),lastModified:new Date(s).toISOString(),resources:r,overallStatus:i};return ut.set(t,a),ue.markUpdated(),a}import{appendFileSync as Po,existsSync as mt,mkdirSync as Lo,readFileSync as Mo,writeFileSync as Nr}from"node:fs";import{dirname as Uo,resolve as X}from"node:path";function wc(e,t,r){for(let[n,o]of t.entries())console.log(p.blue(`${o.emoji} ${o.description}...`)),o.type==="json"?Go(e,o.filename,o.content):Vo(e,o.filename,String(o.content)),r&&r(o,n,t.length)}function Bo(e,t,r=2){let n=`${JSON.stringify(t,null,r)}
26
+ `;Nr(e,n,"utf-8")}function Go(e,t,r,n=2){let o=X(e,t);Bo(o,r,n)}function ht(e,t){Nr(e,t,"utf-8")}function Vo(e,t,r){let n=X(e,t);ht(n,r)}function _c(e){mt(e)||Lo(e,{recursive:!0})}var Ko=[".env",".tdk/.tdk-out/",".tdk/.project-id",".tdk/smoke/","node_modules/"];function Wo(e){let t=X(e,".gitignore"),r=mt(t)?Mo(t,"utf-8"):"",n=new Set(r.split(`
27
+ `).map(a=>a.trim().replace(/\/$/,""))),o=Ko.filter(a=>!n.has(a.replace(/\/$/,"")));if(o.length===0)return[];let s=r&&!r.endsWith(`
28
+ `)?`
29
+ `:"";return Po(t,`${s}${r?`
30
+ # Flisk (generated files and secrets)
31
+ `:`# Flisk (generated files and secrets)
32
+ `}${o.join(`
33
+ `)}
34
+ `),o}function Ho(e){let t=X(e);for(;;){if(mt(X(t,".git")))return!0;let r=Uo(t);if(r===t)return!1;t=r}}function Ac(e){if(Ho(e))try{Wo(e);return}catch(t){let r=t instanceof Error?t.message:String(t);return`Could not add .tdk/smoke/ to ${X(e,".gitignore")}: ${r}. Git may track the smoke response records.`}}import*as f from"node:fs";import*as u from"node:path";import{fileURLToPath as fs}from"node:url";import K from"handlebars";var Yo="1.0.0",qo={runtime:"bun",bundler:"vite",language:"typescript",framework:"hono",database:"postgresql",orm:"prisma",messaging:"nats",linting:"biome",testing:"vitest"},Jo={frontend:{base:E.frontend.base,range:E.frontend.range,start:E.frontend.min,end:E.frontend.max},backend:{base:E.backend.base,range:E.backend.range,start:E.backend.min,end:E.backend.max},health:{base:E.health.base,range:E.health.range,start:E.health.min,end:E.health.max},worker:{base:E.worker.base,range:E.worker.range,start:E.worker.min,end:E.worker.max},migrator:{base:E.migrator.base,range:E.migrator.range,start:E.migrator.min,end:E.migrator.max},tiltUi:Ue.tiltUi,traefik:Ue.traefik},zo={path:"/health",live:"/health/live",ready:"/health/ready",timeout:30,interval:5},Xo={frontend:"-frontend",backend:"-backend",worker:"-worker",migrator:"-migrator",library:"-lib",sdk:"-sdk",validSeparators:["-","_"],maxLength:63,minLength:3},Qo={entrypoint:"web",network:"traefik-public",defaultHost:"localhost",appHost:"app.localhost",apiHost:"api.localhost",appSubdomainPrefix:"app",apiSubdomainPrefix:"api",defaultPort:8080,tlsEnabled:!1,entrypoints:["web"],middlewares:[],tls:{enabled:!1},healthcheckPath:"/health",healthcheckInterval:"10s",healthcheckTimeout:"5s",frontendPriorityBase:100},Zo=["node_modules","dist","build",".git",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests"],es={frontend:{suffix:"-frontend",portRange:"3000-3999"},backend:{suffix:"-backend",portRange:"4000-4999"},library:{suffix:"-library",portRange:null},sdk:{suffix:"-sdk",portRange:"3000-9999"},migrator:{suffix:"-migrator",portRange:"7000-7999"},worker:{suffix:"-worker",portRange:"6000-6999"}},ts={prisma:"Database ORM with migrations",nats:"Event streaming via NATS",redis:"Caching layer",infisical:"Secrets management",vitest:"Testing framework",traefik:"HTTP routing",websocket:"Real-time connections",graphql:"GraphQL support",grpc:"gRPC support",viteNode:"Vite Node runtime",maintenance:"Maintenance mode"},rs={services:"services/product",sharedPlatform:"shared-platform-engineering",sharedProduct:"shared-product-engineering",sharedDdd:"shared-ddd-layers"},ns={scanIntervalSeconds:5,maxManifestsPerRoot:50,servicePatterns:["services/product/*","services/platform/*"]},os={dockerfile:"Dockerfile",context:"."},ss={backend:{command:"bun",args:["run","dev"],env:{NODE_ENV:"development"}},frontend:{command:"bun",args:["run","dev"],env:{NODE_ENV:"development"}}},v={version:Yo,tech:qo,ports:Jo,health:zo,naming:Xo,traefik:Qo,filewatchIgnores:Zo,serviceTypes:es,features:ts,paths:rs,discovery:ns,docker:os,runtime:ss};import{existsSync as is,lstatSync as as}from"node:fs";import{isAbsolute as Fr,normalize as we,relative as cs,sep as jr}from"node:path";var Nc=[`${ie}/**`,".tdk/.tdk-out/**","Tiltfile","TILT_*.star",C,`${B} (create only)`,"shared-platform-engineering/docker-templates/**","services/platform/database-management/docker-compose.yml","product_autogenerated_resource_manifests/**","product_autogenerated_services_list/**"];function ls(e){let t=we(e).split(jr).join("/");return Fr(e)||t===".."||t.startsWith("../")?!1:t.split("/").includes(ie)||t.startsWith(".tdk/.tdk-out/")||t==="shared-platform-engineering/docker-templates"||t.startsWith("shared-platform-engineering/docker-templates/")||t.startsWith("product_autogenerated_resource_manifests/")||t.startsWith("product_autogenerated_services_list/")?!0:t==="Tiltfile"||/^TILT_[^/]+\.star$/.test(t)||t===C||t===B||t==="services/platform/database-management/docker-compose.yml"}function V(e,t){let r=Fr(t)?we(t):we(`${e}/${t}`),n=cs(e,r).split(jr).join("/");if(!ls(n))throw new Error(`Refusing to write outside Flisk's generated-file allowlist: ${n}`);let o=e;for(let s of n.split("/"))if(o=we(`${o}/${s}`),is(o)&&as(o).isSymbolicLink())throw new Error(`Refusing to write through a symbolic link in generated path: ${n}`);return r}var Pr=[j,"proxy"];var us={[j]:{name:j,description:"Generate and load the stack-level PostgreSQL docker-compose file",generatedFiles:["services/platform/database-management/docker-compose.yml"]}};function Lr(e,t){return us[t]?["pre_alpha","alpha","beta"].some(r=>e[r]?.enabledStacks?.includes(t)):!1}var ds=fs(new URL("../dist/generator/template-engine.js",import.meta.url).href),gt=u.dirname(ds);function fe(e){let t=[u.join(gt,"..","..","templates"),u.join(gt,"..","templates"),u.join(gt,"..","..","..","templates"),u.join(process.cwd(),"node_modules","@flisk-sh","flisk","templates"),u.join(u.dirname(process.execPath),"tdk-cli","cli","templates")],r=[];for(let n of t){let o=u.join(n,e);r.push(o);try{return f.readFileSync(o,"utf-8")}catch{}}throw new Error(`Failed to load template ${e} from any of these paths: ${r.join(", ")}`)}var St=null;function ps(){return St||(St={[C]:fe(".tiltignore.hbs"),[ge]:fe("TILT_RESOURCE_DEFAULTS.star.hbs"),[he]:fe("TILT_TECH_STACK.star.hbs"),Tiltfile:fe("Tiltfile.hbs"),"spec.master":fe("spec.master.hbs")}),St}var ms={proxy:"Traefik reverse proxy",verdaccio:"Private npm registry","database-management":"PostgreSQL database"},hs={monitoring:"Signoz, SkyWalking (RAM intensive)",elk:"Elasticsearch/Logstash/Kibana",debezium:"CDC with Kafka/Zookeeper",golden_image:"Golden image rebuild (one-time)",verdaccio:"Premium local npm registry"},Ur=["TILT_TECH_STACK.star","TILT_RESOURCE_DEFAULTS.star","spec.master","Tiltfile",".tiltignore"],_e=class{templatesDir;constructor(t){let r=Ce("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||u.dirname(new URL(new URL("../dist/generator/template-engine.js",import.meta.url).href).pathname);this.templatesDir=t||u.join(r,"..","..","templates"),this.registerHelpers()}quoteStarlarkString(t){return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}formatStarlarkValue(t){return t==null?"None":typeof t=="string"?this.quoteStarlarkString(t):typeof t=="boolean"?t?"True":"False":typeof t=="number"?String(t):Array.isArray(t)?`[${t.map(n=>this.formatStarlarkValue(n)).join(", ")}]`:typeof t=="object"?`{${Object.entries(t).map(([n,o])=>`${this.quoteStarlarkString(n)}: ${this.formatStarlarkValue(o)}`).join(", ")}}`:String(t)}registerHelpers(){K.registerHelper("starlark",t=>new K.SafeString(this.formatStarlarkValue(t))),K.registerHelper("starlarkArray",t=>{if(!Array.isArray(t))return new K.SafeString("[]");let r=t.map(n=>this.formatStarlarkValue(n));return new K.SafeString(`[${r.join(", ")}]`)}),K.registerHelper("json",t=>JSON.stringify(t))}buildContext(t){return{version:v.version,tech:v.tech,ports:v.ports,health:v.health,naming:v.naming,traefik:v.traefik,filewatchIgnores:[...v.filewatchIgnores],serviceTypes:v.serviceTypes,paths:v.paths,discovery:{scanIntervalSeconds:v.discovery.scanIntervalSeconds,maxManifestsPerRoot:v.discovery.maxManifestsPerRoot,paths:t.discovery.paths},docker:v.docker,runtime:v.runtime,project:t.project,phases:gs(t.phases),alwaysEnabledInfra:t.always_enabled_infra??[...Pr],optionalInfra:t.optional_infra,serviceDescriptions:ms,infraDescriptions:hs}}loadTemplate(t){let r=u.join(this.templatesDir,`${t}.hbs`),n=f.existsSync(r)?f.readFileSync(r,"utf-8"):ps()[t];if(!n)throw new Error(`Template not found: ${r}`);return K.compile(n)}generateTechStack(t){return this.loadTemplate(he)(t)}generateServiceDefaults(t){return this.loadTemplate(ge)(t)}generateSpecMaster(t){return this.loadTemplate("spec.master")(t)}generateTiltfile(t){return this.loadTemplate("Tiltfile")(t)}generateTiltIgnore(t){return this.loadTemplate(".tiltignore")(t)}generateAll(t){let r=this.buildContext(t);return{"TILT_TECH_STACK.star":this.generateTechStack(r),"TILT_RESOURCE_DEFAULTS.star":this.generateServiceDefaults(r),"spec.master":this.generateSpecMaster(r),Tiltfile:this.generateTiltfile(r),".tiltignore":this.generateTiltIgnore(r)}}};function gs(e){let t={...e};for(let r of Object.keys(t))t[r]={...t[r],enabledStacks:Array.from(new Set(t[r].enabledStacks))};return t}function Ss(e){return e.replace(/-/g,"_")}function ys(e){let t=Ss(e.project.name||"tdk_project");return`###############################################################################
35
+ # SYSTEM-GENERATED - DO NOT EDIT
36
+ # Stack feature: database-management
37
+ # Source: .tdk/project.json phases.*.enabledStacks includes "database-management"
38
+ # Regenerate with: flisk config regenerate
39
+ ###############################################################################
40
+
41
+ services:
42
+ postgres:
43
+ image: postgres:16-alpine
44
+ container_name: ${t}_postgres
45
+ restart: unless-stopped
46
+ environment:
47
+ POSTGRES_USER: ${t}
48
+ POSTGRES_PASSWORD: \${DB_PASSWORD}
49
+ POSTGRES_DB: postgres
50
+ ports:
51
+ - "\${TDK_BIND_ADDRESS:-127.0.0.1}:\${TDK_POSTGRES_PORT:-15432}:5432"
52
+ volumes:
53
+ - ${t}_postgres_data:/var/lib/postgresql/data
54
+ networks:
55
+ - database
56
+ healthcheck:
57
+ test: ["CMD-SHELL", "pg_isready -U ${t} -d postgres"]
58
+ interval: 5s
59
+ timeout: 5s
60
+ retries: 20
61
+
62
+ networks:
63
+ database:
64
+ name: ${t}_database
65
+ external: true
66
+
67
+ volumes:
68
+ ${t}_postgres_data:
69
+ `}function Mr(e,t){if(!e||typeof e!="object")return!1;let r=e;for(let n of["pre_alpha","alpha","beta","out_of_scope"]){let o=r[n];if(!o||typeof o!="object"||!Array.isArray(o[t]))return!1}return!0}function Es(e){if(!e||typeof e!="object")return null;let t=e;if(typeof t.version!="string"||!t.project||typeof t.project!="object")return null;let r=t.project;if(typeof r.name!="string"||typeof r.version!="string")return null;let n=null;if(Mr(t.phases,"enabledStacks"))n=t.phases;else if(Mr(t.stacks,"services")){let i=t.stacks;n={pre_alpha:{name:i.pre_alpha.name,description:i.pre_alpha.description,enabledStacks:i.pre_alpha.services},alpha:{name:i.alpha.name,description:i.alpha.description,enabledStacks:i.alpha.services},beta:{name:i.beta.name,description:i.beta.description,enabledStacks:i.beta.services},out_of_scope:{name:i.out_of_scope.name,description:i.out_of_scope.description,enabledStacks:i.out_of_scope.services}}}if(!n||!t.optional_infra||typeof t.optional_infra!="object")return null;let o=t.optional_infra;if(typeof o.monitoring!="boolean"||typeof o.elk!="boolean"||typeof o.debezium!="boolean"||typeof o.golden_image!="boolean"||typeof o.verdaccio!="boolean"||!t.discovery||typeof t.discovery!="object")return null;let s=t.discovery;return Array.isArray(s.paths)?{version:t.version,project:t.project,phases:n,always_enabled_infra:t.always_enabled_infra,optional_infra:t.optional_infra,discovery:t.discovery,overrides:t.overrides}:null}var yt=class extends Error{};function Br(e){let t=u.join(e,".tdk",H),r;try{r=f.readFileSync(t,"utf-8")}catch(s){if(s?.code==="ENOENT")throw new yt(`Project config not found: ${t}. Run 'flisk project --yes' first.`);let i=s instanceof Error?s.message:String(s);throw new Error(`Could not read project.json at ${t}: ${i}`)}let n;try{n=JSON.parse(r)}catch(s){let i=s instanceof Error?s.message:String(s);throw new Error(`Could not parse project.json at ${t}: ${i}`)}let o=Es(n);if(!o)throw new Error("Invalid project.json: missing or invalid required fields. Expected: version (string), project (object with name/version), phases (object with pre_alpha/alpha/beta/out_of_scope enabledStacks), optional_infra (object with boolean flags), discovery (object with paths array)");return o}async function ks(e){let t=xe(e).filter(n=>n.config?.sablier?.enable===!0);t.length===0||await vt(e)||console.warn(`\u26A0\uFE0F Sablier (on-demand scaling) is a Premium feature - no valid license key found. ${t.length} resource${t.length===1?" has":"s have"} a \`sablier\` block, but it will have no effect without a license. Set TDK_LICENSE_KEY to a key that grants it, or remove the \`sablier\` block from the affected service.json file(s) to silence this warning.`)}function Ts(e,t){let r=V(e,B);if(f.existsSync(r))return!1;let n={name:t.project.name||u.basename(e),version:t.project.version||"1.0.0",private:!0,type:"module",workspaces:t.discovery.paths};return ht(r,`${JSON.stringify(n,null,2)}
70
+ `),!0}async function Qc(e,t={}){let r=Br(e),n=dt(e).flatMap(c=>$r(c,u.relative(e,c).split(u.sep).join("/")));if(n.length>0)throw new Error(`Refusing to generate config from unsafe service.json values:
71
+ ${n.map(c=>` ${c}`).join(`
72
+ `)}`);await ks(e),Ts(e,r)&&!t.quiet&&console.log("\u2713 Generated: package.json (workspace root)");let o=Object.values(r.phases).some(c=>c.enabledStacks.includes("verdaccio"));(r.optional_infra.verdaccio||o)&&(await xt(e)||console.warn("\u26A0\uFE0F Verdaccio is a Premium feature - no valid license key found. It's enabled in this project's config, but will have no effect without a license. Set TDK_LICENSE_KEY to a key that grants it, or run `flisk config disable-infra verdaccio` to silence this warning."));let s=u.join(e,".tdk",".tdk-out");f.existsSync(s)||f.mkdirSync(s,{recursive:!0});let a=new _e().generateAll(r);for(let c of Ur){let h=a[c],y=V(e,u.join(".tdk",".tdk-out",c));ce(y,h),t.quiet||console.log(`\u2713 Generated: .tdk/.tdk-out/${c}`)}if(Lr(r.phases,j)){let c=V(e,u.join("services","platform",j,se)),h=u.dirname(c);f.mkdirSync(h,{recursive:!0}),ce(c,ys(r)),t.quiet||console.log("\u2713 Generated: services/platform/database-management/docker-compose.yml")}let l=u.join(s,C),d=V(e,C);if(f.existsSync(l)){if(!f.existsSync(d))f.copyFileSync(l,d),console.log("\u2713 Copied: .tiltignore \u2192 project root");else if(t.discardHandEdits){let c=f.readFileSync(d,"utf-8");c.includes(Kr)&&c!==f.readFileSync(l,"utf-8")&&(f.copyFileSync(l,d),console.log("\u2713 Restored: .tiltignore \u2192 project root (hand edits discarded)"))}}let m=Rs(e);for(let c of m)console.log(`\u2713 Copied: ${c} \u2192 project root`);await $s(e),console.log(""),console.log("\u{1F4A1} To start Tilt: flisk up")}var bs=/\.(?:test|spec)\.[cm]?[jt]sx?$/;function Gr(e){return bs.test(e)}function Vr(e){if(f.existsSync(e))for(let t of f.readdirSync(e,{withFileTypes:!0})){let r=u.join(e,t.name);t.isDirectory()?Vr(r):Gr(r)&&f.rmSync(r,{force:!0})}}var xs=["engine","discovery","specs","ext"],vs=[["shared-platform-engineering","docker-templates"]],ws=["install-deps.sh","bun-hoisted-symlink-fix.sh","prisma-bun-client-link-fix.sh","prisma-normalize-client.sh"];function _s(){let e=Ce("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||process.cwd();for(let t=0;t<6;t++){if(f.existsSync(u.join(e,"Tiltfile"))&&f.existsSync(u.join(e,"engine")))return e;let r=u.dirname(e);if(r===e)break;e=r}return null}function As(){let e=Ce("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||process.cwd();for(let n=0;n<8;n++){if(f.existsSync(u.join(e,"shared-platform-engineering","docker-templates")))return e;let o=u.dirname(e);if(o===e)break;e=o}let t=u.dirname(process.execPath);return[u.join(t,"tdk-cli"),u.join(process.cwd(),"node_modules","@flisk-sh","flisk")].find(n=>f.existsSync(u.join(n,"shared-platform-engineering","docker-templates")))??null}function Rs(e){let t=As(),r=[];if(!t)return console.warn("\u26A0\uFE0F Flisk runtime assets not found - generated Dockerfiles may fail. Reinstall or upgrade Flisk, then re-run `flisk project`."),r;for(let n of vs){let o=u.join(t,...n),s=V(e,u.join(...n));f.existsSync(o)&&(f.mkdirSync(u.dirname(s),{recursive:!0}),f.cpSync(o,s,{recursive:!0}),r.push(n.join("/")))}for(let n of ws){let o=u.join(e,"shared-platform-engineering","docker-templates",n);f.existsSync(o)||console.warn(`\u26A0\uFE0F Missing runtime asset after copy: ${o}`)}return r}async function $s(e){let t=V(e,u.join(".tdk",".tdk-out","tdk-cli-ext")),r=[];process.env.TDK_EXTENSION_SOURCE&&r.push(process.env.TDK_EXTENSION_SOURCE);let n=_s();n&&r.push(n);let o=u.dirname(process.execPath);r.push(u.join(o,"tdk-cli")),r.push(u.join(e,"..","tdk-cli"));let s="";for(let i of r)if(i&&f.existsSync(u.join(i,"Tiltfile"))&&f.existsSync(u.join(i,"engine"))){s=i;break}if(!s){console.warn("\u26A0\uFE0F Flisk extension not found - set TDK_EXTENSION_SOURCE to its checkout path and re-run `flisk project` (or `flisk config regenerate`) to vendor it before `flisk up`.");return}f.existsSync(t)||f.mkdirSync(t,{recursive:!0}),f.copyFileSync(u.join(s,"Tiltfile"),u.join(t,"Tiltfile"));for(let i of xs)Vr(u.join(t,i)),f.cpSync(u.join(s,i),u.join(t,i),{recursive:!0,filter:a=>!Gr(a)});console.log("\u2713 Vendored Flisk extension \u2192 .tdk/.tdk-out/tdk-cli-ext/");try{let{applyPremiumOverlay:i}=await import("./extension-fetch-6XNTDF44.js");await i(e,t)}catch(i){console.warn(`\u26A0\uFE0F Premium overlay skipped: ${i.message}`)}}var Kr="SYSTEM-GENERATED BY Flisk CLI";function Zc(e,t){let r=[],n=[],o=[],s=[],i=(k,w,R)=>{w!==R&&(r.push(`${w===void 0?"Missing file":"Out of sync"}: ${k} (run 'flisk config regenerate')`),o.push({file:k,diff:Os(k,w??"",R)}))},a=Br(e),d=new _e().generateAll(a),m=u.join(e,".tdk",".tdk-out");for(let k of Ur){let w=d[k],R=u.join(m,k);i(`.tdk/.tdk-out/${k}`,f.existsSync(R)?f.readFileSync(R,"utf-8"):void 0,w)}let c=u.join(e,C),h=f.existsSync(c)?f.readFileSync(c,"utf-8"):void 0;h!==void 0&&!h.includes(Kr)?n.push(".tiltignore: not generated by Flisk, left as is"):i(C,h,d[C]);let y=t?.manifestPaths??dt(e);for(let k of y){let w=u.relative(e,k).split(u.sep).join("/");if(!t?.skipManifestValidation){let b=Or(k,w);r.push(...b.errors),n.push(...b.warnings)}let R=Cs(e,k);r.push(...R.errors),s.push(...R.handEdited)}return{valid:r.length===0,errors:r,warnings:n,diffs:o,handEdited:s}}function Os(e,t,r){let n=t.replace(/\n$/,"").split(`
73
+ `),o=r.replace(/\n$/,"").split(`
74
+ `),s=[`--- a/${e}`,`+++ b/${e}`,`@@ -1,${n.length} +1,${o.length} @@`];for(let i of n)s.push(`-${i}`);for(let i of o)s.push(`+${i}`);return s.join(`
75
+ `)}function Cs(e,t){let r=u.dirname(t),n=u.join(r,ie);if(!f.existsSync(n))return{errors:[],handEdited:[]};let o=[],s=(m,c="")=>{for(let h of f.readdirSync(m,{withFileTypes:!0})){if(c===""&&h.name===".tdk-contract")continue;let y=u.join(c,h.name),k=u.join(m,h.name);h.isDirectory()?s(k,y):h.isFile()&&o.push({fullPath:k,relativeFile:y})}};if(s(n),o.length===0)return{errors:[],handEdited:[]};let i=u.join(n,".tdk-contract"),a=u.join(i,"service.json.source"),l=[],d=[];f.existsSync(a)?f.readFileSync(a,"utf-8")!==f.readFileSync(t,"utf-8")&&l.push(u.relative(e,t)+": service.json changed since generated outputs were written (run flisk up)"):l.push(u.relative(e,a)+": generated-file contract snapshot is missing (run flisk up to regenerate)");for(let m of o){if(m.relativeFile==="service.yaml")continue;let c=u.join(i,m.relativeFile),h=u.relative(e,m.fullPath);f.existsSync(c)?f.readFileSync(m.fullPath,"utf-8")!==f.readFileSync(c,"utf-8")&&(d.push(h.split(u.sep).join("/")),l.push(`${h}: generated file differs from its Flisk snapshot (run flisk up to regenerate)`)):l.push(`${h}: generated-file snapshot is missing (run flisk up to regenerate)`)}return{errors:l,handEdited:d}}import{stdin as Is,stdout as Ds}from"node:process";import{createInterface as Ns}from"node:readline/promises";async function Ae(e){let t=Ns({input:Is,output:Ds});try{return await new Promise((r,n)=>{t.once("close",()=>n(new Error("No input available to answer the prompt. Run this in a terminal."))),t.question(e).then(o=>r(o.trim()),n)})}finally{t.close()}}async function nl(e){let t=e.initial?` (${e.initial})`:"";for(;;){let n=await Ae(`${e.message}${t} `)||e.initial||"",o=e.validate?.(n)??!0;if(o===!0)return n;console.log(o)}}async function ol(e){let t=e.initial??!0,r=t?"Y/n":"y/N";for(;;){let n=(await Ae(`${e.message} (${r}) `)).toLowerCase();if(!n)return t;if(["y","yes"].includes(n))return!0;if(["n","no"].includes(n))return!1;console.log("Please answer yes or no.")}}async function sl(e){for(console.log(e.message),e.choices.forEach((t,r)=>{console.log(` ${r+1}. ${t.title}`)});;){let t=await Ae("Choose one: "),r=Number.parseInt(t,10)-1,n=e.choices[r];if(n)return n.value;console.log(`Enter a number from 1 to ${e.choices.length}.`)}}async function il(e){let t=e.choices.map((n,o)=>n.selected?o+1:null).filter(n=>n!==null),r=t.length>0?` [${t.join(",")}]`:"";for(console.log(e.message),e.choices.forEach((n,o)=>{let s=n.selected?"*":" ";console.log(` ${s} ${o+1}. ${n.title}`)});;){let n=await Ae(`Choose one or more numbers, comma-separated${r}: `),o=t;if(n){let a=n.split(",").map(d=>d.trim()),l=a.find(d=>{if(!/^\d+$/.test(d))return!0;let m=Number.parseInt(d,10);return!e.choices[m-1]});if(l!==void 0){console.log(`"${l}" is not a valid choice (1-${e.choices.length})`);continue}o=a.map(d=>Number.parseInt(d,10))}let s=Array.from(new Set(o)).map(a=>e.choices[a-1]).filter(a=>!!a).map(a=>a.value),i=e.validate?.(s)??!0;if(i===!0)return s;console.log(i)}}export{Ne as a,p as b,Bt as c,Ys as d,W as e,j as f,Lt as g,se as h,ie as i,he as j,ge as k,H as l,B as m,qs as n,Js as o,zs as p,E as q,Ue as r,Xs as s,D as t,si as u,ae as v,li as w,ui as x,ye as y,hi as z,wn as A,zt as B,_n as C,_i as D,Ai as E,Qt as F,Fi as G,A as H,N as I,ji as J,Rn as K,Pi as L,Li as M,We as N,Mi as O,er as P,Gi as Q,Vi as R,Ki as S,Wi as T,Hi as U,Yi as V,qi as W,Ji as X,zi as Y,qe as Z,Xi as _,Qi as $,Zi as aa,ea as ba,ta as ca,ra as da,na as ea,oa as fa,q as ga,ma as ha,Y as ia,ha as ja,ga as ka,Sa as la,Ze as ma,no as na,dr as oa,fr as pa,io as qa,et as ra,ao as sa,tt as ta,Pa as ua,La as va,Ma as wa,Ya as xa,qa as ya,Ja as za,za as Aa,Xa as Ba,_r as Ca,tc as Da,it as Ea,Cr as Fa,zn as Ga,Xn as Ha,ka as Ia,Ta as Ja,ba as Ka,xa as La,va as Ma,Qe as Na,dt as Oa,Dr as Pa,Io as Qa,xe as Ra,ve as Sa,mc as Ta,hc as Ua,Do as Va,gc as Wa,Sc as Xa,yc as Ya,Ec as Za,Fo as _a,kc as $a,wc as ab,Bo as bb,_c as cb,Wo as db,Ac as eb,Pr as fb,fe as gb,_e as hb,yt as ib,Br as jb,Qc as kb,As as lb,Rs as mb,Zc as nb,nl as ob,ol as pb,sl as qb,il as rb};