@specific.dev/cli 0.1.62 → 0.1.64

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 (72) hide show
  1. package/dist/admin/404/index.html +1 -1
  2. package/dist/admin/404.html +1 -1
  3. package/dist/admin/__next.!KGRlZmF1bHQp.__PAGE__.txt +2 -2
  4. package/dist/admin/__next.!KGRlZmF1bHQp.txt +5 -5
  5. package/dist/admin/__next._full.txt +8 -8
  6. package/dist/admin/__next._head.txt +1 -1
  7. package/dist/admin/__next._index.txt +3 -3
  8. package/dist/admin/__next._tree.txt +1 -1
  9. package/dist/admin/_next/static/chunks/{59b95f8f36877231.js → 369cccd775763aa2.js} +2 -2
  10. package/dist/admin/_next/static/chunks/497f00630c8a5681.js +1 -0
  11. package/dist/admin/_next/static/chunks/{422a5aac8222197b.js → c7954d71061f1f9b.js} +2 -2
  12. package/dist/admin/_next/static/chunks/e3baf0c708c5b9ae.js +1 -0
  13. package/dist/admin/_not-found/__next._full.txt +3 -3
  14. package/dist/admin/_not-found/__next._head.txt +1 -1
  15. package/dist/admin/_not-found/__next._index.txt +3 -3
  16. package/dist/admin/_not-found/__next._not-found.__PAGE__.txt +1 -1
  17. package/dist/admin/_not-found/__next._not-found.txt +1 -1
  18. package/dist/admin/_not-found/__next._tree.txt +1 -1
  19. package/dist/admin/_not-found/index.html +1 -1
  20. package/dist/admin/_not-found/index.txt +3 -3
  21. package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.__PAGE__.txt +2 -2
  22. package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.txt +1 -1
  23. package/dist/admin/databases/__next.!KGRlZmF1bHQp.txt +5 -5
  24. package/dist/admin/databases/__next._full.txt +8 -8
  25. package/dist/admin/databases/__next._head.txt +1 -1
  26. package/dist/admin/databases/__next._index.txt +3 -3
  27. package/dist/admin/databases/__next._tree.txt +1 -1
  28. package/dist/admin/databases/index.html +1 -1
  29. package/dist/admin/databases/index.txt +8 -8
  30. package/dist/admin/fullscreen/__next._full.txt +4 -4
  31. package/dist/admin/fullscreen/__next._head.txt +1 -1
  32. package/dist/admin/fullscreen/__next._index.txt +3 -3
  33. package/dist/admin/fullscreen/__next._tree.txt +1 -1
  34. package/dist/admin/fullscreen/__next.fullscreen.__PAGE__.txt +2 -2
  35. package/dist/admin/fullscreen/__next.fullscreen.txt +1 -1
  36. package/dist/admin/fullscreen/databases/__next._full.txt +4 -4
  37. package/dist/admin/fullscreen/databases/__next._head.txt +1 -1
  38. package/dist/admin/fullscreen/databases/__next._index.txt +3 -3
  39. package/dist/admin/fullscreen/databases/__next._tree.txt +1 -1
  40. package/dist/admin/fullscreen/databases/__next.fullscreen.databases.__PAGE__.txt +2 -2
  41. package/dist/admin/fullscreen/databases/__next.fullscreen.databases.txt +1 -1
  42. package/dist/admin/fullscreen/databases/__next.fullscreen.txt +1 -1
  43. package/dist/admin/fullscreen/databases/index.html +1 -1
  44. package/dist/admin/fullscreen/databases/index.txt +4 -4
  45. package/dist/admin/fullscreen/index.html +1 -1
  46. package/dist/admin/fullscreen/index.txt +4 -4
  47. package/dist/admin/index.html +1 -1
  48. package/dist/admin/index.txt +8 -8
  49. package/dist/admin/workflows/__next.!KGRlZmF1bHQp.txt +8 -0
  50. package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.__PAGE__.txt +9 -0
  51. package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.txt +4 -0
  52. package/dist/admin/workflows/__next._full.txt +27 -0
  53. package/dist/admin/workflows/__next._head.txt +6 -0
  54. package/dist/admin/workflows/__next._index.txt +7 -0
  55. package/dist/admin/workflows/__next._tree.txt +5 -0
  56. package/dist/admin/workflows/index.html +1 -0
  57. package/dist/admin/workflows/index.txt +27 -0
  58. package/dist/cli.js +1316 -335
  59. package/dist/docs/builds.md +59 -13
  60. package/dist/docs/index.md +4 -0
  61. package/dist/docs/integrations/prisma.md +4 -2
  62. package/dist/docs/integrations/temporal.md +4 -0
  63. package/dist/docs/postgres.md +2 -0
  64. package/dist/docs/services.md +42 -0
  65. package/dist/docs/temporal.md +98 -0
  66. package/dist/docs/volumes.md +63 -0
  67. package/dist/postinstall.js +1 -1
  68. package/package.json +4 -2
  69. package/dist/admin/_next/static/chunks/144304e5f91b7ae5.js +0 -1
  70. /package/dist/admin/_next/static/{bSt01e539un5ZT_sTTRm7 → Au-tOFiLJaoIPzWnpCaGr}/_buildManifest.js +0 -0
  71. /package/dist/admin/_next/static/{bSt01e539un5ZT_sTTRm7 → Au-tOFiLJaoIPzWnpCaGr}/_clientMiddlewareManifest.json +0 -0
  72. /package/dist/admin/_next/static/{bSt01e539un5ZT_sTTRm7 → Au-tOFiLJaoIPzWnpCaGr}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -238,15 +238,15 @@ var init_wsl_utils = __esm({
238
238
  const { stdout } = await executePowerShell(command, { powerShellPath: psPath });
239
239
  return stdout.trim();
240
240
  };
241
- convertWslPathToWindows = async (path27) => {
242
- if (/^[a-z]+:\/\//i.test(path27)) {
243
- return path27;
241
+ convertWslPathToWindows = async (path28) => {
242
+ if (/^[a-z]+:\/\//i.test(path28)) {
243
+ return path28;
244
244
  }
245
245
  try {
246
- const { stdout } = await execFile2("wslpath", ["-aw", path27], { encoding: "utf8" });
246
+ const { stdout } = await execFile2("wslpath", ["-aw", path28], { encoding: "utf8" });
247
247
  return stdout.trim();
248
248
  } catch {
249
- return path27;
249
+ return path28;
250
250
  }
251
251
  };
252
252
  }
@@ -754,8 +754,8 @@ var require_dist = __commonJS({
754
754
  var $global, $module, $NaN = NaN;
755
755
  if ("undefined" != typeof window ? $global = window : "undefined" != typeof self ? $global = self : "undefined" != typeof global ? ($global = global).require = __require : $global = this, void 0 === $global || void 0 === $global.Array) throw new Error("no global object found");
756
756
  if ("undefined" != typeof module && ($module = module), !$global.fs && $global.require) try {
757
- var fs29 = $global.require("fs");
758
- "object" == typeof fs29 && null !== fs29 && 0 !== Object.keys(fs29).length && ($global.fs = fs29);
757
+ var fs30 = $global.require("fs");
758
+ "object" == typeof fs30 && null !== fs30 && 0 !== Object.keys(fs30).length && ($global.fs = fs30);
759
759
  } catch (e) {
760
760
  }
761
761
  if (!$global.fs) {
@@ -182942,6 +182942,487 @@ var require_dist = __commonJS({
182942
182942
  }
182943
182943
  });
182944
182944
 
182945
+ // node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js
182946
+ var require_picocolors = __commonJS({
182947
+ "node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js"(exports, module) {
182948
+ var p = process || {};
182949
+ var argv = p.argv || [];
182950
+ var env2 = p.env || {};
182951
+ var isColorSupported = !(!!env2.NO_COLOR || argv.includes("--no-color")) && (!!env2.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env2.TERM !== "dumb" || !!env2.CI);
182952
+ var formatter = (open3, close, replace = open3) => (input) => {
182953
+ let string = "" + input, index = string.indexOf(close, open3.length);
182954
+ return ~index ? open3 + replaceClose(string, close, replace, index) + close : open3 + string + close;
182955
+ };
182956
+ var replaceClose = (string, close, replace, index) => {
182957
+ let result = "", cursor = 0;
182958
+ do {
182959
+ result += string.substring(cursor, index) + replace;
182960
+ cursor = index + close.length;
182961
+ index = string.indexOf(close, cursor);
182962
+ } while (~index);
182963
+ return result + string.substring(cursor);
182964
+ };
182965
+ var createColors = (enabled = isColorSupported) => {
182966
+ let f = enabled ? formatter : () => String;
182967
+ return {
182968
+ isColorSupported: enabled,
182969
+ reset: f("\x1B[0m", "\x1B[0m"),
182970
+ bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
182971
+ dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
182972
+ italic: f("\x1B[3m", "\x1B[23m"),
182973
+ underline: f("\x1B[4m", "\x1B[24m"),
182974
+ inverse: f("\x1B[7m", "\x1B[27m"),
182975
+ hidden: f("\x1B[8m", "\x1B[28m"),
182976
+ strikethrough: f("\x1B[9m", "\x1B[29m"),
182977
+ black: f("\x1B[30m", "\x1B[39m"),
182978
+ red: f("\x1B[31m", "\x1B[39m"),
182979
+ green: f("\x1B[32m", "\x1B[39m"),
182980
+ yellow: f("\x1B[33m", "\x1B[39m"),
182981
+ blue: f("\x1B[34m", "\x1B[39m"),
182982
+ magenta: f("\x1B[35m", "\x1B[39m"),
182983
+ cyan: f("\x1B[36m", "\x1B[39m"),
182984
+ white: f("\x1B[37m", "\x1B[39m"),
182985
+ gray: f("\x1B[90m", "\x1B[39m"),
182986
+ bgBlack: f("\x1B[40m", "\x1B[49m"),
182987
+ bgRed: f("\x1B[41m", "\x1B[49m"),
182988
+ bgGreen: f("\x1B[42m", "\x1B[49m"),
182989
+ bgYellow: f("\x1B[43m", "\x1B[49m"),
182990
+ bgBlue: f("\x1B[44m", "\x1B[49m"),
182991
+ bgMagenta: f("\x1B[45m", "\x1B[49m"),
182992
+ bgCyan: f("\x1B[46m", "\x1B[49m"),
182993
+ bgWhite: f("\x1B[47m", "\x1B[49m"),
182994
+ blackBright: f("\x1B[90m", "\x1B[39m"),
182995
+ redBright: f("\x1B[91m", "\x1B[39m"),
182996
+ greenBright: f("\x1B[92m", "\x1B[39m"),
182997
+ yellowBright: f("\x1B[93m", "\x1B[39m"),
182998
+ blueBright: f("\x1B[94m", "\x1B[39m"),
182999
+ magentaBright: f("\x1B[95m", "\x1B[39m"),
183000
+ cyanBright: f("\x1B[96m", "\x1B[39m"),
183001
+ whiteBright: f("\x1B[97m", "\x1B[39m"),
183002
+ bgBlackBright: f("\x1B[100m", "\x1B[49m"),
183003
+ bgRedBright: f("\x1B[101m", "\x1B[49m"),
183004
+ bgGreenBright: f("\x1B[102m", "\x1B[49m"),
183005
+ bgYellowBright: f("\x1B[103m", "\x1B[49m"),
183006
+ bgBlueBright: f("\x1B[104m", "\x1B[49m"),
183007
+ bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
183008
+ bgCyanBright: f("\x1B[106m", "\x1B[49m"),
183009
+ bgWhiteBright: f("\x1B[107m", "\x1B[49m")
183010
+ };
183011
+ };
183012
+ module.exports = createColors();
183013
+ module.exports.createColors = createColors;
183014
+ }
183015
+ });
183016
+
183017
+ // node_modules/.pnpm/js-tokens@4.0.0/node_modules/js-tokens/index.js
183018
+ var require_js_tokens = __commonJS({
183019
+ "node_modules/.pnpm/js-tokens@4.0.0/node_modules/js-tokens/index.js"(exports) {
183020
+ Object.defineProperty(exports, "__esModule", {
183021
+ value: true
183022
+ });
183023
+ exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g;
183024
+ exports.matchToToken = function(match) {
183025
+ var token = { type: "invalid", value: match[0], closed: void 0 };
183026
+ if (match[1]) token.type = "string", token.closed = !!(match[3] || match[4]);
183027
+ else if (match[5]) token.type = "comment";
183028
+ else if (match[6]) token.type = "comment", token.closed = !!match[7];
183029
+ else if (match[8]) token.type = "regex";
183030
+ else if (match[9]) token.type = "number";
183031
+ else if (match[10]) token.type = "name";
183032
+ else if (match[11]) token.type = "punctuator";
183033
+ else if (match[12]) token.type = "whitespace";
183034
+ return token;
183035
+ };
183036
+ }
183037
+ });
183038
+
183039
+ // node_modules/.pnpm/@babel+helper-validator-identifier@7.28.5/node_modules/@babel/helper-validator-identifier/lib/identifier.js
183040
+ var require_identifier = __commonJS({
183041
+ "node_modules/.pnpm/@babel+helper-validator-identifier@7.28.5/node_modules/@babel/helper-validator-identifier/lib/identifier.js"(exports) {
183042
+ "use strict";
183043
+ Object.defineProperty(exports, "__esModule", {
183044
+ value: true
183045
+ });
183046
+ exports.isIdentifierChar = isIdentifierChar;
183047
+ exports.isIdentifierName = isIdentifierName;
183048
+ exports.isIdentifierStart = isIdentifierStart;
183049
+ var nonASCIIidentifierStartChars = "\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC";
183050
+ var nonASCIIidentifierChars = "\xB7\u0300-\u036F\u0387\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u0669\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u06F0-\u06F9\u0711\u0730-\u074A\u07A6-\u07B0\u07C0-\u07C9\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0897-\u089F\u08CA-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0966-\u096F\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09E6-\u09EF\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A66-\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AE6-\u0AEF\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B62\u0B63\u0B66-\u0B6F\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE6-\u0BEF\u0C00-\u0C04\u0C3C\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0CE6-\u0CEF\u0CF3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D66-\u0D6F\u0D81-\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0E50-\u0E59\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECE\u0ED0-\u0ED9\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1040-\u1049\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F-\u109D\u135D-\u135F\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u18A9\u1920-\u192B\u1930-\u193B\u1946-\u194F\u19D0-\u19DA\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AB0-\u1ABD\u1ABF-\u1ADD\u1AE0-\u1AEB\u1B00-\u1B04\u1B34-\u1B44\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BB0-\u1BB9\u1BE6-\u1BF3\u1C24-\u1C37\u1C40-\u1C49\u1C50-\u1C59\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DFF\u200C\u200D\u203F\u2040\u2054\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\u30FB\uA620-\uA629\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA82C\uA880\uA881\uA8B4-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F1\uA8FF-\uA909\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9D0-\uA9D9\uA9E5\uA9F0-\uA9F9\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA50-\uAA59\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uABF0-\uABF9\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFF10-\uFF19\uFF3F\uFF65";
183051
+ var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
183052
+ var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
183053
+ nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
183054
+ var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489];
183055
+ var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
183056
+ function isInAstralSet(code, set) {
183057
+ let pos = 65536;
183058
+ for (let i = 0, length = set.length; i < length; i += 2) {
183059
+ pos += set[i];
183060
+ if (pos > code) return false;
183061
+ pos += set[i + 1];
183062
+ if (pos >= code) return true;
183063
+ }
183064
+ return false;
183065
+ }
183066
+ function isIdentifierStart(code) {
183067
+ if (code < 65) return code === 36;
183068
+ if (code <= 90) return true;
183069
+ if (code < 97) return code === 95;
183070
+ if (code <= 122) return true;
183071
+ if (code <= 65535) {
183072
+ return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code));
183073
+ }
183074
+ return isInAstralSet(code, astralIdentifierStartCodes);
183075
+ }
183076
+ function isIdentifierChar(code) {
183077
+ if (code < 48) return code === 36;
183078
+ if (code < 58) return true;
183079
+ if (code < 65) return false;
183080
+ if (code <= 90) return true;
183081
+ if (code < 97) return code === 95;
183082
+ if (code <= 122) return true;
183083
+ if (code <= 65535) {
183084
+ return code >= 170 && nonASCIIidentifier.test(String.fromCharCode(code));
183085
+ }
183086
+ return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
183087
+ }
183088
+ function isIdentifierName(name) {
183089
+ let isFirst = true;
183090
+ for (let i = 0; i < name.length; i++) {
183091
+ let cp = name.charCodeAt(i);
183092
+ if ((cp & 64512) === 55296 && i + 1 < name.length) {
183093
+ const trail = name.charCodeAt(++i);
183094
+ if ((trail & 64512) === 56320) {
183095
+ cp = 65536 + ((cp & 1023) << 10) + (trail & 1023);
183096
+ }
183097
+ }
183098
+ if (isFirst) {
183099
+ isFirst = false;
183100
+ if (!isIdentifierStart(cp)) {
183101
+ return false;
183102
+ }
183103
+ } else if (!isIdentifierChar(cp)) {
183104
+ return false;
183105
+ }
183106
+ }
183107
+ return !isFirst;
183108
+ }
183109
+ }
183110
+ });
183111
+
183112
+ // node_modules/.pnpm/@babel+helper-validator-identifier@7.28.5/node_modules/@babel/helper-validator-identifier/lib/keyword.js
183113
+ var require_keyword = __commonJS({
183114
+ "node_modules/.pnpm/@babel+helper-validator-identifier@7.28.5/node_modules/@babel/helper-validator-identifier/lib/keyword.js"(exports) {
183115
+ "use strict";
183116
+ Object.defineProperty(exports, "__esModule", {
183117
+ value: true
183118
+ });
183119
+ exports.isKeyword = isKeyword;
183120
+ exports.isReservedWord = isReservedWord;
183121
+ exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord;
183122
+ exports.isStrictBindReservedWord = isStrictBindReservedWord;
183123
+ exports.isStrictReservedWord = isStrictReservedWord;
183124
+ var reservedWords = {
183125
+ keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
183126
+ strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
183127
+ strictBind: ["eval", "arguments"]
183128
+ };
183129
+ var keywords = new Set(reservedWords.keyword);
183130
+ var reservedWordsStrictSet = new Set(reservedWords.strict);
183131
+ var reservedWordsStrictBindSet = new Set(reservedWords.strictBind);
183132
+ function isReservedWord(word, inModule) {
183133
+ return inModule && word === "await" || word === "enum";
183134
+ }
183135
+ function isStrictReservedWord(word, inModule) {
183136
+ return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);
183137
+ }
183138
+ function isStrictBindOnlyReservedWord(word) {
183139
+ return reservedWordsStrictBindSet.has(word);
183140
+ }
183141
+ function isStrictBindReservedWord(word, inModule) {
183142
+ return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word);
183143
+ }
183144
+ function isKeyword(word) {
183145
+ return keywords.has(word);
183146
+ }
183147
+ }
183148
+ });
183149
+
183150
+ // node_modules/.pnpm/@babel+helper-validator-identifier@7.28.5/node_modules/@babel/helper-validator-identifier/lib/index.js
183151
+ var require_lib = __commonJS({
183152
+ "node_modules/.pnpm/@babel+helper-validator-identifier@7.28.5/node_modules/@babel/helper-validator-identifier/lib/index.js"(exports) {
183153
+ "use strict";
183154
+ Object.defineProperty(exports, "__esModule", {
183155
+ value: true
183156
+ });
183157
+ Object.defineProperty(exports, "isIdentifierChar", {
183158
+ enumerable: true,
183159
+ get: function() {
183160
+ return _identifier.isIdentifierChar;
183161
+ }
183162
+ });
183163
+ Object.defineProperty(exports, "isIdentifierName", {
183164
+ enumerable: true,
183165
+ get: function() {
183166
+ return _identifier.isIdentifierName;
183167
+ }
183168
+ });
183169
+ Object.defineProperty(exports, "isIdentifierStart", {
183170
+ enumerable: true,
183171
+ get: function() {
183172
+ return _identifier.isIdentifierStart;
183173
+ }
183174
+ });
183175
+ Object.defineProperty(exports, "isKeyword", {
183176
+ enumerable: true,
183177
+ get: function() {
183178
+ return _keyword.isKeyword;
183179
+ }
183180
+ });
183181
+ Object.defineProperty(exports, "isReservedWord", {
183182
+ enumerable: true,
183183
+ get: function() {
183184
+ return _keyword.isReservedWord;
183185
+ }
183186
+ });
183187
+ Object.defineProperty(exports, "isStrictBindOnlyReservedWord", {
183188
+ enumerable: true,
183189
+ get: function() {
183190
+ return _keyword.isStrictBindOnlyReservedWord;
183191
+ }
183192
+ });
183193
+ Object.defineProperty(exports, "isStrictBindReservedWord", {
183194
+ enumerable: true,
183195
+ get: function() {
183196
+ return _keyword.isStrictBindReservedWord;
183197
+ }
183198
+ });
183199
+ Object.defineProperty(exports, "isStrictReservedWord", {
183200
+ enumerable: true,
183201
+ get: function() {
183202
+ return _keyword.isStrictReservedWord;
183203
+ }
183204
+ });
183205
+ var _identifier = require_identifier();
183206
+ var _keyword = require_keyword();
183207
+ }
183208
+ });
183209
+
183210
+ // node_modules/.pnpm/@babel+code-frame@7.29.0/node_modules/@babel/code-frame/lib/index.js
183211
+ var require_lib2 = __commonJS({
183212
+ "node_modules/.pnpm/@babel+code-frame@7.29.0/node_modules/@babel/code-frame/lib/index.js"(exports) {
183213
+ "use strict";
183214
+ Object.defineProperty(exports, "__esModule", { value: true });
183215
+ var picocolors = require_picocolors();
183216
+ var jsTokens = require_js_tokens();
183217
+ var helperValidatorIdentifier = require_lib();
183218
+ function isColorSupported() {
183219
+ return typeof process === "object" && (process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false") ? false : picocolors.isColorSupported;
183220
+ }
183221
+ var compose = (f, g) => (v) => f(g(v));
183222
+ function buildDefs(colors) {
183223
+ return {
183224
+ keyword: colors.cyan,
183225
+ capitalized: colors.yellow,
183226
+ jsxIdentifier: colors.yellow,
183227
+ punctuator: colors.yellow,
183228
+ number: colors.magenta,
183229
+ string: colors.green,
183230
+ regex: colors.magenta,
183231
+ comment: colors.gray,
183232
+ invalid: compose(compose(colors.white, colors.bgRed), colors.bold),
183233
+ gutter: colors.gray,
183234
+ marker: compose(colors.red, colors.bold),
183235
+ message: compose(colors.red, colors.bold),
183236
+ reset: colors.reset
183237
+ };
183238
+ }
183239
+ var defsOn = buildDefs(picocolors.createColors(true));
183240
+ var defsOff = buildDefs(picocolors.createColors(false));
183241
+ function getDefs(enabled) {
183242
+ return enabled ? defsOn : defsOff;
183243
+ }
183244
+ var sometimesKeywords = /* @__PURE__ */ new Set(["as", "async", "from", "get", "of", "set"]);
183245
+ var NEWLINE$1 = /\r\n|[\n\r\u2028\u2029]/;
183246
+ var BRACKET = /^[()[\]{}]$/;
183247
+ var tokenize;
183248
+ var JSX_TAG = /^[a-z][\w-]*$/i;
183249
+ var getTokenType = function(token, offset, text) {
183250
+ if (token.type === "name") {
183251
+ const tokenValue = token.value;
183252
+ if (helperValidatorIdentifier.isKeyword(tokenValue) || helperValidatorIdentifier.isStrictReservedWord(tokenValue, true) || sometimesKeywords.has(tokenValue)) {
183253
+ return "keyword";
183254
+ }
183255
+ if (JSX_TAG.test(tokenValue) && (text[offset - 1] === "<" || text.slice(offset - 2, offset) === "</")) {
183256
+ return "jsxIdentifier";
183257
+ }
183258
+ const firstChar = String.fromCodePoint(tokenValue.codePointAt(0));
183259
+ if (firstChar !== firstChar.toLowerCase()) {
183260
+ return "capitalized";
183261
+ }
183262
+ }
183263
+ if (token.type === "punctuator" && BRACKET.test(token.value)) {
183264
+ return "bracket";
183265
+ }
183266
+ if (token.type === "invalid" && (token.value === "@" || token.value === "#")) {
183267
+ return "punctuator";
183268
+ }
183269
+ return token.type;
183270
+ };
183271
+ tokenize = function* (text) {
183272
+ let match;
183273
+ while (match = jsTokens.default.exec(text)) {
183274
+ const token = jsTokens.matchToToken(match);
183275
+ yield {
183276
+ type: getTokenType(token, match.index, text),
183277
+ value: token.value
183278
+ };
183279
+ }
183280
+ };
183281
+ function highlight(text) {
183282
+ if (text === "") return "";
183283
+ const defs = getDefs(true);
183284
+ let highlighted = "";
183285
+ for (const {
183286
+ type,
183287
+ value
183288
+ } of tokenize(text)) {
183289
+ if (type in defs) {
183290
+ highlighted += value.split(NEWLINE$1).map((str) => defs[type](str)).join("\n");
183291
+ } else {
183292
+ highlighted += value;
183293
+ }
183294
+ }
183295
+ return highlighted;
183296
+ }
183297
+ var deprecationWarningShown = false;
183298
+ var NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
183299
+ function getMarkerLines(loc, source, opts, startLineBaseZero) {
183300
+ const startLoc = Object.assign({
183301
+ column: 0,
183302
+ line: -1
183303
+ }, loc.start);
183304
+ const endLoc = Object.assign({}, startLoc, loc.end);
183305
+ const {
183306
+ linesAbove = 2,
183307
+ linesBelow = 3
183308
+ } = opts || {};
183309
+ const startLine = startLoc.line - startLineBaseZero;
183310
+ const startColumn = startLoc.column;
183311
+ const endLine = endLoc.line - startLineBaseZero;
183312
+ const endColumn = endLoc.column;
183313
+ let start = Math.max(startLine - (linesAbove + 1), 0);
183314
+ let end = Math.min(source.length, endLine + linesBelow);
183315
+ if (startLine === -1) {
183316
+ start = 0;
183317
+ }
183318
+ if (endLine === -1) {
183319
+ end = source.length;
183320
+ }
183321
+ const lineDiff = endLine - startLine;
183322
+ const markerLines = {};
183323
+ if (lineDiff) {
183324
+ for (let i = 0; i <= lineDiff; i++) {
183325
+ const lineNumber = i + startLine;
183326
+ if (!startColumn) {
183327
+ markerLines[lineNumber] = true;
183328
+ } else if (i === 0) {
183329
+ const sourceLength = source[lineNumber - 1].length;
183330
+ markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];
183331
+ } else if (i === lineDiff) {
183332
+ markerLines[lineNumber] = [0, endColumn];
183333
+ } else {
183334
+ const sourceLength = source[lineNumber - i].length;
183335
+ markerLines[lineNumber] = [0, sourceLength];
183336
+ }
183337
+ }
183338
+ } else {
183339
+ if (startColumn === endColumn) {
183340
+ if (startColumn) {
183341
+ markerLines[startLine] = [startColumn, 0];
183342
+ } else {
183343
+ markerLines[startLine] = true;
183344
+ }
183345
+ } else {
183346
+ markerLines[startLine] = [startColumn, endColumn - startColumn];
183347
+ }
183348
+ }
183349
+ return {
183350
+ start,
183351
+ end,
183352
+ markerLines
183353
+ };
183354
+ }
183355
+ function codeFrameColumns2(rawLines, loc, opts = {}) {
183356
+ const shouldHighlight = opts.forceColor || isColorSupported() && opts.highlightCode;
183357
+ const startLineBaseZero = (opts.startLine || 1) - 1;
183358
+ const defs = getDefs(shouldHighlight);
183359
+ const lines = rawLines.split(NEWLINE);
183360
+ const {
183361
+ start,
183362
+ end,
183363
+ markerLines
183364
+ } = getMarkerLines(loc, lines, opts, startLineBaseZero);
183365
+ const hasColumns = loc.start && typeof loc.start.column === "number";
183366
+ const numberMaxWidth = String(end + startLineBaseZero).length;
183367
+ const highlightedLines = shouldHighlight ? highlight(rawLines) : rawLines;
183368
+ let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index2) => {
183369
+ const number = start + 1 + index2;
183370
+ const paddedNumber = ` ${number + startLineBaseZero}`.slice(-numberMaxWidth);
183371
+ const gutter = ` ${paddedNumber} |`;
183372
+ const hasMarker = markerLines[number];
183373
+ const lastMarkerLine = !markerLines[number + 1];
183374
+ if (hasMarker) {
183375
+ let markerLine = "";
183376
+ if (Array.isArray(hasMarker)) {
183377
+ const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
183378
+ const numberOfMarkers = hasMarker[1] || 1;
183379
+ markerLine = ["\n ", defs.gutter(gutter.replace(/\d/g, " ")), " ", markerSpacing, defs.marker("^").repeat(numberOfMarkers)].join("");
183380
+ if (lastMarkerLine && opts.message) {
183381
+ markerLine += " " + defs.message(opts.message);
183382
+ }
183383
+ }
183384
+ return [defs.marker(">"), defs.gutter(gutter), line.length > 0 ? ` ${line}` : "", markerLine].join("");
183385
+ } else {
183386
+ return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : ""}`;
183387
+ }
183388
+ }).join("\n");
183389
+ if (opts.message && !hasColumns) {
183390
+ frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}
183391
+ ${frame}`;
183392
+ }
183393
+ if (shouldHighlight) {
183394
+ return defs.reset(frame);
183395
+ } else {
183396
+ return frame;
183397
+ }
183398
+ }
183399
+ function index(rawLines, lineNumber, colNumber, opts = {}) {
183400
+ if (!deprecationWarningShown) {
183401
+ deprecationWarningShown = true;
183402
+ const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.";
183403
+ if (process.emitWarning) {
183404
+ process.emitWarning(message, "DeprecationWarning");
183405
+ } else {
183406
+ const deprecationError = new Error(message);
183407
+ deprecationError.name = "DeprecationWarning";
183408
+ console.warn(new Error(message));
183409
+ }
183410
+ }
183411
+ colNumber = Math.max(colNumber, 0);
183412
+ const location = {
183413
+ start: {
183414
+ column: colNumber,
183415
+ line: lineNumber
183416
+ }
183417
+ };
183418
+ return codeFrameColumns2(rawLines, location, opts);
183419
+ }
183420
+ exports.codeFrameColumns = codeFrameColumns2;
183421
+ exports.default = index;
183422
+ exports.highlight = highlight;
183423
+ }
183424
+ });
183425
+
182945
183426
  // src/cli.tsx
