@base44-preview/cli 0.1.32-pr.662.e04bb64 → 0.1.32-pr.663.463d401

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.
package/dist/cli/index.js CHANGED
@@ -31177,7 +31177,7 @@ function cleanDoc(doc) {
31177
31177
  return mapDoc(doc, (currentDoc) => cleanDocFn(currentDoc));
31178
31178
  }
31179
31179
  function replaceEndOfLine(doc, replacement = literalline) {
31180
- return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ? join30(replacement, currentDoc.split(`
31180
+ return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ? join31(replacement, currentDoc.split(`
31181
31181
  `)) : currentDoc);
31182
31182
  }
31183
31183
  function canBreakFn(doc) {
@@ -31257,7 +31257,7 @@ function indentIfBreak(contents, options) {
31257
31257
  negate: options.negate
31258
31258
  };
31259
31259
  }
31260
- function join30(separator, docs) {
31260
+ function join31(separator, docs) {
31261
31261
  assertDoc(separator);
31262
31262
  assertDocArray(docs);
31263
31263
  const parts = [];
@@ -31968,7 +31968,7 @@ var init_doc = __esm(() => {
31968
31968
  MODE_FLAT = Symbol("MODE_FLAT");
31969
31969
  DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
31970
31970
  builders = {
31971
- join: join30,
31971
+ join: join31,
31972
31972
  line,
31973
31973
  softline,
31974
31974
  hardline,
@@ -119123,7 +119123,7 @@ import url22 from "url";
119123
119123
  function diffLines(oldStr, newStr, options8) {
119124
119124
  return lineDiff.diff(oldStr, newStr, options8);
119125
119125
  }
119126
- function tokenize(value, options8) {
119126
+ function tokenize2(value, options8) {
119127
119127
  if (options8.stripTrailingCr) {
119128
119128
  value = value.replace(/\r\n/g, `
119129
119129
  `);
@@ -120053,7 +120053,7 @@ function highlight(text) {
120053
120053
  for (const {
120054
120054
  type,
120055
120055
  value
120056
- } of tokenize2(text)) {
120056
+ } of tokenize22(text)) {
120057
120057
  if (type in defs) {
120058
120058
  highlighted += value.split(NEWLINE$1).map((str) => defs[type](str)).join(`
120059
120059
  `);
@@ -124581,7 +124581,7 @@ var require2, __filename2, __dirname3, __create2, __defProp3, __getOwnPropDesc2,
124581
124581
  return internalize({ "": root }, "", reviver);
124582
124582
  }
124583
124583
  return root;
124584
- }, lexState, buffer, doubleQuote, sign, c7, lexStates, parseStates, dist_default, import_picocolors4, import_js_tokens, nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-࢏ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚ౜ౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ೜-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲊᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-Ƛ꟱-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ", nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࢗ-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-᫝᫠-᫫ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‌‍‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・", nonASCIIidentifierStart, nonASCIIidentifier, reservedWords, keywords, reservedWordsStrictSet, reservedWordsStrictBindSet, compose = (f, g) => (v) => f(g(v)), defsOn, defsOff, sometimesKeywords, NEWLINE$1, BRACKET, tokenize2, NEWLINE, getOffsets = ({
124584
+ }, lexState, buffer, doubleQuote, sign, c7, lexStates, parseStates, dist_default, import_picocolors4, import_js_tokens, nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-࢏ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚ౜ౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ೜-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲊᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-Ƛ꟱-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ", nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࢗ-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-᫝᫠-᫫ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‌‍‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・", nonASCIIidentifierStart, nonASCIIidentifier, reservedWords, keywords, reservedWordsStrictSet, reservedWordsStrictBindSet, compose = (f, g) => (v) => f(g(v)), defsOn, defsOff, sometimesKeywords, NEWLINE$1, BRACKET, tokenize22, NEWLINE, getOffsets = ({
124585
124585
  oneBased,
124586
124586
  oneBasedLine = oneBased,
124587
124587
  oneBasedColumn = oneBased
@@ -124807,7 +124807,7 @@ var require2, __filename2, __dirname3, __create2, __defProp3, __getOwnPropDesc2,
124807
124807
  }
124808
124808
  }
124809
124809
  }, ast_path_default, is_object_default, skipWhitespace, skipSpaces, skipToLineEnd, skipEverythingButNewLine, isNewlineCharacter = (character) => character === `
124810
- ` || character === "\r" || character === "\u2028" || character === "\u2029", skip_newline_default, has_newline_default, is_non_empty_array_default, get_sorted_child_nodes_default, childNodesCache, returnFalse = () => false, isAllEmptyAndNoLineBreak = (text) => !/[\S\n\u2028\u2029]/u.test(text), is_previous_line_empty_default, breakParent2, hardline2, indent2, join32, line22, lineSuffix2, create_print_pre_check_function_default = () => noop_default2, core_options_evaluate_default, arrayToReversed, toReversed, method_to_reversed_default, import_n_readlines, get_interpreter_default, getFileBasename = (file) => {
124810
+ ` || character === "\r" || character === "\u2028" || character === "\u2029", skip_newline_default, has_newline_default, is_non_empty_array_default, get_sorted_child_nodes_default, childNodesCache, returnFalse = () => false, isAllEmptyAndNoLineBreak = (text) => !/[\S\n\u2028\u2029]/u.test(text), is_previous_line_empty_default, breakParent2, hardline2, indent2, join33, line22, lineSuffix2, create_print_pre_check_function_default = () => noop_default2, core_options_evaluate_default, arrayToReversed, toReversed, method_to_reversed_default, import_n_readlines, get_interpreter_default, getFileBasename = (file) => {
124811
124811
  try {
124812
124812
  return path112.basename(toPath3(file));
124813
124813
  } catch {
@@ -133471,7 +133471,7 @@ globstar while`, file, fr, pattern, pr, swallowee);
133471
133471
  LineDiff = class extends Diff {
133472
133472
  constructor() {
133473
133473
  super(...arguments);
133474
- this.tokenize = tokenize;
133474
+ this.tokenize = tokenize2;
133475
133475
  }
133476
133476
  equals(left, right, options8) {
133477
133477
  if (options8.ignoreWhitespace) {
@@ -134348,7 +134348,7 @@ globstar while`, file, fr, pattern, pr, swallowee);
134348
134348
  return "uncolored";
134349
134349
  }
134350
134350
  };
134351
- tokenize2 = function* (text) {
134351
+ tokenize22 = function* (text) {
134352
134352
  for (const token2 of (0, import_js_tokens.default)(text, {
134353
134353
  jsx: true
134354
134354
  })) {
@@ -134836,7 +134836,7 @@ ${codeblock}`, options8);
134836
134836
  breakParent: breakParent2,
134837
134837
  hardline: hardline2,
134838
134838
  indent: indent2,
134839
- join: join32,
134839
+ join: join33,
134840
134840
  line: line22,
134841
134841
  lineSuffix: lineSuffix2
134842
134842
  } = builders);
@@ -228838,7 +228838,7 @@ function normalizeBase44Env() {
228838
228838
  loadProjectEnvFiles();
228839
228839
 
228840
228840
  // src/cli/index.ts
228841
- import { dirname as dirname29, join as join40 } from "node:path";
228841
+ import { dirname as dirname29, join as join41 } from "node:path";
228842
228842
  import { fileURLToPath as fileURLToPath7 } from "node:url";
228843
228843
 
228844
228844
  // ../../node_modules/@clack/core/dist/index.mjs
@@ -239451,6 +239451,7 @@ var package_default = {
239451
239451
  jsonwebtoken: "^9.0.3",
239452
239452
  ky: "^1.14.2",
239453
239453
  lodash: "^4.17.23",
239454
+ minisearch: "7.1.2",
239454
239455
  ms: "^2.1.3",
239455
239456
  multer: "^2.0.0",
239456
239457
  nanoid: "^5.1.6",
@@ -247586,8 +247587,8 @@ function normalizeDatetime(value) {
247586
247587
  return `${value}Z`;
247587
247588
  }
247588
247589
  // src/cli/utils/json.ts
247589
- function toJsonStdout(result) {
247590
- return `${JSON.stringify(result, null, 2)}
247590
+ function toJsonStdout(result, options = {}) {
247591
+ return `${JSON.stringify(result, null, options.compact ? undefined : 2)}
247591
247592
  `;
247592
247593
  }
247593
247594
  // src/cli/errors.ts
@@ -248041,13 +248042,1767 @@ function getAgentsCommand() {
248041
248042
  return new Command2("agents").description("Manage project agents").addCommand(getAgentsPushCommand()).addCommand(getAgentsPullCommand());
248042
248043
  }
248043
248044
 
248045
+ // ../../node_modules/minisearch/dist/es/index.js
248046
+ var ENTRIES = "ENTRIES";
248047
+ var KEYS = "KEYS";
248048
+ var VALUES = "VALUES";
248049
+ var LEAF = "";
248050
+
248051
+ class TreeIterator {
248052
+ constructor(set, type) {
248053
+ const node = set._tree;
248054
+ const keys = Array.from(node.keys());
248055
+ this.set = set;
248056
+ this._type = type;
248057
+ this._path = keys.length > 0 ? [{ node, keys }] : [];
248058
+ }
248059
+ next() {
248060
+ const value = this.dive();
248061
+ this.backtrack();
248062
+ return value;
248063
+ }
248064
+ dive() {
248065
+ if (this._path.length === 0) {
248066
+ return { done: true, value: undefined };
248067
+ }
248068
+ const { node, keys } = last$1(this._path);
248069
+ if (last$1(keys) === LEAF) {
248070
+ return { done: false, value: this.result() };
248071
+ }
248072
+ const child = node.get(last$1(keys));
248073
+ this._path.push({ node: child, keys: Array.from(child.keys()) });
248074
+ return this.dive();
248075
+ }
248076
+ backtrack() {
248077
+ if (this._path.length === 0) {
248078
+ return;
248079
+ }
248080
+ const keys = last$1(this._path).keys;
248081
+ keys.pop();
248082
+ if (keys.length > 0) {
248083
+ return;
248084
+ }
248085
+ this._path.pop();
248086
+ this.backtrack();
248087
+ }
248088
+ key() {
248089
+ return this.set._prefix + this._path.map(({ keys }) => last$1(keys)).filter((key) => key !== LEAF).join("");
248090
+ }
248091
+ value() {
248092
+ return last$1(this._path).node.get(LEAF);
248093
+ }
248094
+ result() {
248095
+ switch (this._type) {
248096
+ case VALUES:
248097
+ return this.value();
248098
+ case KEYS:
248099
+ return this.key();
248100
+ default:
248101
+ return [this.key(), this.value()];
248102
+ }
248103
+ }
248104
+ [Symbol.iterator]() {
248105
+ return this;
248106
+ }
248107
+ }
248108
+ var last$1 = (array) => {
248109
+ return array[array.length - 1];
248110
+ };
248111
+ var fuzzySearch = (node, query, maxDistance) => {
248112
+ const results = new Map;
248113
+ if (query === undefined)
248114
+ return results;
248115
+ const n = query.length + 1;
248116
+ const m = n + maxDistance;
248117
+ const matrix = new Uint8Array(m * n).fill(maxDistance + 1);
248118
+ for (let j = 0;j < n; ++j)
248119
+ matrix[j] = j;
248120
+ for (let i = 1;i < m; ++i)
248121
+ matrix[i * n] = i;
248122
+ recurse(node, query, maxDistance, results, matrix, 1, n, "");
248123
+ return results;
248124
+ };
248125
+ var recurse = (node, query, maxDistance, results, matrix, m, n, prefix) => {
248126
+ const offset = m * n;
248127
+ key:
248128
+ for (const key of node.keys()) {
248129
+ if (key === LEAF) {
248130
+ const distance = matrix[offset - 1];
248131
+ if (distance <= maxDistance) {
248132
+ results.set(prefix, [node.get(key), distance]);
248133
+ }
248134
+ } else {
248135
+ let i = m;
248136
+ for (let pos = 0;pos < key.length; ++pos, ++i) {
248137
+ const char = key[pos];
248138
+ const thisRowOffset = n * i;
248139
+ const prevRowOffset = thisRowOffset - n;
248140
+ let minDistance = matrix[thisRowOffset];
248141
+ const jmin = Math.max(0, i - maxDistance - 1);
248142
+ const jmax = Math.min(n - 1, i + maxDistance);
248143
+ for (let j = jmin;j < jmax; ++j) {
248144
+ const different = char !== query[j];
248145
+ const rpl = matrix[prevRowOffset + j] + +different;
248146
+ const del = matrix[prevRowOffset + j + 1] + 1;
248147
+ const ins = matrix[thisRowOffset + j] + 1;
248148
+ const dist = matrix[thisRowOffset + j + 1] = Math.min(rpl, del, ins);
248149
+ if (dist < minDistance)
248150
+ minDistance = dist;
248151
+ }
248152
+ if (minDistance > maxDistance) {
248153
+ continue key;
248154
+ }
248155
+ }
248156
+ recurse(node.get(key), query, maxDistance, results, matrix, i, n, prefix + key);
248157
+ }
248158
+ }
248159
+ };
248160
+
248161
+ class SearchableMap {
248162
+ constructor(tree = new Map, prefix = "") {
248163
+ this._size = undefined;
248164
+ this._tree = tree;
248165
+ this._prefix = prefix;
248166
+ }
248167
+ atPrefix(prefix) {
248168
+ if (!prefix.startsWith(this._prefix)) {
248169
+ throw new Error("Mismatched prefix");
248170
+ }
248171
+ const [node, path] = trackDown(this._tree, prefix.slice(this._prefix.length));
248172
+ if (node === undefined) {
248173
+ const [parentNode, key] = last(path);
248174
+ for (const k of parentNode.keys()) {
248175
+ if (k !== LEAF && k.startsWith(key)) {
248176
+ const node = new Map;
248177
+ node.set(k.slice(key.length), parentNode.get(k));
248178
+ return new SearchableMap(node, prefix);
248179
+ }
248180
+ }
248181
+ }
248182
+ return new SearchableMap(node, prefix);
248183
+ }
248184
+ clear() {
248185
+ this._size = undefined;
248186
+ this._tree.clear();
248187
+ }
248188
+ delete(key) {
248189
+ this._size = undefined;
248190
+ return remove(this._tree, key);
248191
+ }
248192
+ entries() {
248193
+ return new TreeIterator(this, ENTRIES);
248194
+ }
248195
+ forEach(fn) {
248196
+ for (const [key, value] of this) {
248197
+ fn(key, value, this);
248198
+ }
248199
+ }
248200
+ fuzzyGet(key, maxEditDistance) {
248201
+ return fuzzySearch(this._tree, key, maxEditDistance);
248202
+ }
248203
+ get(key) {
248204
+ const node = lookup(this._tree, key);
248205
+ return node !== undefined ? node.get(LEAF) : undefined;
248206
+ }
248207
+ has(key) {
248208
+ const node = lookup(this._tree, key);
248209
+ return node !== undefined && node.has(LEAF);
248210
+ }
248211
+ keys() {
248212
+ return new TreeIterator(this, KEYS);
248213
+ }
248214
+ set(key, value) {
248215
+ if (typeof key !== "string") {
248216
+ throw new Error("key must be a string");
248217
+ }
248218
+ this._size = undefined;
248219
+ const node = createPath(this._tree, key);
248220
+ node.set(LEAF, value);
248221
+ return this;
248222
+ }
248223
+ get size() {
248224
+ if (this._size) {
248225
+ return this._size;
248226
+ }
248227
+ this._size = 0;
248228
+ const iter = this.entries();
248229
+ while (!iter.next().done)
248230
+ this._size += 1;
248231
+ return this._size;
248232
+ }
248233
+ update(key, fn) {
248234
+ if (typeof key !== "string") {
248235
+ throw new Error("key must be a string");
248236
+ }
248237
+ this._size = undefined;
248238
+ const node = createPath(this._tree, key);
248239
+ node.set(LEAF, fn(node.get(LEAF)));
248240
+ return this;
248241
+ }
248242
+ fetch(key, initial) {
248243
+ if (typeof key !== "string") {
248244
+ throw new Error("key must be a string");
248245
+ }
248246
+ this._size = undefined;
248247
+ const node = createPath(this._tree, key);
248248
+ let value = node.get(LEAF);
248249
+ if (value === undefined) {
248250
+ node.set(LEAF, value = initial());
248251
+ }
248252
+ return value;
248253
+ }
248254
+ values() {
248255
+ return new TreeIterator(this, VALUES);
248256
+ }
248257
+ [Symbol.iterator]() {
248258
+ return this.entries();
248259
+ }
248260
+ static from(entries) {
248261
+ const tree = new SearchableMap;
248262
+ for (const [key, value] of entries) {
248263
+ tree.set(key, value);
248264
+ }
248265
+ return tree;
248266
+ }
248267
+ static fromObject(object) {
248268
+ return SearchableMap.from(Object.entries(object));
248269
+ }
248270
+ }
248271
+ var trackDown = (tree, key, path = []) => {
248272
+ if (key.length === 0 || tree == null) {
248273
+ return [tree, path];
248274
+ }
248275
+ for (const k of tree.keys()) {
248276
+ if (k !== LEAF && key.startsWith(k)) {
248277
+ path.push([tree, k]);
248278
+ return trackDown(tree.get(k), key.slice(k.length), path);
248279
+ }
248280
+ }
248281
+ path.push([tree, key]);
248282
+ return trackDown(undefined, "", path);
248283
+ };
248284
+ var lookup = (tree, key) => {
248285
+ if (key.length === 0 || tree == null) {
248286
+ return tree;
248287
+ }
248288
+ for (const k of tree.keys()) {
248289
+ if (k !== LEAF && key.startsWith(k)) {
248290
+ return lookup(tree.get(k), key.slice(k.length));
248291
+ }
248292
+ }
248293
+ };
248294
+ var createPath = (node, key) => {
248295
+ const keyLength = key.length;
248296
+ outer:
248297
+ for (let pos = 0;node && pos < keyLength; ) {
248298
+ for (const k of node.keys()) {
248299
+ if (k !== LEAF && key[pos] === k[0]) {
248300
+ const len = Math.min(keyLength - pos, k.length);
248301
+ let offset = 1;
248302
+ while (offset < len && key[pos + offset] === k[offset])
248303
+ ++offset;
248304
+ const child = node.get(k);
248305
+ if (offset === k.length) {
248306
+ node = child;
248307
+ } else {
248308
+ const intermediate = new Map;
248309
+ intermediate.set(k.slice(offset), child);
248310
+ node.set(key.slice(pos, pos + offset), intermediate);
248311
+ node.delete(k);
248312
+ node = intermediate;
248313
+ }
248314
+ pos += offset;
248315
+ continue outer;
248316
+ }
248317
+ }
248318
+ const child = new Map;
248319
+ node.set(key.slice(pos), child);
248320
+ return child;
248321
+ }
248322
+ return node;
248323
+ };
248324
+ var remove = (tree, key) => {
248325
+ const [node, path] = trackDown(tree, key);
248326
+ if (node === undefined) {
248327
+ return;
248328
+ }
248329
+ node.delete(LEAF);
248330
+ if (node.size === 0) {
248331
+ cleanup(path);
248332
+ } else if (node.size === 1) {
248333
+ const [key, value] = node.entries().next().value;
248334
+ merge3(path, key, value);
248335
+ }
248336
+ };
248337
+ var cleanup = (path) => {
248338
+ if (path.length === 0) {
248339
+ return;
248340
+ }
248341
+ const [node, key] = last(path);
248342
+ node.delete(key);
248343
+ if (node.size === 0) {
248344
+ cleanup(path.slice(0, -1));
248345
+ } else if (node.size === 1) {
248346
+ const [key, value] = node.entries().next().value;
248347
+ if (key !== LEAF) {
248348
+ merge3(path.slice(0, -1), key, value);
248349
+ }
248350
+ }
248351
+ };
248352
+ var merge3 = (path, key, value) => {
248353
+ if (path.length === 0) {
248354
+ return;
248355
+ }
248356
+ const [node, nodeKey] = last(path);
248357
+ node.set(nodeKey + key, value);
248358
+ node.delete(nodeKey);
248359
+ };
248360
+ var last = (array) => {
248361
+ return array[array.length - 1];
248362
+ };
248363
+ var OR = "or";
248364
+ var AND = "and";
248365
+ var AND_NOT = "and_not";
248366
+
248367
+ class MiniSearch {
248368
+ constructor(options) {
248369
+ if ((options === null || options === undefined ? undefined : options.fields) == null) {
248370
+ throw new Error('MiniSearch: option "fields" must be provided');
248371
+ }
248372
+ const autoVacuum = options.autoVacuum == null || options.autoVacuum === true ? defaultAutoVacuumOptions : options.autoVacuum;
248373
+ this._options = {
248374
+ ...defaultOptions,
248375
+ ...options,
248376
+ autoVacuum,
248377
+ searchOptions: { ...defaultSearchOptions, ...options.searchOptions || {} },
248378
+ autoSuggestOptions: { ...defaultAutoSuggestOptions, ...options.autoSuggestOptions || {} }
248379
+ };
248380
+ this._index = new SearchableMap;
248381
+ this._documentCount = 0;
248382
+ this._documentIds = new Map;
248383
+ this._idToShortId = new Map;
248384
+ this._fieldIds = {};
248385
+ this._fieldLength = new Map;
248386
+ this._avgFieldLength = [];
248387
+ this._nextId = 0;
248388
+ this._storedFields = new Map;
248389
+ this._dirtCount = 0;
248390
+ this._currentVacuum = null;
248391
+ this._enqueuedVacuum = null;
248392
+ this._enqueuedVacuumConditions = defaultVacuumConditions;
248393
+ this.addFields(this._options.fields);
248394
+ }
248395
+ add(document2) {
248396
+ const { extractField, tokenize, processTerm, fields, idField } = this._options;
248397
+ const id = extractField(document2, idField);
248398
+ if (id == null) {
248399
+ throw new Error(`MiniSearch: document does not have ID field "${idField}"`);
248400
+ }
248401
+ if (this._idToShortId.has(id)) {
248402
+ throw new Error(`MiniSearch: duplicate ID ${id}`);
248403
+ }
248404
+ const shortDocumentId = this.addDocumentId(id);
248405
+ this.saveStoredFields(shortDocumentId, document2);
248406
+ for (const field of fields) {
248407
+ const fieldValue = extractField(document2, field);
248408
+ if (fieldValue == null)
248409
+ continue;
248410
+ const tokens = tokenize(fieldValue.toString(), field);
248411
+ const fieldId = this._fieldIds[field];
248412
+ const uniqueTerms = new Set(tokens).size;
248413
+ this.addFieldLength(shortDocumentId, fieldId, this._documentCount - 1, uniqueTerms);
248414
+ for (const term of tokens) {
248415
+ const processedTerm = processTerm(term, field);
248416
+ if (Array.isArray(processedTerm)) {
248417
+ for (const t of processedTerm) {
248418
+ this.addTerm(fieldId, shortDocumentId, t);
248419
+ }
248420
+ } else if (processedTerm) {
248421
+ this.addTerm(fieldId, shortDocumentId, processedTerm);
248422
+ }
248423
+ }
248424
+ }
248425
+ }
248426
+ addAll(documents) {
248427
+ for (const document2 of documents)
248428
+ this.add(document2);
248429
+ }
248430
+ addAllAsync(documents, options = {}) {
248431
+ const { chunkSize = 10 } = options;
248432
+ const acc = { chunk: [], promise: Promise.resolve() };
248433
+ const { chunk, promise } = documents.reduce(({ chunk, promise }, document2, i) => {
248434
+ chunk.push(document2);
248435
+ if ((i + 1) % chunkSize === 0) {
248436
+ return {
248437
+ chunk: [],
248438
+ promise: promise.then(() => new Promise((resolve) => setTimeout(resolve, 0))).then(() => this.addAll(chunk))
248439
+ };
248440
+ } else {
248441
+ return { chunk, promise };
248442
+ }
248443
+ }, acc);
248444
+ return promise.then(() => this.addAll(chunk));
248445
+ }
248446
+ remove(document2) {
248447
+ const { tokenize, processTerm, extractField, fields, idField } = this._options;
248448
+ const id = extractField(document2, idField);
248449
+ if (id == null) {
248450
+ throw new Error(`MiniSearch: document does not have ID field "${idField}"`);
248451
+ }
248452
+ const shortId = this._idToShortId.get(id);
248453
+ if (shortId == null) {
248454
+ throw new Error(`MiniSearch: cannot remove document with ID ${id}: it is not in the index`);
248455
+ }
248456
+ for (const field of fields) {
248457
+ const fieldValue = extractField(document2, field);
248458
+ if (fieldValue == null)
248459
+ continue;
248460
+ const tokens = tokenize(fieldValue.toString(), field);
248461
+ const fieldId = this._fieldIds[field];
248462
+ const uniqueTerms = new Set(tokens).size;
248463
+ this.removeFieldLength(shortId, fieldId, this._documentCount, uniqueTerms);
248464
+ for (const term of tokens) {
248465
+ const processedTerm = processTerm(term, field);
248466
+ if (Array.isArray(processedTerm)) {
248467
+ for (const t of processedTerm) {
248468
+ this.removeTerm(fieldId, shortId, t);
248469
+ }
248470
+ } else if (processedTerm) {
248471
+ this.removeTerm(fieldId, shortId, processedTerm);
248472
+ }
248473
+ }
248474
+ }
248475
+ this._storedFields.delete(shortId);
248476
+ this._documentIds.delete(shortId);
248477
+ this._idToShortId.delete(id);
248478
+ this._fieldLength.delete(shortId);
248479
+ this._documentCount -= 1;
248480
+ }
248481
+ removeAll(documents) {
248482
+ if (documents) {
248483
+ for (const document2 of documents)
248484
+ this.remove(document2);
248485
+ } else if (arguments.length > 0) {
248486
+ throw new Error("Expected documents to be present. Omit the argument to remove all documents.");
248487
+ } else {
248488
+ this._index = new SearchableMap;
248489
+ this._documentCount = 0;
248490
+ this._documentIds = new Map;
248491
+ this._idToShortId = new Map;
248492
+ this._fieldLength = new Map;
248493
+ this._avgFieldLength = [];
248494
+ this._storedFields = new Map;
248495
+ this._nextId = 0;
248496
+ }
248497
+ }
248498
+ discard(id) {
248499
+ const shortId = this._idToShortId.get(id);
248500
+ if (shortId == null) {
248501
+ throw new Error(`MiniSearch: cannot discard document with ID ${id}: it is not in the index`);
248502
+ }
248503
+ this._idToShortId.delete(id);
248504
+ this._documentIds.delete(shortId);
248505
+ this._storedFields.delete(shortId);
248506
+ (this._fieldLength.get(shortId) || []).forEach((fieldLength, fieldId) => {
248507
+ this.removeFieldLength(shortId, fieldId, this._documentCount, fieldLength);
248508
+ });
248509
+ this._fieldLength.delete(shortId);
248510
+ this._documentCount -= 1;
248511
+ this._dirtCount += 1;
248512
+ this.maybeAutoVacuum();
248513
+ }
248514
+ maybeAutoVacuum() {
248515
+ if (this._options.autoVacuum === false) {
248516
+ return;
248517
+ }
248518
+ const { minDirtFactor, minDirtCount, batchSize, batchWait } = this._options.autoVacuum;
248519
+ this.conditionalVacuum({ batchSize, batchWait }, { minDirtCount, minDirtFactor });
248520
+ }
248521
+ discardAll(ids) {
248522
+ const autoVacuum = this._options.autoVacuum;
248523
+ try {
248524
+ this._options.autoVacuum = false;
248525
+ for (const id of ids) {
248526
+ this.discard(id);
248527
+ }
248528
+ } finally {
248529
+ this._options.autoVacuum = autoVacuum;
248530
+ }
248531
+ this.maybeAutoVacuum();
248532
+ }
248533
+ replace(updatedDocument) {
248534
+ const { idField, extractField } = this._options;
248535
+ const id = extractField(updatedDocument, idField);
248536
+ this.discard(id);
248537
+ this.add(updatedDocument);
248538
+ }
248539
+ vacuum(options = {}) {
248540
+ return this.conditionalVacuum(options);
248541
+ }
248542
+ conditionalVacuum(options, conditions) {
248543
+ if (this._currentVacuum) {
248544
+ this._enqueuedVacuumConditions = this._enqueuedVacuumConditions && conditions;
248545
+ if (this._enqueuedVacuum != null) {
248546
+ return this._enqueuedVacuum;
248547
+ }
248548
+ this._enqueuedVacuum = this._currentVacuum.then(() => {
248549
+ const conditions = this._enqueuedVacuumConditions;
248550
+ this._enqueuedVacuumConditions = defaultVacuumConditions;
248551
+ return this.performVacuuming(options, conditions);
248552
+ });
248553
+ return this._enqueuedVacuum;
248554
+ }
248555
+ if (this.vacuumConditionsMet(conditions) === false) {
248556
+ return Promise.resolve();
248557
+ }
248558
+ this._currentVacuum = this.performVacuuming(options);
248559
+ return this._currentVacuum;
248560
+ }
248561
+ async performVacuuming(options, conditions) {
248562
+ const initialDirtCount = this._dirtCount;
248563
+ if (this.vacuumConditionsMet(conditions)) {
248564
+ const batchSize = options.batchSize || defaultVacuumOptions.batchSize;
248565
+ const batchWait = options.batchWait || defaultVacuumOptions.batchWait;
248566
+ let i = 1;
248567
+ for (const [term, fieldsData] of this._index) {
248568
+ for (const [fieldId, fieldIndex] of fieldsData) {
248569
+ for (const [shortId] of fieldIndex) {
248570
+ if (this._documentIds.has(shortId)) {
248571
+ continue;
248572
+ }
248573
+ if (fieldIndex.size <= 1) {
248574
+ fieldsData.delete(fieldId);
248575
+ } else {
248576
+ fieldIndex.delete(shortId);
248577
+ }
248578
+ }
248579
+ }
248580
+ if (this._index.get(term).size === 0) {
248581
+ this._index.delete(term);
248582
+ }
248583
+ if (i % batchSize === 0) {
248584
+ await new Promise((resolve) => setTimeout(resolve, batchWait));
248585
+ }
248586
+ i += 1;
248587
+ }
248588
+ this._dirtCount -= initialDirtCount;
248589
+ }
248590
+ await null;
248591
+ this._currentVacuum = this._enqueuedVacuum;
248592
+ this._enqueuedVacuum = null;
248593
+ }
248594
+ vacuumConditionsMet(conditions) {
248595
+ if (conditions == null) {
248596
+ return true;
248597
+ }
248598
+ let { minDirtCount, minDirtFactor } = conditions;
248599
+ minDirtCount = minDirtCount || defaultAutoVacuumOptions.minDirtCount;
248600
+ minDirtFactor = minDirtFactor || defaultAutoVacuumOptions.minDirtFactor;
248601
+ return this.dirtCount >= minDirtCount && this.dirtFactor >= minDirtFactor;
248602
+ }
248603
+ get isVacuuming() {
248604
+ return this._currentVacuum != null;
248605
+ }
248606
+ get dirtCount() {
248607
+ return this._dirtCount;
248608
+ }
248609
+ get dirtFactor() {
248610
+ return this._dirtCount / (1 + this._documentCount + this._dirtCount);
248611
+ }
248612
+ has(id) {
248613
+ return this._idToShortId.has(id);
248614
+ }
248615
+ getStoredFields(id) {
248616
+ const shortId = this._idToShortId.get(id);
248617
+ if (shortId == null) {
248618
+ return;
248619
+ }
248620
+ return this._storedFields.get(shortId);
248621
+ }
248622
+ search(query, searchOptions = {}) {
248623
+ const { searchOptions: globalSearchOptions } = this._options;
248624
+ const searchOptionsWithDefaults = { ...globalSearchOptions, ...searchOptions };
248625
+ const rawResults = this.executeQuery(query, searchOptions);
248626
+ const results = [];
248627
+ for (const [docId, { score, terms, match }] of rawResults) {
248628
+ const quality = terms.length || 1;
248629
+ const result = {
248630
+ id: this._documentIds.get(docId),
248631
+ score: score * quality,
248632
+ terms: Object.keys(match),
248633
+ queryTerms: terms,
248634
+ match
248635
+ };
248636
+ Object.assign(result, this._storedFields.get(docId));
248637
+ if (searchOptionsWithDefaults.filter == null || searchOptionsWithDefaults.filter(result)) {
248638
+ results.push(result);
248639
+ }
248640
+ }
248641
+ if (query === MiniSearch.wildcard && searchOptionsWithDefaults.boostDocument == null) {
248642
+ return results;
248643
+ }
248644
+ results.sort(byScore);
248645
+ return results;
248646
+ }
248647
+ autoSuggest(queryString, options = {}) {
248648
+ options = { ...this._options.autoSuggestOptions, ...options };
248649
+ const suggestions = new Map;
248650
+ for (const { score, terms } of this.search(queryString, options)) {
248651
+ const phrase = terms.join(" ");
248652
+ const suggestion = suggestions.get(phrase);
248653
+ if (suggestion != null) {
248654
+ suggestion.score += score;
248655
+ suggestion.count += 1;
248656
+ } else {
248657
+ suggestions.set(phrase, { score, terms, count: 1 });
248658
+ }
248659
+ }
248660
+ const results = [];
248661
+ for (const [suggestion, { score, terms, count }] of suggestions) {
248662
+ results.push({ suggestion, terms, score: score / count });
248663
+ }
248664
+ results.sort(byScore);
248665
+ return results;
248666
+ }
248667
+ get documentCount() {
248668
+ return this._documentCount;
248669
+ }
248670
+ get termCount() {
248671
+ return this._index.size;
248672
+ }
248673
+ static loadJSON(json, options) {
248674
+ if (options == null) {
248675
+ throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");
248676
+ }
248677
+ return this.loadJS(JSON.parse(json), options);
248678
+ }
248679
+ static async loadJSONAsync(json, options) {
248680
+ if (options == null) {
248681
+ throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");
248682
+ }
248683
+ return this.loadJSAsync(JSON.parse(json), options);
248684
+ }
248685
+ static getDefault(optionName) {
248686
+ if (defaultOptions.hasOwnProperty(optionName)) {
248687
+ return getOwnProperty(defaultOptions, optionName);
248688
+ } else {
248689
+ throw new Error(`MiniSearch: unknown option "${optionName}"`);
248690
+ }
248691
+ }
248692
+ static loadJS(js, options) {
248693
+ const { index, documentIds, fieldLength, storedFields, serializationVersion } = js;
248694
+ const miniSearch = this.instantiateMiniSearch(js, options);
248695
+ miniSearch._documentIds = objectToNumericMap(documentIds);
248696
+ miniSearch._fieldLength = objectToNumericMap(fieldLength);
248697
+ miniSearch._storedFields = objectToNumericMap(storedFields);
248698
+ for (const [shortId, id] of miniSearch._documentIds) {
248699
+ miniSearch._idToShortId.set(id, shortId);
248700
+ }
248701
+ for (const [term, data] of index) {
248702
+ const dataMap = new Map;
248703
+ for (const fieldId of Object.keys(data)) {
248704
+ let indexEntry = data[fieldId];
248705
+ if (serializationVersion === 1) {
248706
+ indexEntry = indexEntry.ds;
248707
+ }
248708
+ dataMap.set(parseInt(fieldId, 10), objectToNumericMap(indexEntry));
248709
+ }
248710
+ miniSearch._index.set(term, dataMap);
248711
+ }
248712
+ return miniSearch;
248713
+ }
248714
+ static async loadJSAsync(js, options) {
248715
+ const { index, documentIds, fieldLength, storedFields, serializationVersion } = js;
248716
+ const miniSearch = this.instantiateMiniSearch(js, options);
248717
+ miniSearch._documentIds = await objectToNumericMapAsync(documentIds);
248718
+ miniSearch._fieldLength = await objectToNumericMapAsync(fieldLength);
248719
+ miniSearch._storedFields = await objectToNumericMapAsync(storedFields);
248720
+ for (const [shortId, id] of miniSearch._documentIds) {
248721
+ miniSearch._idToShortId.set(id, shortId);
248722
+ }
248723
+ let count = 0;
248724
+ for (const [term, data] of index) {
248725
+ const dataMap = new Map;
248726
+ for (const fieldId of Object.keys(data)) {
248727
+ let indexEntry = data[fieldId];
248728
+ if (serializationVersion === 1) {
248729
+ indexEntry = indexEntry.ds;
248730
+ }
248731
+ dataMap.set(parseInt(fieldId, 10), await objectToNumericMapAsync(indexEntry));
248732
+ }
248733
+ if (++count % 1000 === 0)
248734
+ await wait(0);
248735
+ miniSearch._index.set(term, dataMap);
248736
+ }
248737
+ return miniSearch;
248738
+ }
248739
+ static instantiateMiniSearch(js, options) {
248740
+ const { documentCount, nextId, fieldIds, averageFieldLength, dirtCount, serializationVersion } = js;
248741
+ if (serializationVersion !== 1 && serializationVersion !== 2) {
248742
+ throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");
248743
+ }
248744
+ const miniSearch = new MiniSearch(options);
248745
+ miniSearch._documentCount = documentCount;
248746
+ miniSearch._nextId = nextId;
248747
+ miniSearch._idToShortId = new Map;
248748
+ miniSearch._fieldIds = fieldIds;
248749
+ miniSearch._avgFieldLength = averageFieldLength;
248750
+ miniSearch._dirtCount = dirtCount || 0;
248751
+ miniSearch._index = new SearchableMap;
248752
+ return miniSearch;
248753
+ }
248754
+ executeQuery(query, searchOptions = {}) {
248755
+ if (query === MiniSearch.wildcard) {
248756
+ return this.executeWildcardQuery(searchOptions);
248757
+ }
248758
+ if (typeof query !== "string") {
248759
+ const options = { ...searchOptions, ...query, queries: undefined };
248760
+ const results = query.queries.map((subquery) => this.executeQuery(subquery, options));
248761
+ return this.combineResults(results, options.combineWith);
248762
+ }
248763
+ const { tokenize, processTerm, searchOptions: globalSearchOptions } = this._options;
248764
+ const options = { tokenize, processTerm, ...globalSearchOptions, ...searchOptions };
248765
+ const { tokenize: searchTokenize, processTerm: searchProcessTerm } = options;
248766
+ const terms = searchTokenize(query).flatMap((term) => searchProcessTerm(term)).filter((term) => !!term);
248767
+ const queries = terms.map(termToQuerySpec(options));
248768
+ const results = queries.map((query) => this.executeQuerySpec(query, options));
248769
+ return this.combineResults(results, options.combineWith);
248770
+ }
248771
+ executeQuerySpec(query, searchOptions) {
248772
+ const options = { ...this._options.searchOptions, ...searchOptions };
248773
+ const boosts = (options.fields || this._options.fields).reduce((boosts, field) => ({ ...boosts, [field]: getOwnProperty(options.boost, field) || 1 }), {});
248774
+ const { boostDocument, weights, maxFuzzy, bm25: bm25params } = options;
248775
+ const { fuzzy: fuzzyWeight, prefix: prefixWeight } = { ...defaultSearchOptions.weights, ...weights };
248776
+ const data = this._index.get(query.term);
248777
+ const results = this.termResults(query.term, query.term, 1, query.termBoost, data, boosts, boostDocument, bm25params);
248778
+ let prefixMatches;
248779
+ let fuzzyMatches;
248780
+ if (query.prefix) {
248781
+ prefixMatches = this._index.atPrefix(query.term);
248782
+ }
248783
+ if (query.fuzzy) {
248784
+ const fuzzy = query.fuzzy === true ? 0.2 : query.fuzzy;
248785
+ const maxDistance = fuzzy < 1 ? Math.min(maxFuzzy, Math.round(query.term.length * fuzzy)) : fuzzy;
248786
+ if (maxDistance)
248787
+ fuzzyMatches = this._index.fuzzyGet(query.term, maxDistance);
248788
+ }
248789
+ if (prefixMatches) {
248790
+ for (const [term, data] of prefixMatches) {
248791
+ const distance = term.length - query.term.length;
248792
+ if (!distance) {
248793
+ continue;
248794
+ }
248795
+ fuzzyMatches === null || fuzzyMatches === undefined || fuzzyMatches.delete(term);
248796
+ const weight = prefixWeight * term.length / (term.length + 0.3 * distance);
248797
+ this.termResults(query.term, term, weight, query.termBoost, data, boosts, boostDocument, bm25params, results);
248798
+ }
248799
+ }
248800
+ if (fuzzyMatches) {
248801
+ for (const term of fuzzyMatches.keys()) {
248802
+ const [data, distance] = fuzzyMatches.get(term);
248803
+ if (!distance) {
248804
+ continue;
248805
+ }
248806
+ const weight = fuzzyWeight * term.length / (term.length + distance);
248807
+ this.termResults(query.term, term, weight, query.termBoost, data, boosts, boostDocument, bm25params, results);
248808
+ }
248809
+ }
248810
+ return results;
248811
+ }
248812
+ executeWildcardQuery(searchOptions) {
248813
+ const results = new Map;
248814
+ const options = { ...this._options.searchOptions, ...searchOptions };
248815
+ for (const [shortId, id] of this._documentIds) {
248816
+ const score = options.boostDocument ? options.boostDocument(id, "", this._storedFields.get(shortId)) : 1;
248817
+ results.set(shortId, {
248818
+ score,
248819
+ terms: [],
248820
+ match: {}
248821
+ });
248822
+ }
248823
+ return results;
248824
+ }
248825
+ combineResults(results, combineWith = OR) {
248826
+ if (results.length === 0) {
248827
+ return new Map;
248828
+ }
248829
+ const operator = combineWith.toLowerCase();
248830
+ const combinator = combinators[operator];
248831
+ if (!combinator) {
248832
+ throw new Error(`Invalid combination operator: ${combineWith}`);
248833
+ }
248834
+ return results.reduce(combinator) || new Map;
248835
+ }
248836
+ toJSON() {
248837
+ const index = [];
248838
+ for (const [term, fieldIndex] of this._index) {
248839
+ const data = {};
248840
+ for (const [fieldId, freqs] of fieldIndex) {
248841
+ data[fieldId] = Object.fromEntries(freqs);
248842
+ }
248843
+ index.push([term, data]);
248844
+ }
248845
+ return {
248846
+ documentCount: this._documentCount,
248847
+ nextId: this._nextId,
248848
+ documentIds: Object.fromEntries(this._documentIds),
248849
+ fieldIds: this._fieldIds,
248850
+ fieldLength: Object.fromEntries(this._fieldLength),
248851
+ averageFieldLength: this._avgFieldLength,
248852
+ storedFields: Object.fromEntries(this._storedFields),
248853
+ dirtCount: this._dirtCount,
248854
+ index,
248855
+ serializationVersion: 2
248856
+ };
248857
+ }
248858
+ termResults(sourceTerm, derivedTerm, termWeight, termBoost, fieldTermData, fieldBoosts, boostDocumentFn, bm25params, results = new Map) {
248859
+ if (fieldTermData == null)
248860
+ return results;
248861
+ for (const field of Object.keys(fieldBoosts)) {
248862
+ const fieldBoost = fieldBoosts[field];
248863
+ const fieldId = this._fieldIds[field];
248864
+ const fieldTermFreqs = fieldTermData.get(fieldId);
248865
+ if (fieldTermFreqs == null)
248866
+ continue;
248867
+ let matchingFields = fieldTermFreqs.size;
248868
+ const avgFieldLength = this._avgFieldLength[fieldId];
248869
+ for (const docId of fieldTermFreqs.keys()) {
248870
+ if (!this._documentIds.has(docId)) {
248871
+ this.removeTerm(fieldId, docId, derivedTerm);
248872
+ matchingFields -= 1;
248873
+ continue;
248874
+ }
248875
+ const docBoost = boostDocumentFn ? boostDocumentFn(this._documentIds.get(docId), derivedTerm, this._storedFields.get(docId)) : 1;
248876
+ if (!docBoost)
248877
+ continue;
248878
+ const termFreq = fieldTermFreqs.get(docId);
248879
+ const fieldLength = this._fieldLength.get(docId)[fieldId];
248880
+ const rawScore = calcBM25Score(termFreq, matchingFields, this._documentCount, fieldLength, avgFieldLength, bm25params);
248881
+ const weightedScore = termWeight * termBoost * fieldBoost * docBoost * rawScore;
248882
+ const result = results.get(docId);
248883
+ if (result) {
248884
+ result.score += weightedScore;
248885
+ assignUniqueTerm(result.terms, sourceTerm);
248886
+ const match = getOwnProperty(result.match, derivedTerm);
248887
+ if (match) {
248888
+ match.push(field);
248889
+ } else {
248890
+ result.match[derivedTerm] = [field];
248891
+ }
248892
+ } else {
248893
+ results.set(docId, {
248894
+ score: weightedScore,
248895
+ terms: [sourceTerm],
248896
+ match: { [derivedTerm]: [field] }
248897
+ });
248898
+ }
248899
+ }
248900
+ }
248901
+ return results;
248902
+ }
248903
+ addTerm(fieldId, documentId, term) {
248904
+ const indexData = this._index.fetch(term, createMap);
248905
+ let fieldIndex = indexData.get(fieldId);
248906
+ if (fieldIndex == null) {
248907
+ fieldIndex = new Map;
248908
+ fieldIndex.set(documentId, 1);
248909
+ indexData.set(fieldId, fieldIndex);
248910
+ } else {
248911
+ const docs = fieldIndex.get(documentId);
248912
+ fieldIndex.set(documentId, (docs || 0) + 1);
248913
+ }
248914
+ }
248915
+ removeTerm(fieldId, documentId, term) {
248916
+ if (!this._index.has(term)) {
248917
+ this.warnDocumentChanged(documentId, fieldId, term);
248918
+ return;
248919
+ }
248920
+ const indexData = this._index.fetch(term, createMap);
248921
+ const fieldIndex = indexData.get(fieldId);
248922
+ if (fieldIndex == null || fieldIndex.get(documentId) == null) {
248923
+ this.warnDocumentChanged(documentId, fieldId, term);
248924
+ } else if (fieldIndex.get(documentId) <= 1) {
248925
+ if (fieldIndex.size <= 1) {
248926
+ indexData.delete(fieldId);
248927
+ } else {
248928
+ fieldIndex.delete(documentId);
248929
+ }
248930
+ } else {
248931
+ fieldIndex.set(documentId, fieldIndex.get(documentId) - 1);
248932
+ }
248933
+ if (this._index.get(term).size === 0) {
248934
+ this._index.delete(term);
248935
+ }
248936
+ }
248937
+ warnDocumentChanged(shortDocumentId, fieldId, term) {
248938
+ for (const fieldName of Object.keys(this._fieldIds)) {
248939
+ if (this._fieldIds[fieldName] === fieldId) {
248940
+ this._options.logger("warn", `MiniSearch: document with ID ${this._documentIds.get(shortDocumentId)} has changed before removal: term "${term}" was not present in field "${fieldName}". Removing a document after it has changed can corrupt the index!`, "version_conflict");
248941
+ return;
248942
+ }
248943
+ }
248944
+ }
248945
+ addDocumentId(documentId) {
248946
+ const shortDocumentId = this._nextId;
248947
+ this._idToShortId.set(documentId, shortDocumentId);
248948
+ this._documentIds.set(shortDocumentId, documentId);
248949
+ this._documentCount += 1;
248950
+ this._nextId += 1;
248951
+ return shortDocumentId;
248952
+ }
248953
+ addFields(fields) {
248954
+ for (let i = 0;i < fields.length; i++) {
248955
+ this._fieldIds[fields[i]] = i;
248956
+ }
248957
+ }
248958
+ addFieldLength(documentId, fieldId, count, length) {
248959
+ let fieldLengths = this._fieldLength.get(documentId);
248960
+ if (fieldLengths == null)
248961
+ this._fieldLength.set(documentId, fieldLengths = []);
248962
+ fieldLengths[fieldId] = length;
248963
+ const averageFieldLength = this._avgFieldLength[fieldId] || 0;
248964
+ const totalFieldLength = averageFieldLength * count + length;
248965
+ this._avgFieldLength[fieldId] = totalFieldLength / (count + 1);
248966
+ }
248967
+ removeFieldLength(documentId, fieldId, count, length) {
248968
+ if (count === 1) {
248969
+ this._avgFieldLength[fieldId] = 0;
248970
+ return;
248971
+ }
248972
+ const totalFieldLength = this._avgFieldLength[fieldId] * count - length;
248973
+ this._avgFieldLength[fieldId] = totalFieldLength / (count - 1);
248974
+ }
248975
+ saveStoredFields(documentId, doc) {
248976
+ const { storeFields, extractField } = this._options;
248977
+ if (storeFields == null || storeFields.length === 0) {
248978
+ return;
248979
+ }
248980
+ let documentFields = this._storedFields.get(documentId);
248981
+ if (documentFields == null)
248982
+ this._storedFields.set(documentId, documentFields = {});
248983
+ for (const fieldName of storeFields) {
248984
+ const fieldValue = extractField(doc, fieldName);
248985
+ if (fieldValue !== undefined)
248986
+ documentFields[fieldName] = fieldValue;
248987
+ }
248988
+ }
248989
+ }
248990
+ MiniSearch.wildcard = Symbol("*");
248991
+ var getOwnProperty = (object, property) => Object.prototype.hasOwnProperty.call(object, property) ? object[property] : undefined;
248992
+ var combinators = {
248993
+ [OR]: (a, b) => {
248994
+ for (const docId of b.keys()) {
248995
+ const existing = a.get(docId);
248996
+ if (existing == null) {
248997
+ a.set(docId, b.get(docId));
248998
+ } else {
248999
+ const { score, terms, match } = b.get(docId);
249000
+ existing.score = existing.score + score;
249001
+ existing.match = Object.assign(existing.match, match);
249002
+ assignUniqueTerms(existing.terms, terms);
249003
+ }
249004
+ }
249005
+ return a;
249006
+ },
249007
+ [AND]: (a, b) => {
249008
+ const combined = new Map;
249009
+ for (const docId of b.keys()) {
249010
+ const existing = a.get(docId);
249011
+ if (existing == null)
249012
+ continue;
249013
+ const { score, terms, match } = b.get(docId);
249014
+ assignUniqueTerms(existing.terms, terms);
249015
+ combined.set(docId, {
249016
+ score: existing.score + score,
249017
+ terms: existing.terms,
249018
+ match: Object.assign(existing.match, match)
249019
+ });
249020
+ }
249021
+ return combined;
249022
+ },
249023
+ [AND_NOT]: (a, b) => {
249024
+ for (const docId of b.keys())
249025
+ a.delete(docId);
249026
+ return a;
249027
+ }
249028
+ };
249029
+ var defaultBM25params = { k: 1.2, b: 0.7, d: 0.5 };
249030
+ var calcBM25Score = (termFreq, matchingCount, totalCount, fieldLength, avgFieldLength, bm25params) => {
249031
+ const { k, b, d } = bm25params;
249032
+ const invDocFreq = Math.log(1 + (totalCount - matchingCount + 0.5) / (matchingCount + 0.5));
249033
+ return invDocFreq * (d + termFreq * (k + 1) / (termFreq + k * (1 - b + b * fieldLength / avgFieldLength)));
249034
+ };
249035
+ var termToQuerySpec = (options) => (term, i, terms) => {
249036
+ const fuzzy = typeof options.fuzzy === "function" ? options.fuzzy(term, i, terms) : options.fuzzy || false;
249037
+ const prefix = typeof options.prefix === "function" ? options.prefix(term, i, terms) : options.prefix === true;
249038
+ const termBoost = typeof options.boostTerm === "function" ? options.boostTerm(term, i, terms) : 1;
249039
+ return { term, fuzzy, prefix, termBoost };
249040
+ };
249041
+ var defaultOptions = {
249042
+ idField: "id",
249043
+ extractField: (document2, fieldName) => document2[fieldName],
249044
+ tokenize: (text) => text.split(SPACE_OR_PUNCTUATION),
249045
+ processTerm: (term) => term.toLowerCase(),
249046
+ fields: undefined,
249047
+ searchOptions: undefined,
249048
+ storeFields: [],
249049
+ logger: (level, message) => {
249050
+ if (typeof (console === null || console === undefined ? undefined : console[level]) === "function")
249051
+ console[level](message);
249052
+ },
249053
+ autoVacuum: true
249054
+ };
249055
+ var defaultSearchOptions = {
249056
+ combineWith: OR,
249057
+ prefix: false,
249058
+ fuzzy: false,
249059
+ maxFuzzy: 6,
249060
+ boost: {},
249061
+ weights: { fuzzy: 0.45, prefix: 0.375 },
249062
+ bm25: defaultBM25params
249063
+ };
249064
+ var defaultAutoSuggestOptions = {
249065
+ combineWith: AND,
249066
+ prefix: (term, i, terms) => i === terms.length - 1
249067
+ };
249068
+ var defaultVacuumOptions = { batchSize: 1000, batchWait: 10 };
249069
+ var defaultVacuumConditions = { minDirtFactor: 0.1, minDirtCount: 20 };
249070
+ var defaultAutoVacuumOptions = { ...defaultVacuumOptions, ...defaultVacuumConditions };
249071
+ var assignUniqueTerm = (target, term) => {
249072
+ if (!target.includes(term))
249073
+ target.push(term);
249074
+ };
249075
+ var assignUniqueTerms = (target, source) => {
249076
+ for (const term of source) {
249077
+ if (!target.includes(term))
249078
+ target.push(term);
249079
+ }
249080
+ };
249081
+ var byScore = ({ score: a }, { score: b }) => b - a;
249082
+ var createMap = () => new Map;
249083
+ var objectToNumericMap = (object) => {
249084
+ const map = new Map;
249085
+ for (const key of Object.keys(object)) {
249086
+ map.set(parseInt(key, 10), object[key]);
249087
+ }
249088
+ return map;
249089
+ };
249090
+ var objectToNumericMapAsync = async (object) => {
249091
+ const map = new Map;
249092
+ let count = 0;
249093
+ for (const key of Object.keys(object)) {
249094
+ map.set(parseInt(key, 10), object[key]);
249095
+ if (++count % 1000 === 0) {
249096
+ await wait(0);
249097
+ }
249098
+ }
249099
+ return map;
249100
+ };
249101
+ var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
249102
+ var SPACE_OR_PUNCTUATION = /[\n\r\p{Z}\p{P}]+/u;
249103
+
249104
+ // src/core/api-spec/search.ts
249105
+ var BOOST = { path: 8, summary: 5, description: 2, parameters: 0.5 };
249106
+ var MIN_RELATIVE_SCORE = 0.2;
249107
+ var TOKEN_SEPARATOR = /[\n\r\p{Z}\p{P}\p{S}]+/u;
249108
+ var STOPWORDS = new Set("a an and are at be by do does for from how i in is it its me my of on or our that the this to we what who with you your".split(" "));
249109
+ function tokenize(text) {
249110
+ return text.split(TOKEN_SEPARATOR).filter((word) => word && !STOPWORDS.has(word.toLowerCase()));
249111
+ }
249112
+ function toOperationSummary(op) {
249113
+ return { endpoint: op.endpoint, summary: op.summary };
249114
+ }
249115
+ function buildSearchIndex(operations) {
249116
+ const index = new MiniSearch({
249117
+ fields: ["path", "summary", "description", "parameters"],
249118
+ tokenize
249119
+ });
249120
+ index.addAll(operations.map((op, id) => ({
249121
+ id,
249122
+ path: op.path.replace(/\{[^}]*\}/g, ""),
249123
+ summary: op.summary,
249124
+ description: op.description,
249125
+ parameters: op.parameterText
249126
+ })));
249127
+ return index;
249128
+ }
249129
+ function summaryCoverage(query, op) {
249130
+ const terms = tokenize(query.toLowerCase());
249131
+ if (!op || terms.length === 0) {
249132
+ return 0;
249133
+ }
249134
+ const words = tokenize(op.summary.toLowerCase());
249135
+ return terms.filter((term) => words.some((word) => word.startsWith(term))).length / terms.length;
249136
+ }
249137
+ function searchOperations(operations, query, options = {}) {
249138
+ const index = buildSearchIndex(operations);
249139
+ const hits = index.search(query, {
249140
+ prefix: (term) => term.length >= 3,
249141
+ fuzzy: (term) => term.length >= 4 ? 0.2 : false,
249142
+ boost: BOOST,
249143
+ filter: options.readOnly ? (hit) => operations[hit.id]?.readOnly === true : undefined
249144
+ }).map((hit) => ({
249145
+ ...hit,
249146
+ score: hit.score * (1 + summaryCoverage(query, operations[hit.id]))
249147
+ })).sort((a, b) => b.score - a.score);
249148
+ const baseline = (hits[0]?.score ?? 0) * MIN_RELATIVE_SCORE;
249149
+ return hits.filter((hit) => hit.score >= baseline).slice(0, options.limit ?? 5).flatMap((hit) => {
249150
+ const op = operations[hit.id];
249151
+ return op ? [toOperationSummary(op)] : [];
249152
+ });
249153
+ }
249154
+
249155
+ // src/core/api-spec/catalog.ts
249156
+ var INLINE_AREA_MAX = 2;
249157
+ var AREA_SAMPLE_MAX = 3;
249158
+ var AREA_OPERATIONS_MAX = 200;
249159
+ var byCodePoint = (a, b) => a < b ? -1 : a > b ? 1 : 0;
249160
+ function areaOf(path) {
249161
+ const parts = path.split("/").filter(Boolean);
249162
+ const appIdIndex = parts.indexOf("{app_id}");
249163
+ if (appIdIndex !== -1 && appIdIndex + 1 < parts.length) {
249164
+ return parts[appIdIndex + 1] ?? "other";
249165
+ }
249166
+ if (parts[0] === "api" && parts.length > 1) {
249167
+ return parts[1] ?? "other";
249168
+ }
249169
+ return parts[0] ?? "other";
249170
+ }
249171
+ function groupByArea(operations) {
249172
+ const sorted = [...operations].sort((a, b) => byCodePoint(`${a.method} ${a.path}`, `${b.method} ${b.path}`));
249173
+ const areas = new Map;
249174
+ for (const op of sorted) {
249175
+ const area = areaOf(op.path);
249176
+ areas.set(area, [...areas.get(area) ?? [], op]);
249177
+ }
249178
+ return new Map([...areas].sort(([a], [b]) => byCodePoint(a, b)));
249179
+ }
249180
+ function readsFirst(ops) {
249181
+ const isRead = (op) => op.method === "GET" ? 0 : 1;
249182
+ return [...ops].sort((a, b) => isRead(a) - isRead(b));
249183
+ }
249184
+ function catalogIndex(operations) {
249185
+ const areas = [...groupByArea(operations)].map(([area, ops]) => ops.length <= INLINE_AREA_MAX ? { area, operations: ops.map(toOperationSummary) } : {
249186
+ area,
249187
+ operationCount: ops.length,
249188
+ sample: readsFirst(ops).slice(0, AREA_SAMPLE_MAX).map((op) => op.summary)
249189
+ });
249190
+ return { areas, total: operations.length };
249191
+ }
249192
+ function areaListing(area, operations, max = AREA_OPERATIONS_MAX) {
249193
+ return {
249194
+ area,
249195
+ operations: operations.slice(0, max).map(toOperationSummary),
249196
+ total: operations.length,
249197
+ truncated: operations.length > max
249198
+ };
249199
+ }
249200
+ // src/core/api-spec/grep.ts
249201
+ var CONTEXT_CHARS = 40;
249202
+ var MAX_SNIPPETS = 3;
249203
+ var MAX_SNIPPET_CHARS = 200;
249204
+ function unescapeJson(snippet) {
249205
+ return snippet.replace(/\\[nrt]/g, " ").replace(/\\"/g, '"');
249206
+ }
249207
+ function snippets(text, pattern) {
249208
+ const found = [];
249209
+ for (const match of text.matchAll(pattern)) {
249210
+ const start = Math.max(0, match.index - CONTEXT_CHARS);
249211
+ const end = match.index + match[0].length + CONTEXT_CHARS;
249212
+ found.push(unescapeJson(text.slice(start, Math.min(end, start + MAX_SNIPPET_CHARS))));
249213
+ if (found.length === MAX_SNIPPETS || match[0].length === 0) {
249214
+ break;
249215
+ }
249216
+ }
249217
+ return found;
249218
+ }
249219
+ function grepSpec(spec, operations, pattern, options = {}) {
249220
+ const regex = new RegExp(pattern, options.ignoreCase ? "gi" : "g");
249221
+ const hits = [];
249222
+ for (const op of operations) {
249223
+ const { summary, description, parameters, requestBody, responses } = op.operation;
249224
+ const matches = snippets(`${op.endpoint} ${JSON.stringify({ summary, description, parameters, requestBody, responses })}`, regex);
249225
+ if (matches.length > 0) {
249226
+ hits.push({ ...toOperationSummary(op), matches });
249227
+ }
249228
+ }
249229
+ const schemas = options.schemas === false ? {} : spec.components?.schemas;
249230
+ for (const [schema, definition] of Object.entries(schemas ?? {})) {
249231
+ const matches = snippets(JSON.stringify(definition), regex);
249232
+ if (matches.length > 0) {
249233
+ hits.push({ schema, matches });
249234
+ }
249235
+ }
249236
+ return hits.slice(0, options.limit ?? 20);
249237
+ }
249238
+ // src/core/api-spec/schema.ts
249239
+ var HTTP_METHODS = [
249240
+ "get",
249241
+ "put",
249242
+ "post",
249243
+ "delete",
249244
+ "patch",
249245
+ "head",
249246
+ "options",
249247
+ "trace"
249248
+ ];
249249
+ var ParameterSchema = looseObject({
249250
+ name: string2(),
249251
+ in: string2(),
249252
+ required: boolean2().optional(),
249253
+ description: string2().optional(),
249254
+ schema: unknown().optional(),
249255
+ example: unknown().optional()
249256
+ });
249257
+ var MediaTypesSchema = record(string2(), looseObject({ schema: unknown().optional() }));
249258
+ var RequestBodySchema = looseObject({
249259
+ content: MediaTypesSchema.optional()
249260
+ });
249261
+ var ResponseObjectSchema = looseObject({
249262
+ description: string2().optional(),
249263
+ content: MediaTypesSchema.optional()
249264
+ });
249265
+ var SecurityRequirementSchema = record(string2(), array(string2()));
249266
+ var OperationSchema = looseObject({
249267
+ summary: string2().optional(),
249268
+ description: string2().optional(),
249269
+ operationId: string2().optional(),
249270
+ parameters: array(unknown()).optional(),
249271
+ requestBody: unknown().optional(),
249272
+ responses: record(string2(), unknown()).optional(),
249273
+ security: array(SecurityRequirementSchema).optional()
249274
+ });
249275
+ var PathItemSchema = looseObject({
249276
+ ...Object.fromEntries(HTTP_METHODS.map((method) => [method, OperationSchema.optional()])),
249277
+ parameters: array(unknown()).optional()
249278
+ });
249279
+ var OpenApiSpecSchema = looseObject({
249280
+ openapi: string2(),
249281
+ paths: record(string2(), PathItemSchema),
249282
+ components: looseObject({
249283
+ schemas: record(string2(), unknown()).optional()
249284
+ }).optional(),
249285
+ security: array(SecurityRequirementSchema).optional()
249286
+ });
249287
+
249288
+ // src/core/api-spec/operations.ts
249289
+ var PERSONAL_ACCESS_TOKEN_SCHEME = "PersonalAccessTokenAuth";
249290
+ var READ_ONLY_SCOPE = "read_only";
249291
+ function isReadOnly(operation, spec) {
249292
+ const security = operation.security ?? spec.security ?? [];
249293
+ return security.some((requirement) => requirement[PERSONAL_ACCESS_TOKEN_SCHEME]?.includes(READ_ONLY_SCOPE));
249294
+ }
249295
+ function parameterText(operation) {
249296
+ return (operation.parameters ?? []).flatMap((parameter) => {
249297
+ const parsed = ParameterSchema.safeParse(parameter);
249298
+ return parsed.success ? [parsed.data.name, parsed.data.description ?? ""] : [];
249299
+ }).join(" ");
249300
+ }
249301
+ function mergeParameters(shared, own) {
249302
+ if (!shared?.length) {
249303
+ return own;
249304
+ }
249305
+ const key = (parameter) => {
249306
+ const parsed = ParameterSchema.safeParse(parameter);
249307
+ return parsed.success ? `${parsed.data.in}:${parsed.data.name}` : undefined;
249308
+ };
249309
+ const ownKeys = new Set((own ?? []).map(key));
249310
+ return [
249311
+ ...shared.filter((parameter) => !ownKeys.has(key(parameter))),
249312
+ ...own ?? []
249313
+ ];
249314
+ }
249315
+ function listOperations(spec) {
249316
+ return Object.entries(spec.paths).flatMap(([path, item]) => HTTP_METHODS.flatMap((method) => {
249317
+ const declared = item[method];
249318
+ if (!declared) {
249319
+ return [];
249320
+ }
249321
+ const operation = {
249322
+ ...declared,
249323
+ parameters: mergeParameters(item.parameters, declared.parameters)
249324
+ };
249325
+ return [
249326
+ {
249327
+ endpoint: `${method.toUpperCase()} ${path}`,
249328
+ method: method.toUpperCase(),
249329
+ path,
249330
+ summary: operation.summary ?? "",
249331
+ description: operation.description ?? "",
249332
+ parameterText: parameterText(operation),
249333
+ readOnly: isReadOnly(operation, spec),
249334
+ operation
249335
+ }
249336
+ ];
249337
+ }));
249338
+ }
249339
+ function pathSegments(path) {
249340
+ const pathname = path.split(/[?#]/, 1)[0] ?? "";
249341
+ return pathname.split("/").filter(Boolean);
249342
+ }
249343
+ function segmentPattern(segment) {
249344
+ const source = segment.split(/(\{[^}]+\})/).map((part) => part.startsWith("{") ? "[^/]+" : part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("");
249345
+ return new RegExp(`^${source}$`);
249346
+ }
249347
+ function specificity(templateSegments) {
249348
+ return templateSegments.map((segment) => segment.includes("{") ? 0 : 1);
249349
+ }
249350
+ function compareSpecificity(a, b) {
249351
+ for (let i = 0;i < a.length; i++) {
249352
+ if (a[i] !== b[i]) {
249353
+ return (b[i] ?? 0) - (a[i] ?? 0);
249354
+ }
249355
+ }
249356
+ return 0;
249357
+ }
249358
+ function matchOperation(operations, method, concretePath) {
249359
+ const upperMethod = method.toUpperCase();
249360
+ const segments = pathSegments(concretePath);
249361
+ const candidates = operations.filter((op) => {
249362
+ if (op.method !== upperMethod) {
249363
+ return false;
249364
+ }
249365
+ const template = pathSegments(op.path);
249366
+ return template.length === segments.length && template.every((part, i) => segmentPattern(part).test(segments[i] ?? ""));
249367
+ });
249368
+ return candidates.sort((a, b) => compareSpecificity(specificity(pathSegments(a.path)), specificity(pathSegments(b.path))))[0];
249369
+ }
249370
+ var SCHEMA_REF_PREFIX = "#/components/schemas/";
249371
+ var MAX_REF_DEPTH = 4;
249372
+ var FRAMEWORK_VALIDATION_ERROR = "Validation Error";
249373
+ function inlineRefs(node, schemas, seen = new Set, depth = 0) {
249374
+ if (depth > MAX_REF_DEPTH) {
249375
+ return node;
249376
+ }
249377
+ if (Array.isArray(node)) {
249378
+ return node.map((item) => inlineRefs(item, schemas, seen, depth));
249379
+ }
249380
+ if (node === null || typeof node !== "object") {
249381
+ return node;
249382
+ }
249383
+ const { $ref, ...siblings } = node;
249384
+ if (typeof $ref === "string" && $ref.startsWith(SCHEMA_REF_PREFIX)) {
249385
+ const name = $ref.slice(SCHEMA_REF_PREFIX.length);
249386
+ if (seen.has(name) || !(name in schemas)) {
249387
+ return node;
249388
+ }
249389
+ const resolved = inlineRefs(schemas[name], schemas, new Set([...seen, name]), depth + 1);
249390
+ return resolved !== null && typeof resolved === "object" ? { ...resolved, ...siblings } : resolved;
249391
+ }
249392
+ return Object.fromEntries(Object.entries(node).map(([key, value]) => [
249393
+ key,
249394
+ inlineRefs(value, schemas, seen, depth)
249395
+ ]));
249396
+ }
249397
+ function jsonSchemaOf(value) {
249398
+ const parsed = RequestBodySchema.safeParse(value);
249399
+ return parsed.success ? parsed.data.content?.["application/json"]?.schema : undefined;
249400
+ }
249401
+ function requestBodyOf(value) {
249402
+ const parsed = RequestBodySchema.safeParse(value);
249403
+ const content = parsed.success ? parsed.data.content ?? {} : {};
249404
+ const contentType = "application/json" in content ? "application/json" : Object.keys(content)[0];
249405
+ return contentType ? { contentType, schema: content[contentType]?.schema } : {};
249406
+ }
249407
+ function leftoverRefs(node, schemas, found = new Map) {
249408
+ if (Array.isArray(node)) {
249409
+ for (const item of node) {
249410
+ leftoverRefs(item, schemas, found);
249411
+ }
249412
+ } else if (node !== null && typeof node === "object") {
249413
+ for (const [key, value] of Object.entries(node)) {
249414
+ if (key === "$ref" && typeof value === "string" && value.startsWith(SCHEMA_REF_PREFIX) && !found.has(value)) {
249415
+ const schema = schemas[value.slice(SCHEMA_REF_PREFIX.length)];
249416
+ found.set(value, schema);
249417
+ leftoverRefs(schema, schemas, found);
249418
+ } else {
249419
+ leftoverRefs(value, schemas, found);
249420
+ }
249421
+ }
249422
+ }
249423
+ return found;
249424
+ }
249425
+ function getOperationContract(spec, op) {
249426
+ const schemas = spec.components?.schemas ?? {};
249427
+ const inline = (node) => node === undefined ? null : inlineRefs(node, schemas);
249428
+ const responses = Object.entries(op.operation.responses ?? {}).flatMap(([status, response]) => {
249429
+ const parsed = ResponseObjectSchema.safeParse(response);
249430
+ return parsed.success ? [[status, parsed.data]] : [];
249431
+ });
249432
+ const success = responses.filter(([status]) => status.startsWith("2")).sort(([a], [b]) => a.localeCompare(b)).map(([, response]) => jsonSchemaOf(response)).find(Boolean);
249433
+ const errors = responses.filter(([status, response]) => !status.startsWith("2") && response.description !== FRAMEWORK_VALIDATION_ERROR);
249434
+ const requestBody = requestBodyOf(op.operation.requestBody);
249435
+ const contract = {
249436
+ endpoint: op.endpoint,
249437
+ method: op.method,
249438
+ path: op.path,
249439
+ summary: op.summary,
249440
+ description: op.description,
249441
+ parameters: (op.operation.parameters ?? []).flatMap((parameter) => {
249442
+ const parsed = ParameterSchema.safeParse(parameter);
249443
+ if (!parsed.success) {
249444
+ return [];
249445
+ }
249446
+ const { name, in: location2, required, schema, description } = parsed.data;
249447
+ const inSchema = schema !== null && typeof schema === "object" && "description" in schema;
249448
+ return [
249449
+ {
249450
+ name,
249451
+ in: location2,
249452
+ required: required ?? false,
249453
+ schema: inline(schema ?? {}),
249454
+ ...description && !inSchema ? { description } : {},
249455
+ ..."example" in parsed.data ? { example: parsed.data.example } : {}
249456
+ }
249457
+ ];
249458
+ }),
249459
+ ...requestBody.contentType && requestBody.contentType !== "application/json" ? { requestBodyContentType: requestBody.contentType } : {},
249460
+ requestBodySchema: inline(requestBody.schema),
249461
+ responseSchema: inline(success),
249462
+ errors: Object.fromEntries(errors.map(([status, response]) => [status, response.description ?? ""]))
249463
+ };
249464
+ const refs = leftoverRefs(contract, schemas);
249465
+ return {
249466
+ ...contract,
249467
+ ...refs.size > 0 ? { refs: Object.fromEntries(refs) } : {}
249468
+ };
249469
+ }
249470
+ // src/core/api-spec/request.ts
249471
+ var MAX_ERROR_BODY_CHARS = 4000;
249472
+ async function readBody(response) {
249473
+ try {
249474
+ const text = (await response.clone().text()).trim();
249475
+ return text.length > MAX_ERROR_BODY_CHARS ? `${text.slice(0, MAX_ERROR_BODY_CHARS)}…` : text || undefined;
249476
+ } catch {
249477
+ return;
249478
+ }
249479
+ }
249480
+ async function sendApiRequest(method, path, body) {
249481
+ try {
249482
+ const response = await base44Client(path.replace(/^\/+/, ""), {
249483
+ method,
249484
+ body,
249485
+ headers: body === undefined ? {} : { "Content-Type": "application/json" },
249486
+ timeout: false
249487
+ });
249488
+ return {
249489
+ status: response.status,
249490
+ contentType: response.headers.get("content-type") ?? "",
249491
+ body: new Uint8Array(await response.arrayBuffer())
249492
+ };
249493
+ } catch (error) {
249494
+ const apiError = await ApiError.fromHttpError(error, `calling ${method} ${path}`);
249495
+ const raw = error instanceof HTTPError ? await readBody(error.response) : undefined;
249496
+ throw new ApiError(apiError.message, {
249497
+ statusCode: apiError.statusCode,
249498
+ requestUrl: apiError.requestUrl,
249499
+ requestMethod: apiError.requestMethod,
249500
+ requestId: apiError.requestId,
249501
+ hints: apiError.hints,
249502
+ details: raw ? [`Response body: ${raw}`] : apiError.details
249503
+ });
249504
+ }
249505
+ }
249506
+ // src/core/api-spec/spec.ts
249507
+ import { rename, stat as stat3 } from "node:fs/promises";
249508
+ import { join as join22 } from "node:path";
249509
+ var SPEC_CACHE_TTL_MS = 60 * 60 * 1000;
249510
+ function getSpecCachePath(apiUrl = getBase44ApiUrl()) {
249511
+ const server = new URL(apiUrl).host.replace(/[^a-zA-Z0-9.-]/g, "_");
249512
+ return join22(getBase44GlobalDir(), "cache", server, "openapi.json");
249513
+ }
249514
+ function isSpecCacheFresh(mtimeMs, now = Date.now()) {
249515
+ return now - mtimeMs < SPEC_CACHE_TTL_MS;
249516
+ }
249517
+ function parseSpec(text) {
249518
+ let json;
249519
+ try {
249520
+ json = JSON.parse(text);
249521
+ } catch {
249522
+ throw new ApiError("The API spec from the server is not valid JSON");
249523
+ }
249524
+ const result = OpenApiSpecSchema.safeParse(json);
249525
+ if (!result.success) {
249526
+ throw new SchemaValidationError("Invalid API spec", result.error);
249527
+ }
249528
+ return result.data;
249529
+ }
249530
+ var SPEC_DOWNLOAD_TIMEOUT_MS = 60000;
249531
+ async function readFreshCache(path) {
249532
+ try {
249533
+ const { mtimeMs } = await stat3(path);
249534
+ if (!isSpecCacheFresh(mtimeMs)) {
249535
+ return null;
249536
+ }
249537
+ const text = await readTextFile(path);
249538
+ return { text, spec: parseSpec(text) };
249539
+ } catch {
249540
+ return null;
249541
+ }
249542
+ }
249543
+ async function downloadSpec() {
249544
+ try {
249545
+ const response = await base44Client.get("api/openapi.json", {
249546
+ timeout: SPEC_DOWNLOAD_TIMEOUT_MS
249547
+ });
249548
+ return await response.text();
249549
+ } catch (error) {
249550
+ throw await ApiError.fromHttpError(error, "fetching the API spec");
249551
+ }
249552
+ }
249553
+ async function loadSpec(options = {}) {
249554
+ const path = getSpecCachePath();
249555
+ const cached = options.refresh ? null : await readFreshCache(path);
249556
+ if (cached !== null) {
249557
+ return cached;
249558
+ }
249559
+ const text = await downloadSpec();
249560
+ const spec = parseSpec(text);
249561
+ const partial = `${path}.${process.pid}.tmp`;
249562
+ await writeFile(partial, text);
249563
+ await rename(partial, path);
249564
+ return { text, spec };
249565
+ }
249566
+ // src/cli/commands/api/shared.ts
249567
+ import { fstatSync } from "node:fs";
249568
+ function formatJson(value) {
249569
+ return toJsonStdout(value, { compact: !process.stdout.isTTY });
249570
+ }
249571
+ function parseLimit(value) {
249572
+ if (value === undefined) {
249573
+ return;
249574
+ }
249575
+ const n = Number.parseInt(value, 10);
249576
+ if (!Number.isInteger(n) || n < 1) {
249577
+ throw new InvalidInputError("--limit must be a positive integer.");
249578
+ }
249579
+ return n;
249580
+ }
249581
+ var READ_ONLY_FILTER_HELP = "Only read-only operations";
249582
+ var REFRESH_OPTION_HELP = "Fetch the API spec again instead of using the cached copy (kept 1 hour)";
249583
+ function loadSpecTask({ runTask }, refresh) {
249584
+ return runTask("Loading the API spec", () => loadSpec({ refresh }), {
249585
+ successMessage: "Loaded the API spec"
249586
+ });
249587
+ }
249588
+ function operationsInArea(operations, area) {
249589
+ const areas = groupByArea(operations);
249590
+ const inArea = areas.get(area);
249591
+ if (!inArea) {
249592
+ throw new InvalidInputError(`Unknown API area: ${area}`, {
249593
+ details: [`Areas: ${[...areas.keys()].join(", ")}`],
249594
+ hints: [{ message: "List the areas", command: "base44 api catalog" }]
249595
+ });
249596
+ }
249597
+ return inArea;
249598
+ }
249599
+ function isPipedStdin() {
249600
+ try {
249601
+ const stats = fstatSync(0);
249602
+ return stats.isFIFO() || stats.isFile();
249603
+ } catch {
249604
+ return false;
249605
+ }
249606
+ }
249607
+ async function readRequestBody(method, flag) {
249608
+ if (flag === "@-") {
249609
+ return readStdin("--body @-", { trim: false });
249610
+ }
249611
+ if (flag?.startsWith("@")) {
249612
+ return readTextFile(flag.slice(1));
249613
+ }
249614
+ if (flag !== undefined) {
249615
+ return flag;
249616
+ }
249617
+ if (method === "GET" || method === "HEAD" || !isPipedStdin()) {
249618
+ return;
249619
+ }
249620
+ const piped = await readStdin("--body", { trim: false });
249621
+ return piped.trim() ? piped : undefined;
249622
+ }
249623
+
249624
+ // src/cli/commands/api/catalog.ts
249625
+ async function catalogAction(ctx, area, options) {
249626
+ const { spec } = await loadSpecTask(ctx, options.refresh);
249627
+ const operations = listOperations(spec);
249628
+ const readOnly = (ops) => options.readOnly ? ops.filter((op) => op.readOnly) : ops;
249629
+ if (area === undefined) {
249630
+ return { stdout: formatJson(catalogIndex(readOnly(operations))) };
249631
+ }
249632
+ const inArea = readOnly(operationsInArea(operations, area));
249633
+ return { stdout: formatJson(areaListing(area, inArea)) };
249634
+ }
249635
+ function getApiCatalogCommand() {
249636
+ return new Base44Command("catalog", {
249637
+ requireAuth: false,
249638
+ requireAppContext: false
249639
+ }).description("List the API's areas, or every operation in one area").argument("[area]", 'An area from the list, e.g. "workflows"').option("--read-only", READ_ONLY_FILTER_HELP).option("--refresh", REFRESH_OPTION_HELP).action(catalogAction);
249640
+ }
249641
+
249642
+ // src/cli/commands/api/fetch.ts
249643
+ async function findOperation(ctx, method, path, refresh) {
249644
+ const { spec } = await loadSpecTask(ctx, refresh);
249645
+ const op = matchOperation(listOperations(spec), method, path);
249646
+ if (!op) {
249647
+ throw new InvalidInputError(`No operation in the API spec matches ${method} ${path}.`, {
249648
+ hints: [
249649
+ {
249650
+ message: "The cached spec may predate this route; fetch it again",
249651
+ command: "base44 api fetch <METHOD> <path> --help --refresh"
249652
+ },
249653
+ {
249654
+ message: "Find the operation and its path template",
249655
+ command: 'base44 api search "<what you want to do>"'
249656
+ }
249657
+ ]
249658
+ });
249659
+ }
249660
+ return { spec, op };
249661
+ }
249662
+ var TEXT_CONTENT_TYPES = [
249663
+ "json",
249664
+ "text/",
249665
+ "xml",
249666
+ "javascript",
249667
+ "x-www-form-urlencoded"
249668
+ ];
249669
+ function isText(contentType) {
249670
+ return !contentType || TEXT_CONTENT_TYPES.some((hint) => contentType.toLowerCase().includes(hint));
249671
+ }
249672
+ async function formatResponse({ status, contentType, body }, output, jsonMode) {
249673
+ if (output !== undefined) {
249674
+ await writeFile(output, body);
249675
+ return formatJson({ status, contentType, bytes: body.length, output });
249676
+ }
249677
+ if (body.length === 0) {
249678
+ return formatJson({ status });
249679
+ }
249680
+ if (!isText(contentType)) {
249681
+ return formatJson({
249682
+ status,
249683
+ contentType,
249684
+ bytes: body.length,
249685
+ note: "Binary body not printed; add --output <file> to save it."
249686
+ });
249687
+ }
249688
+ const text = new TextDecoder().decode(body);
249689
+ try {
249690
+ return formatJson(JSON.parse(text));
249691
+ } catch {
249692
+ if (jsonMode) {
249693
+ return formatJson({ status, contentType, body: text });
249694
+ }
249695
+ return text.endsWith(`
249696
+ `) ? text : `${text}
249697
+ `;
249698
+ }
249699
+ }
249700
+ async function fetchAction(ctx, methodArg, path, options, command) {
249701
+ if (!methodArg || !path) {
249702
+ if (options.help) {
249703
+ const usage = command.helpInformation();
249704
+ return { stdout: ctx.jsonMode ? formatJson({ usage }) : usage };
249705
+ }
249706
+ throw new InvalidInputError("Provide a method and a path, e.g. GET /api/apps.");
249707
+ }
249708
+ const method = methodArg.toUpperCase();
249709
+ if (options.help) {
249710
+ const { spec, op } = await findOperation(ctx, method, path, options.refresh);
249711
+ return { stdout: formatJson(getOperationContract(spec, op)) };
249712
+ }
249713
+ if (options.readOnly) {
249714
+ const { op } = await findOperation(ctx, method, path, options.refresh);
249715
+ if (!op.readOnly) {
249716
+ throw new InvalidInputError(`Refused under --read-only: ${op.method} ${op.path} is not a read-only operation. Nothing was sent.`);
249717
+ }
249718
+ }
249719
+ ctx.errorReporter.setContext({
249720
+ command: {
249721
+ name: "api fetch",
249722
+ args: [method, path.split("?", 1)[0] ?? ""],
249723
+ options: { ...options, body: options.body && "[not reported]" }
249724
+ }
249725
+ });
249726
+ await ensureAuth(ctx);
249727
+ const body = await readRequestBody(method, options.body);
249728
+ const response = await ctx.runTask(`Calling ${method} ${path}`, () => sendApiRequest(method, path, body), {
249729
+ successMessage: `Called ${method} ${path}`,
249730
+ errorMessage: "Request failed"
249731
+ });
249732
+ return {
249733
+ stdout: await formatResponse(response, options.output, ctx.jsonMode)
249734
+ };
249735
+ }
249736
+ function getApiFetchCommand() {
249737
+ return new Base44Command("fetch", {
249738
+ requireAuth: false,
249739
+ requireAppContext: false
249740
+ }).description("Call a Base44 API operation, like curl; add --help after a path for its contract").helpOption(false).argument("[method]", "HTTP method, e.g. GET or POST").argument("[path]", 'Concrete path with any query string, e.g. "/api/apps/<app-id>/workflows/runs?status=failed"').option("--body <json>", "Request body: JSON, @file.json, or @- for stdin (piped stdin is read too)").option("--output <file>", "Save the response body to a file").option("--read-only", "Refuse, before sending, any operation the spec does not mark read-only").option("--refresh", REFRESH_OPTION_HELP).option("-h, --help", "With a method and path, print that operation's contract; otherwise this help").action(fetchAction);
249741
+ }
249742
+
249743
+ // src/cli/commands/api/grep.ts
249744
+ function assertValidRegex(pattern) {
249745
+ try {
249746
+ new RegExp(pattern);
249747
+ } catch (error) {
249748
+ throw new InvalidInputError(`Invalid regular expression: ${error instanceof Error ? error.message : pattern}`);
249749
+ }
249750
+ }
249751
+ async function grepAction(ctx, pattern, options) {
249752
+ const limit = parseLimit(options.limit);
249753
+ assertValidRegex(pattern);
249754
+ const { spec } = await loadSpecTask(ctx, options.refresh);
249755
+ let operations = listOperations(spec);
249756
+ if (options.area !== undefined) {
249757
+ operations = operationsInArea(operations, options.area);
249758
+ }
249759
+ if (options.readOnly) {
249760
+ operations = operations.filter((op) => op.readOnly);
249761
+ }
249762
+ const narrowed = options.area !== undefined || options.readOnly === true;
249763
+ const hits = grepSpec(spec, operations, pattern, {
249764
+ ignoreCase: options.ignoreCase,
249765
+ limit,
249766
+ schemas: !narrowed
249767
+ });
249768
+ return { stdout: formatJson(hits) };
249769
+ }
249770
+ function getApiGrepCommand() {
249771
+ return new Base44Command("grep", {
249772
+ requireAuth: false,
249773
+ requireAppContext: false
249774
+ }).description("Search the raw API spec with a regular expression, for when search misses").argument("<pattern>", 'Regular expression, e.g. "runs.*status"').option("--area <area>", "Search only one area's operations (see base44 api catalog)").option("-i, --ignore-case", "Case-insensitive match").option("--limit <n>", "Most operations or schemas to return (default 20)").option("--read-only", READ_ONLY_FILTER_HELP).option("--refresh", REFRESH_OPTION_HELP).action(grepAction);
249775
+ }
249776
+
249777
+ // src/cli/commands/api/search.ts
249778
+ async function searchAction(ctx, words, options) {
249779
+ const limit = parseLimit(options.limit);
249780
+ const { spec } = await loadSpecTask(ctx, options.refresh);
249781
+ const results = searchOperations(listOperations(spec), words.join(" "), {
249782
+ limit,
249783
+ readOnly: options.readOnly
249784
+ });
249785
+ return { stdout: formatJson(results) };
249786
+ }
249787
+ function getApiSearchCommand() {
249788
+ return new Base44Command("search", {
249789
+ requireAuth: false,
249790
+ requireAppContext: false
249791
+ }).description("Search every Base44 API operation by what it does").argument("<text...>", 'What you are looking for, e.g. "failed workflow runs"').option("--limit <n>", "Most results to return (default 5)").option("--read-only", READ_ONLY_FILTER_HELP).option("--refresh", REFRESH_OPTION_HELP).action(searchAction);
249792
+ }
249793
+
249794
+ // src/cli/commands/api/index.ts
249795
+ function getApiCommand() {
249796
+ return new Command2("api").description("Search and call any public Base44 API operation").addCommand(getApiCatalogCommand()).addCommand(getApiSearchCommand()).addCommand(getApiGrepCommand()).addCommand(getApiFetchCommand());
249797
+ }
249798
+
248044
249799
  // src/cli/commands/auth/password-login.ts
248045
- import { dirname as dirname16, join as join22 } from "node:path";
249800
+ import { dirname as dirname16, join as join23 } from "node:path";
248046
249801
  async function passwordLoginAction({ log, runTask }, action) {
248047
249802
  const shouldEnable = action === "enable";
248048
249803
  const { project } = await readProjectConfig();
248049
249804
  const configDir = dirname16(project.configPath);
248050
- const authDir = join22(configDir, project.authDir);
249805
+ const authDir = join23(configDir, project.authDir);
248051
249806
  const updated = await runTask("Updating local auth config", async () => {
248052
249807
  const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
248053
249808
  const merged = { ...current, enableUsernamePassword: shouldEnable };
@@ -248067,14 +249822,14 @@ function getPasswordLoginCommand() {
248067
249822
  }
248068
249823
 
248069
249824
  // src/cli/commands/auth/pull.ts
248070
- import { dirname as dirname17, join as join23 } from "node:path";
249825
+ import { dirname as dirname17, join as join24 } from "node:path";
248071
249826
  async function pullAuthAction({
248072
249827
  log,
248073
249828
  runTask
248074
249829
  }) {
248075
249830
  const { project } = await readProjectConfig();
248076
249831
  const configDir = dirname17(project.configPath);
248077
- const authDir = join23(configDir, project.authDir);
249832
+ const authDir = join24(configDir, project.authDir);
248078
249833
  const remoteConfig = await runTask("Fetching auth config from Base44", async () => {
248079
249834
  return await pullAuthConfig();
248080
249835
  }, {
@@ -248138,7 +249893,7 @@ function getAuthPushCommand() {
248138
249893
  }
248139
249894
 
248140
249895
  // src/cli/commands/auth/social-login.ts
248141
- import { dirname as dirname18, join as join24, resolve as resolve7 } from "node:path";
249896
+ import { dirname as dirname18, join as join25, resolve as resolve7 } from "node:path";
248142
249897
  var PROVIDER_LABELS = {
248143
249898
  google: "Google",
248144
249899
  microsoft: "Microsoft",
@@ -248209,7 +249964,7 @@ async function socialLoginAction({ log, isNonInteractive, runTask }, provider, a
248209
249964
  }
248210
249965
  const { project } = await readProjectConfig();
248211
249966
  const configDir = dirname18(project.configPath);
248212
- const authDir = join24(configDir, project.authDir);
249967
+ const authDir = join25(configDir, project.authDir);
248213
249968
  const { config: updated } = await runTask("Updating local auth config", async () => updateSocialLoginConfig(authDir, provider, shouldEnable, useCustomOAuth && options.clientId ? { clientId: options.clientId } : undefined));
248214
249969
  if (clientSecret) {
248215
249970
  await runTask("Saving client secret", async () => pushCustomOAuthSecret(provider, clientSecret));
@@ -248234,7 +249989,7 @@ function getSocialLoginCommand() {
248234
249989
  }
248235
249990
 
248236
249991
  // src/cli/commands/auth/sso.ts
248237
- import { dirname as dirname19, join as join25, resolve as resolve8 } from "node:path";
249992
+ import { dirname as dirname19, join as join26, resolve as resolve8 } from "node:path";
248238
249993
  var SSOConfigFileSchema = object({
248239
249994
  provider: _enum(Object.values(KNOWN_SSO_PROVIDERS)),
248240
249995
  clientId: string2(),
@@ -248398,7 +250153,7 @@ async function ssoEnableAction({ isNonInteractive, runTask }, options) {
248398
250153
  }
248399
250154
  const { project } = await readProjectConfig();
248400
250155
  const configDir = dirname19(project.configPath);
248401
- const authDir = join25(configDir, project.authDir);
250156
+ const authDir = join26(configDir, project.authDir);
248402
250157
  await runTask("Updating local auth config", async () => updateSSOConfig(authDir, provider, true));
248403
250158
  await runTask("Saving SSO credentials", async () => pushSSOSecrets(secrets));
248404
250159
  return {
@@ -248414,7 +250169,7 @@ async function ssoDisableAction({ log, runTask }, options) {
248414
250169
  }
248415
250170
  const { project } = await readProjectConfig();
248416
250171
  const configDir = dirname19(project.configPath);
248417
- const authDir = join25(configDir, project.authDir);
250172
+ const authDir = join26(configDir, project.authDir);
248418
250173
  const updated = await runTask("Updating local auth config", async () => updateSSOConfig(authDir, null, false));
248419
250174
  await runTask("Removing SSO credentials", async () => deleteSSOSecrets());
248420
250175
  if (!hasAnyLoginMethod(updated)) {
@@ -249296,13 +251051,13 @@ function getConnectorsListAvailableCommand() {
249296
251051
  }
249297
251052
 
249298
251053
  // src/cli/commands/connectors/pull.ts
249299
- import { dirname as dirname20, join as join26, resolve as resolve9 } from "node:path";
251054
+ import { dirname as dirname20, join as join27, resolve as resolve9 } from "node:path";
249300
251055
  async function resolveConnectorsDir(options) {
249301
251056
  if (!getAppContext().projectRoot) {
249302
251057
  return resolve9(options.dir ?? "connectors");
249303
251058
  }
249304
251059
  const { project } = await readProjectConfig();
249305
- return join26(dirname20(project.configPath), project.connectorsDir);
251060
+ return join27(dirname20(project.configPath), project.connectorsDir);
249306
251061
  }
249307
251062
  async function pullConnectorsAction({ log, runTask, jsonMode }, options) {
249308
251063
  const connectorsDir = await resolveConnectorsDir(options);
@@ -249689,11 +251444,11 @@ function getListCommand() {
249689
251444
  }
249690
251445
 
249691
251446
  // src/cli/commands/functions/pull.ts
249692
- import { dirname as dirname21, join as join27 } from "node:path";
251447
+ import { dirname as dirname21, join as join28 } from "node:path";
249693
251448
  async function pullFunctionsAction({ log, runTask }, name) {
249694
251449
  const { project, functions } = await readProjectConfig();
249695
251450
  const configDir = dirname21(project.configPath);
249696
- const functionsDir = join27(configDir, project.functionsDir);
251451
+ const functionsDir = join28(configDir, project.functionsDir);
249697
251452
  const pluginFunctionNames = new Set(functions.filter((fn) => fn.source.type === "plugin").map((fn) => fn.name));
249698
251453
  const remoteFunctions = await runTask("Fetching functions from Base44", async () => {
249699
251454
  const { functions } = await listDeployedFunctions();
@@ -249807,7 +251562,7 @@ import { basename as basename6, resolve as resolve11 } from "node:path";
249807
251562
  var import_kebabCase = __toESM(require_kebabCase(), 1);
249808
251563
 
249809
251564
  // src/cli/commands/project/scaffold-shared.ts
249810
- import { join as join28 } from "node:path";
251565
+ import { join as join29 } from "node:path";
249811
251566
  var DEFAULT_TEMPLATE_ID = "backend-only";
249812
251567
  async function getTemplateById(templateId) {
249813
251568
  const templates = await listTemplates();
@@ -249870,7 +251625,7 @@ async function completeProjectSetup({
249870
251625
  env: { VITE_BASE44_APP_ID: projectId }
249871
251626
  })`${buildCommand}`;
249872
251627
  updateMessage("Deploying site...");
249873
- return await deploySite(join28(resolvedPath, outputDirectory));
251628
+ return await deploySite(join29(resolvedPath, outputDirectory));
249874
251629
  }, {
249875
251630
  successMessage: theme.colors.base44Orange("Site deployed successfully"),
249876
251631
  errorMessage: "Failed to deploy site"
@@ -250886,7 +252641,7 @@ async function setEnvironmentVersion(environment, versionId, options = {}) {
250886
252641
  }
250887
252642
  // src/core/version/artifacts.ts
250888
252643
  import { createHash as createHash3 } from "node:crypto";
250889
- import { join as join29, resolve as resolve13 } from "node:path";
252644
+ import { join as join30, resolve as resolve13 } from "node:path";
250890
252645
 
250891
252646
  // src/core/version/functions.ts
250892
252647
  import { createHash as createHash2 } from "node:crypto";
@@ -253161,10 +254916,6 @@ var STATIC_EGRESS_ENABLED_ENV = "BASE44_STATIC_EGRESS_ENABLED";
253161
254916
  var STATIC_EGRESS_DIAGNOSTIC_LIMIT = 5;
253162
254917
  var staticEgressFetchInstalled = false;
253163
254918
  var staticEgressDiagnosticCount = 0;
253164
- var dedicatedEgressResponses = /* @__PURE__ */ new WeakSet();
253165
- function isDedicatedEgressResponse(response) {
253166
- return dedicatedEgressResponses.has(response);
253167
- }
253168
254919
  function inputKind(input) {
253169
254920
  if (typeof input === "string") return "string";
253170
254921
  return input instanceof URL ? "url" : "request";
@@ -253266,10 +255017,7 @@ function createRequestScopedStaticEgressFetch(originalFetch, readEnvironment) {
253266
255017
  return originalFetch(input, init);
253267
255018
  }
253268
255019
  logStaticEgressDecision("dedicated", input, binding, enableSecret);
253269
- return binding.fetch(input, init).then((response) => {
253270
- dedicatedEgressResponses.add(response);
253271
- return response;
253272
- });
255020
+ return binding.fetch(input, init);
253273
255021
  };
253274
255022
  }
253275
255023
  function installStaticEgressFetch() {
@@ -253281,128 +255029,6 @@ function installStaticEgressFetch() {
253281
255029
  staticEgressFetchInstalled = true;
253282
255030
  }
253283
255031
 
253284
- // src/edge-errors.ts
253285
- var EDGE_ERRORS_HEADER = "X-B44-Edge-Errors";
253286
- var MAX_EDGE_ERRORS = 5;
253287
- var MAX_INSPECTED_BODY_BYTES = 8192;
253288
- var BODY_READ_TIMEOUT_MS = 500;
253289
- var PLAIN_TEXT_EDGE_ERROR = /^error code: (\\d{3,4})\\s*$/;
253290
- var UNBRANDED_5XX_PAGE = /<center>cloudflare<\\/center>/i;
253291
- var SAFE_VALUE = /^[\\x20-\\x7e]{1,253}$/;
253292
- function safe(value) {
253293
- return typeof value === "string" && SAFE_VALUE.test(value) ? value : void 0;
253294
- }
253295
- function parseEdgeErrorBody(body, status) {
253296
- const plain = PLAIN_TEXT_EDGE_ERROR.exec(body);
253297
- if (plain) return { code: Number(plain[1]) };
253298
- if (status >= 500 && UNBRANDED_5XX_PAGE.test(body)) return { code: status };
253299
- try {
253300
- const json = JSON.parse(body);
253301
- if (json === null || typeof json !== "object") return null;
253302
- const fields = json;
253303
- if (fields.cloudflare_error !== true || !Number.isInteger(fields.error_code)) return null;
253304
- return {
253305
- code: fields.error_code,
253306
- name: safe(fields.error_name),
253307
- category: safe(fields.error_category),
253308
- zone: safe(fields.zone)
253309
- };
253310
- } catch {
253311
- return null;
253312
- }
253313
- }
253314
- async function readBodyPrefix(response) {
253315
- if (Number(response.headers.get("content-length")) > MAX_INSPECTED_BODY_BYTES) return null;
253316
- const reader = response.clone().body?.getReader();
253317
- if (!reader) return "";
253318
- const timer = setTimeout(() => reader.cancel().catch(() => {
253319
- }), BODY_READ_TIMEOUT_MS);
253320
- const decoder = new TextDecoder();
253321
- let text = "";
253322
- let size = 0;
253323
- try {
253324
- for (; ; ) {
253325
- const { done, value } = await reader.read();
253326
- if (done) break;
253327
- size += value.byteLength;
253328
- if (size > MAX_INSPECTED_BODY_BYTES) return null;
253329
- text += decoder.decode(value, { stream: true });
253330
- }
253331
- } catch {
253332
- return null;
253333
- } finally {
253334
- clearTimeout(timer);
253335
- reader.cancel().catch(() => {
253336
- });
253337
- }
253338
- return text + decoder.decode();
253339
- }
253340
- async function readEdgeError(response) {
253341
- if (response.status < 400 || !response.headers.get("cf-ray")) return null;
253342
- if (response.headers.get("cf-mitigated") === "challenge") {
253343
- return { code: response.status, name: "challenge" };
253344
- }
253345
- const body = await readBodyPrefix(response);
253346
- return body === null ? null : parseEdgeErrorBody(body, response.status);
253347
- }
253348
- function targetOrigin(input) {
253349
- try {
253350
- const raw = input instanceof URL ? input.href : typeof input === "string" ? input : input.url;
253351
- return new URL(raw).origin;
253352
- } catch {
253353
- return null;
253354
- }
253355
- }
253356
- async function recordEdgeError(input, response, startedAt) {
253357
- const store = currentWorkerRuntimeContext();
253358
- if (!store) return;
253359
- const body = await readEdgeError(response);
253360
- const target = targetOrigin(input);
253361
- if (!body || !target) return;
253362
- const record = store.edgeErrors ??= { errors: [], dropped: 0 };
253363
- if (record.errors.length >= MAX_EDGE_ERRORS) {
253364
- record.dropped += 1;
253365
- return;
253366
- }
253367
- record.errors.push({
253368
- ...body,
253369
- target,
253370
- status: response.status,
253371
- ray: safe(response.headers.get("cf-ray")) ?? "",
253372
- egress: isDedicatedEgressResponse(response) ? "dedicated" : "shared",
253373
- elapsed_ms: Date.now() - startedAt
253374
- });
253375
- }
253376
- function createEdgeErrorFetch(innerFetch) {
253377
- return async (input, init) => {
253378
- const startedAt = Date.now();
253379
- const response = await innerFetch(input, init);
253380
- try {
253381
- await recordEdgeError(input, response, startedAt);
253382
- } catch {
253383
- }
253384
- return response;
253385
- };
253386
- }
253387
- var edgeErrorFetchInstalled = false;
253388
- function installEdgeErrorFetch() {
253389
- if (edgeErrorFetchInstalled) return;
253390
- globalThis.fetch = createEdgeErrorFetch(globalThis.fetch.bind(globalThis));
253391
- edgeErrorFetchInstalled = true;
253392
- }
253393
- function attachEdgeErrors(response) {
253394
- const record = currentWorkerRuntimeContext()?.edgeErrors;
253395
- if (!record || !(response instanceof Response)) return response;
253396
- if (response.status === 101 || response.webSocket) return response;
253397
- try {
253398
- const wrapped = new Response(response.body, response);
253399
- wrapped.headers.set(EDGE_ERRORS_HEADER, JSON.stringify(record));
253400
- return wrapped;
253401
- } catch {
253402
- return response;
253403
- }
253404
- }
253405
-
253406
255032
  // src/static-egress-tcp-core.mjs
253407
255033
  function normalizeHost(host) {
253408
255034
  return host.toLowerCase().replace(/^\\[(.*)\\]$/, "$1").replace(/\\.$/, "");
@@ -253531,6 +255157,12 @@ var deno2 = Object.freeze({
253531
255157
  });
253532
255158
  globalThis.Deno = deno2;
253533
255159
  globalThis.Buffer = Buffer2;
255160
+ try {
255161
+ new AsyncLocalStorage().enterWith(void 0);
255162
+ } catch {
255163
+ AsyncLocalStorage.prototype.enterWith = () => {
255164
+ };
255165
+ }
253534
255166
  function getRegisteredHandler() {
253535
255167
  return registeredHandler;
253536
255168
  }
@@ -253556,9 +255188,7 @@ function resolveHandler(functionName) {
253556
255188
  return handler;
253557
255189
  }
253558
255190
  export {
253559
- attachEdgeErrors,
253560
255191
  getRegisteredHandler,
253561
- installEdgeErrorFetch,
253562
255192
  installStaticEgressFetch,
253563
255193
  registerLazy,
253564
255194
  resolveHandler
@@ -256498,7 +258128,7 @@ var TELEMETRY_PATCH = [
256498
258128
  var TELEMETRY_STORE_FIELDS = "reqId: crypto.randomUUID(), respondedAt: null, inflight: new Map(), inflightTotal: 0, hadRejection: false, hadNonOk: false, logBudget: 5";
256499
258129
 
256500
258130
  // ../functions-compiler/src/version.ts
256501
- var COMPILER_VERSION = "0.1.7";
258131
+ var COMPILER_VERSION = "0.1.8";
256502
258132
 
256503
258133
  // ../functions-compiler/src/worker-entry.ts
256504
258134
  function denoShimSource() {
@@ -256603,22 +258233,20 @@ registerLazy(${JSON.stringify(functionName)}, () => import(${JSON.stringify(user
256603
258233
  function buildAppEntrySource(functionModules, telemetry, runtimeSecrets = false) {
256604
258234
  const moduleImports = functionModules.map((file) => `import "./${file}";`).join(`
256605
258235
  `);
256606
- const handlerExpr = `_b44AttachInvocationLogs(_b44AttachEdgeErrors(${telemetry ? "_b44AttachTelemetry(await handler(request, info))" : "await handler(request, info)"}))`;
258236
+ const handlerExpr = `_b44AttachInvocationLogs(${telemetry ? "_b44AttachTelemetry(await handler(request, info))" : "await handler(request, info)"})`;
256607
258237
  const guard = activationGuard(runtimeSecrets);
256608
258238
  const returnExpr = guard(handlerExpr);
256609
258239
  return `// Auto-generated by the base44 bundler. Do not edit.
256610
258240
 
256611
258241
  import { currentWorkerRuntimeContext as _b44Context, runWithWorkerEnvironment as _b44Run } from ${JSON.stringify(RUNTIME_CONTEXT_SPECIFIER)};
256612
- import { attachEdgeErrors as _b44AttachEdgeErrors, installEdgeErrorFetch, installStaticEgressFetch, resolveHandler } from "./${SHIM_FILENAME}";${activationImport(runtimeSecrets)}
258242
+ import { installStaticEgressFetch, resolveHandler } from "./${SHIM_FILENAME}";${activationImport(runtimeSecrets)}
256613
258243
  ${moduleImports}
256614
258244
 
256615
258245
  ${consolePatch(runtimeSecrets)}
256616
258246
  ${INVOCATION_LOGS_PATCH}
256617
- // Static egress reads workerEnv from the active request store. Install it and
256618
- // the edge-error recorder before telemetry so telemetry remains the outermost
256619
- // fetch wrapper.
258247
+ // Static egress reads workerEnv from the active request store. Install it
258248
+ // before telemetry so telemetry remains the outermost fetch wrapper.
256620
258249
  installStaticEgressFetch();
256621
- installEdgeErrorFetch();
256622
258250
  ${telemetry ? TELEMETRY_PATCH : ""}
256623
258251
 
256624
258252
  export default {
@@ -261124,6 +262752,174 @@ function runtimeVirtualPlugin() {
261124
262752
  };
261125
262753
  }
261126
262754
 
262755
+ // ../functions-compiler/src/esbuild/ws-native-virtual.ts
262756
+ var NAMESPACE4 = "base44-ws-native";
262757
+ var WS_SPECIFIER = /^(npm:)?ws(@[^/]+)?$/;
262758
+ var ADAPTER = `"use strict";
262759
+ const toBuffer = (value) => (globalThis.Buffer ? globalThis.Buffer.from(value) : value);
262760
+ const READY_STATES = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
262761
+ const later = (fn, ...args) => queueMicrotask(() => fn(...args));
262762
+ const upgradeHeaders = (options) => {
262763
+ const headers = new Headers(options?.headers);
262764
+ for (const name of headers.keys()) if (name !== "user-agent") return headers;
262765
+ return null;
262766
+ };
262767
+ class WebSocket {
262768
+ static CONNECTING = 0;
262769
+ static OPEN = 1;
262770
+ static CLOSING = 2;
262771
+ static CLOSED = 3;
262772
+ #socket = null;
262773
+ #state = 0;
262774
+ #url;
262775
+ #closeRequested = null;
262776
+ #terminated = false;
262777
+ #listeners = new Map();
262778
+ constructor(address, protocols, options) {
262779
+ if (protocols && typeof protocols === "object" && !Array.isArray(protocols)) {
262780
+ options = protocols;
262781
+ protocols = undefined;
262782
+ }
262783
+ this.#url = String(address);
262784
+ const headers = upgradeHeaders(options);
262785
+ if (headers) {
262786
+ this.#upgrade(headers, protocols);
262787
+ } else {
262788
+ this.#attach(new globalThis.WebSocket(this.#url, protocols));
262789
+ }
262790
+ }
262791
+ get readyState() {
262792
+ if (this.#terminated) return 3;
262793
+ return this.#socket ? this.#socket.readyState : this.#state;
262794
+ }
262795
+ get url() { return this.#url; }
262796
+ get protocol() { return this.#socket ? this.#socket.protocol ?? "" : ""; }
262797
+ on(name, listener) { return this.#add(name, listener, false); }
262798
+ addListener(name, listener) { return this.#add(name, listener, false); }
262799
+ once(name, listener) { return this.#add(name, listener, true); }
262800
+ off(name, listener) { return this.removeListener(name, listener); }
262801
+ removeListener(name, listener) {
262802
+ const listeners = this.#listeners.get(name);
262803
+ if (listeners) this.#listeners.set(name, listeners.filter((entry) => entry.listener !== listener));
262804
+ return this;
262805
+ }
262806
+ removeAllListeners(name) {
262807
+ if (name === undefined) this.#listeners.clear();
262808
+ else this.#listeners.delete(name);
262809
+ return this;
262810
+ }
262811
+ emit(name, ...args) {
262812
+ const listeners = this.#listeners.get(name) ?? [];
262813
+ this.#listeners.set(name, listeners.filter((entry) => !entry.once));
262814
+ for (const entry of listeners) entry.listener.apply(this, args);
262815
+ return listeners.length > 0;
262816
+ }
262817
+ send(data, options, callback) {
262818
+ const done = typeof options === "function" ? options : callback;
262819
+ try {
262820
+ if (!this.#socket) {
262821
+ throw new Error("WebSocket is not open: readyState " + this.#state + " (" + READY_STATES[this.#state] + ")");
262822
+ }
262823
+ this.#socket.send(data);
262824
+ done?.();
262825
+ } catch (error) {
262826
+ if (!done) throw error;
262827
+ done(error);
262828
+ }
262829
+ }
262830
+ close(code, reason) {
262831
+ if (this.#socket) this.#socket.close(code, reason);
262832
+ else if (this.#state === 0) {
262833
+ // Upgrade still in flight: close as soon as it lands.
262834
+ this.#closeRequested = [code, reason];
262835
+ this.#state = 2;
262836
+ }
262837
+ }
262838
+ // \`ws\` tears the connection down at once. workerd has no abrupt close, so the
262839
+ // socket is closed normally and "close" is reported now, not on the reply.
262840
+ terminate() {
262841
+ if (this.#terminated || this.readyState === 3) return;
262842
+ this.#terminated = true;
262843
+ if (this.#socket) {
262844
+ try { this.#socket.close(); } catch {}
262845
+ } else {
262846
+ // Upgrade still in flight: close it on arrival, without an "open".
262847
+ this.#closeRequested = [];
262848
+ this.#state = 3;
262849
+ }
262850
+ later(() => this.emit("close", 1006, toBuffer("")));
262851
+ }
262852
+ #attach(socket) {
262853
+ this.#socket = socket;
262854
+ try { socket.binaryType = "arraybuffer"; } catch {}
262855
+ socket.addEventListener("open", () => this.emit("open"));
262856
+ socket.addEventListener("message", (event) => {
262857
+ const isBinary = typeof event.data !== "string";
262858
+ this.emit("message", toBuffer(isBinary ? new Uint8Array(event.data) : event.data), isBinary);
262859
+ });
262860
+ socket.addEventListener("error", (event) => this.emit("error", event.error ?? new Error(event.message || "WebSocket error")));
262861
+ socket.addEventListener("close", (event) => {
262862
+ if (!this.#terminated) this.emit("close", event.code, toBuffer(event.reason ?? ""));
262863
+ });
262864
+ }
262865
+ #upgrade(headers, protocols) {
262866
+ headers.set("Upgrade", "websocket");
262867
+ if (protocols) headers.set("Sec-WebSocket-Protocol", [].concat(protocols).join(", "));
262868
+ const httpUrl = this.#url.replace(/^ws(s?):/i, "http$1:");
262869
+ const fail = (error) => {
262870
+ this.#state = 3;
262871
+ if (this.#terminated) return;
262872
+ this.emit("error", error);
262873
+ this.emit("close", 1006, toBuffer(""));
262874
+ };
262875
+ // Two-argument then(): an exception from an "open" listener must not be
262876
+ // reported as a failed upgrade.
262877
+ fetch(httpUrl, { headers }).then((response) => {
262878
+ const socket = response.webSocket;
262879
+ if (!socket) {
262880
+ response.body?.cancel();
262881
+ return fail(new Error("Unexpected server response: " + response.status));
262882
+ }
262883
+ socket.accept();
262884
+ this.#attach(socket);
262885
+ if (this.#closeRequested) return socket.close(...this.#closeRequested);
262886
+ // accept() opens the socket without dispatching an "open" event.
262887
+ this.emit("open");
262888
+ }, fail);
262889
+ }
262890
+ #add(name, listener, once) {
262891
+ const listeners = this.#listeners.get(name) ?? [];
262892
+ listeners.push({ listener, once });
262893
+ this.#listeners.set(name, listeners);
262894
+ return this;
262895
+ }
262896
+ }
262897
+ class WebSocketServer {
262898
+ constructor() {
262899
+ throw new Error("ws WebSocketServer is not available in Base44 functions: a function can open WebSocket connections but cannot listen for them.");
262900
+ }
262901
+ }
262902
+ module.exports = WebSocket;
262903
+ module.exports.WebSocket = WebSocket;
262904
+ module.exports.WebSocketServer = WebSocketServer;
262905
+ module.exports.default = WebSocket;
262906
+ `;
262907
+ function wsNativeVirtualPlugin() {
262908
+ return {
262909
+ name: "base44-ws-native",
262910
+ setup(build) {
262911
+ build.onResolve({ filter: WS_SPECIFIER }, () => ({
262912
+ path: "ws",
262913
+ namespace: NAMESPACE4
262914
+ }));
262915
+ build.onLoad({ filter: /.*/, namespace: NAMESPACE4 }, () => ({
262916
+ contents: ADAPTER,
262917
+ loader: "js"
262918
+ }));
262919
+ }
262920
+ };
262921
+ }
262922
+
261127
262923
  // ../functions-compiler/src/deno-bundle.ts
261128
262924
  async function bundleToModule(prepared, nodeModulesDir = "none") {
261129
262925
  const dir = await mkdtemp(path21.join(tmpdir2(), "b44-bundle-"));
@@ -261147,6 +262943,7 @@ async function bundleToModule(prepared, nodeModulesDir = "none") {
261147
262943
  sourcemap: false,
261148
262944
  logLevel: "silent",
261149
262945
  plugins: [
262946
+ wsNativeVirtualPlugin(),
261150
262947
  nodeBuiltinRequirePlugin(),
261151
262948
  userFilesPlugin(prepared.files, prepared.entry),
261152
262949
  privateDataSourcesVirtualPlugin(),
@@ -261771,14 +263568,14 @@ async function readRawResources(dir) {
261771
263568
  const payloads = {};
261772
263569
  for (const relativePath of files.sort()) {
261773
263570
  const name = relativePath.replace(/\.jsonc?$/, "");
261774
- payloads[name] = await readJsonFile(join29(dir, ...relativePath.split("/")));
263571
+ payloads[name] = await readJsonFile(join30(dir, ...relativePath.split("/")));
261775
263572
  }
261776
263573
  return payloads;
261777
263574
  }
261778
263575
  async function collectResources(configDir, dirs) {
261779
263576
  const [entities, agents] = await Promise.all([
261780
- readRawResources(join29(configDir, dirs.entitiesDir)),
261781
- readRawResources(join29(configDir, dirs.agentsDir))
263577
+ readRawResources(join30(configDir, dirs.entitiesDir)),
263578
+ readRawResources(join30(configDir, dirs.agentsDir))
261782
263579
  ]);
261783
263580
  return { entities, agents };
261784
263581
  }
@@ -261790,7 +263587,7 @@ async function collectArtifacts(target) {
261790
263587
  entryFile: ENTRY2
261791
263588
  }),
261792
263589
  ...siteWorker ? { siteWorker } : {},
261793
- backendBundles: await tagStep2("build", () => compileBackendBundles(target.root, join29(target.configDir, target.functionsDir))),
263590
+ backendBundles: await tagStep2("build", () => compileBackendBundles(target.root, join30(target.configDir, target.functionsDir))),
261794
263591
  ...await collectResources(target.configDir, target)
261795
263592
  };
261796
263593
  }
@@ -262007,7 +263804,7 @@ function writeFile3(appId, params) {
262007
263804
  function editFile(appId, params) {
262008
263805
  return callTool(appId, "edit_file", { ...params }, EditFileResponseSchema, `editing file "${params.path}"`);
262009
263806
  }
262010
- function grep(appId, params) {
263807
+ function grep2(appId, params) {
262011
263808
  return callTool(appId, "grep", { ...params }, GrepResponseSchema, "searching files");
262012
263809
  }
262013
263810
  function runCommand(appId, params) {
@@ -262111,10 +263908,10 @@ Examples:
262111
263908
  }
262112
263909
 
262113
263910
  // src/cli/commands/sandbox/grep.ts
262114
- async function grepAction({ runTask, branchId }, pattern, options) {
263911
+ async function grepAction2({ runTask, branchId }, pattern, options) {
262115
263912
  const { id: appId } = getAppContext();
262116
263913
  const maxResults = parsePositiveInt(options.maxResults, "--max-results");
262117
- const result = await runTask("Searching files", () => grep(appId, {
263914
+ const result = await runTask("Searching files", () => grep2(appId, {
262118
263915
  pattern,
262119
263916
  path: options.path,
262120
263917
  is_regex: options.regex,
@@ -262126,7 +263923,7 @@ async function grepAction({ runTask, branchId }, pattern, options) {
262126
263923
  return { outroMessage: "Searched files", stdout: toJsonStdout(result) };
262127
263924
  }
262128
263925
  function getSandboxGrepCommand() {
262129
- return new Base44Command("grep", { supportsBranch: true }).description("Search files for a pattern in an app's remote sandbox").argument("<pattern>", "Search pattern").option("--path <path>", "Subtree to search, relative to the app root").option("--no-regex", "Treat the pattern as a literal string, not a regex").option("--case-sensitive", "Case-sensitive match").option("--glob <glob>", 'File glob filter, e.g. "*.tsx"').option("--max-results <n>", "Maximum number of match lines to return").action(grepAction);
263926
+ return new Base44Command("grep", { supportsBranch: true }).description("Search files for a pattern in an app's remote sandbox").argument("<pattern>", "Search pattern").option("--path <path>", "Subtree to search, relative to the app root").option("--no-regex", "Treat the pattern as a literal string, not a regex").option("--case-sensitive", "Case-sensitive match").option("--glob <glob>", 'File glob filter, e.g. "*.tsx"').option("--max-results <n>", "Maximum number of match lines to return").action(grepAction2);
262130
263927
  }
262131
263928
 
262132
263929
  // src/cli/commands/sandbox/list-directory.ts
@@ -262721,10 +264518,10 @@ function toPascalCase(name) {
262721
264518
  return name.split(/[-_\s]+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join("");
262722
264519
  }
262723
264520
  // src/core/types/update-project.ts
262724
- import { join as join33 } from "node:path";
264521
+ import { join as join34 } from "node:path";
262725
264522
  var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
262726
264523
  async function updateProjectConfig(projectRoot) {
262727
- const tsconfigPath = join33(projectRoot, "tsconfig.json");
264524
+ const tsconfigPath = join34(projectRoot, "tsconfig.json");
262728
264525
  if (!await pathExists(tsconfigPath)) {
262729
264526
  return false;
262730
264527
  }
@@ -262943,7 +264740,7 @@ function rethrowLegacyAppAsExplanation(error) {
262943
264740
 
262944
264741
  // src/cli/commands/workflows/limit.ts
262945
264742
  var MAX_LIMIT = 200;
262946
- function parseLimit(limit) {
264743
+ function parseLimit2(limit) {
262947
264744
  if (limit === undefined)
262948
264745
  return;
262949
264746
  const parsed = Number.parseInt(limit, 10);
@@ -262960,7 +264757,7 @@ function formatWorkflowLine(workflow) {
262960
264757
  return `${workflow.name} [${workflow.status}] runs: ${workflow.totalRuns}, ${lastRun}${failures}`;
262961
264758
  }
262962
264759
  async function listAction({ log, runTask, jsonMode }, options) {
262963
- const limit = parseLimit(options.limit);
264760
+ const limit = parseLimit2(options.limit);
262964
264761
  const workflows = await runTask("Fetching workflows from Base44", async () => listWorkflows(limit).catch(rethrowLegacyAppAsExplanation), {
262965
264762
  successMessage: "Workflows fetched successfully",
262966
264763
  errorMessage: "Failed to fetch workflows"
@@ -263019,7 +264816,7 @@ async function describeEmptyResult(hasFilters) {
263019
264816
  return hasFilters ? `No runs match your filters. Workflows in this app: ${names}.` : `No runs yet. Workflows in this app: ${names}.`;
263020
264817
  }
263021
264818
  async function runsAction(ctx, options) {
263022
- const limit = parseLimit(options.limit);
264819
+ const limit = parseLimit2(options.limit);
263023
264820
  const runs = await ctx.runTask("Fetching workflow runs from Base44", async () => listWorkflowRuns({
263024
264821
  status: options.status,
263025
264822
  since: options.since,
@@ -263205,7 +265002,7 @@ function getWorkspaceCommand() {
263205
265002
  // src/cli/dev/dev-server/main.ts
263206
265003
  var import_cors = __toESM(require_lib4(), 1);
263207
265004
  var import_express6 = __toESM(require_express(), 1);
263208
- import { dirname as dirname27, join as join38 } from "node:path";
265005
+ import { dirname as dirname27, join as join39 } from "node:path";
263209
265006
 
263210
265007
  // ../../node_modules/get-port/index.js
263211
265008
  import net from "node:net";
@@ -263335,7 +265132,7 @@ var $tmpName = promisify12(tmp.tmpName);
263335
265132
 
263336
265133
  // src/cli/dev/dev-server/function-manager.ts
263337
265134
  import { spawn as spawn3 } from "node:child_process";
263338
- import { dirname as dirname24, join as join34 } from "node:path";
265135
+ import { dirname as dirname24, join as join35 } from "node:path";
263339
265136
  import { pathToFileURL as pathToFileURL6 } from "node:url";
263340
265137
 
263341
265138
  // src/cli/dev/dev-server/base-function-manager.ts
@@ -263440,7 +265237,7 @@ class FunctionManager extends BaseFunctionManager {
263440
265237
  }
263441
265238
  spawnFunction(func, port) {
263442
265239
  this.logger.log(`Spawning function "${func.name}" on port ${port}`);
263443
- const importMapPath = join34(dirname24(this.wrapperPath), "import-map.json");
265240
+ const importMapPath = join35(dirname24(this.wrapperPath), "import-map.json");
263444
265241
  const process2 = spawn3("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
263445
265242
  env: {
263446
265243
  ...globalThis.process.env,
@@ -263514,7 +265311,7 @@ class FunctionManager extends BaseFunctionManager {
263514
265311
  import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
263515
265312
  import { isBuiltin as isBuiltin3 } from "node:module";
263516
265313
  import { homedir as homedir4 } from "node:os";
263517
- import { join as join35 } from "node:path";
265314
+ import { join as join36 } from "node:path";
263518
265315
  import { pathToFileURL as pathToFileURL7 } from "node:url";
263519
265316
  var depsPromise;
263520
265317
  function loadDeps() {
@@ -263635,9 +265432,9 @@ export default {
263635
265432
  };
263636
265433
  `;
263637
265434
  function ensureBundlerConfig() {
263638
- const dir = join35(homedir4(), ".base44", "function-bundler");
265435
+ const dir = join36(homedir4(), ".base44", "function-bundler");
263639
265436
  mkdirSync2(dir, { recursive: true });
263640
- const configPath = join35(dir, "deno.json");
265437
+ const configPath = join36(dir, "deno.json");
263641
265438
  writeFileSync2(configPath, `${JSON.stringify({ nodeModulesDir: "auto" }, null, 2)}
263642
265439
  `);
263643
265440
  return configPath;
@@ -265174,11 +266971,11 @@ import { relative as relative10 } from "node:path";
265174
266971
  // ../../node_modules/chokidar/index.js
265175
266972
  import { EventEmitter as EventEmitter3 } from "node:events";
265176
266973
  import { stat as statcb, Stats } from "node:fs";
265177
- import { readdir as readdir3, stat as stat6 } from "node:fs/promises";
266974
+ import { readdir as readdir3, stat as stat7 } from "node:fs/promises";
265178
266975
  import * as sp3 from "node:path";
265179
266976
 
265180
266977
  // ../../node_modules/readdirp/index.js
265181
- import { lstat as lstat2, readdir as readdir2, realpath, stat as stat4 } from "node:fs/promises";
266978
+ import { lstat as lstat2, readdir as readdir2, realpath, stat as stat5 } from "node:fs/promises";
265182
266979
  import { join as pjoin, relative as prelative, resolve as presolve, sep as psep } from "node:path";
265183
266980
  import { Readable as Readable6 } from "node:stream";
265184
266981
  var EntryTypes = {
@@ -265187,7 +266984,7 @@ var EntryTypes = {
265187
266984
  FILE_DIR_TYPE: "files_directories",
265188
266985
  EVERYTHING_TYPE: "all"
265189
266986
  };
265190
- var defaultOptions = {
266987
+ var defaultOptions2 = {
265191
266988
  root: ".",
265192
266989
  fileFilter: (_entryInfo) => true,
265193
266990
  directoryFilter: (_entryInfo) => true,
@@ -265197,7 +266994,7 @@ var defaultOptions = {
265197
266994
  alwaysStat: false,
265198
266995
  highWaterMark: 4096
265199
266996
  };
265200
- Object.freeze(defaultOptions);
266997
+ Object.freeze(defaultOptions2);
265201
266998
  var RECURSIVE_ERROR_CODE = "READDIRP_RECURSIVE_ERROR";
265202
266999
  var NORMAL_FLOW_ERRORS = new Set(["ENOENT", "EPERM", "EACCES", "ELOOP", RECURSIVE_ERROR_CODE]);
265203
267000
  var ALL_TYPES = [
@@ -265256,17 +267053,17 @@ class ReaddirpStream extends Readable6 {
265256
267053
  autoDestroy: true,
265257
267054
  highWaterMark: options.highWaterMark
265258
267055
  });
265259
- const opts = { ...defaultOptions, ...options };
267056
+ const opts = { ...defaultOptions2, ...options };
265260
267057
  const { root, type } = opts;
265261
267058
  this._fileFilter = normalizeFilter(opts.fileFilter);
265262
267059
  this._directoryFilter = normalizeFilter(opts.directoryFilter);
265263
- const statMethod = opts.lstat ? lstat2 : stat4;
267060
+ const statMethod = opts.lstat ? lstat2 : stat5;
265264
267061
  if (wantBigintFsStats) {
265265
267062
  this._stat = (path) => statMethod(path, { bigint: true });
265266
267063
  } else {
265267
267064
  this._stat = statMethod;
265268
267065
  }
265269
- this._maxDepth = opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth : defaultOptions.depth;
267066
+ this._maxDepth = opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth : defaultOptions2.depth;
265270
267067
  this._wantsDir = type ? DIR_TYPES.has(type) : false;
265271
267068
  this._wantsFile = type ? FILE_TYPES2.has(type) : false;
265272
267069
  this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
@@ -265413,7 +267210,7 @@ function readdirp(root, options = {}) {
265413
267210
 
265414
267211
  // ../../node_modules/chokidar/handler.js
265415
267212
  import { watch as fs_watch, unwatchFile, watchFile } from "node:fs";
265416
- import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as stat5 } from "node:fs/promises";
267213
+ import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as stat6 } from "node:fs/promises";
265417
267214
  import { type as osType } from "node:os";
265418
267215
  import * as sp2 from "node:path";
265419
267216
  var STR_DATA = "data";
@@ -265439,7 +267236,7 @@ var EVENTS = {
265439
267236
  };
265440
267237
  var EV = EVENTS;
265441
267238
  var THROTTLE_MODE_WATCH = "watch";
265442
- var statMethods = { lstat: lstat3, stat: stat5 };
267239
+ var statMethods = { lstat: lstat3, stat: stat6 };
265443
267240
  var KEY_LISTENERS = "listeners";
265444
267241
  var KEY_ERR = "errHandlers";
265445
267242
  var KEY_RAW = "rawEmitters";
@@ -265910,7 +267707,7 @@ class NodeFsHandler {
265910
267707
  return;
265911
267708
  if (!newStats || newStats.mtimeMs === 0) {
265912
267709
  try {
265913
- const newStats = await stat5(file);
267710
+ const newStats = await stat6(file);
265914
267711
  if (this.fsw.closed)
265915
267712
  return;
265916
267713
  const at = newStats.atimeMs;
@@ -266582,7 +268379,7 @@ class FSWatcher extends EventEmitter3 {
266582
268379
  const fullPath = opts.cwd ? sp3.join(opts.cwd, path) : path;
266583
268380
  let stats;
266584
268381
  try {
266585
- stats = await stat6(fullPath);
268382
+ stats = await stat7(fullPath);
266586
268383
  } catch (err) {}
266587
268384
  if (!stats || this.closed)
266588
268385
  return;
@@ -266966,8 +268763,8 @@ async function createDevServer(options) {
266966
268763
  broadcastEntityEvent(io, appId, entityName, event);
266967
268764
  };
266968
268765
  const base44ConfigWatcher = new WatchBase44({
266969
- functions: join38(dirname27(project.configPath), project.functionsDir),
266970
- entities: join38(dirname27(project.configPath), project.entitiesDir)
268766
+ functions: join39(dirname27(project.configPath), project.functionsDir),
268767
+ entities: join39(dirname27(project.configPath), project.entitiesDir)
266971
268768
  }, devLogger);
266972
268769
  base44ConfigWatcher.on("change", async (name) => {
266973
268770
  try {
@@ -267170,7 +268967,7 @@ function readExecEnvTarget(env = process.env) {
267170
268967
  // src/core/exec/run-script.ts
267171
268968
  import { spawn as spawn4 } from "node:child_process";
267172
268969
  import { readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
267173
- import { join as join39 } from "node:path";
268970
+ import { join as join40 } from "node:path";
267174
268971
  var SDK_SPECIFIER = '"npm:@base44/sdk"';
267175
268972
  function wrapperSource(sdkVersion) {
267176
268973
  const source = readFileSync4(getExecWrapperPath(), "utf-8");
@@ -267206,7 +269003,7 @@ async function runScript(options) {
267206
269003
  writeFileSync3(tempWrapper.path, wrapperSource(sdkVersion), "utf-8");
267207
269004
  const configDir = await $dir({ unsafeCleanup: true });
267208
269005
  cleanupFns.push(configDir.cleanup);
267209
- const configPath = join39(configDir.path, "deno.json");
269006
+ const configPath = join40(configDir.path, "deno.json");
267210
269007
  writeFileSync3(configPath, JSON.stringify(DENO_CONFIG), "utf-8");
267211
269008
  try {
267212
269009
  const exitCode = await new Promise((resolvePromise) => {
@@ -267478,6 +269275,7 @@ function createProgram(context) {
267478
269275
  program.addCommand(getSecretsCommand());
267479
269276
  program.addCommand(getSandboxCommand());
267480
269277
  program.addCommand(getBranchesCommand());
269278
+ program.addCommand(getApiCommand());
267481
269279
  program.addCommand(getAuthCommand());
267482
269280
  program.addCommand(getSiteCommand());
267483
269281
  if (versionsApiEnabled()) {
@@ -271496,7 +273294,7 @@ function addCommandInfoToErrorReporter(program, errorReporter) {
271496
273294
  // src/cli/index.ts
271497
273295
  var __dirname4 = dirname29(fileURLToPath7(import.meta.url));
271498
273296
  async function runCLI(options) {
271499
- ensureNpmAssets(join40(__dirname4, "../assets"));
273297
+ ensureNpmAssets(join41(__dirname4, "../assets"));
271500
273298
  const errorReporter = new ErrorReporter;
271501
273299
  errorReporter.registerProcessErrorHandlers();
271502
273300
  const jsonMode = process.argv.includes("--json");
@@ -271535,4 +273333,4 @@ export {
271535
273333
  runCLI
271536
273334
  };
271537
273335
 
271538
- //# debugId=45318CD4F94D8EF364756E2164756E21
273336
+ //# debugId=CD2605865A84BE8564756E2164756E21