182946
183427
  import { Command } from "commander";
182947
183428
 
@@ -184014,7 +184495,7 @@ function trackEvent(event, properties) {
184014
184495
  event,
184015
184496
  properties: {
184016
184497
  ...properties,
184017
- cli_version: "0.1.62",
184498
+ cli_version: "0.1.64",
184018
184499
  platform: process.platform,
184019
184500
  node_version: process.version,
184020
184501
  project_id: getProjectId(),
@@ -184382,6 +184863,10 @@ var BETA_REGISTRY = [
184382
184863
  {
184383
184864
  name: "reshape",
184384
184865
  description: "Zero-downtime database schema migrations using Reshape"
184866
+ },
184867
+ {
184868
+ name: "temporal",
184869
+ description: "Managed Temporal workflow engine for durable workflows and background tasks"
184385
184870
  }
184386
184871
  ];
184387
184872
 
@@ -184428,11 +184913,11 @@ function saveBetas(enabled, projectDir) {
184428
184913
  // src/commands/docs.tsx
184429
184914
  var __dirname2 = dirname2(fileURLToPath2(import.meta.url));
184430
184915
  var docsDir = join8(__dirname2, "docs");
184431
- function docsCommand(path27) {
184432
- const docPath = resolveDocPath(path27);
184916
+ function docsCommand(path28) {
184917
+ const docPath = resolveDocPath(path28);
184433
184918
  if (!docPath) {
184434
184919
  console.error(
184435
- `Documentation not found: ${path27 || "index"}
184920
+ `Documentation not found: ${path28 || "index"}
184436
184921
 
184437
184922
  Run 'specific docs' to see available topics.`
184438
184923
  );
@@ -184451,16 +184936,16 @@ function filterBetaTags(content, enabledBetas) {
184451
184936
  }
184452
184937
  );
184453
184938
  }
184454
- function resolveDocPath(path27) {
184455
- if (!path27) {
184939
+ function resolveDocPath(path28) {
184940
+ if (!path28) {
184456
184941
  const indexPath2 = join8(docsDir, "index.md");
184457
184942
  return existsSync7(indexPath2) ? indexPath2 : null;
184458
184943
  }
184459
- const directPath = join8(docsDir, `${path27}.md`);
184944
+ const directPath = join8(docsDir, `${path28}.md`);
184460
184945
  if (existsSync7(directPath)) {
184461
184946
  return directPath;
184462
184947
  }
184463
- const indexPath = join8(docsDir, path27, "index.md");
184948
+ const indexPath = join8(docsDir, path28, "index.md");
184464
184949
  if (existsSync7(indexPath)) {
184465
184950
  return indexPath;
184466
184951
  }
@@ -184527,11 +185012,12 @@ function parseReferenceString(str) {
184527
185012
  if (str === "port") {
184528
185013
  return { type: "port" };
184529
185014
  }
184530
- const buildMatch = str.match(/^build\.(\w+)$/);
185015
+ const id = "[\\w-]+";
185016
+ const buildMatch = str.match(new RegExp(`^build\\.(${id})$`));
184531
185017
  if (buildMatch && buildMatch[1]) {
184532
185018
  return { type: "build", name: buildMatch[1] };
184533
185019
  }
184534
- const postgresSyncMatch = str.match(/^postgres\.(\w+)\.sync\.(\w+)$/);
185020
+ const postgresSyncMatch = str.match(new RegExp(`^postgres\\.(${id})\\.sync\\.(\\w+)$`));
184535
185021
  if (postgresSyncMatch && postgresSyncMatch[1] && postgresSyncMatch[2]) {
184536
185022
  const attr = postgresSyncMatch[2];
184537
185023
  if (["url", "secret"].includes(attr)) {
@@ -184542,10 +185028,10 @@ function parseReferenceString(str) {
184542
185028
  };
184543
185029
  }
184544
185030
  }
184545
- const postgresMatch = str.match(/^postgres\.(\w+)\.(\w+)$/);
185031
+ const postgresMatch = str.match(new RegExp(`^postgres\\.(${id})\\.(\\w+)$`));
184546
185032
  if (postgresMatch && postgresMatch[1] && postgresMatch[2]) {
184547
185033
  const attr = postgresMatch[2];
184548
- if (["url", "host", "port", "user", "password", "name"].includes(attr)) {
185034
+ if (["url", "host", "port", "user", "password", "name", "direct_url", "direct_host"].includes(attr)) {
184549
185035
  return {
184550
185036
  type: "postgres",
184551
185037
  name: postgresMatch[1],
@@ -184553,7 +185039,7 @@ function parseReferenceString(str) {
184553
185039
  };
184554
185040
  }
184555
185041
  }
184556
- const redisMatch = str.match(/^redis\.(\w+)\.(\w+)$/);
185042
+ const redisMatch = str.match(new RegExp(`^redis\\.(${id})\\.(\\w+)$`));
184557
185043
  if (redisMatch && redisMatch[1] && redisMatch[2]) {
184558
185044
  const attr = redisMatch[2];
184559
185045
  if (["url", "host", "port", "password"].includes(attr)) {
@@ -184564,7 +185050,7 @@ function parseReferenceString(str) {
184564
185050
  };
184565
185051
  }
184566
185052
  }
184567
- const storageMatch = str.match(/^storage\.(\w+)\.(\w+)$/);
185053
+ const storageMatch = str.match(new RegExp(`^storage\\.(${id})\\.(\\w+)$`));
184568
185054
  if (storageMatch && storageMatch[1] && storageMatch[2]) {
184569
185055
  const attr = storageMatch[2];
184570
185056
  if (["endpoint", "access_key", "secret_key", "bucket"].includes(attr)) {
@@ -184575,15 +185061,37 @@ function parseReferenceString(str) {
184575
185061
  };
184576
185062
  }
184577
185063
  }
184578
- const configMatch = str.match(/^config\.(\w+)$/);
185064
+ const temporalMatch = str.match(new RegExp(`^temporal\\.(${id})\\.(\\w+)$`));
185065
+ if (temporalMatch && temporalMatch[1] && temporalMatch[2]) {
185066
+ const attr = temporalMatch[2];
185067
+ if (["url", "namespace", "api_key"].includes(attr)) {
185068
+ return {
185069
+ type: "temporal",
185070
+ name: temporalMatch[1],
185071
+ attribute: attr
185072
+ };
185073
+ }
185074
+ }
185075
+ const volumeMatch = str.match(new RegExp(`^volume\\.(${id})\\.(\\w+)$`));
185076
+ if (volumeMatch && volumeMatch[1] && volumeMatch[2]) {
185077
+ const attr = volumeMatch[2];
185078
+ if (["path"].includes(attr)) {
185079
+ return {
185080
+ type: "volume",
185081
+ volumeName: volumeMatch[1],
185082
+ attribute: attr
185083
+ };
185084
+ }
185085
+ }
185086
+ const configMatch = str.match(new RegExp(`^config\\.(${id})$`));
184579
185087
  if (configMatch && configMatch[1]) {
184580
185088
  return { type: "config", name: configMatch[1] };
184581
185089
  }
184582
- const secretMatch = str.match(/^secret\.(\w+)$/);
185090
+ const secretMatch = str.match(new RegExp(`^secret\\.(${id})$`));
184583
185091
  if (secretMatch && secretMatch[1]) {
184584
185092
  return { type: "secret", name: secretMatch[1] };
184585
185093
  }
184586
- const endpointMatch = str.match(/^endpoint\.(\w+)\.port$/);
185094
+ const endpointMatch = str.match(new RegExp(`^endpoint\\.(${id})\\.port$`));
184587
185095
  if (endpointMatch && endpointMatch[1]) {
184588
185096
  return {
184589
185097
  type: "endpoint",
@@ -184591,7 +185099,7 @@ function parseReferenceString(str) {
184591
185099
  attribute: "port"
184592
185100
  };
184593
185101
  }
184594
- const serviceEndpointMatch = str.match(/^service\.(\w+)\.endpoint\.(\w+)\.(url|private_url|host|port|public_url)$/);
185102
+ const serviceEndpointMatch = str.match(new RegExp(`^service\\.(${id})\\.endpoint\\.(${id})\\.(url|private_url|host|port|public_url)$`));
184595
185103
  if (serviceEndpointMatch && serviceEndpointMatch[1] && serviceEndpointMatch[2] && serviceEndpointMatch[3]) {
184596
185104
  return {
184597
185105
  type: "service",
@@ -184600,7 +185108,7 @@ function parseReferenceString(str) {
184600
185108
  attribute: serviceEndpointMatch[3]
184601
185109
  };
184602
185110
  }
184603
- const serviceMatch = str.match(/^service\.(\w+)\.(url|private_url|host|port|public_url)$/);
185111
+ const serviceMatch = str.match(new RegExp(`^service\\.(${id})\\.(url|private_url|host|port|public_url)$`));
184604
185112
  if (serviceMatch && serviceMatch[1] && serviceMatch[2]) {
184605
185113
  return {
184606
185114
  type: "service",
@@ -184608,6 +185116,11 @@ function parseReferenceString(str) {
184608
185116
  attribute: serviceMatch[2]
184609
185117
  };
184610
185118
  }
185119
+ const knownPrefixes = ["build", "postgres", "redis", "storage", "temporal", "volume", "config", "secret", "endpoint", "service"];
185120
+ const prefixMatch = str.match(/^(\w+)\./);
185121
+ if (prefixMatch && knownPrefixes.includes(prefixMatch[1])) {
185122
+ throw new Error(`Invalid reference "\${${str}}". The prefix "${prefixMatch[1]}" is recognized but the reference format is invalid.`);
185123
+ }
184611
185124
  return str;
184612
185125
  }
184613
185126
  function parseEnv(env2) {
@@ -184685,16 +185198,31 @@ function parseBuilds(buildData) {
184685
185198
  }
184686
185199
  const fieldObj = fields;
184687
185200
  const base = fieldObj.base;
184688
- if (!base) {
184689
- throw new Error(`Build "${name}" is missing required field "base". Supported values: ${VALID_BASES.join(", ")}`);
185201
+ const dockerfile = fieldObj.dockerfile;
185202
+ if (base && dockerfile) {
185203
+ throw new Error(`Build "${name}" cannot have both "base" and "dockerfile". Use one or the other.`);
185204
+ }
185205
+ if (!base && !dockerfile) {
185206
+ throw new Error(`Build "${name}" must have either "base" (supported: ${VALID_BASES.join(", ")}) or "dockerfile" (path to a custom Dockerfile).`);
184690
185207
  }
184691
- if (typeof base !== "string" || !VALID_BASES.includes(base)) {
184692
- throw new Error(`Build "${name}" has invalid base "${base}". Supported values: ${VALID_BASES.join(", ")}`);
185208
+ if (base) {
185209
+ if (typeof base !== "string" || !VALID_BASES.includes(base)) {
185210
+ throw new Error(`Build "${name}" has invalid base "${base}". Supported values: ${VALID_BASES.join(", ")}`);
185211
+ }
185212
+ }
185213
+ if (dockerfile) {
185214
+ if (typeof dockerfile !== "string" || dockerfile.trim() === "") {
185215
+ throw new Error(`Build "${name}" has invalid "dockerfile" value. Must be a non-empty path string.`);
185216
+ }
185217
+ if (fieldObj.command) {
185218
+ throw new Error(`Build "${name}" cannot have both "dockerfile" and "command". When using a custom Dockerfile, the build steps are defined in the Dockerfile itself.`);
185219
+ }
184693
185220
  }
184694
185221
  const dev = parseDevBlock(fieldObj.dev);
184695
185222
  const build = {
184696
185223
  name,
184697
- base
185224
+ ...base ? { base } : {},
185225
+ ...dockerfile ? { dockerfile: String(dockerfile) } : {}
184698
185226
  };
184699
185227
  if (fieldObj.command) {
184700
185228
  build.command = String(fieldObj.command);
@@ -184783,6 +185311,22 @@ function parseEndpoints(fieldObj) {
184783
185311
  }
184784
185312
  return endpoints;
184785
185313
  }
185314
+ function parseVolumes(fieldObj) {
185315
+ const volumes = [];
185316
+ const volumeData = fieldObj.volume;
185317
+ if (!volumeData) {
185318
+ return volumes;
185319
+ }
185320
+ if (typeof volumeData !== "object") {
185321
+ return volumes;
185322
+ }
185323
+ if (!Array.isArray(volumeData)) {
185324
+ for (const [name] of Object.entries(volumeData)) {
185325
+ volumes.push({ name });
185326
+ }
185327
+ }
185328
+ return volumes;
185329
+ }
184786
185330
  function parseServices(serviceData) {
184787
185331
  if (!serviceData || typeof serviceData !== "object" || Array.isArray(serviceData)) {
184788
185332
  return [];
@@ -184799,6 +185343,15 @@ function parseServices(serviceData) {
184799
185343
  if (buildRef) {
184800
185344
  service.build = buildRef;
184801
185345
  }
185346
+ if (fieldObj.image) {
185347
+ if (typeof fieldObj.image !== "string" || fieldObj.image.trim() === "") {
185348
+ throw new Error(`Service "${name}" has invalid "image" value. Must be a non-empty string.`);
185349
+ }
185350
+ service.image = String(fieldObj.image);
185351
+ }
185352
+ if (service.build && service.image) {
185353
+ throw new Error(`Service "${name}" cannot have both "build" and "image". Use one or the other.`);
185354
+ }
184802
185355
  if (fieldObj.command) {
184803
185356
  service.command = String(fieldObj.command);
184804
185357
  }
@@ -184806,6 +185359,10 @@ function parseServices(serviceData) {
184806
185359
  service.root = String(fieldObj.root);
184807
185360
  }
184808
185361
  const endpoints = parseEndpoints(fieldObj);
185362
+ const volumes = parseVolumes(fieldObj);
185363
+ if (volumes.length > 0) {
185364
+ service.volumes = volumes;
185365
+ }
184809
185366
  if (fieldObj.expose !== void 0) {
184810
185367
  service.expose = {};
184811
185368
  if (endpoints.length === 0) {
@@ -184899,6 +185456,16 @@ function parseStorage(data) {
184899
185456
  }
184900
185457
  return result;
184901
185458
  }
185459
+ function parseTemporal(data) {
185460
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
185461
+ return [];
185462
+ }
185463
+ const result = [];
185464
+ for (const [name] of Object.entries(data)) {
185465
+ result.push({ name });
185466
+ }
185467
+ return result;
185468
+ }
184902
185469
  function parseConfigDevBlock(dev) {
184903
185470
  if (!dev) {
184904
185471
  return void 0;
@@ -185010,6 +185577,7 @@ async function parseConfig(hcl) {
185010
185577
  postgres: parsePostgres(json.postgres),
185011
185578
  redis: parseRedis(json.redis),
185012
185579
  storage: parseStorage(json.storage),
185580
+ temporal: parseTemporal(json.temporal),
185013
185581
  configs: parseConfigs(json.config),
185014
185582
  secrets: parseSecrets(json.secret),
185015
185583
  environments: parseEnvironments(json.environment)
@@ -185108,12 +185676,101 @@ function validateEndpointReferences(config) {
185108
185676
  });
185109
185677
  }
185110
185678
  }
185679
+ if (ref.type === "volume") {
185680
+ const volumeRef = ref;
185681
+ const volumeExists = service.volumes?.some((v) => v.name === volumeRef.volumeName);
185682
+ if (!volumeExists) {
185683
+ errors.push({
185684
+ service: service.name,
185685
+ message: `Service "${service.name}" references volume "${volumeRef.volumeName}" in env var "${key}", but that volume is not defined on this service.`
185686
+ });
185687
+ }
185688
+ }
185111
185689
  }
185112
185690
  }
185113
185691
  }
185114
185692
  return errors;
185115
185693
  }
185116
185694
 
185695
+ // node_modules/.pnpm/@specific+config@file+..+config/node_modules/@specific/config/dist/errors.js
185696
+ function parseHclErrors(rawError) {
185697
+ const raw = rawError.trim();
185698
+ if (!raw.startsWith("parse config: [")) {
185699
+ return [];
185700
+ }
185701
+ const inner = raw.slice("parse config: [".length, -1);
185702
+ const errors = [];
185703
+ const locationPattern = /:(\d+),(\d+)-(?:(\d+),)?(\d+):\s*/g;
185704
+ const locations = [];
185705
+ let match;
185706
+ while ((match = locationPattern.exec(inner)) !== null) {
185707
+ const line = parseInt(match[1], 10);
185708
+ const colStart = parseInt(match[2], 10);
185709
+ const endLine = match[3] ? parseInt(match[3], 10) : line;
185710
+ const colEnd = parseInt(match[4], 10);
185711
+ locations.push({
185712
+ index: match.index,
185713
+ line,
185714
+ colStart,
185715
+ endLine,
185716
+ colEnd,
185717
+ matchEnd: match.index + match[0].length
185718
+ });
185719
+ }
185720
+ for (let i = 0; i < locations.length; i++) {
185721
+ const loc = locations[i];
185722
+ const nextStart = locations[i + 1]?.index ?? inner.length;
185723
+ const messageText = inner.slice(loc.matchEnd, nextStart).trim();
185724
+ const semicolonIdx = messageText.indexOf(";");
185725
+ let title;
185726
+ let description;
185727
+ if (semicolonIdx !== -1) {
185728
+ title = messageText.slice(0, semicolonIdx).trim();
185729
+ description = messageText.slice(semicolonIdx + 1).trim();
185730
+ } else {
185731
+ title = messageText;
185732
+ description = "";
185733
+ }
185734
+ errors.push({
185735
+ line: loc.line,
185736
+ colStart: loc.colStart,
185737
+ endLine: loc.endLine,
185738
+ colEnd: loc.colEnd,
185739
+ title,
185740
+ description
185741
+ });
185742
+ }
185743
+ return errors;
185744
+ }
185745
+
185746
+ // src/lib/format-config-error.ts
185747
+ var import_code_frame = __toESM(require_lib2(), 1);
185748
+ function formatConfigError(err, fileContents, filePath) {
185749
+ const raw = err instanceof Error ? err.message : String(err);
185750
+ const errors = parseHclErrors(raw);
185751
+ if (errors.length === 0) {
185752
+ return `Error: Invalid configuration: ${raw}`;
185753
+ }
185754
+ const name = filePath ?? "specific.hcl";
185755
+ const header = errors.length === 1 ? `Error in ${name}:` : `${errors.length} errors in ${name}:`;
185756
+ const blocks = errors.map((e) => {
185757
+ const frame = (0, import_code_frame.codeFrameColumns)(
185758
+ fileContents,
185759
+ {
185760
+ start: { line: e.line, column: e.colStart },
185761
+ end: { line: e.endLine, column: e.colEnd }
185762
+ },
185763
+ { highlightCode: false, message: e.description }
185764
+ );
185765
+ return ` ${e.title}
185766
+
185767
+ ${frame}`;
185768
+ });
185769
+ return `${header}
185770
+
185771
+ ${blocks.join("\n\n")}`;
185772
+ }
185773
+
185117
185774
  // src/lib/bin/types.ts
185118
185775
  var BinaryNotFoundError = class extends Error {
185119
185776
  constructor(binaryName, version, platformInfo) {
@@ -185457,6 +186114,25 @@ var reshapeBinary = {
185457
186114
  executables: ["reshape"]
185458
186115
  };
185459
186116
 
186117
+ // src/lib/bin/definitions/temporal.ts
186118
+ var temporalBinary = {
186119
+ name: "temporal",
186120
+ versions: ["1.3.0"],
186121
+ urlTemplate: "https://temporal.download/cli/archive/v{version}?platform={platform}&arch={arch}",
186122
+ platformMapping: {
186123
+ darwin: {
186124
+ arm64: { platform: "darwin", arch: "arm64" },
186125
+ x64: { platform: "darwin", arch: "amd64" }
186126
+ },
186127
+ linux: {
186128
+ arm64: { platform: "linux", arch: "arm64" },
186129
+ x64: { platform: "linux", arch: "amd64" }
186130
+ }
186131
+ },
186132
+ stripComponents: 0,
186133
+ executables: ["temporal"]
186134
+ };
186135
+
185460
186136
  // src/commands/check.tsx
185461
186137
  async function runReshapeCheck(migrationsDir) {
185462
186138
  try {
@@ -185488,9 +186164,21 @@ function CheckUI() {
185488
186164
  });
185489
186165
  return;
185490
186166
  }
186167
+ const hcl = fs13.readFileSync(configPath, "utf-8");
185491
186168
  try {
185492
- const hcl = fs13.readFileSync(configPath, "utf-8");
185493
186169
  const config2 = await parseConfig(hcl);
186170
+ for (const build of config2.builds) {
186171
+ if (build.dockerfile) {
186172
+ const dockerfilePath = path9.resolve(process.cwd(), build.dockerfile);
186173
+ if (!fs13.existsSync(dockerfilePath)) {
186174
+ setState({
186175
+ status: "error",
186176
+ error: `Build "${build.name}": Dockerfile not found at "${build.dockerfile}" (resolved to ${dockerfilePath})`
186177
+ });
186178
+ return;
186179
+ }
186180
+ }
186181
+ }
185494
186182
  const reshapeChecks2 = [];
185495
186183
  for (const pg of config2.postgres) {
185496
186184
  if (pg.reshape?.enabled) {
@@ -185522,7 +186210,7 @@ function CheckUI() {
185522
186210
  } catch (err) {
185523
186211
  setState({
185524
186212
  status: "error",
185525
- error: err instanceof Error ? err.message : String(err)
186213
+ error: formatConfigError(err, hcl, configPath)
185526
186214
  });
185527
186215
  }
185528
186216
  }
@@ -185532,7 +186220,7 @@ function CheckUI() {
185532
186220
  return /* @__PURE__ */ React3.createElement(Box3, null, /* @__PURE__ */ React3.createElement(Text3, { color: "blue" }, /* @__PURE__ */ React3.createElement(Spinner3, { type: "dots" })), /* @__PURE__ */ React3.createElement(Text3, null, " Checking configuration..."));
185533
186221
  }
185534
186222
  if (state.status === "error") {
185535
- return /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, "Error: ", state.error));
186223
+ return /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, state.error));
185536
186224
  }
185537
186225
  const { config } = state;
185538
186226
  if (!config) {
@@ -185541,7 +186229,7 @@ function CheckUI() {
185541
186229
  const reshapeChecks = state.reshapeChecks ?? [];
185542
186230
  const reshapeErrors = reshapeChecks.filter((r) => !r.success);
185543
186231
  const hasReshapeErrors = reshapeErrors.length > 0;
185544
- return /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", gap: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: hasReshapeErrors ? "yellow" : "green" }, hasReshapeErrors ? "Configuration is valid but reshape migrations have errors" : "Configuration is valid"), config.builds.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Builds (", config.builds.length, "):"), config.builds.map((b) => /* @__PURE__ */ React3.createElement(Text3, { key: b.name }, " ", "- ", b.name))), config.services.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Services (", config.services.length, "):"), config.services.map((s) => /* @__PURE__ */ React3.createElement(Text3, { key: s.name }, " ", "- ", s.name))), config.postgres.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Postgres (", config.postgres.length, "):"), config.postgres.map((p) => /* @__PURE__ */ React3.createElement(Text3, { key: p.name }, " ", "- ", p.name, p.reshape?.enabled ? " (reshape enabled)" : ""))), reshapeChecks.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Reshape Migrations:"), reshapeChecks.map((r) => /* @__PURE__ */ React3.createElement(Box3, { key: r.databaseName, flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, null, " ", /* @__PURE__ */ React3.createElement(Text3, { color: r.success ? "green" : "red" }, r.success ? "pass" : "fail"), " ", r.databaseName, " (", r.migrationsDir, ")"), r.error && /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, " ", r.error)))), config.redis.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Redis (", config.redis.length, "):"), config.redis.map((r) => /* @__PURE__ */ React3.createElement(Text3, { key: r.name }, " ", "- ", r.name))), config.storage.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Storage (", config.storage.length, "):"), config.storage.map((s) => /* @__PURE__ */ React3.createElement(Text3, { key: s.name }, " ", "- ", s.name))), config.configs.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Config (", config.configs.length, "):"), config.configs.map((c) => /* @__PURE__ */ React3.createElement(Text3, { key: c.name }, " ", "- ", c.name, c.default ? ` (default: ${c.default})` : ""))), config.environments.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Environments (", config.environments.length, "):"), config.environments.map((e) => /* @__PURE__ */ React3.createElement(Text3, { key: e.name }, " ", "- ", e.name))));
186232
+ return /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", gap: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: hasReshapeErrors ? "yellow" : "green" }, hasReshapeErrors ? "Configuration is valid but reshape migrations have errors" : "Configuration is valid"), config.builds.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Builds (", config.builds.length, "):"), config.builds.map((b) => /* @__PURE__ */ React3.createElement(Text3, { key: b.name }, " ", "- ", b.name, b.base ? ` (${b.base})` : "", b.dockerfile ? ` (dockerfile: ${b.dockerfile})` : ""))), config.services.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Services (", config.services.length, "):"), config.services.map((s) => /* @__PURE__ */ React3.createElement(Text3, { key: s.name }, " ", "- ", s.name, s.build ? ` (build: ${s.build.name})` : "", s.image ? ` (image: ${s.image})` : ""))), config.postgres.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Postgres (", config.postgres.length, "):"), config.postgres.map((p) => /* @__PURE__ */ React3.createElement(Text3, { key: p.name }, " ", "- ", p.name, p.reshape?.enabled ? " (reshape enabled)" : ""))), reshapeChecks.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Reshape Migrations:"), reshapeChecks.map((r) => /* @__PURE__ */ React3.createElement(Box3, { key: r.databaseName, flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, null, " ", /* @__PURE__ */ React3.createElement(Text3, { color: r.success ? "green" : "red" }, r.success ? "pass" : "fail"), " ", r.databaseName, " (", r.migrationsDir, ")"), r.error && /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, " ", r.error)))), config.redis.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Redis (", config.redis.length, "):"), config.redis.map((r) => /* @__PURE__ */ React3.createElement(Text3, { key: r.name }, " ", "- ", r.name))), config.storage.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Storage (", config.storage.length, "):"), config.storage.map((s) => /* @__PURE__ */ React3.createElement(Text3, { key: s.name }, " ", "- ", s.name))), config.configs.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Config (", config.configs.length, "):"), config.configs.map((c) => /* @__PURE__ */ React3.createElement(Text3, { key: c.name }, " ", "- ", c.name, c.default ? ` (default: ${c.default})` : ""))), config.environments.length > 0 && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Environments (", config.environments.length, "):"), config.environments.map((e) => /* @__PURE__ */ React3.createElement(Text3, { key: e.name }, " ", "- ", e.name))));
185545
186233
  }
185546
186234
  function checkCommand() {
185547
186235
  render3(/* @__PURE__ */ React3.createElement(CheckUI, null));
@@ -185551,8 +186239,8 @@ function checkCommand() {
185551
186239
  import React6, { useState as useState5, useEffect as useEffect3, useRef } from "react";
185552
186240
  import { render as render4, Text as Text6, Box as Box6, useApp as useApp2, Static } from "ink";
185553
186241
  import Spinner4 from "ink-spinner";
185554
- import * as fs22 from "fs";
185555
- import * as path19 from "path";
186242
+ import * as fs23 from "fs";
186243
+ import * as path20 from "path";
185556
186244
 
185557
186245
  // node_modules/.pnpm/chokidar@5.0.0/node_modules/chokidar/index.js
185558
186246
  import { EventEmitter } from "node:events";
@@ -185644,7 +186332,7 @@ var ReaddirpStream = class extends Readable {
185644
186332
  this._directoryFilter = normalizeFilter(opts.directoryFilter);
185645
186333
  const statMethod = opts.lstat ? lstat : stat;
185646
186334
  if (wantBigintFsStats) {
185647
- this._stat = (path27) => statMethod(path27, { bigint: true });
186335
+ this._stat = (path28) => statMethod(path28, { bigint: true });
185648
186336
  } else {
185649
186337
  this._stat = statMethod;
185650
186338
  }
@@ -185669,8 +186357,8 @@ var ReaddirpStream = class extends Readable {
185669
186357
  const par = this.parent;
185670
186358
  const fil = par && par.files;
185671
186359
  if (fil && fil.length > 0) {
185672
- const { path: path27, depth } = par;
185673
- const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path27));
186360
+ const { path: path28, depth } = par;
186361
+ const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path28));
185674
186362
  const awaited = await Promise.all(slice);
185675
186363
  for (const entry of awaited) {
185676
186364
  if (!entry)
@@ -185710,20 +186398,20 @@ var ReaddirpStream = class extends Readable {
185710
186398
  this.reading = false;
185711
186399
  }
185712
186400
  }
185713
- async _exploreDir(path27, depth) {
186401
+ async _exploreDir(path28, depth) {
185714
186402
  let files;
185715
186403
  try {
185716
- files = await readdir(path27, this._rdOptions);
186404
+ files = await readdir(path28, this._rdOptions);
185717
186405
  } catch (error) {
185718
186406
  this._onError(error);
185719
186407
  }
185720
- return { files, depth, path: path27 };
186408
+ return { files, depth, path: path28 };
185721
186409
  }
185722
- async _formatEntry(dirent, path27) {
186410
+ async _formatEntry(dirent, path28) {
185723
186411
  let entry;
185724
186412
  const basename6 = this._isDirent ? dirent.name : dirent;
185725
186413
  try {
185726
- const fullPath = presolve(pjoin(path27, basename6));
186414
+ const fullPath = presolve(pjoin(path28, basename6));
185727
186415
  entry = { path: prelative(this._root, fullPath), fullPath, basename: basename6 };
185728
186416
  entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);
185729
186417
  } catch (err) {
@@ -186123,16 +186811,16 @@ var delFromSet = (main, prop, item) => {
186123
186811
  };
186124
186812
  var isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val;
186125
186813
  var FsWatchInstances = /* @__PURE__ */ new Map();
186126
- function createFsWatchInstance(path27, options2, listener, errHandler, emitRaw) {
186814
+ function createFsWatchInstance(path28, options2, listener, errHandler, emitRaw) {
186127
186815
  const handleEvent = (rawEvent, evPath) => {
186128
- listener(path27);
186129
- emitRaw(rawEvent, evPath, { watchedPath: path27 });
186130
- if (evPath && path27 !== evPath) {
186131
- fsWatchBroadcast(sp.resolve(path27, evPath), KEY_LISTENERS, sp.join(path27, evPath));
186816
+ listener(path28);
186817
+ emitRaw(rawEvent, evPath, { watchedPath: path28 });
186818
+ if (evPath && path28 !== evPath) {
186819
+ fsWatchBroadcast(sp.resolve(path28, evPath), KEY_LISTENERS, sp.join(path28, evPath));
186132
186820
  }
186133
186821
  };
186134
186822
  try {
186135
- return fs_watch(path27, {
186823
+ return fs_watch(path28, {
186136
186824
  persistent: options2.persistent
186137
186825
  }, handleEvent);
186138
186826
  } catch (error) {
@@ -186148,12 +186836,12 @@ var fsWatchBroadcast = (fullPath, listenerType, val1, val2, val3) => {
186148
186836
  listener(val1, val2, val3);
186149
186837
  });
186150
186838
  };
186151
- var setFsWatchListener = (path27, fullPath, options2, handlers) => {
186839
+ var setFsWatchListener = (path28, fullPath, options2, handlers) => {
186152
186840
  const { listener, errHandler, rawEmitter } = handlers;
186153
186841
  let cont = FsWatchInstances.get(fullPath);
186154
186842
  let watcher;
186155
186843
  if (!options2.persistent) {
186156
- watcher = createFsWatchInstance(path27, options2, listener, errHandler, rawEmitter);
186844
+ watcher = createFsWatchInstance(path28, options2, listener, errHandler, rawEmitter);
186157
186845
  if (!watcher)
186158
186846
  return;
186159
186847
  return watcher.close.bind(watcher);
@@ -186164,7 +186852,7 @@ var setFsWatchListener = (path27, fullPath, options2, handlers) => {
186164
186852
  addAndConvert(cont, KEY_RAW, rawEmitter);
186165
186853
  } else {
186166
186854
  watcher = createFsWatchInstance(
186167
- path27,
186855
+ path28,
186168
186856
  options2,
186169
186857
  fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS),
186170
186858
  errHandler,
@@ -186179,7 +186867,7 @@ var setFsWatchListener = (path27, fullPath, options2, handlers) => {
186179
186867
  cont.watcherUnusable = true;
186180
186868
  if (isWindows && error.code === "EPERM") {
186181
186869
  try {
186182
- const fd = await open2(path27, "r");
186870
+ const fd = await open2(path28, "r");
186183
186871
  await fd.close();
186184
186872
  broadcastErr(error);
186185
186873
  } catch (err) {
@@ -186210,7 +186898,7 @@ var setFsWatchListener = (path27, fullPath, options2, handlers) => {
186210
186898
  };
186211
186899
  };
186212
186900
  var FsWatchFileInstances = /* @__PURE__ */ new Map();
186213
- var setFsWatchFileListener = (path27, fullPath, options2, handlers) => {
186901
+ var setFsWatchFileListener = (path28, fullPath, options2, handlers) => {
186214
186902
  const { listener, rawEmitter } = handlers;
186215
186903
  let cont = FsWatchFileInstances.get(fullPath);
186216
186904
  const copts = cont && cont.options;
@@ -186232,7 +186920,7 @@ var setFsWatchFileListener = (path27, fullPath, options2, handlers) => {
186232
186920
  });
186233
186921
  const currmtime = curr.mtimeMs;
186234
186922
  if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {
186235
- foreach(cont.listeners, (listener2) => listener2(path27, curr));
186923
+ foreach(cont.listeners, (listener2) => listener2(path28, curr));
186236
186924
  }
186237
186925
  })
186238
186926
  };
@@ -186262,13 +186950,13 @@ var NodeFsHandler = class {
186262
186950
  * @param listener on fs change
186263
186951
  * @returns closer for the watcher instance
186264
186952
  */
186265
- _watchWithNodeFs(path27, listener) {
186953
+ _watchWithNodeFs(path28, listener) {
186266
186954
  const opts = this.fsw.options;
186267
- const directory = sp.dirname(path27);
186268
- const basename6 = sp.basename(path27);
186955
+ const directory = sp.dirname(path28);
186956
+ const basename6 = sp.basename(path28);
186269
186957
  const parent = this.fsw._getWatchedDir(directory);
186270
186958
  parent.add(basename6);
186271
- const absolutePath = sp.resolve(path27);
186959
+ const absolutePath = sp.resolve(path28);
186272
186960
  const options2 = {
186273
186961
  persistent: opts.persistent
186274
186962
  };
@@ -186278,12 +186966,12 @@ var NodeFsHandler = class {
186278
186966
  if (opts.usePolling) {
186279
186967
  const enableBin = opts.interval !== opts.binaryInterval;
186280
186968
  options2.interval = enableBin && isBinaryPath(basename6) ? opts.binaryInterval : opts.interval;
186281
- closer = setFsWatchFileListener(path27, absolutePath, options2, {
186969
+ closer = setFsWatchFileListener(path28, absolutePath, options2, {
186282
186970
  listener,
186283
186971
  rawEmitter: this.fsw._emitRaw
186284
186972
  });
186285
186973
  } else {
186286
- closer = setFsWatchListener(path27, absolutePath, options2, {
186974
+ closer = setFsWatchListener(path28, absolutePath, options2, {
186287
186975
  listener,
186288
186976
  errHandler: this._boundHandleError,
186289
186977
  rawEmitter: this.fsw._emitRaw
@@ -186299,13 +186987,13 @@ var NodeFsHandler = class {
186299
186987
  if (this.fsw.closed) {
186300
186988
  return;
186301
186989
  }
186302
- const dirname8 = sp.dirname(file);
186990
+ const dirname9 = sp.dirname(file);
186303
186991
  const basename6 = sp.basename(file);
186304
- const parent = this.fsw._getWatchedDir(dirname8);
186992
+ const parent = this.fsw._getWatchedDir(dirname9);
186305
186993
  let prevStats = stats;
186306
186994
  if (parent.has(basename6))
186307
186995
  return;
186308
- const listener = async (path27, newStats) => {
186996
+ const listener = async (path28, newStats) => {
186309
186997
  if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))
186310
186998
  return;
186311
186999
  if (!newStats || newStats.mtimeMs === 0) {
@@ -186319,16 +187007,16 @@ var NodeFsHandler = class {
186319
187007
  this.fsw._emit(EV.CHANGE, file, newStats2);
186320
187008
  }
186321
187009
  if ((isMacos || isLinux || isFreeBSD) && prevStats.ino !== newStats2.ino) {
186322
- this.fsw._closeFile(path27);
187010
+ this.fsw._closeFile(path28);
186323
187011
  prevStats = newStats2;
186324
187012
  const closer2 = this._watchWithNodeFs(file, listener);
186325
187013
  if (closer2)
186326
- this.fsw._addPathCloser(path27, closer2);
187014
+ this.fsw._addPathCloser(path28, closer2);
186327
187015
  } else {
186328
187016
  prevStats = newStats2;
186329
187017
  }
186330
187018
  } catch (error) {
186331
- this.fsw._remove(dirname8, basename6);
187019
+ this.fsw._remove(dirname9, basename6);
186332
187020
  }
186333
187021
  } else if (parent.has(basename6)) {
186334
187022
  const at = newStats.atimeMs;
@@ -186355,7 +187043,7 @@ var NodeFsHandler = class {
186355
187043
  * @param item basename of this item
186356
187044
  * @returns true if no more processing is needed for this entry.
186357
187045
  */
186358
- async _handleSymlink(entry, directory, path27, item) {
187046
+ async _handleSymlink(entry, directory, path28, item) {
186359
187047
  if (this.fsw.closed) {
186360
187048
  return;
186361
187049
  }
@@ -186365,7 +187053,7 @@ var NodeFsHandler = class {
186365
187053
  this.fsw._incrReadyCount();
186366
187054
  let linkPath;
186367
187055
  try {
186368
- linkPath = await fsrealpath(path27);
187056
+ linkPath = await fsrealpath(path28);
186369
187057
  } catch (e) {
186370
187058
  this.fsw._emitReady();
186371
187059
  return true;
@@ -186375,12 +187063,12 @@ var NodeFsHandler = class {
186375
187063
  if (dir.has(item)) {
186376
187064
  if (this.fsw._symlinkPaths.get(full) !== linkPath) {
186377
187065
  this.fsw._symlinkPaths.set(full, linkPath);
186378
- this.fsw._emit(EV.CHANGE, path27, entry.stats);
187066
+ this.fsw._emit(EV.CHANGE, path28, entry.stats);
186379
187067
  }
186380
187068
  } else {
186381
187069
  dir.add(item);
186382
187070
  this.fsw._symlinkPaths.set(full, linkPath);
186383
- this.fsw._emit(EV.ADD, path27, entry.stats);
187071
+ this.fsw._emit(EV.ADD, path28, entry.stats);
186384
187072
  }
186385
187073
  this.fsw._emitReady();
186386
187074
  return true;
@@ -186410,9 +187098,9 @@ var NodeFsHandler = class {
186410
187098
  return;
186411
187099
  }
186412
187100
  const item = entry.path;
186413
- let path27 = sp.join(directory, item);
187101
+ let path28 = sp.join(directory, item);
186414
187102
  current.add(item);
186415
- if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path27, item)) {
187103
+ if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path28, item)) {
186416
187104
  return;
186417
187105
  }
186418
187106
  if (this.fsw.closed) {
@@ -186421,8 +187109,8 @@ var NodeFsHandler = class {
186421
187109
  }
186422
187110
  if (item === target || !target && !previous.has(item)) {
186423
187111
  this.fsw._incrReadyCount();
186424
- path27 = sp.join(dir, sp.relative(dir, path27));
186425
- this._addToNodeFs(path27, initialAdd, wh, depth + 1);
187112
+ path28 = sp.join(dir, sp.relative(dir, path28));
187113
+ this._addToNodeFs(path28, initialAdd, wh, depth + 1);
186426
187114
  }
186427
187115
  }).on(EV.ERROR, this._boundHandleError);
186428
187116
  return new Promise((resolve10, reject) => {
@@ -186491,13 +187179,13 @@ var NodeFsHandler = class {
186491
187179
  * @param depth Child path actually targeted for watch
186492
187180
  * @param target Child path actually targeted for watch
186493
187181
  */
186494
- async _addToNodeFs(path27, initialAdd, priorWh, depth, target) {
187182
+ async _addToNodeFs(path28, initialAdd, priorWh, depth, target) {
186495
187183
  const ready = this.fsw._emitReady;
186496
- if (this.fsw._isIgnored(path27) || this.fsw.closed) {
187184
+ if (this.fsw._isIgnored(path28) || this.fsw.closed) {
186497
187185
  ready();
186498
187186
  return false;
186499
187187
  }
186500
- const wh = this.fsw._getWatchHelpers(path27);
187188
+ const wh = this.fsw._getWatchHelpers(path28);
186501
187189
  if (priorWh) {
186502
187190
  wh.filterPath = (entry) => priorWh.filterPath(entry);
186503
187191
  wh.filterDir = (entry) => priorWh.filterDir(entry);
@@ -186513,8 +187201,8 @@ var NodeFsHandler = class {
186513
187201
  const follow = this.fsw.options.followSymlinks;
186514
187202
  let closer;
186515
187203
  if (stats.isDirectory()) {
186516
- const absPath = sp.resolve(path27);
186517
- const targetPath = follow ? await fsrealpath(path27) : path27;
187204
+ const absPath = sp.resolve(path28);
187205
+ const targetPath = follow ? await fsrealpath(path28) : path28;
186518
187206
  if (this.fsw.closed)
186519
187207
  return;
186520
187208
  closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);
@@ -186524,29 +187212,29 @@ var NodeFsHandler = class {
186524
187212
  this.fsw._symlinkPaths.set(absPath, targetPath);
186525
187213
  }
186526
187214
  } else if (stats.isSymbolicLink()) {
186527
- const targetPath = follow ? await fsrealpath(path27) : path27;
187215
+ const targetPath = follow ? await fsrealpath(path28) : path28;
186528
187216
  if (this.fsw.closed)
186529
187217
  return;
186530
187218
  const parent = sp.dirname(wh.watchPath);
186531
187219
  this.fsw._getWatchedDir(parent).add(wh.watchPath);
186532
187220
  this.fsw._emit(EV.ADD, wh.watchPath, stats);
186533
- closer = await this._handleDir(parent, stats, initialAdd, depth, path27, wh, targetPath);
187221
+ closer = await this._handleDir(parent, stats, initialAdd, depth, path28, wh, targetPath);
186534
187222
  if (this.fsw.closed)
186535
187223
  return;
186536
187224
  if (targetPath !== void 0) {
186537
- this.fsw._symlinkPaths.set(sp.resolve(path27), targetPath);
187225
+ this.fsw._symlinkPaths.set(sp.resolve(path28), targetPath);
186538
187226
  }
186539
187227
  } else {
186540
187228
  closer = this._handleFile(wh.watchPath, stats, initialAdd);
186541
187229
  }
186542
187230
  ready();
186543
187231
  if (closer)
186544
- this.fsw._addPathCloser(path27, closer);
187232
+ this.fsw._addPathCloser(path28, closer);
186545
187233
  return false;
186546
187234
  } catch (error) {
186547
187235
  if (this.fsw._handleError(error)) {
186548
187236
  ready();
186549
- return path27;
187237
+ return path28;
186550
187238
  }
186551
187239
  }
186552
187240
  }
@@ -186589,24 +187277,24 @@ function createPattern(matcher) {
186589
187277
  }
186590
187278
  return () => false;
186591
187279
  }
186592
- function normalizePath(path27) {
186593
- if (typeof path27 !== "string")
187280
+ function normalizePath(path28) {
187281
+ if (typeof path28 !== "string")
186594
187282
  throw new Error("string expected");
186595
- path27 = sp2.normalize(path27);
186596
- path27 = path27.replace(/\\/g, "/");
187283
+ path28 = sp2.normalize(path28);
187284
+ path28 = path28.replace(/\\/g, "/");
186597
187285
  let prepend = false;
186598
- if (path27.startsWith("//"))
187286
+ if (path28.startsWith("//"))
186599
187287
  prepend = true;
186600
- path27 = path27.replace(DOUBLE_SLASH_RE, "/");
187288
+ path28 = path28.replace(DOUBLE_SLASH_RE, "/");
186601
187289
  if (prepend)
186602
- path27 = "/" + path27;
186603
- return path27;
187290
+ path28 = "/" + path28;
187291
+ return path28;
186604
187292
  }
186605
187293
  function matchPatterns(patterns, testString, stats) {
186606
- const path27 = normalizePath(testString);
187294
+ const path28 = normalizePath(testString);
186607
187295
  for (let index = 0; index < patterns.length; index++) {
186608
187296
  const pattern = patterns[index];
186609
- if (pattern(path27, stats)) {
187297
+ if (pattern(path28, stats)) {
186610
187298
  return true;
186611
187299
  }
186612
187300
  }
@@ -186644,19 +187332,19 @@ var toUnix = (string) => {
186644
187332
  }
186645
187333
  return str;
186646
187334
  };
186647
- var normalizePathToUnix = (path27) => toUnix(sp2.normalize(toUnix(path27)));
186648
- var normalizeIgnored = (cwd = "") => (path27) => {
186649
- if (typeof path27 === "string") {
186650
- return normalizePathToUnix(sp2.isAbsolute(path27) ? path27 : sp2.join(cwd, path27));
187335
+ var normalizePathToUnix = (path28) => toUnix(sp2.normalize(toUnix(path28)));
187336
+ var normalizeIgnored = (cwd = "") => (path28) => {
187337
+ if (typeof path28 === "string") {
187338
+ return normalizePathToUnix(sp2.isAbsolute(path28) ? path28 : sp2.join(cwd, path28));
186651
187339
  } else {
186652
- return path27;
187340
+ return path28;
186653
187341
  }
186654
187342
  };
186655
- var getAbsolutePath = (path27, cwd) => {
186656
- if (sp2.isAbsolute(path27)) {
186657
- return path27;
187343
+ var getAbsolutePath = (path28, cwd) => {
187344
+ if (sp2.isAbsolute(path28)) {
187345
+ return path28;
186658
187346
  }
186659
- return sp2.join(cwd, path27);
187347
+ return sp2.join(cwd, path28);
186660
187348
  };
186661
187349
  var EMPTY_SET = Object.freeze(/* @__PURE__ */ new Set());
186662
187350
  var DirEntry = class {
@@ -186721,10 +187409,10 @@ var WatchHelper = class {
186721
187409
  dirParts;
186722
187410
  followSymlinks;
186723
187411
  statMethod;
186724
- constructor(path27, follow, fsw) {
187412
+ constructor(path28, follow, fsw) {
186725
187413
  this.fsw = fsw;
186726
- const watchPath = path27;
186727
- this.path = path27 = path27.replace(REPLACER_RE, "");
187414
+ const watchPath = path28;
187415
+ this.path = path28 = path28.replace(REPLACER_RE, "");
186728
187416
  this.watchPath = watchPath;
186729
187417
  this.fullWatchPath = sp2.resolve(watchPath);
186730
187418
  this.dirParts = [];
@@ -186864,20 +187552,20 @@ var FSWatcher = class extends EventEmitter {
186864
187552
  this._closePromise = void 0;
186865
187553
  let paths = unifyPaths(paths_);
186866
187554
  if (cwd) {
186867
- paths = paths.map((path27) => {
186868
- const absPath = getAbsolutePath(path27, cwd);
187555
+ paths = paths.map((path28) => {
187556
+ const absPath = getAbsolutePath(path28, cwd);
186869
187557
  return absPath;
186870
187558
  });
186871
187559
  }
186872
- paths.forEach((path27) => {
186873
- this._removeIgnoredPath(path27);
187560
+ paths.forEach((path28) => {
187561
+ this._removeIgnoredPath(path28);
186874
187562
  });
186875
187563
  this._userIgnored = void 0;
186876
187564
  if (!this._readyCount)
186877
187565
  this._readyCount = 0;
186878
187566
  this._readyCount += paths.length;
186879
- Promise.all(paths.map(async (path27) => {
186880
- const res = await this._nodeFsHandler._addToNodeFs(path27, !_internal, void 0, 0, _origAdd);
187567
+ Promise.all(paths.map(async (path28) => {
187568
+ const res = await this._nodeFsHandler._addToNodeFs(path28, !_internal, void 0, 0, _origAdd);
186881
187569
  if (res)
186882
187570
  this._emitReady();
186883
187571
  return res;
@@ -186899,17 +187587,17 @@ var FSWatcher = class extends EventEmitter {
186899
187587
  return this;
186900
187588
  const paths = unifyPaths(paths_);
186901
187589
  const { cwd } = this.options;
186902
- paths.forEach((path27) => {
186903
- if (!sp2.isAbsolute(path27) && !this._closers.has(path27)) {
187590
+ paths.forEach((path28) => {
187591
+ if (!sp2.isAbsolute(path28) && !this._closers.has(path28)) {
186904
187592
  if (cwd)
186905
- path27 = sp2.join(cwd, path27);
186906
- path27 = sp2.resolve(path27);
187593
+ path28 = sp2.join(cwd, path28);
187594
+ path28 = sp2.resolve(path28);
186907
187595
  }
186908
- this._closePath(path27);
186909
- this._addIgnoredPath(path27);
186910
- if (this._watched.has(path27)) {
187596
+ this._closePath(path28);
187597
+ this._addIgnoredPath(path28);
187598
+ if (this._watched.has(path28)) {
186911
187599
  this._addIgnoredPath({
186912
- path: path27,
187600
+ path: path28,
186913
187601
  recursive: true
186914
187602
  });
186915
187603
  }
@@ -186973,38 +187661,38 @@ var FSWatcher = class extends EventEmitter {
186973
187661
  * @param stats arguments to be passed with event
186974
187662
  * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag
186975
187663
  */
186976
- async _emit(event, path27, stats) {
187664
+ async _emit(event, path28, stats) {
186977
187665
  if (this.closed)
186978
187666
  return;
186979
187667
  const opts = this.options;
186980
187668
  if (isWindows)
186981
- path27 = sp2.normalize(path27);
187669
+ path28 = sp2.normalize(path28);
186982
187670
  if (opts.cwd)
186983
- path27 = sp2.relative(opts.cwd, path27);
186984
- const args = [path27];
187671
+ path28 = sp2.relative(opts.cwd, path28);
187672
+ const args = [path28];
186985
187673
  if (stats != null)
186986
187674
  args.push(stats);
186987
187675
  const awf = opts.awaitWriteFinish;
186988
187676
  let pw;
186989
- if (awf && (pw = this._pendingWrites.get(path27))) {
187677
+ if (awf && (pw = this._pendingWrites.get(path28))) {
186990
187678
  pw.lastChange = /* @__PURE__ */ new Date();
186991
187679
  return this;
186992
187680
  }
186993
187681
  if (opts.atomic) {
186994
187682
  if (event === EVENTS.UNLINK) {
186995
- this._pendingUnlinks.set(path27, [event, ...args]);
187683
+ this._pendingUnlinks.set(path28, [event, ...args]);
186996
187684
  setTimeout(() => {
186997
- this._pendingUnlinks.forEach((entry, path28) => {
187685
+ this._pendingUnlinks.forEach((entry, path29) => {
186998
187686
  this.emit(...entry);
186999
187687
  this.emit(EVENTS.ALL, ...entry);
187000
- this._pendingUnlinks.delete(path28);
187688
+ this._pendingUnlinks.delete(path29);
187001
187689
  });
187002
187690
  }, typeof opts.atomic === "number" ? opts.atomic : 100);
187003
187691
  return this;
187004
187692
  }
187005
- if (event === EVENTS.ADD && this._pendingUnlinks.has(path27)) {
187693
+ if (event === EVENTS.ADD && this._pendingUnlinks.has(path28)) {
187006
187694
  event = EVENTS.CHANGE;
187007
- this._pendingUnlinks.delete(path27);
187695
+ this._pendingUnlinks.delete(path28);
187008
187696
  }
187009
187697
  }
187010
187698
  if (awf && (event === EVENTS.ADD || event === EVENTS.CHANGE) && this._readyEmitted) {
@@ -187022,16 +187710,16 @@ var FSWatcher = class extends EventEmitter {
187022
187710
  this.emitWithAll(event, args);
187023
187711
  }
187024
187712
  };
187025
- this._awaitWriteFinish(path27, awf.stabilityThreshold, event, awfEmit);
187713
+ this._awaitWriteFinish(path28, awf.stabilityThreshold, event, awfEmit);
187026
187714
  return this;
187027
187715
  }
187028
187716
  if (event === EVENTS.CHANGE) {
187029
- const isThrottled = !this._throttle(EVENTS.CHANGE, path27, 50);
187717
+ const isThrottled = !this._throttle(EVENTS.CHANGE, path28, 50);
187030
187718
  if (isThrottled)
187031
187719
  return this;
187032
187720
  }
187033
187721
  if (opts.alwaysStat && stats === void 0 && (event === EVENTS.ADD || event === EVENTS.ADD_DIR || event === EVENTS.CHANGE)) {
187034
- const fullPath = opts.cwd ? sp2.join(opts.cwd, path27) : path27;
187722
+ const fullPath = opts.cwd ? sp2.join(opts.cwd, path28) : path28;
187035
187723
  let stats2;
187036
187724
  try {
187037
187725
  stats2 = await stat3(fullPath);
@@ -187062,23 +187750,23 @@ var FSWatcher = class extends EventEmitter {
187062
187750
  * @param timeout duration of time to suppress duplicate actions
187063
187751
  * @returns tracking object or false if action should be suppressed
187064
187752
  */
187065
- _throttle(actionType, path27, timeout) {
187753
+ _throttle(actionType, path28, timeout) {
187066
187754
  if (!this._throttled.has(actionType)) {
187067
187755
  this._throttled.set(actionType, /* @__PURE__ */ new Map());
187068
187756
  }
187069
187757
  const action = this._throttled.get(actionType);
187070
187758
  if (!action)
187071
187759
  throw new Error("invalid throttle");
187072
- const actionPath = action.get(path27);
187760
+ const actionPath = action.get(path28);
187073
187761
  if (actionPath) {
187074
187762
  actionPath.count++;
187075
187763
  return false;
187076
187764
  }
187077
187765
  let timeoutObject;
187078
187766
  const clear = () => {
187079
- const item = action.get(path27);
187767
+ const item = action.get(path28);
187080
187768
  const count = item ? item.count : 0;
187081
- action.delete(path27);
187769
+ action.delete(path28);
187082
187770
  clearTimeout(timeoutObject);
187083
187771
  if (item)
187084
187772
  clearTimeout(item.timeoutObject);
@@ -187086,7 +187774,7 @@ var FSWatcher = class extends EventEmitter {
187086
187774
  };
187087
187775
  timeoutObject = setTimeout(clear, timeout);
187088
187776
  const thr = { timeoutObject, clear, count: 0 };
187089
- action.set(path27, thr);
187777
+ action.set(path28, thr);
187090
187778
  return thr;
187091
187779
  }
187092
187780
  _incrReadyCount() {
@@ -187100,44 +187788,44 @@ var FSWatcher = class extends EventEmitter {
187100
187788
  * @param event
187101
187789
  * @param awfEmit Callback to be called when ready for event to be emitted.
187102
187790
  */
187103
- _awaitWriteFinish(path27, threshold, event, awfEmit) {
187791
+ _awaitWriteFinish(path28, threshold, event, awfEmit) {
187104
187792
  const awf = this.options.awaitWriteFinish;
187105
187793
  if (typeof awf !== "object")
187106
187794
  return;
187107
187795
  const pollInterval = awf.pollInterval;
187108
187796
  let timeoutHandler;
187109
- let fullPath = path27;
187110
- if (this.options.cwd && !sp2.isAbsolute(path27)) {
187111
- fullPath = sp2.join(this.options.cwd, path27);
187797
+ let fullPath = path28;
187798
+ if (this.options.cwd && !sp2.isAbsolute(path28)) {
187799
+ fullPath = sp2.join(this.options.cwd, path28);
187112
187800
  }
187113
187801
  const now = /* @__PURE__ */ new Date();
187114
187802
  const writes = this._pendingWrites;
187115
187803
  function awaitWriteFinishFn(prevStat) {
187116
187804
  statcb(fullPath, (err, curStat) => {
187117
- if (err || !writes.has(path27)) {
187805
+ if (err || !writes.has(path28)) {
187118
187806
  if (err && err.code !== "ENOENT")
187119
187807
  awfEmit(err);
187120
187808
  return;
187121
187809
  }
187122
187810
  const now2 = Number(/* @__PURE__ */ new Date());
187123
187811
  if (prevStat && curStat.size !== prevStat.size) {
187124
- writes.get(path27).lastChange = now2;
187812
+ writes.get(path28).lastChange = now2;
187125
187813
  }
187126
- const pw = writes.get(path27);
187814
+ const pw = writes.get(path28);
187127
187815
  const df = now2 - pw.lastChange;
187128
187816
  if (df >= threshold) {
187129
- writes.delete(path27);
187817
+ writes.delete(path28);
187130
187818
  awfEmit(void 0, curStat);
187131
187819
  } else {
187132
187820
  timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval, curStat);
187133
187821
  }
187134
187822
  });
187135
187823
  }
187136
- if (!writes.has(path27)) {
187137
- writes.set(path27, {
187824
+ if (!writes.has(path28)) {
187825
+ writes.set(path28, {
187138
187826
  lastChange: now,
187139
187827
  cancelWait: () => {
187140
- writes.delete(path27);
187828
+ writes.delete(path28);
187141
187829
  clearTimeout(timeoutHandler);
187142
187830
  return event;
187143
187831
  }
@@ -187148,8 +187836,8 @@ var FSWatcher = class extends EventEmitter {
187148
187836
  /**
187149
187837
  * Determines whether user has asked to ignore this path.
187150
187838
  */
187151
- _isIgnored(path27, stats) {
187152
- if (this.options.atomic && DOT_RE.test(path27))
187839
+ _isIgnored(path28, stats) {
187840
+ if (this.options.atomic && DOT_RE.test(path28))
187153
187841
  return true;
187154
187842
  if (!this._userIgnored) {
187155
187843
  const { cwd } = this.options;
@@ -187159,17 +187847,17 @@ var FSWatcher = class extends EventEmitter {
187159
187847
  const list = [...ignoredPaths.map(normalizeIgnored(cwd)), ...ignored];
187160
187848
  this._userIgnored = anymatch(list, void 0);
187161
187849
  }
187162
- return this._userIgnored(path27, stats);
187850
+ return this._userIgnored(path28, stats);
187163
187851
  }
187164
- _isntIgnored(path27, stat4) {
187165
- return !this._isIgnored(path27, stat4);
187852
+ _isntIgnored(path28, stat4) {
187853
+ return !this._isIgnored(path28, stat4);
187166
187854
  }
187167
187855
  /**
187168
187856
  * Provides a set of common helpers and properties relating to symlink handling.
187169
187857
  * @param path file or directory pattern being watched
187170
187858
  */
187171
- _getWatchHelpers(path27) {
187172
- return new WatchHelper(path27, this.options.followSymlinks, this);
187859
+ _getWatchHelpers(path28) {
187860
+ return new WatchHelper(path28, this.options.followSymlinks, this);
187173
187861
  }
187174
187862
  // Directory helpers
187175
187863
  // -----------------
@@ -187201,63 +187889,63 @@ var FSWatcher = class extends EventEmitter {
187201
187889
  * @param item base path of item/directory
187202
187890
  */
187203
187891
  _remove(directory, item, isDirectory) {
187204
- const path27 = sp2.join(directory, item);
187205
- const fullPath = sp2.resolve(path27);
187206
- isDirectory = isDirectory != null ? isDirectory : this._watched.has(path27) || this._watched.has(fullPath);
187207
- if (!this._throttle("remove", path27, 100))
187892
+ const path28 = sp2.join(directory, item);
187893
+ const fullPath = sp2.resolve(path28);
187894
+ isDirectory = isDirectory != null ? isDirectory : this._watched.has(path28) || this._watched.has(fullPath);
187895
+ if (!this._throttle("remove", path28, 100))
187208
187896
  return;
187209
187897
  if (!isDirectory && this._watched.size === 1) {
187210
187898
  this.add(directory, item, true);
187211
187899
  }
187212
- const wp = this._getWatchedDir(path27);
187900
+ const wp = this._getWatchedDir(path28);
187213
187901
  const nestedDirectoryChildren = wp.getChildren();
187214
- nestedDirectoryChildren.forEach((nested) => this._remove(path27, nested));
187902
+ nestedDirectoryChildren.forEach((nested) => this._remove(path28, nested));
187215
187903
  const parent = this._getWatchedDir(directory);
187216
187904
  const wasTracked = parent.has(item);
187217
187905
  parent.remove(item);
187218
187906
  if (this._symlinkPaths.has(fullPath)) {
187219
187907
  this._symlinkPaths.delete(fullPath);
187220
187908
  }
187221
- let relPath = path27;
187909
+ let relPath = path28;
187222
187910
  if (this.options.cwd)
187223
- relPath = sp2.relative(this.options.cwd, path27);
187911
+ relPath = sp2.relative(this.options.cwd, path28);
187224
187912
  if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {
187225
187913
  const event = this._pendingWrites.get(relPath).cancelWait();
187226
187914
  if (event === EVENTS.ADD)
187227
187915
  return;
187228
187916
  }
187229
- this._watched.delete(path27);
187917
+ this._watched.delete(path28);
187230
187918
  this._watched.delete(fullPath);
187231
187919
  const eventName = isDirectory ? EVENTS.UNLINK_DIR : EVENTS.UNLINK;
187232
- if (wasTracked && !this._isIgnored(path27))
187233
- this._emit(eventName, path27);
187234
- this._closePath(path27);
187920
+ if (wasTracked && !this._isIgnored(path28))
187921
+ this._emit(eventName, path28);
187922
+ this._closePath(path28);
187235
187923
  }
187236
187924
  /**
187237
187925
  * Closes all watchers for a path
187238
187926
  */
187239
- _closePath(path27) {
187240
- this._closeFile(path27);
187241
- const dir = sp2.dirname(path27);
187242
- this._getWatchedDir(dir).remove(sp2.basename(path27));
187927
+ _closePath(path28) {
187928
+ this._closeFile(path28);
187929
+ const dir = sp2.dirname(path28);
187930
+ this._getWatchedDir(dir).remove(sp2.basename(path28));
187243
187931
  }
187244
187932
  /**
187245
187933
  * Closes only file-specific watchers
187246
187934
  */
187247
- _closeFile(path27) {
187248
- const closers = this._closers.get(path27);
187935
+ _closeFile(path28) {
187936
+ const closers = this._closers.get(path28);
187249
187937
  if (!closers)
187250
187938
  return;
187251
187939
  closers.forEach((closer) => closer());
187252
- this._closers.delete(path27);
187940
+ this._closers.delete(path28);
187253
187941
  }
187254
- _addPathCloser(path27, closer) {
187942
+ _addPathCloser(path28, closer) {
187255
187943
  if (!closer)
187256
187944
  return;
187257
- let list = this._closers.get(path27);
187945
+ let list = this._closers.get(path28);
187258
187946
  if (!list) {
187259
187947
  list = [];
187260
- this._closers.set(path27, list);
187948
+ this._closers.set(path28, list);
187261
187949
  }
187262
187950
  list.push(closer);
187263
187951
  }
@@ -187738,7 +188426,7 @@ config {
187738
188426
  this.name = "MissingConfigError";
187739
188427
  }
187740
188428
  };
187741
- function resolveEnvValue(value, resources, secrets, configs, servicePort, serviceEndpoints, currentServicePorts, publicUrls) {
188429
+ function resolveEnvValue(value, resources, secrets, configs, servicePort, serviceEndpoints, currentServicePorts, publicUrls, volumePaths) {
187742
188430
  if (typeof value === "string") {
187743
188431
  return value;
187744
188432
  }
@@ -187753,7 +188441,8 @@ function resolveEnvValue(value, resources, secrets, configs, servicePort, servic
187753
188441
  servicePort,
187754
188442
  serviceEndpoints,
187755
188443
  currentServicePorts,
187756
- publicUrls
188444
+ publicUrls,
188445
+ volumePaths
187757
188446
  );
187758
188447
  }).join("");
187759
188448
  }
@@ -187838,6 +188527,10 @@ function resolveEnvValue(value, resources, secrets, configs, servicePort, servic
187838
188527
  return pg.password;
187839
188528
  case "name":
187840
188529
  return pg.dbName;
188530
+ case "direct_url":
188531
+ return pg.url;
188532
+ case "direct_host":
188533
+ return pg.host;
187841
188534
  case "sync.url":
187842
188535
  if (!pg.syncUrl) {
187843
188536
  throw new Error(`Postgres "${value.name}" does not have sync enabled`);
@@ -187900,6 +188593,22 @@ function resolveEnvValue(value, resources, secrets, configs, servicePort, servic
187900
188593
  throw new Error(`Unknown storage attribute: ${String(value.attribute)}`);
187901
188594
  }
187902
188595
  }
188596
+ case "temporal": {
188597
+ const temporal = resources.get(value.name);
188598
+ if (!temporal || temporal.type !== "temporal") {
188599
+ throw new Error(`Temporal "${value.name}" not found`);
188600
+ }
188601
+ switch (value.attribute) {
188602
+ case "url":
188603
+ return temporal.url;
188604
+ case "namespace":
188605
+ return value.name;
188606
+ case "api_key":
188607
+ return "";
188608
+ default:
188609
+ throw new Error(`Unknown temporal attribute: ${String(value.attribute)}`);
188610
+ }
188611
+ }
187903
188612
  case "config": {
187904
188613
  const configValue = configs.get(value.name);
187905
188614
  if (configValue === void 0) {
@@ -187914,13 +188623,24 @@ function resolveEnvValue(value, resources, secrets, configs, servicePort, servic
187914
188623
  }
187915
188624
  return secretValue;
187916
188625
  }
188626
+ case "volume": {
188627
+ const volumeRef = value;
188628
+ if (!volumePaths) {
188629
+ throw new Error("Volume reference used but no volume paths provided");
188630
+ }
188631
+ const volumePath = volumePaths.get(volumeRef.volumeName);
188632
+ if (volumePath === void 0) {
188633
+ throw new Error(`Volume "${volumeRef.volumeName}" not found`);
188634
+ }
188635
+ return volumePath;
188636
+ }
187917
188637
  case "build":
187918
188638
  throw new Error(`Build references cannot be used as env values`);
187919
188639
  default:
187920
188640
  throw new Error(`Unknown reference type`);
187921
188641
  }
187922
188642
  }
187923
- function resolveEnv(env2, resources, secrets, configs, servicePort, serviceEndpoints, currentServicePorts, publicUrls) {
188643
+ function resolveEnv(env2, resources, secrets, configs, servicePort, serviceEndpoints, currentServicePorts, publicUrls, volumePaths) {
187924
188644
  if (!env2) {
187925
188645
  return {};
187926
188646
  }
@@ -187934,7 +188654,8 @@ function resolveEnv(env2, resources, secrets, configs, servicePort, serviceEndpo
187934
188654
  servicePort,
187935
188655
  serviceEndpoints,
187936
188656
  currentServicePorts,
187937
- publicUrls
188657
+ publicUrls,
188658
+ volumePaths
187938
188659
  );
187939
188660
  }
187940
188661
  return resolved;
@@ -187949,12 +188670,12 @@ function resolveEnvForExec(env2, resources, secrets, configs) {
187949
188670
  resolved[key] = value;
187950
188671
  continue;
187951
188672
  }
187952
- if (value.type === "port" || value.type === "endpoint" || value.type === "service") {
188673
+ if (value.type === "port" || value.type === "endpoint" || value.type === "service" || value.type === "volume") {
187953
188674
  continue;
187954
188675
  }
187955
188676
  if (value.type === "interpolated") {
187956
188677
  const hasSkippableRef = value.parts.some(
187957
- (part) => part.type === "ref" && (part.ref.type === "port" || part.ref.type === "endpoint" || part.ref.type === "service")
188678
+ (part) => part.type === "ref" && (part.ref.type === "port" || part.ref.type === "endpoint" || part.ref.type === "service" || part.ref.type === "volume")
187958
188679
  );
187959
188680
  if (hasSkippableRef) {
187960
188681
  continue;
@@ -187968,7 +188689,7 @@ function resolveEnvForExec(env2, resources, secrets, configs) {
187968
188689
  }
187969
188690
 
187970
188691
  // src/lib/dev/service-runner.ts
187971
- function startService(service, resources, secrets, configs, endpointPorts, serviceEndpoints, onLog, publicUrls, cwd) {
188692
+ function startService(service, resources, secrets, configs, endpointPorts, serviceEndpoints, onLog, publicUrls, cwd, volumePaths) {
187972
188693
  const command = service.dev?.command ?? service.command;
187973
188694
  if (!command) {
187974
188695
  throw new Error(`Service "${service.name}" has no command`);
@@ -187986,7 +188707,8 @@ function startService(service, resources, secrets, configs, endpointPorts, servi
187986
188707
  defaultPort,
187987
188708
  serviceEndpoints,
187988
188709
  endpointPorts,
187989
- publicUrls
188710
+ publicUrls,
188711
+ volumePaths
187990
188712
  );
187991
188713
  const child = spawn2(command, {
187992
188714
  shell: true,
@@ -188277,6 +188999,7 @@ var HTTPS_PORT = 443;
188277
188999
  var DOMAIN_SUFFIX = ".local.spcf.app";
188278
189000
  var ADMIN_DOMAIN = "local.spcf.app";
188279
189001
  var DRIZZLE_GATEWAY_PREFIX = "__drizzle_gateway";
189002
+ var TEMPORAL_UI_PREFIX = "__temporal";
188280
189003
  var MIME_TYPES = {
188281
189004
  ".html": "text/html",
188282
189005
  ".css": "text/css",
@@ -188295,6 +189018,7 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
188295
189018
  const serviceMap = /* @__PURE__ */ new Map();
188296
189019
  const adminPortMap = /* @__PURE__ */ new Map();
188297
189020
  const drizzleGatewayPortMap = /* @__PURE__ */ new Map();
189021
+ const temporalUiPortMap = /* @__PURE__ */ new Map();
188298
189022
  const buildMapKey = (serviceName, key) => {
188299
189023
  return key === "default" ? serviceName : `${serviceName}.${key}`;
188300
189024
  };
@@ -188305,6 +189029,7 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
188305
189029
  serviceMap.clear();
188306
189030
  adminPortMap.clear();
188307
189031
  drizzleGatewayPortMap.clear();
189032
+ temporalUiPortMap.clear();
188308
189033
  for (const svc of registryServices) {
188309
189034
  serviceMap.set(buildMapKey(svc.serviceName, svc.key), svc.port);
188310
189035
  }
@@ -188313,6 +189038,9 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
188313
189038
  if (registration.drizzleGatewayPort !== void 0) {
188314
189039
  drizzleGatewayPortMap.set(key, registration.drizzleGatewayPort);
188315
189040
  }
189041
+ if (registration.temporalUiPort !== void 0) {
189042
+ temporalUiPortMap.set(key, registration.temporalUiPort);
189043
+ }
188316
189044
  }
188317
189045
  writeLog("proxy", `Updated service map: ${serviceMap.size} services, ${adminPortMap.size} admin instances, ${drizzleGatewayPortMap.size} drizzle gateways`);
188318
189046
  };
@@ -188326,9 +189054,32 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
188326
189054
  res.end(`<h1>Bad Gateway</h1><p>Service unavailable: ${err.message}</p>`);
188327
189055
  }
188328
189056
  });
189057
+ proxy.on("proxyRes", (proxyRes, req) => {
189058
+ const host = req.headers?.host || "";
189059
+ if (extractTemporalUiKey(host) !== null || extractDrizzleGatewayKey(host) !== null) {
189060
+ delete proxyRes.headers["x-frame-options"];
189061
+ const csp = proxyRes.headers["content-security-policy"];
189062
+ if (typeof csp === "string" && csp.includes("frame-ancestors")) {
189063
+ proxyRes.headers["content-security-policy"] = csp.split(";").filter((d) => !d.trim().startsWith("frame-ancestors")).join(";");
189064
+ }
189065
+ }
189066
+ });
188329
189067
  const handleRequest = (req, res) => {
188330
189068
  const host = req.headers.host || "";
188331
189069
  const hostname2 = host.split(":")[0];
189070
+ const temporalKey = extractTemporalUiKey(host);
189071
+ if (temporalKey !== null) {
189072
+ const temporalPort = temporalUiPortMap.get(temporalKey);
189073
+ if (temporalPort) {
189074
+ proxy.web(req, res, {
189075
+ target: `http://127.0.0.1:${temporalPort}`
189076
+ });
189077
+ return;
189078
+ }
189079
+ res.writeHead(503, { "Content-Type": "text/html" });
189080
+ res.end("<h1>Workflow Engine</h1><p>No workflow engine running for this instance.</p>");
189081
+ return;
189082
+ }
188332
189083
  const drizzleKey = extractDrizzleGatewayKey(host);
188333
189084
  if (drizzleKey !== null) {
188334
189085
  const drizzlePort = drizzleGatewayPortMap.get(drizzleKey);
@@ -188373,6 +189124,26 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
188373
189124
  };
188374
189125
  const handleUpgrade = (req, socket, head) => {
188375
189126
  const host = req.headers.host || "";
189127
+ const temporalKey = extractTemporalUiKey(host);
189128
+ if (temporalKey !== null) {
189129
+ const temporalPort = temporalUiPortMap.get(temporalKey);
189130
+ if (temporalPort) {
189131
+ proxy.ws(req, socket, head, { target: `http://127.0.0.1:${temporalPort}` });
189132
+ return;
189133
+ }
189134
+ socket.end("HTTP/1.1 404 Not Found\r\n\r\n");
189135
+ return;
189136
+ }
189137
+ const drizzleKey = extractDrizzleGatewayKey(host);
189138
+ if (drizzleKey !== null) {
189139
+ const drizzlePort = drizzleGatewayPortMap.get(drizzleKey);
189140
+ if (drizzlePort) {
189141
+ proxy.ws(req, socket, head, { target: `http://127.0.0.1:${drizzlePort}` });
189142
+ return;
189143
+ }
189144
+ socket.end("HTTP/1.1 404 Not Found\r\n\r\n");
189145
+ return;
189146
+ }
188376
189147
  const adminKey = extractAdminKey(host);
188377
189148
  if (adminKey !== null) {
188378
189149
  if (adminPortMap.has(adminKey)) {
@@ -188508,6 +189279,23 @@ function extractDrizzleGatewayKey(host) {
188508
189279
  }
188509
189280
  return null;
188510
189281
  }
189282
+ function extractTemporalUiKey(host) {
189283
+ const hostname2 = host.split(":")[0];
189284
+ if (!hostname2 || !hostname2.endsWith(DOMAIN_SUFFIX)) {
189285
+ return null;
189286
+ }
189287
+ const prefix = hostname2.slice(0, -DOMAIN_SUFFIX.length);
189288
+ if (!prefix) {
189289
+ return null;
189290
+ }
189291
+ const parts = prefix.split(".");
189292
+ if (parts.length === 1 && parts[0] === TEMPORAL_UI_PREFIX) {
189293
+ return "default";
189294
+ } else if (parts.length === 2 && parts[0] === TEMPORAL_UI_PREFIX && parts[1]) {
189295
+ return parts[1];
189296
+ }
189297
+ return null;
189298
+ }
188511
189299
  function extractAdminKey(host) {
188512
189300
  const hostname2 = host.split(":")[0];
188513
189301
  if (!hostname2) {
@@ -189266,9 +190054,110 @@ function createReshapeWatcher(options2) {
189266
190054
  };
189267
190055
  }
189268
190056
 
190057
+ // src/lib/dev/temporal-manager.ts
190058
+ import * as fs20 from "fs";
190059
+ import * as path17 from "path";
190060
+ import * as net4 from "net";
190061
+ import { spawn as spawn5 } from "child_process";
190062
+ async function startTemporalDevServer(temporals, grpcPort, uiPort, dataDir, onProgress) {
190063
+ const binary = await ensureBinary(temporalBinary, void 0, onProgress);
190064
+ const dbPath = path17.join(process.cwd(), dataDir, "temporal.db");
190065
+ const dbDir = path17.dirname(dbPath);
190066
+ if (!fs20.existsSync(dbDir)) {
190067
+ fs20.mkdirSync(dbDir, { recursive: true });
190068
+ }
190069
+ const host = "127.0.0.1";
190070
+ const namespaceArgs = temporals.flatMap((t) => ["--namespace", t.name]);
190071
+ const proc = spawn5(
190072
+ binary.executables["temporal"],
190073
+ [
190074
+ "server",
190075
+ "start-dev",
190076
+ "--port",
190077
+ String(grpcPort),
190078
+ "--ui-port",
190079
+ String(uiPort),
190080
+ "--db-filename",
190081
+ dbPath,
190082
+ ...namespaceArgs,
190083
+ "--log-format",
190084
+ "pretty"
190085
+ ],
190086
+ {
190087
+ stdio: ["ignore", "pipe", "pipe"]
190088
+ }
190089
+ );
190090
+ pipeProcess("temporal", proc);
190091
+ await waitForTcpPort4(host, grpcPort);
190092
+ const stopServer = () => stopProcess4(proc);
190093
+ const instances = temporals.map((temporal, i) => ({
190094
+ name: temporal.name,
190095
+ type: "temporal",
190096
+ port: grpcPort,
190097
+ host,
190098
+ user: "",
190099
+ password: "",
190100
+ dbName: temporal.name,
190101
+ url: `${host}:${grpcPort}`,
190102
+ uiPort,
190103
+ // Only the first instance owns the server lifecycle
190104
+ stop: i === 0 ? stopServer : async () => {
190105
+ }
190106
+ }));
190107
+ return instances;
190108
+ }
190109
+ async function waitForTcpPort4(host, port, timeoutMs = 3e4) {
190110
+ const startTime = Date.now();
190111
+ while (Date.now() - startTime < timeoutMs) {
190112
+ const isOpen = await checkTcpPort4(host, port);
190113
+ if (isOpen) {
190114
+ return;
190115
+ }
190116
+ await new Promise((resolve10) => setTimeout(resolve10, 100));
190117
+ }
190118
+ throw new Error(`Temporal port ${port} did not become available within timeout`);
190119
+ }
190120
+ function checkTcpPort4(host, port) {
190121
+ return new Promise((resolve10) => {
190122
+ const socket = new net4.Socket();
190123
+ socket.setTimeout(1e3);
190124
+ socket.on("connect", () => {
190125
+ socket.destroy();
190126
+ resolve10(true);
190127
+ });
190128
+ socket.on("timeout", () => {
190129
+ socket.destroy();
190130
+ resolve10(false);
190131
+ });
190132
+ socket.on("error", () => {
190133
+ socket.destroy();
190134
+ resolve10(false);
190135
+ });
190136
+ socket.connect(port, host);
190137
+ });
190138
+ }
190139
+ async function stopProcess4(proc) {
190140
+ return new Promise((resolve10) => {
190141
+ if (proc.killed || proc.exitCode !== null) {
190142
+ resolve10();
190143
+ return;
190144
+ }
190145
+ proc.once("exit", () => {
190146
+ clearTimeout(forceKillTimeout);
190147
+ resolve10();
190148
+ });
190149
+ proc.kill("SIGTERM");
190150
+ const forceKillTimeout = setTimeout(() => {
190151
+ if (!proc.killed && proc.exitCode === null) {
190152
+ proc.kill("SIGKILL");
190153
+ }
190154
+ }, 2e3);
190155
+ });
190156
+ }
190157
+
189269
190158
  // src/lib/dev/resource-starter.ts
189270
190159
  function findRequiredResources(service) {
189271
- const required = { postgres: [], redis: [], storage: [] };
190160
+ const required = { postgres: [], redis: [], storage: [], temporal: [] };
189272
190161
  if (service.env) {
189273
190162
  for (const value of Object.values(service.env)) {
189274
190163
  if (typeof value !== "object" || value === null) continue;
@@ -189280,6 +190169,8 @@ function findRequiredResources(service) {
189280
190169
  required.redis.push(ref.name);
189281
190170
  } else if (ref.type === "storage" && !required.storage.includes(ref.name)) {
189282
190171
  required.storage.push(ref.name);
190172
+ } else if (ref.type === "temporal" && !required.temporal.includes(ref.name)) {
190173
+ required.temporal.push(ref.name);
189283
190174
  }
189284
190175
  }
189285
190176
  }
@@ -189306,14 +190197,17 @@ async function startResources(options2) {
189306
190197
  let postgresConfigs;
189307
190198
  let redisConfigs;
189308
190199
  let storageConfigs;
190200
+ let temporalConfigs;
189309
190201
  if (selection.mode === "all") {
189310
190202
  postgresConfigs = config.postgres;
189311
190203
  redisConfigs = config.redis;
189312
190204
  storageConfigs = config.storage;
190205
+ temporalConfigs = config.temporal;
189313
190206
  } else {
189314
190207
  postgresConfigs = config.postgres.filter((p) => selection.postgres.includes(p.name));
189315
190208
  redisConfigs = config.redis.filter((r) => selection.redis.includes(r.name));
189316
190209
  storageConfigs = config.storage.filter((s) => selection.storage.includes(s.name));
190210
+ temporalConfigs = config.temporal.filter((t) => selection.temporal.includes(t.name));
189317
190211
  }
189318
190212
  for (const pg of postgresConfigs) {
189319
190213
  if (signal?.cancelled) {
@@ -189399,6 +190293,25 @@ async function startResources(options2) {
189399
190293
  if (instance.secretKey) dbState.secretKey = instance.secretKey;
189400
190294
  await stateManager.registerDatabase(storage.name, dbState);
189401
190295
  }
190296
+ if (temporalConfigs.length > 0) {
190297
+ if (signal?.cancelled) {
190298
+ return { resources, electric, startedResources, startedElectric, cancelled: true };
190299
+ }
190300
+ const grpcPort = portAllocator.allocate("temporal-grpc");
190301
+ const uiPort = portAllocator.allocate("temporal-ui");
190302
+ const names = temporalConfigs.map((t) => t.name).join(", ");
190303
+ log(`Starting temporal dev server on port ${grpcPort} (UI: ${uiPort}) with namespaces: ${names}`);
190304
+ callbacks.onResourceStarting?.(temporalConfigs[0].name, "temporal");
190305
+ const instances = await startTemporalDevServer(temporalConfigs, grpcPort, uiPort, dataDir, (progress) => {
190306
+ callbacks.onResourceProgress?.(temporalConfigs[0].name, progress);
190307
+ });
190308
+ for (const instance of instances) {
190309
+ resources.set(instance.name, instance);
190310
+ startedResources.push(instance);
190311
+ callbacks.onResourceReady?.(instance.name, instance);
190312
+ log(`Temporal namespace "${instance.name}" ready`);
190313
+ }
190314
+ }
189402
190315
  if (shouldStartElectric) {
189403
190316
  const syncDatabases = detectSyncDatabases(config);
189404
190317
  for (const pgName of syncDatabases) {
@@ -189449,24 +190362,24 @@ function watchConfigFile(configPath, debounceMs, onChange) {
189449
190362
  }
189450
190363
 
189451
190364
  // src/lib/dev/subdomain-generator.ts
189452
- import * as fs20 from "fs";
189453
- import * as path17 from "path";
190365
+ import * as fs21 from "fs";
190366
+ import * as path18 from "path";
189454
190367
  import { generateSlug } from "random-word-slugs";
189455
190368
  var StableSubdomainAllocator = class {
189456
190369
  tunnelsDir;
189457
190370
  tunnelsFilePath;
189458
190371
  baseSlug = null;
189459
190372
  constructor(projectRoot, key = "default") {
189460
- this.tunnelsDir = path17.join(projectRoot, ".specific", "keys", key);
189461
- this.tunnelsFilePath = path17.join(this.tunnelsDir, "tunnels.json");
190373
+ this.tunnelsDir = path18.join(projectRoot, ".specific", "keys", key);
190374
+ this.tunnelsFilePath = path18.join(this.tunnelsDir, "tunnels.json");
189462
190375
  this.loadTunnels();
189463
190376
  }
189464
190377
  loadTunnels() {
189465
- if (!fs20.existsSync(this.tunnelsFilePath)) {
190378
+ if (!fs21.existsSync(this.tunnelsFilePath)) {
189466
190379
  return;
189467
190380
  }
189468
190381
  try {
189469
- const content = fs20.readFileSync(this.tunnelsFilePath, "utf-8");
190382
+ const content = fs21.readFileSync(this.tunnelsFilePath, "utf-8");
189470
190383
  const data = JSON.parse(content);
189471
190384
  if (data.version === 1 && data.baseSlug) {
189472
190385
  this.baseSlug = data.baseSlug;
@@ -189476,14 +190389,14 @@ var StableSubdomainAllocator = class {
189476
190389
  }
189477
190390
  }
189478
190391
  saveTunnels() {
189479
- if (!fs20.existsSync(this.tunnelsDir)) {
189480
- fs20.mkdirSync(this.tunnelsDir, { recursive: true });
190392
+ if (!fs21.existsSync(this.tunnelsDir)) {
190393
+ fs21.mkdirSync(this.tunnelsDir, { recursive: true });
189481
190394
  }
189482
190395
  const data = {
189483
190396
  version: 1,
189484
190397
  baseSlug: this.baseSlug
189485
190398
  };
189486
- fs20.writeFileSync(this.tunnelsFilePath, JSON.stringify(data, null, 2));
190399
+ fs21.writeFileSync(this.tunnelsFilePath, JSON.stringify(data, null, 2));
189487
190400
  }
189488
190401
  generateBaseSlug() {
189489
190402
  return generateSlug(2, {
@@ -189520,7 +190433,7 @@ var StableSubdomainAllocator = class {
189520
190433
 
189521
190434
  // node_modules/.pnpm/@specific+tunnel-client@file+..+tunnel+client/node_modules/@specific/tunnel-client/dist/index.js
189522
190435
  import { EventEmitter as EventEmitter2 } from "node:events";
189523
- import * as net4 from "node:net";
190436
+ import * as net5 from "node:net";
189524
190437
  var DEFAULT_HOST = "https://tunnel.spcf.app";
189525
190438
  var RECONNECT_DELAYS = [1e3, 2e3, 4e3, 8e3, 15e3];
189526
190439
  async function register(baseUrl, subdomain) {
@@ -189562,7 +190475,7 @@ var TunnelClientImpl = class extends EventEmitter2 {
189562
190475
  }
189563
190476
  }
189564
190477
  addPoolConnection() {
189565
- const remote = net4.connect({ host: this.tunnelHost, port: this.info.port });
190478
+ const remote = net5.connect({ host: this.tunnelHost, port: this.info.port });
189566
190479
  remote.setKeepAlive(true, 3e4);
189567
190480
  this.pool.add(remote);
189568
190481
  remote.once("data", (firstChunk) => {
@@ -189577,7 +190490,7 @@ var TunnelClientImpl = class extends EventEmitter2 {
189577
190490
  remote.on("close", () => this.onIdleClose(remote, errored));
189578
190491
  }
189579
190492
  pipeToLocal(remote, firstChunk) {
189580
- const local = net4.connect({ host: "127.0.0.1", port: this.localPort }, () => {
190493
+ const local = net5.connect({ host: "127.0.0.1", port: this.localPort }, () => {
189581
190494
  local.write(firstChunk);
189582
190495
  remote.pipe(local);
189583
190496
  local.pipe(remote);
@@ -189639,10 +190552,10 @@ async function startTunnel(serviceName, endpointName, port, subdomain, callbacks
189639
190552
  }
189640
190553
 
189641
190554
  // src/lib/dev/proxy-registry.ts
189642
- import * as fs21 from "fs";
189643
- import * as path18 from "path";
190555
+ import * as fs22 from "fs";
190556
+ import * as path19 from "path";
189644
190557
  import * as os8 from "os";
189645
- import * as net5 from "net";
190558
+ import * as net6 from "net";
189646
190559
  var ProxyRegistryManager = class {
189647
190560
  proxyDir;
189648
190561
  ownerPath;
@@ -189651,14 +190564,14 @@ var ProxyRegistryManager = class {
189651
190564
  isOwner = false;
189652
190565
  registryWatcher = null;
189653
190566
  constructor() {
189654
- this.proxyDir = path18.join(os8.homedir(), ".specific", "proxy");
189655
- this.ownerPath = path18.join(this.proxyDir, "owner.json");
189656
- this.registryPath = path18.join(this.proxyDir, "registry.json");
189657
- this.lockPath = path18.join(this.proxyDir, "registry.lock");
190567
+ this.proxyDir = path19.join(os8.homedir(), ".specific", "proxy");
190568
+ this.ownerPath = path19.join(this.proxyDir, "owner.json");
190569
+ this.registryPath = path19.join(this.proxyDir, "registry.json");
190570
+ this.lockPath = path19.join(this.proxyDir, "registry.lock");
189658
190571
  }
189659
190572
  ensureProxyDir() {
189660
- if (!fs21.existsSync(this.proxyDir)) {
189661
- fs21.mkdirSync(this.proxyDir, { recursive: true });
190573
+ if (!fs22.existsSync(this.proxyDir)) {
190574
+ fs22.mkdirSync(this.proxyDir, { recursive: true });
189662
190575
  }
189663
190576
  }
189664
190577
  isProcessRunning(pid) {
@@ -189676,7 +190589,7 @@ var ProxyRegistryManager = class {
189676
190589
  */
189677
190590
  isProxyListening(port, timeoutMs = 1e3) {
189678
190591
  return new Promise((resolve10) => {
189679
- const socket = new net5.Socket();
190592
+ const socket = new net6.Socket();
189680
190593
  let resolved = false;
189681
190594
  const cleanup = () => {
189682
190595
  if (!resolved) {
@@ -189715,15 +190628,15 @@ var ProxyRegistryManager = class {
189715
190628
  const startTime = Date.now();
189716
190629
  while (Date.now() - startTime < timeoutMs) {
189717
190630
  try {
189718
- const fd = fs21.openSync(
190631
+ const fd = fs22.openSync(
189719
190632
  this.lockPath,
189720
- fs21.constants.O_CREAT | fs21.constants.O_EXCL | fs21.constants.O_WRONLY
190633
+ fs22.constants.O_CREAT | fs22.constants.O_EXCL | fs22.constants.O_WRONLY
189721
190634
  );
189722
- fs21.writeSync(fd, String(process.pid));
189723
- fs21.closeSync(fd);
190635
+ fs22.writeSync(fd, String(process.pid));
190636
+ fs22.closeSync(fd);
189724
190637
  return () => {
189725
190638
  try {
189726
- fs21.unlinkSync(this.lockPath);
190639
+ fs22.unlinkSync(this.lockPath);
189727
190640
  } catch {
189728
190641
  }
189729
190642
  };
@@ -189732,16 +190645,16 @@ var ProxyRegistryManager = class {
189732
190645
  if (err.code === "EEXIST") {
189733
190646
  try {
189734
190647
  const lockPid = parseInt(
189735
- fs21.readFileSync(this.lockPath, "utf-8").trim(),
190648
+ fs22.readFileSync(this.lockPath, "utf-8").trim(),
189736
190649
  10
189737
190650
  );
189738
190651
  if (!this.isProcessRunning(lockPid)) {
189739
- fs21.unlinkSync(this.lockPath);
190652
+ fs22.unlinkSync(this.lockPath);
189740
190653
  continue;
189741
190654
  }
189742
190655
  } catch {
189743
190656
  try {
189744
- fs21.unlinkSync(this.lockPath);
190657
+ fs22.unlinkSync(this.lockPath);
189745
190658
  } catch {
189746
190659
  }
189747
190660
  continue;
@@ -189761,8 +190674,8 @@ var ProxyRegistryManager = class {
189761
190674
  async claimProxyOwnership(key) {
189762
190675
  const releaseLock = await this.acquireLock();
189763
190676
  try {
189764
- if (fs21.existsSync(this.ownerPath)) {
189765
- const content = fs21.readFileSync(this.ownerPath, "utf-8");
190677
+ if (fs22.existsSync(this.ownerPath)) {
190678
+ const content = fs22.readFileSync(this.ownerPath, "utf-8");
189766
190679
  const ownerFile2 = JSON.parse(content);
189767
190680
  if (await this.isProxyOwnerHealthy(ownerFile2.owner.pid)) {
189768
190681
  return false;
@@ -189792,11 +190705,11 @@ var ProxyRegistryManager = class {
189792
190705
  }
189793
190706
  const releaseLock = await this.acquireLock();
189794
190707
  try {
189795
- if (fs21.existsSync(this.ownerPath)) {
189796
- const content = fs21.readFileSync(this.ownerPath, "utf-8");
190708
+ if (fs22.existsSync(this.ownerPath)) {
190709
+ const content = fs22.readFileSync(this.ownerPath, "utf-8");
189797
190710
  const ownerFile = JSON.parse(content);
189798
190711
  if (ownerFile.owner.pid === process.pid) {
189799
- fs21.unlinkSync(this.ownerPath);
190712
+ fs22.unlinkSync(this.ownerPath);
189800
190713
  }
189801
190714
  }
189802
190715
  this.isOwner = false;
@@ -189808,12 +190721,12 @@ var ProxyRegistryManager = class {
189808
190721
  * Get the current proxy owner.
189809
190722
  */
189810
190723
  async getProxyOwner() {
189811
- if (!fs21.existsSync(this.ownerPath)) {
190724
+ if (!fs22.existsSync(this.ownerPath)) {
189812
190725
  return null;
189813
190726
  }
189814
190727
  const releaseLock = await this.acquireLock();
189815
190728
  try {
189816
- const content = fs21.readFileSync(this.ownerPath, "utf-8");
190729
+ const content = fs22.readFileSync(this.ownerPath, "utf-8");
189817
190730
  const ownerFile = JSON.parse(content);
189818
190731
  if (!await this.isProxyOwnerHealthy(ownerFile.owner.pid)) {
189819
190732
  return null;
@@ -189834,7 +190747,7 @@ var ProxyRegistryManager = class {
189834
190747
  /**
189835
190748
  * Register services for a key.
189836
190749
  */
189837
- async registerServices(key, adminPort, services, drizzleGatewayPort) {
190750
+ async registerServices(key, adminPort, services, drizzleGatewayPort, temporalUiPort) {
189838
190751
  const releaseLock = await this.acquireLock();
189839
190752
  try {
189840
190753
  const registry = this.readRegistry();
@@ -189845,6 +190758,9 @@ var ProxyRegistryManager = class {
189845
190758
  if (drizzleGatewayPort !== void 0) {
189846
190759
  registration.drizzleGatewayPort = drizzleGatewayPort;
189847
190760
  }
190761
+ if (temporalUiPort !== void 0) {
190762
+ registration.temporalUiPort = temporalUiPort;
190763
+ }
189848
190764
  registry.keys[key] = registration;
189849
190765
  registry.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
189850
190766
  this.writeFileAtomic(this.registryPath, registry);
@@ -189907,7 +190823,7 @@ var ProxyRegistryManager = class {
189907
190823
  */
189908
190824
  watchRegistry(onChange) {
189909
190825
  this.ensureProxyDir();
189910
- if (!fs21.existsSync(this.registryPath)) {
190826
+ if (!fs22.existsSync(this.registryPath)) {
189911
190827
  const emptyRegistry = {
189912
190828
  version: 1,
189913
190829
  keys: {},
@@ -189950,13 +190866,13 @@ var ProxyRegistryManager = class {
189950
190866
  async attemptElection(key) {
189951
190867
  const releaseLock = await this.acquireLock();
189952
190868
  try {
189953
- if (fs21.existsSync(this.ownerPath)) {
189954
- const content = fs21.readFileSync(this.ownerPath, "utf-8");
190869
+ if (fs22.existsSync(this.ownerPath)) {
190870
+ const content = fs22.readFileSync(this.ownerPath, "utf-8");
189955
190871
  const ownerFile2 = JSON.parse(content);
189956
190872
  if (await this.isProxyOwnerHealthy(ownerFile2.owner.pid)) {
189957
190873
  return false;
189958
190874
  }
189959
- fs21.unlinkSync(this.ownerPath);
190875
+ fs22.unlinkSync(this.ownerPath);
189960
190876
  }
189961
190877
  const ownerFile = {
189962
190878
  version: 1,
@@ -189974,7 +190890,7 @@ var ProxyRegistryManager = class {
189974
190890
  }
189975
190891
  }
189976
190892
  readRegistry() {
189977
- if (!fs21.existsSync(this.registryPath)) {
190893
+ if (!fs22.existsSync(this.registryPath)) {
189978
190894
  return {
189979
190895
  version: 1,
189980
190896
  keys: {},
@@ -189982,7 +190898,7 @@ var ProxyRegistryManager = class {
189982
190898
  };
189983
190899
  }
189984
190900
  try {
189985
- const content = fs21.readFileSync(this.registryPath, "utf-8");
190901
+ const content = fs22.readFileSync(this.registryPath, "utf-8");
189986
190902
  return JSON.parse(content);
189987
190903
  } catch {
189988
190904
  return {
@@ -189995,8 +190911,8 @@ var ProxyRegistryManager = class {
189995
190911
  writeFileAtomic(filePath, data) {
189996
190912
  this.ensureProxyDir();
189997
190913
  const tmpPath = filePath + ".tmp";
189998
- fs21.writeFileSync(tmpPath, JSON.stringify(data, null, 2));
189999
- fs21.renameSync(tmpPath, filePath);
190914
+ fs22.writeFileSync(tmpPath, JSON.stringify(data, null, 2));
190915
+ fs22.renameSync(tmpPath, filePath);
190000
190916
  }
190001
190917
  };
190002
190918
 
@@ -190309,16 +191225,16 @@ function DevUI({ instanceKey, tunnelEnabled }) {
190309
191225
  }, [state.status]);
190310
191226
  useEffect3(() => {
190311
191227
  if (state.status !== "running") return;
190312
- const configPath = path19.join(process.cwd(), "specific.hcl");
191228
+ const configPath = path20.join(process.cwd(), "specific.hcl");
190313
191229
  const watcher = watchConfigFile(configPath, 1e3, () => {
190314
191230
  try {
190315
- const hcl = fs22.readFileSync(configPath, "utf-8");
191231
+ const hcl = fs23.readFileSync(configPath, "utf-8");
190316
191232
  parseConfig(hcl).then(() => {
190317
191233
  triggerReload();
190318
191234
  }).catch((err) => {
190319
191235
  setState((s) => ({
190320
191236
  ...s,
190321
- parseError: `Config error: ${err instanceof Error ? err.message : String(err)}`
191237
+ parseError: formatConfigError(err, hcl, configPath)
190322
191238
  }));
190323
191239
  });
190324
191240
  } catch (err) {
@@ -190437,8 +191353,8 @@ function DevUI({ instanceKey, tunnelEnabled }) {
190437
191353
  }));
190438
191354
  return;
190439
191355
  }
190440
- const configPath = path19.join(process.cwd(), "specific.hcl");
190441
- if (!fs22.existsSync(configPath)) {
191356
+ const configPath = path20.join(process.cwd(), "specific.hcl");
191357
+ if (!fs23.existsSync(configPath)) {
190442
191358
  writeLog("system", "Waiting for specific.hcl to appear");
190443
191359
  setState((s) => ({
190444
191360
  ...s,
@@ -190456,14 +191372,14 @@ function DevUI({ instanceKey, tunnelEnabled }) {
190456
191372
  return;
190457
191373
  }
190458
191374
  let config2;
191375
+ const hcl = fs23.readFileSync(configPath, "utf-8");
190459
191376
  try {
190460
- const hcl = fs22.readFileSync(configPath, "utf-8");
190461
191377
  config2 = await parseConfig(hcl);
190462
191378
  } catch (err) {
190463
191379
  setState((s) => ({
190464
191380
  ...s,
190465
191381
  status: "error",
190466
- error: err instanceof Error ? err.message : String(err)
191382
+ error: formatConfigError(err, hcl, configPath)
190467
191383
  }));
190468
191384
  return;
190469
191385
  }
@@ -190482,6 +191398,10 @@ function DevUI({ instanceKey, tunnelEnabled }) {
190482
191398
  colorMap.set(`res:${storage.name}`, COLORS[colorIndex % COLORS.length]);
190483
191399
  colorIndex++;
190484
191400
  }
191401
+ for (const temporal of config2.temporal) {
191402
+ colorMap.set(`res:${temporal.name}`, COLORS[colorIndex % COLORS.length]);
191403
+ colorIndex++;
191404
+ }
190485
191405
  for (const service of config2.services) {
190486
191406
  colorMap.set(
190487
191407
  `svc:${service.name}`,
@@ -190563,7 +191483,7 @@ function DevUI({ instanceKey, tunnelEnabled }) {
190563
191483
  const drizzleGateway = await startDrizzleGateway(
190564
191484
  postgresResources,
190565
191485
  drizzlePort,
190566
- path19.join(process.cwd(), ".specific", "keys", instanceKey)
191486
+ path20.join(process.cwd(), ".specific", "keys", instanceKey)
190567
191487
  );
190568
191488
  startedDrizzleGateway = drizzleGateway;
190569
191489
  drizzleGatewayRef.current = drizzleGateway;
@@ -190583,7 +191503,7 @@ function DevUI({ instanceKey, tunnelEnabled }) {
190583
191503
  if (pg.reshape?.enabled) {
190584
191504
  const resource = resources2.get(pg.name);
190585
191505
  if (!resource) continue;
190586
- const migrationsDir = path19.resolve(
191506
+ const migrationsDir = path20.resolve(
190587
191507
  process.cwd(),
190588
191508
  pg.reshape.migrations_dir ?? "migrations"
190589
191509
  );
@@ -190751,10 +191671,10 @@ Add them to the config block in specific.local`);
190751
191671
  }
190752
191672
  const services2 = [];
190753
191673
  function resolveServiceCwd(service) {
190754
- if (service.root) return path19.resolve(process.cwd(), service.root);
191674
+ if (service.root) return path20.resolve(process.cwd(), service.root);
190755
191675
  if (service.build) {
190756
191676
  const build = config2.builds.find((b) => b.name === service.build.name);
190757
- if (build?.root) return path19.resolve(process.cwd(), build.root);
191677
+ if (build?.root) return path20.resolve(process.cwd(), build.root);
190758
191678
  }
190759
191679
  return process.cwd();
190760
191680
  }
@@ -190773,6 +191693,14 @@ Add them to the config block in specific.local`);
190773
191693
  "system",
190774
191694
  `Starting service "${service.name}"${portsList ? ` on port${endpointPorts.size > 1 ? "s" : ""} ${portsList}` : ""}`
190775
191695
  );
191696
+ const volumePaths = /* @__PURE__ */ new Map();
191697
+ if (service.volumes) {
191698
+ for (const vol of service.volumes) {
191699
+ const volumeDir = path20.resolve(`.specific/keys/${instanceKey}/data/volumes/${service.name}/${vol.name}`);
191700
+ fs23.mkdirSync(volumeDir, { recursive: true });
191701
+ volumePaths.set(vol.name, volumeDir);
191702
+ }
191703
+ }
190776
191704
  const running = startService(
190777
191705
  service,
190778
191706
  resources2,
@@ -190782,7 +191710,8 @@ Add them to the config block in specific.local`);
190782
191710
  serviceEndpoints,
190783
191711
  (line) => addLog(line, colorMap),
190784
191712
  publicUrls,
190785
- resolveServiceCwd(service)
191713
+ resolveServiceCwd(service),
191714
+ volumePaths
190786
191715
  );
190787
191716
  services2.push(running);
190788
191717
  startedServices.push(running);
@@ -190820,6 +191749,14 @@ Add them to the config block in specific.local`);
190820
191749
  if (!service.command && !service.dev?.command) continue;
190821
191750
  try {
190822
191751
  const endpointPorts = serviceEndpointPorts.get(service.name) || /* @__PURE__ */ new Map();
191752
+ const volumePaths = /* @__PURE__ */ new Map();
191753
+ if (service.volumes) {
191754
+ for (const vol of service.volumes) {
191755
+ const volumeDir = path20.resolve(`.specific/keys/${instanceKey}/data/volumes/${service.name}/${vol.name}`);
191756
+ fs23.mkdirSync(volumeDir, { recursive: true });
191757
+ volumePaths.set(vol.name, volumeDir);
191758
+ }
191759
+ }
190823
191760
  const running = startService(
190824
191761
  service,
190825
191762
  resources2,
@@ -190829,7 +191766,8 @@ Add them to the config block in specific.local`);
190829
191766
  serviceEndpoints,
190830
191767
  (line) => addLog(line, colorMap),
190831
191768
  void 0,
190832
- resolveServiceCwd(service)
191769
+ resolveServiceCwd(service),
191770
+ volumePaths
190833
191771
  );
190834
191772
  newServices.push(running);
190835
191773
  } catch (err) {
@@ -190916,6 +191854,7 @@ Add them to the config block in specific.local`);
190916
191854
  runningServicePorts.set(s.name, s.ports.get("default"));
190917
191855
  }
190918
191856
  const projectId = hasProjectId() ? readProjectId() : void 0;
191857
+ const hasTemporal = config2.temporal.length > 0;
190919
191858
  const getState = () => ({
190920
191859
  status: "running",
190921
191860
  services: config2.services.filter((svc) => runningServicePorts.has(svc.name) || svc.serve).map((svc) => ({
@@ -190931,16 +191870,20 @@ Add them to the config block in specific.local`);
190931
191870
  host: r.host,
190932
191871
  syncEnabled: r.type === "postgres" && syncDatabases.has(name)
190933
191872
  })),
190934
- projectId
191873
+ projectId,
191874
+ hasTemporal
190935
191875
  });
190936
191876
  const adminServer = await startAdminServer(getState);
190937
191877
  adminServerRef.current = adminServer;
190938
191878
  writeLog("system", `Admin API server started on port ${adminServer.port}`);
191879
+ const temporalInstance = [...resources2.values()].find((r) => r.type === "temporal");
191880
+ const temporalUiPort = temporalInstance?.uiPort;
190939
191881
  await proxyRegistry.registerServices(
190940
191882
  instanceKey,
190941
191883
  adminServer.port,
190942
191884
  serviceInfos,
190943
- startedDrizzleGateway?.port
191885
+ startedDrizzleGateway?.port,
191886
+ temporalUiPort
190944
191887
  );
190945
191888
  writeLog("system", `Registered ${serviceInfos.length} services with proxy registry`);
190946
191889
  const becameProxyOwner = await proxyRegistry.claimProxyOwnership(instanceKey);
@@ -191137,7 +192080,7 @@ Add them to the config block in specific.local`);
191137
192080
  return /* @__PURE__ */ React6.createElement(Box6, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Text6, null, /* @__PURE__ */ React6.createElement(Text6, { color: "yellow" }, /* @__PURE__ */ React6.createElement(Spinner4, { type: "dots" })), /* @__PURE__ */ React6.createElement(Text6, null, " No specific.hcl in project yet. Go build something with your coding agent!")));
191138
192081
  }
191139
192082
  if (state.status === "error") {
191140
- return /* @__PURE__ */ React6.createElement(Box6, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Text6, { color: "red" }, "Error: ", state.error));
192083
+ return /* @__PURE__ */ React6.createElement(Box6, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Text6, { color: "red" }, state.error));
191141
192084
  }
191142
192085
  if (state.status === "stopping") {
191143
192086
  return /* @__PURE__ */ React6.createElement(Box6, null, /* @__PURE__ */ React6.createElement(Text6, { color: "yellow" }, /* @__PURE__ */ React6.createElement(Spinner4, { type: "dots" })), /* @__PURE__ */ React6.createElement(Text6, null, " Shutting down..."));
@@ -191150,7 +192093,7 @@ Add them to the config block in specific.local`);
191150
192093
  return /* @__PURE__ */ React6.createElement(Box6, null, /* @__PURE__ */ React6.createElement(Text6, { color: "blue" }, /* @__PURE__ */ React6.createElement(Spinner4, { type: "dots" })));
191151
192094
  }
191152
192095
  if (state.status === "starting") {
191153
- return /* @__PURE__ */ React6.createElement(Box6, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Text6, null, /* @__PURE__ */ React6.createElement(Text6, { bold: true, color: "cyan" }, "Specific dev server"), /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, " (Ctrl+C to stop)")), /* @__PURE__ */ React6.createElement(Text6, null, " "), (config.postgres.length > 0 || config.redis.length > 0 || config.storage.length > 0) && /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement(Text6, { bold: true }, "Resources:"), config.postgres.map((pg) => {
192096
+ return /* @__PURE__ */ React6.createElement(Box6, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Text6, null, /* @__PURE__ */ React6.createElement(Text6, { bold: true, color: "cyan" }, "Specific dev server"), /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, " (Ctrl+C to stop)")), /* @__PURE__ */ React6.createElement(Text6, null, " "), (config.postgres.length > 0 || config.redis.length > 0 || config.storage.length > 0 || config.temporal.length > 0) && /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement(Text6, { bold: true }, "Resources:"), config.postgres.map((pg) => {
191154
192097
  const instance = resources.get(pg.name);
191155
192098
  const resStatus = state.resourceStatus.get(pg.name);
191156
192099
  const isReady = !!instance;
@@ -191188,6 +192131,22 @@ Add them to the config block in specific.local`);
191188
192131
  const isReady = !!instance;
191189
192132
  const statusText = resStatus?.status === "starting" ? " starting..." : "";
191190
192133
  return /* @__PURE__ */ React6.createElement(Text6, { key: storage.name }, /* @__PURE__ */ React6.createElement(Text6, { color: isReady ? "green" : "gray" }, " \u25CF "), /* @__PURE__ */ React6.createElement(Text6, null, storage.name, " (storage)"), instance && /* @__PURE__ */ React6.createElement(Text6, null, " \u2192 localhost:", instance.port), !isReady && statusText && /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, statusText));
192134
+ }), config.temporal.map((temporal) => {
192135
+ const instance = resources.get(temporal.name);
192136
+ const resStatus = state.resourceStatus.get(temporal.name);
192137
+ const isReady = !!instance;
192138
+ let statusText = "";
192139
+ if (resStatus?.status === "downloading") {
192140
+ const progress = resStatus.downloadProgress;
192141
+ if (progress?.percent !== void 0) {
192142
+ statusText = ` downloading ${progress.percent}%`;
192143
+ } else {
192144
+ statusText = " downloading...";
192145
+ }
192146
+ } else if (resStatus?.status === "starting") {
192147
+ statusText = " starting...";
192148
+ }
192149
+ return /* @__PURE__ */ React6.createElement(Text6, { key: temporal.name }, /* @__PURE__ */ React6.createElement(Text6, { color: isReady ? "green" : "gray" }, " \u25CF "), /* @__PURE__ */ React6.createElement(Text6, null, temporal.name, " (temporal)"), instance && /* @__PURE__ */ React6.createElement(Text6, null, " \u2192 localhost:", instance.port), !isReady && statusText && /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, statusText));
191191
192150
  }), /* @__PURE__ */ React6.createElement(Text6, null, " ")), config.services.length > 0 && /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement(Text6, { bold: true }, "Services:"), config.services.map((svc) => {
191192
192151
  const running = services.find((s) => s.name === svc.name);
191193
192152
  const isReady = !!running;
@@ -191284,11 +192243,22 @@ Add them to the config block in specific.local`);
191284
192243
  }),
191285
192244
  { key: "storage-space", content: /* @__PURE__ */ React6.createElement(Text6, null, " ") }
191286
192245
  ] : [],
192246
+ ...config.temporal.length > 0 ? [
192247
+ { key: "temporal-header", content: /* @__PURE__ */ React6.createElement(Text6, { bold: true }, "Temporal:") },
192248
+ ...config.temporal.map((temporal) => {
192249
+ const instance = resources.get(temporal.name);
192250
+ return {
192251
+ key: `temporal-${temporal.name}`,
192252
+ content: /* @__PURE__ */ React6.createElement(Text6, null, /* @__PURE__ */ React6.createElement(Text6, { color: "green" }, " \u25CF "), /* @__PURE__ */ React6.createElement(Text6, null, temporal.name), instance && /* @__PURE__ */ React6.createElement(Text6, null, " \u2192 localhost:", instance.port))
192253
+ };
192254
+ }),
192255
+ { key: "temporal-space", content: /* @__PURE__ */ React6.createElement(Text6, null, " ") }
192256
+ ] : [],
191287
192257
  { key: "separator", content: /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, "\u2500".repeat(50)) },
191288
192258
  ...state.parseError ? [
191289
192259
  {
191290
192260
  key: "parse-error",
191291
- content: /* @__PURE__ */ React6.createElement(Text6, { color: "red" }, "Warning: ", state.parseError)
192261
+ content: /* @__PURE__ */ React6.createElement(Text6, { color: "red" }, state.parseError)
191292
192262
  }
191293
192263
  ] : [],
191294
192264
  ...output.map((line, i) => ({
@@ -191304,7 +192274,7 @@ function devCommand(instanceKey, tunnelEnabled = false) {
191304
192274
 
191305
192275
  // src/lib/dev/git-worktree.ts
191306
192276
  import { execSync as execSync3 } from "child_process";
191307
- import * as path20 from "path";
192277
+ import * as path21 from "path";
191308
192278
  function isInWorktree() {
191309
192279
  try {
191310
192280
  const commonDir = execSync3("git rev-parse --git-common-dir", {
@@ -191315,8 +192285,8 @@ function isInWorktree() {
191315
192285
  encoding: "utf-8",
191316
192286
  stdio: ["pipe", "pipe", "pipe"]
191317
192287
  }).trim();
191318
- const resolvedCommonDir = path20.resolve(commonDir);
191319
- const resolvedGitDir = path20.resolve(gitDir);
192288
+ const resolvedCommonDir = path21.resolve(commonDir);
192289
+ const resolvedGitDir = path21.resolve(gitDir);
191320
192290
  return resolvedCommonDir !== resolvedGitDir;
191321
192291
  } catch {
191322
192292
  return false;
@@ -191331,7 +192301,7 @@ function getWorktreeName() {
191331
192301
  encoding: "utf-8",
191332
192302
  stdio: ["pipe", "pipe", "pipe"]
191333
192303
  }).trim();
191334
- return path20.basename(gitDir);
192304
+ return path21.basename(gitDir);
191335
192305
  } catch {
191336
192306
  return null;
191337
192307
  }
@@ -191346,36 +192316,37 @@ init_open();
191346
192316
  import React7, { useState as useState6, useEffect as useEffect4, useCallback } from "react";
191347
192317
  import { render as render5, Text as Text7, Box as Box7, useApp as useApp3, useInput as useInput5 } from "ink";
191348
192318
  import Spinner5 from "ink-spinner";
191349
- import * as fs24 from "fs";
191350
- import * as path22 from "path";
192319
+ import * as fs25 from "fs";
192320
+ import * as path23 from "path";
191351
192321
 
191352
192322
  // src/lib/deploy/build-tester.ts
191353
- import { spawn as spawn5 } from "child_process";
191354
- import { existsSync as existsSync21 } from "fs";
191355
- import { join as join22, resolve as resolve7 } from "path";
192323
+ import { spawn as spawn6 } from "child_process";
192324
+ import { existsSync as existsSync22 } from "fs";
192325
+ import { join as join23, resolve as resolve7 } from "path";
191356
192326
  function getDependencyInstallCommand(build, projectDir) {
192327
+ if (!build.base) return null;
191357
192328
  switch (build.base) {
191358
192329
  case "node":
191359
- if (existsSync21(join22(projectDir, "pnpm-lock.yaml"))) {
192330
+ if (existsSync22(join23(projectDir, "pnpm-lock.yaml"))) {
191360
192331
  return "pnpm install --frozen-lockfile";
191361
- } else if (existsSync21(join22(projectDir, "yarn.lock"))) {
192332
+ } else if (existsSync22(join23(projectDir, "yarn.lock"))) {
191362
192333
  return "yarn install --frozen-lockfile";
191363
- } else if (existsSync21(join22(projectDir, "package-lock.json"))) {
192334
+ } else if (existsSync22(join23(projectDir, "package-lock.json"))) {
191364
192335
  return "npm ci";
191365
- } else if (existsSync21(join22(projectDir, "package.json"))) {
192336
+ } else if (existsSync22(join23(projectDir, "package.json"))) {
191366
192337
  return "npm install";
191367
192338
  }
191368
192339
  return null;
191369
192340
  case "python":
191370
- if (existsSync21(join22(projectDir, "poetry.lock"))) {
192341
+ if (existsSync22(join23(projectDir, "poetry.lock"))) {
191371
192342
  return "poetry install --no-interaction";
191372
- } else if (existsSync21(join22(projectDir, "Pipfile.lock"))) {
192343
+ } else if (existsSync22(join23(projectDir, "Pipfile.lock"))) {
191373
192344
  return "pipenv install --deploy";
191374
- } else if (existsSync21(join22(projectDir, "Pipfile"))) {
192345
+ } else if (existsSync22(join23(projectDir, "Pipfile"))) {
191375
192346
  return "pipenv install";
191376
- } else if (existsSync21(join22(projectDir, "pyproject.toml"))) {
192347
+ } else if (existsSync22(join23(projectDir, "pyproject.toml"))) {
191377
192348
  return "pip install .";
191378
- } else if (existsSync21(join22(projectDir, "requirements.txt"))) {
192349
+ } else if (existsSync22(join23(projectDir, "requirements.txt"))) {
191379
192350
  return "pip install -r requirements.txt";
191380
192351
  }
191381
192352
  return null;
@@ -191393,7 +192364,7 @@ function runCommand2(command, projectDir, buildName) {
191393
192364
  const stdout = [];
191394
192365
  const stderr = [];
191395
192366
  writeLog("build-test", `[${buildName}] Running: ${command}`);
191396
- const child = spawn5(command, {
192367
+ const child = spawn6(command, {
191397
192368
  shell: true,
191398
192369
  cwd: projectDir,
191399
192370
  env: { ...process.env },
@@ -191441,6 +192412,15 @@ function runCommand2(command, projectDir, buildName) {
191441
192412
  }
191442
192413
  async function testBuild(build, projectDir) {
191443
192414
  const startTime = Date.now();
192415
+ if (build.dockerfile) {
192416
+ writeLog("build-test", `Skipping test for build "${build.name}" (custom Dockerfile)`);
192417
+ return {
192418
+ buildName: build.name,
192419
+ success: true,
192420
+ output: "Skipped: custom Dockerfile build",
192421
+ durationMs: Date.now() - startTime
192422
+ };
192423
+ }
191444
192424
  const outputs = [];
191445
192425
  const workDir = build.root ? resolve7(projectDir, build.root) : projectDir;
191446
192426
  writeLog("build-test", `Starting test for build "${build.name}" (base: ${build.base}, workDir: ${workDir})`);
@@ -191521,8 +192501,8 @@ async function testAllBuilds(builds, projectDir) {
191521
192501
 
191522
192502
  // src/lib/tarball/create.ts
191523
192503
  import { execSync as execSync4 } from "child_process";
191524
- import * as fs23 from "fs";
191525
- import * as path21 from "path";
192504
+ import * as fs24 from "fs";
192505
+ import * as path22 from "path";
191526
192506
  import { createTarPacker, createEntryItemGenerator } from "tar-vern";
191527
192507
  function isInsideGitRepository(dir) {
191528
192508
  try {
@@ -191579,10 +192559,10 @@ var EXCLUDED_DIRS = [
191579
192559
  ];
191580
192560
  async function collectPaths(baseDir, currentDir, exclude) {
191581
192561
  const results = [];
191582
- const entries = await fs23.promises.readdir(currentDir, { withFileTypes: true });
192562
+ const entries = await fs24.promises.readdir(currentDir, { withFileTypes: true });
191583
192563
  for (const entry of entries) {
191584
- const fullPath = path21.join(currentDir, entry.name);
191585
- const relativePath = path21.relative(baseDir, fullPath);
192564
+ const fullPath = path22.join(currentDir, entry.name);
192565
+ const relativePath = path22.relative(baseDir, fullPath);
191586
192566
  if (entry.isDirectory()) {
191587
192567
  if (!exclude.includes(entry.name)) {
191588
192568
  results.push(relativePath);
@@ -191597,8 +192577,8 @@ async function collectPaths(baseDir, currentDir, exclude) {
191597
192577
  }
191598
192578
  async function createTarArchive(projectDir) {
191599
192579
  writeLog("tarball", "Creating tarball using tar-vern (non-git project)");
191600
- const configPath = path21.join(projectDir, "specific.hcl");
191601
- if (!fs23.existsSync(configPath)) {
192580
+ const configPath = path22.join(projectDir, "specific.hcl");
192581
+ if (!fs24.existsSync(configPath)) {
191602
192582
  throw new Error("specific.hcl not found in project directory");
191603
192583
  }
191604
192584
  const relativePaths = await collectPaths(projectDir, projectDir, EXCLUDED_DIRS);
@@ -191615,8 +192595,8 @@ async function createTarArchive(projectDir) {
191615
192595
  }
191616
192596
  function findWidestContext(projectDir, contexts) {
191617
192597
  if (contexts.length === 0) return ".";
191618
- const absolute = contexts.map((c) => path21.resolve(projectDir, c));
191619
- const segments = absolute.map((p) => p.split(path21.sep).filter(Boolean));
192598
+ const absolute = contexts.map((c) => path22.resolve(projectDir, c));
192599
+ const segments = absolute.map((p) => p.split(path22.sep).filter(Boolean));
191620
192600
  const firstSegments = segments[0];
191621
192601
  if (!firstSegments) return ".";
191622
192602
  const minLen = Math.min(...segments.map((s) => s.length));
@@ -191630,12 +192610,12 @@ function findWidestContext(projectDir, contexts) {
191630
192610
  }
191631
192611
  }
191632
192612
  const ancestorSegments = firstSegments.slice(0, commonLength);
191633
- const ancestor = path21.sep + ancestorSegments.join(path21.sep);
191634
- return path21.relative(projectDir, ancestor) || ".";
192613
+ const ancestor = path22.sep + ancestorSegments.join(path22.sep);
192614
+ return path22.relative(projectDir, ancestor) || ".";
191635
192615
  }
191636
192616
  async function createProjectTarball(projectDir, context = ".") {
191637
- const contextDir = path21.resolve(projectDir, context);
191638
- const appPath = path21.relative(contextDir, projectDir) || ".";
192617
+ const contextDir = path22.resolve(projectDir, context);
192618
+ const appPath = path22.relative(contextDir, projectDir) || ".";
191639
192619
  writeLog("tarball", `Context: ${contextDir}, appPath: ${appPath}`);
191640
192620
  let tarball;
191641
192621
  if (isInsideGitRepository(contextDir)) {
@@ -192522,19 +193502,17 @@ ${errorMsg}`
192522
193502
  ), phase === "error" && /* @__PURE__ */ React7.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React7.createElement(Text7, { color: "red" }, "Error: ", error)), phase === "success" && /* @__PURE__ */ React7.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React7.createElement(Text7, { color: "green" }, "Deployment successful!"), deployment?.publicUrls && Object.keys(deployment.publicUrls).length > 0 && /* @__PURE__ */ React7.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React7.createElement(Text7, { bold: true }, "Public URLs:"), Object.entries(deployment.publicUrls).map(([name, url]) => /* @__PURE__ */ React7.createElement(Text7, { key: name }, " ", name, ": ", /* @__PURE__ */ React7.createElement(Text7, { color: "cyan" }, url))))));
192523
193503
  }
192524
193504
  async function deployCommand(environment, options2) {
192525
- const configPath = path22.join(process.cwd(), "specific.hcl");
192526
- if (!fs24.existsSync(configPath)) {
193505
+ const configPath = path23.join(process.cwd(), "specific.hcl");
193506
+ if (!fs25.existsSync(configPath)) {
192527
193507
  console.error("Error: No specific.hcl found in current directory");
192528
193508
  process.exit(1);
192529
193509
  }
192530
193510
  let config;
193511
+ const hcl = fs25.readFileSync(configPath, "utf-8");
192531
193512
  try {
192532
- const hcl = fs24.readFileSync(configPath, "utf-8");
192533
193513
  config = await parseConfig(hcl);
192534
193514
  } catch (err) {
192535
- console.error(
192536
- `Error: Invalid configuration: ${err instanceof Error ? err.message : String(err)}`
192537
- );
193515
+ console.error(formatConfigError(err, hcl, configPath));
192538
193516
  process.exit(1);
192539
193517
  }
192540
193518
  const env2 = environment || "prod";
@@ -192552,9 +193530,9 @@ async function deployCommand(environment, options2) {
192552
193530
  }
192553
193531
 
192554
193532
  // src/commands/exec.tsx
192555
- import { spawn as spawn6 } from "child_process";
192556
- import * as fs25 from "fs";
192557
- import * as path23 from "path";
193533
+ import { spawn as spawn7 } from "child_process";
193534
+ import * as fs26 from "fs";
193535
+ import * as path24 from "path";
192558
193536
  async function execCommand(serviceName, command, instanceKey = "default") {
192559
193537
  if (command.length === 0) {
192560
193538
  console.error(
@@ -192582,17 +193560,17 @@ async function execCommand(serviceName, command, instanceKey = "default") {
192582
193560
  }
192583
193561
  }
192584
193562
  };
192585
- const configPath = path23.join(process.cwd(), "specific.hcl");
192586
- if (!fs25.existsSync(configPath)) {
193563
+ const configPath = path24.join(process.cwd(), "specific.hcl");
193564
+ if (!fs26.existsSync(configPath)) {
192587
193565
  console.error("Error: No specific.hcl found in current directory");
192588
193566
  process.exit(1);
192589
193567
  }
192590
193568
  let config;
193569
+ const hcl = fs26.readFileSync(configPath, "utf-8");
192591
193570
  try {
192592
- const hcl = fs25.readFileSync(configPath, "utf-8");
192593
193571
  config = await parseConfig(hcl);
192594
193572
  } catch (err) {
192595
- console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
193573
+ console.error(formatConfigError(err, hcl, configPath));
192596
193574
  process.exit(1);
192597
193575
  }
192598
193576
  const service = config.services.find((s) => s.name === serviceName);
@@ -192660,7 +193638,8 @@ async function execCommand(serviceName, command, instanceKey = "default") {
192660
193638
  mode: "required",
192661
193639
  postgres: required.postgres,
192662
193640
  redis: required.redis,
192663
- storage: required.storage
193641
+ storage: required.storage,
193642
+ temporal: required.temporal
192664
193643
  },
192665
193644
  stateManager,
192666
193645
  dataDir: `.specific/keys/${instanceKey}/data`,
@@ -192705,14 +193684,14 @@ async function execCommand(serviceName, command, instanceKey = "default") {
192705
193684
  process.on("SIGTERM", () => handleSignal("SIGTERM"));
192706
193685
  let effectiveCwd = process.cwd();
192707
193686
  if (service.root) {
192708
- effectiveCwd = path23.resolve(process.cwd(), service.root);
193687
+ effectiveCwd = path24.resolve(process.cwd(), service.root);
192709
193688
  } else if (service.build) {
192710
193689
  const build = config.builds.find((b) => b.name === service.build.name);
192711
193690
  if (build?.root) {
192712
- effectiveCwd = path23.resolve(process.cwd(), build.root);
193691
+ effectiveCwd = path24.resolve(process.cwd(), build.root);
192713
193692
  }
192714
193693
  }
192715
- child = spawn6(command[0], command.slice(1), {
193694
+ child = spawn7(command[0], command.slice(1), {
192716
193695
  cwd: effectiveCwd,
192717
193696
  env: {
192718
193697
  ...process.env,
@@ -192736,9 +193715,9 @@ async function execCommand(serviceName, command, instanceKey = "default") {
192736
193715
  }
192737
193716
 
192738
193717
  // src/commands/psql.tsx
192739
- import { spawn as spawn7 } from "child_process";
192740
- import * as fs26 from "fs";
192741
- import * as path24 from "path";
193718
+ import { spawn as spawn8 } from "child_process";
193719
+ import * as fs27 from "fs";
193720
+ import * as path25 from "path";
192742
193721
  async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []) {
192743
193722
  let startedResources = [];
192744
193723
  let ownsInstances = false;
@@ -192755,17 +193734,17 @@ async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []
192755
193734
  }
192756
193735
  }
192757
193736
  };
192758
- const configPath = path24.join(process.cwd(), "specific.hcl");
192759
- if (!fs26.existsSync(configPath)) {
193737
+ const configPath = path25.join(process.cwd(), "specific.hcl");
193738
+ if (!fs27.existsSync(configPath)) {
192760
193739
  console.error("Error: No specific.hcl found in current directory");
192761
193740
  process.exit(1);
192762
193741
  }
192763
193742
  let config;
193743
+ const hcl = fs27.readFileSync(configPath, "utf-8");
192764
193744
  try {
192765
- const hcl = fs26.readFileSync(configPath, "utf-8");
192766
193745
  config = await parseConfig(hcl);
192767
193746
  } catch (err) {
192768
- console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
193747
+ console.error(formatConfigError(err, hcl, configPath));
192769
193748
  process.exit(1);
192770
193749
  }
192771
193750
  const availableDatabases = config.postgres.map((p) => p.name);
@@ -192814,7 +193793,8 @@ async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []
192814
193793
  mode: "required",
192815
193794
  postgres: [targetDb],
192816
193795
  redis: [],
192817
- storage: []
193796
+ storage: [],
193797
+ temporal: []
192818
193798
  },
192819
193799
  stateManager,
192820
193800
  dataDir: `.specific/keys/${instanceKey}/data`,
@@ -192858,7 +193838,7 @@ async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []
192858
193838
  };
192859
193839
  process.on("SIGINT", () => handleSignal("SIGINT"));
192860
193840
  process.on("SIGTERM", () => handleSignal("SIGTERM"));
192861
- child = spawn7(psqlPath, ["-h", dbState.host, "-p", String(dbState.port), "-U", dbState.user, "-d", dbState.dbName, ...extraArgs], {
193841
+ child = spawn8(psqlPath, ["-h", dbState.host, "-p", String(dbState.port), "-U", dbState.user, "-d", dbState.dbName, ...extraArgs], {
192862
193842
  cwd: process.cwd(),
192863
193843
  env: {
192864
193844
  ...process.env,
@@ -192883,9 +193863,9 @@ async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []
192883
193863
  }
192884
193864
 
192885
193865
  // src/commands/reshape.tsx
192886
- import { spawn as spawn8 } from "child_process";
192887
- import * as fs27 from "fs";
192888
- import * as path25 from "path";
193866
+ import { spawn as spawn9 } from "child_process";
193867
+ import * as fs28 from "fs";
193868
+ import * as path26 from "path";
192889
193869
  var VALID_ACTIONS = ["start", "complete", "status", "abort", "check"];
192890
193870
  var MIGRATION_SUBCOMMANDS = ["start", "complete", "abort"];
192891
193871
  var OFFLINE_ACTIONS = ["check"];
@@ -192897,13 +193877,13 @@ async function reshapeCommand(action, databaseName, instanceKey = "default") {
192897
193877
  process.exit(1);
192898
193878
  }
192899
193879
  const isOfflineAction = OFFLINE_ACTIONS.includes(action);
192900
- const configPath = path25.join(process.cwd(), "specific.hcl");
193880
+ const configPath = path26.join(process.cwd(), "specific.hcl");
192901
193881
  let config;
192902
193882
  let migrationsDir = "migrations";
192903
193883
  let targetDb;
192904
193884
  try {
192905
- if (fs27.existsSync(configPath)) {
192906
- const configContent = fs27.readFileSync(configPath, "utf-8");
193885
+ if (fs28.existsSync(configPath)) {
193886
+ const configContent = fs28.readFileSync(configPath, "utf-8");
192907
193887
  config = await parseConfig(configContent);
192908
193888
  if (databaseName) {
192909
193889
  const postgresConfig = config.postgres.find((p) => p.name === databaseName);
@@ -193007,7 +193987,8 @@ async function reshapeCommand(action, databaseName, instanceKey = "default") {
193007
193987
  mode: "required",
193008
193988
  postgres: [targetDb],
193009
193989
  redis: [],
193010
- storage: []
193990
+ storage: [],
193991
+ temporal: []
193011
193992
  },
193012
193993
  stateManager,
193013
193994
  dataDir: `.specific/keys/${instanceKey}/data`,
@@ -193036,9 +194017,9 @@ async function reshapeCommand(action, databaseName, instanceKey = "default") {
193036
194017
  }
193037
194018
  const isMigrationSubcommand = MIGRATION_SUBCOMMANDS.includes(action);
193038
194019
  const reshapeArgs = isMigrationSubcommand ? ["migration", action] : [action];
193039
- const fullMigrationsPath = path25.join(process.cwd(), migrationsDir);
194020
+ const fullMigrationsPath = path26.join(process.cwd(), migrationsDir);
193040
194021
  if (action === "check" || action === "start") {
193041
- if (fs27.existsSync(fullMigrationsPath)) {
194022
+ if (fs28.existsSync(fullMigrationsPath)) {
193042
194023
  reshapeArgs.push("--dirs", fullMigrationsPath);
193043
194024
  } else if (action === "check") {
193044
194025
  console.error(`Error: Migrations directory not found: ${fullMigrationsPath}`);
@@ -193060,7 +194041,7 @@ async function reshapeCommand(action, databaseName, instanceKey = "default") {
193060
194041
  };
193061
194042
  process.on("SIGINT", () => handleSignal("SIGINT"));
193062
194043
  process.on("SIGTERM", () => handleSignal("SIGTERM"));
193063
- child = spawn8(reshapePath, reshapeArgs, {
194044
+ child = spawn9(reshapePath, reshapeArgs, {
193064
194045
  cwd: process.cwd(),
193065
194046
  env: {
193066
194047
  ...process.env,
@@ -193088,21 +194069,21 @@ async function reshapeCommand(action, databaseName, instanceKey = "default") {
193088
194069
  import React8, { useState as useState7, useEffect as useEffect5 } from "react";
193089
194070
  import { render as render6, Text as Text8, Box as Box8 } from "ink";
193090
194071
  import Spinner6 from "ink-spinner";
193091
- import * as fs28 from "fs";
193092
- import * as path26 from "path";
194072
+ import * as fs29 from "fs";
194073
+ import * as path27 from "path";
193093
194074
  function CleanUI({ instanceKey }) {
193094
194075
  const [state, setState] = useState7({ status: "checking" });
193095
194076
  useEffect5(() => {
193096
194077
  async function clean() {
193097
194078
  const projectRoot = process.cwd();
193098
- const specificDir = path26.join(projectRoot, ".specific");
193099
- if (!fs28.existsSync(specificDir)) {
194079
+ const specificDir = path27.join(projectRoot, ".specific");
194080
+ if (!fs29.existsSync(specificDir)) {
193100
194081
  setState({ status: "nothing" });
193101
194082
  return;
193102
194083
  }
193103
194084
  if (instanceKey) {
193104
- const keyDir = path26.join(specificDir, "keys", instanceKey);
193105
- if (!fs28.existsSync(keyDir)) {
194085
+ const keyDir = path27.join(specificDir, "keys", instanceKey);
194086
+ if (!fs29.existsSync(keyDir)) {
193106
194087
  setState({ status: "nothing" });
193107
194088
  return;
193108
194089
  }
@@ -193118,7 +194099,7 @@ function CleanUI({ instanceKey }) {
193118
194099
  await stateManager.cleanStaleState();
193119
194100
  setState({ status: "cleaning" });
193120
194101
  try {
193121
- fs28.rmSync(keyDir, { recursive: true, force: true });
194102
+ fs29.rmSync(keyDir, { recursive: true, force: true });
193122
194103
  setState({ status: "success" });
193123
194104
  } catch (err) {
193124
194105
  setState({
@@ -193127,13 +194108,13 @@ function CleanUI({ instanceKey }) {
193127
194108
  });
193128
194109
  }
193129
194110
  } else {
193130
- const keysDir = path26.join(specificDir, "keys");
193131
- if (!fs28.existsSync(keysDir)) {
194111
+ const keysDir = path27.join(specificDir, "keys");
194112
+ if (!fs29.existsSync(keysDir)) {
193132
194113
  setState({ status: "nothing" });
193133
194114
  return;
193134
194115
  }
193135
- const keys = fs28.readdirSync(keysDir).filter(
193136
- (f) => fs28.statSync(path26.join(keysDir, f)).isDirectory()
194116
+ const keys = fs29.readdirSync(keysDir).filter(
194117
+ (f) => fs29.statSync(path27.join(keysDir, f)).isDirectory()
193137
194118
  );
193138
194119
  for (const key of keys) {
193139
194120
  const stateManager2 = new InstanceStateManager(projectRoot, key);
@@ -193157,7 +194138,7 @@ function CleanUI({ instanceKey }) {
193157
194138
  }
193158
194139
  setState({ status: "cleaning" });
193159
194140
  try {
193160
- fs28.rmSync(keysDir, { recursive: true, force: true });
194141
+ fs29.rmSync(keysDir, { recursive: true, force: true });
193161
194142
  setState({ status: "success" });
193162
194143
  } catch (err) {
193163
194144
  setState({
@@ -193320,7 +194301,7 @@ function betaCommand() {
193320
194301
  var program = new Command();
193321
194302
  var env = "production";
193322
194303
  var envLabel = env !== "production" ? `[${env.toUpperCase()}] ` : "";
193323
- program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.62").enablePositionalOptions();
194304
+ program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.64").enablePositionalOptions();
193324
194305
  program.command("init").description("Initialize project for use with a coding agent").option("--agent <name...>", "Agents to configure (cursor, claude, codex, other)").action((options2) => initCommand(options2));
193325
194306
  program.command("docs [topic]").description("Fetch LLM-optimized documentation").action(docsCommand);
193326
194307
  program.command("check").description("Validate specific.hcl configuration").action(checkCommand);