aiex-cli 0.0.1-beta.9 → 0.0.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +50 -26
  2. package/dist/cli.mjs +1776 -626
  3. package/dist/{completions-ygS1okck.mjs → completions-C3rmTwXZ.mjs} +2 -2
  4. package/dist/core/schema-sqlite/migrate-helper.mjs +35 -37
  5. package/dist/{doctor-BiU1lDp-.mjs → doctor-collector-Cbqgwx__.mjs} +309 -223
  6. package/dist/index.d.mts +15 -15
  7. package/dist/index.mjs +1 -1
  8. package/dist/table-schema.json +4 -0
  9. package/dist/web/assets/AISettings-Cm8fAfaG.js +205 -0
  10. package/dist/web/assets/DataBrowser-DQwOvooY.js +6 -0
  11. package/dist/web/assets/ExtractRunner-CzfLlCCf.js +1 -0
  12. package/dist/web/assets/ExtractionViewer-D7tghmR-.js +1 -0
  13. package/dist/web/assets/JsonSchemaEditor-DXhYW-Un.js +570 -0
  14. package/dist/web/assets/api-client-CIC2X8_4.js +1 -0
  15. package/dist/web/assets/baseinput-B7PU5-38.js +2 -0
  16. package/dist/web/assets/button-Cdgr9Igy.js +927 -0
  17. package/dist/web/assets/checkbox-CCQwMfLd.js +142 -0
  18. package/dist/web/assets/{cssMode-DAbG0CMn.js → cssMode-CCz1uj8b.js} +1 -1
  19. package/dist/web/assets/dialog-8xaIXBKO.js +108 -0
  20. package/dist/web/assets/dist-B5Yem2Jn.js +1 -0
  21. package/dist/web/assets/{editor.main-BqhfoHxy.js → editor.main-DOue-nGf.js} +2 -2
  22. package/dist/web/assets/{freemarker2-B9_5ct2b.js → freemarker2-C87H7V8i.js} +1 -1
  23. package/dist/web/assets/{handlebars-TY59WcoQ.js → handlebars-TLnoktZW.js} +1 -1
  24. package/dist/web/assets/{html-CLULsh27.js → html-Rewbtgcp.js} +1 -1
  25. package/dist/web/assets/{htmlMode-BvG7RNbU.js → htmlMode-Cr9y3YUi.js} +1 -1
  26. package/dist/web/assets/index-BEorm4a5.css +2 -0
  27. package/dist/web/assets/{index-CKUXTDYj.js → index-CWy8KajQ.js} +38 -38
  28. package/dist/web/assets/{javascript-DHrLp6gu.js → javascript-BO8DPECx.js} +1 -1
  29. package/dist/web/assets/{jsonMode-DBDhdzl1.js → jsonMode-B78m_Y1l.js} +1 -1
  30. package/dist/web/assets/{liquid-tGeb-nqF.js → liquid-CDp_8YUE.js} +1 -1
  31. package/dist/web/assets/{mdx-Cmdz78VU.js → mdx-CeR1GULE.js} +1 -1
  32. package/dist/web/assets/{monaco.contribution-CroYPUF5.js → monaco.contribution-tCitzj1_.js} +2 -2
  33. package/dist/web/assets/object-utils-Cm2M3fPO.js +1 -0
  34. package/dist/web/assets/{python-Dmfz4iDE.js → python-DWmB1hQ6.js} +1 -1
  35. package/dist/web/assets/{razor-BJicZHJs.js → razor-BVk762Lq.js} +1 -1
  36. package/dist/web/assets/runtime-dom.esm-bundler-DZwuSnld.js +1 -0
  37. package/dist/web/assets/select-DKPPF403.js +438 -0
  38. package/dist/web/assets/{tsMode-DYqTyE66.js → tsMode-Gjs5D1gt.js} +1 -1
  39. package/dist/web/assets/{typescript-DLnTe9Hf.js → typescript-Cw6YtwrM.js} +1 -1
  40. package/dist/web/assets/utils-CZhxh2Ya.js +2 -0
  41. package/dist/web/assets/{xml-BIYqLORk.js → xml-guZq0YZJ.js} +1 -1
  42. package/dist/web/assets/{yaml-BjmulkMX.js → yaml-B9TbU-LX.js} +1 -1
  43. package/dist/web/index.html +11 -8
  44. package/package.json +17 -1
  45. package/src/core/schema-sqlite/migrate-helper.ts +32 -46
  46. package/dist/web/assets/AISettings-DOzonIux.js +0 -334
  47. package/dist/web/assets/DataBrowser-rznfVRaV.js +0 -3
  48. package/dist/web/assets/JsonSchemaEditor-C9iyQs7N.js +0 -929
  49. package/dist/web/assets/api-client-Dsg4WOM9.js +0 -1
  50. package/dist/web/assets/button-kTMweGMc.js +0 -927
  51. package/dist/web/assets/dialog-CWuu7WjI.js +0 -108
  52. package/dist/web/assets/index-DDFnprdM.css +0 -2
  53. package/dist/web/assets/lib-C30cIFrm.js +0 -1
  54. package/dist/web/assets/overlayeventbus-AtOpmI6n.js +0 -80
  55. package/dist/web/assets/table-schema-mJrrf9qw.js +0 -2
  56. /package/dist/web/assets/{abap-DrZwwXZX.js → abap-C3UM4cME.js} +0 -0
  57. /package/dist/web/assets/{apex-CrCz0btt.js → apex-BQBZvQmN.js} +0 -0
  58. /package/dist/web/assets/{azcli-BapzKHay.js → azcli-Dn9Awrok.js} +0 -0
  59. /package/dist/web/assets/{bat-C_NRAiA1.js → bat-JgEezSDo.js} +0 -0
  60. /package/dist/web/assets/{bicep-C7pp2CNk.js → bicep-vcQeC7wE.js} +0 -0
  61. /package/dist/web/assets/{cameligo-BhhK9vxZ.js → cameligo-C0cr0T3L.js} +0 -0
  62. /package/dist/web/assets/{clojure-D0ujmUyE.js → clojure-Brc1-rbW.js} +0 -0
  63. /package/dist/web/assets/{coffee-DHEl7Jbb.js → coffee-BiZYU83a.js} +0 -0
  64. /package/dist/web/assets/{cpp-Iil-3nzZ.js → cpp-ikWHCInz.js} +0 -0
  65. /package/dist/web/assets/{csharp-Dh0Ee7SY.js → csharp-BRWs_LfH.js} +0 -0
  66. /package/dist/web/assets/{csp-mwzjw0JL.js → csp-CcAumoJw.js} +0 -0
  67. /package/dist/web/assets/{css-COIa8ZTR.js → css-BZm6paiA.js} +0 -0
  68. /package/dist/web/assets/{cypher-GVc17FC4.js → cypher-CDQMONdb.js} +0 -0
  69. /package/dist/web/assets/{dart-phiCaE7_.js → dart-Ci4SZdF1.js} +0 -0
  70. /package/dist/web/assets/{dockerfile-BMaDhdim.js → dockerfile-BV0tAr-M.js} +0 -0
  71. /package/dist/web/assets/{ecl-Cj47kvqp.js → ecl-CP7nM2KN.js} +0 -0
  72. /package/dist/web/assets/{editor.api-DLXGyrN1.js → editor.api-BU_q4v8i.js} +0 -0
  73. /package/dist/web/assets/{elixir-DBbstcE1.js → elixir-GcA6wFiI.js} +0 -0
  74. /package/dist/web/assets/{flow9-ChHb1adO.js → flow9-CIb9youF.js} +0 -0
  75. /package/dist/web/assets/{fsharp-CMk2OIJN.js → fsharp-BVaBE4co.js} +0 -0
  76. /package/dist/web/assets/{go-BrMkuJg0.js → go-Bbqf306x.js} +0 -0
  77. /package/dist/web/assets/{graphql-PSR1UKGv.js → graphql-DJPrC4l-.js} +0 -0
  78. /package/dist/web/assets/{hcl-DAQrbDOW.js → hcl-QyfWVWpM.js} +0 -0
  79. /package/dist/web/assets/{ini-0TG5BxW0.js → ini-CgstZeS8.js} +0 -0
  80. /package/dist/web/assets/{java-rgorz17v.js → java-D4AG88ZY.js} +0 -0
  81. /package/dist/web/assets/{julia-C8VMdHm8.js → julia-CN8U9648.js} +0 -0
  82. /package/dist/web/assets/{kotlin-CllWo3gX.js → kotlin-gNNgpJhY.js} +0 -0
  83. /package/dist/web/assets/{less-Cgca25AP.js → less-C3SY2L8t.js} +0 -0
  84. /package/dist/web/assets/{lexon-D0GHdBaw.js → lexon-CznnqzUX.js} +0 -0
  85. /package/dist/web/assets/{lua-DmRsNG-P.js → lua-f3xyJgy5.js} +0 -0
  86. /package/dist/web/assets/{m3-BgL5dNKT.js → m3-Cl7J89p-.js} +0 -0
  87. /package/dist/web/assets/{markdown-BuJfycGS.js → markdown-Bv2fnzzT.js} +0 -0
  88. /package/dist/web/assets/{mips-C9m_93PR.js → mips-D6rXUTWa.js} +0 -0
  89. /package/dist/web/assets/{msdax-CpFHC9OI.js → msdax-Bb1N2x5J.js} +0 -0
  90. /package/dist/web/assets/{mysql-qFvltsqN.js → mysql-DXSr6oD7.js} +0 -0
  91. /package/dist/web/assets/{objective-c-Bnmr858J.js → objective-c-CEJiVkDa.js} +0 -0
  92. /package/dist/web/assets/{pascal-WP0_D5AO.js → pascal-BtkMEIba.js} +0 -0
  93. /package/dist/web/assets/{pascaligo-Blom4Rij.js → pascaligo-C7FAwqk7.js} +0 -0
  94. /package/dist/web/assets/{perl-B-vk8g64.js → perl-D9kqkBbN.js} +0 -0
  95. /package/dist/web/assets/{pgsql-Cgvz6v67.js → pgsql-BjGTBL1W.js} +0 -0
  96. /package/dist/web/assets/{php-8a3Lrw9m.js → php-BN0c0noA.js} +0 -0
  97. /package/dist/web/assets/{pla-DuFqEZ8V.js → pla-B94QTqOt.js} +0 -0
  98. /package/dist/web/assets/{postiats-DkLtSgkp.js → postiats-DH91dqBs.js} +0 -0
  99. /package/dist/web/assets/{powerquery-BJ1aNepW.js → powerquery-D7P0oUen.js} +0 -0
  100. /package/dist/web/assets/{powershell-rE98k687.js → powershell-CCVHmJax.js} +0 -0
  101. /package/dist/web/assets/{preload-helper-DWTEM3RW.js → preload-helper-DgFuoWHe.js} +0 -0
  102. /package/dist/web/assets/{protobuf-CUheFacr.js → protobuf-BIP7pixC.js} +0 -0
  103. /package/dist/web/assets/{pug-LDcAMD8w.js → pug-DcbLK7HH.js} +0 -0
  104. /package/dist/web/assets/{qsharp-IHfqKOfK.js → qsharp-B-VY_WOG.js} +0 -0
  105. /package/dist/web/assets/{r-D-QApv87.js → r-DwRtsJsj.js} +0 -0
  106. /package/dist/web/assets/{redis-SXdDyWR9.js → redis-CaW0tkwu.js} +0 -0
  107. /package/dist/web/assets/{redshift-Y6lsCryn.js → redshift-3tS8G0ME.js} +0 -0
  108. /package/dist/web/assets/{restructuredtext-edObr9a8.js → restructuredtext-_TNyGyK0.js} +0 -0
  109. /package/dist/web/assets/{ruby-CNnUfF-8.js → ruby-A-MwVfO4.js} +0 -0
  110. /package/dist/web/assets/{rust-IHUZWzBr.js → rust-oemlUIvG.js} +0 -0
  111. /package/dist/web/assets/{sb-DrUvY44N.js → sb-BDZuaI3W.js} +0 -0
  112. /package/dist/web/assets/{scala-B4hbXGLM.js → scala-Bfo2loK4.js} +0 -0
  113. /package/dist/web/assets/{scheme-BGrd12j3.js → scheme-N2eo7rjB.js} +0 -0
  114. /package/dist/web/assets/{scss-x5G1ES4U.js → scss-vjjSCTgN.js} +0 -0
  115. /package/dist/web/assets/{shell-DOehe2Y8.js → shell-Bfb9Yq6w.js} +0 -0
  116. /package/dist/web/assets/{solidity-BeRvcwWV.js → solidity-C9RbukzG.js} +0 -0
  117. /package/dist/web/assets/{sophia-DZbkUNjy.js → sophia-DWV_MWOg.js} +0 -0
  118. /package/dist/web/assets/{sparql-B7_oi5-h.js → sparql-iMXILWhh.js} +0 -0
  119. /package/dist/web/assets/{sql-CTlsFWVE.js → sql-CJDj31JM.js} +0 -0
  120. /package/dist/web/assets/{st-DJVEJdPE.js → st-BG9AQ1OO.js} +0 -0
  121. /package/dist/web/assets/{swift-CwhT3fYa.js → swift-B579DvHm.js} +0 -0
  122. /package/dist/web/assets/{systemverilog-BQN63pkN.js → systemverilog-BNgaF3ZX.js} +0 -0
  123. /package/dist/web/assets/{tcl-DqwfpskA.js → tcl-grdtJiUA.js} +0 -0
  124. /package/dist/web/assets/{twig-BiyenUgc.js → twig-JAsFXBZw.js} +0 -0
  125. /package/dist/web/assets/{typespec-CWOJribt.js → typespec-D3hIQXEU.js} +0 -0
  126. /package/dist/web/assets/{vb-Cq5F87m3.js → vb-H38jRcEz.js} +0 -0
  127. /package/dist/web/assets/{wgsl-BAvW2lVr.js → wgsl-BC5Grc5r.js} +0 -0
@@ -0,0 +1,2 @@
1
+ import{An as e,Kt as t,Nn as n,jn as r}from"./button-Cdgr9Igy.js";var i={STARTS_WITH:`startsWith`,CONTAINS:`contains`,NOT_CONTAINS:`notContains`,ENDS_WITH:`endsWith`,EQUALS:`equals`,NOT_EQUALS:`notEquals`,IN:`in`,LESS_THAN:`lt`,LESS_THAN_OR_EQUAL_TO:`lte`,GREATER_THAN:`gt`,GREATER_THAN_OR_EQUAL_TO:`gte`,BETWEEN:`between`,DATE_IS:`dateIs`,DATE_IS_NOT:`dateIsNot`,DATE_BEFORE:`dateBefore`,DATE_AFTER:`dateAfter`};function a(e,t){var n=typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(!n){if(Array.isArray(e)||(n=o(e))||t){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw TypeError(`Invalid attempt to iterate non-iterable instance.
2
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,s=!0,c=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){c=!0,a=e},f:function(){try{s||n.return==null||n.return()}finally{if(c)throw a}}}}function o(e,t){if(e){if(typeof e==`string`)return s(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var c={filter:function(e,t,r,i,o){var s=[];if(!e)return s;var c=a(e),l;try{for(c.s();!(l=c.n()).done;){var u=l.value;if(typeof u==`string`){if(this.filters[i](u,r,o)){s.push(u);continue}}else{var d=a(t),f;try{for(d.s();!(f=d.n()).done;){var p=f.value,m=n(u,p);if(this.filters[i](m,r,o)){s.push(u);break}}}catch(e){d.e(e)}finally{d.f()}}}}catch(e){c.e(e)}finally{c.f()}return s},filters:{startsWith:function(t,n,r){if(n==null||n===``)return!0;if(t==null)return!1;var i=e(n.toString()).toLocaleLowerCase(r);return e(t.toString()).toLocaleLowerCase(r).slice(0,i.length)===i},contains:function(t,n,r){if(n==null||n===``)return!0;if(t==null)return!1;var i=e(n.toString()).toLocaleLowerCase(r);return e(t.toString()).toLocaleLowerCase(r).indexOf(i)!==-1},notContains:function(t,n,r){if(n==null||n===``)return!0;if(t==null)return!1;var i=e(n.toString()).toLocaleLowerCase(r);return e(t.toString()).toLocaleLowerCase(r).indexOf(i)===-1},endsWith:function(t,n,r){if(n==null||n===``)return!0;if(t==null)return!1;var i=e(n.toString()).toLocaleLowerCase(r),a=e(t.toString()).toLocaleLowerCase(r);return a.indexOf(i,a.length-i.length)!==-1},equals:function(t,n,r){return n==null||n===``?!0:t==null?!1:t.getTime&&n.getTime?t.getTime()===n.getTime():e(t.toString()).toLocaleLowerCase(r)==e(n.toString()).toLocaleLowerCase(r)},notEquals:function(t,n,r){return n==null||n===``?!1:t==null?!0:t.getTime&&n.getTime?t.getTime()!==n.getTime():e(t.toString()).toLocaleLowerCase(r)!=e(n.toString()).toLocaleLowerCase(r)},in:function(e,t){if(t==null||t.length===0)return!0;for(var n=0;n<t.length;n++)if(r(e,t[n]))return!0;return!1},between:function(e,t){return t==null||t[0]==null||t[1]==null?!0:e==null?!1:e.getTime?t[0].getTime()<=e.getTime()&&e.getTime()<=t[1].getTime():t[0]<=e&&e<=t[1]},lt:function(e,t){return t==null?!0:e==null?!1:e.getTime&&t.getTime?e.getTime()<t.getTime():e<t},lte:function(e,t){return t==null?!0:e==null?!1:e.getTime&&t.getTime?e.getTime()<=t.getTime():e<=t},gt:function(e,t){return t==null?!0:e==null?!1:e.getTime&&t.getTime?e.getTime()>t.getTime():e>t},gte:function(e,t){return t==null?!0:e==null?!1:e.getTime&&t.getTime?e.getTime()>=t.getTime():e>=t},dateIs:function(e,t){return t==null?!0:e==null?!1:(typeof e==`string`&&(e=new Date(e)),typeof t==`string`&&(t=new Date(t)),e.toDateString()===t.toDateString())},dateIsNot:function(e,t){return t==null?!0:e==null?!1:(typeof e==`string`&&(e=new Date(e)),typeof t==`string`&&(t=new Date(t)),e.toDateString()!==t.toDateString())},dateBefore:function(e,t){return t==null?!0:e==null?!1:(typeof e==`string`&&(e=new Date(e)),typeof t==`string`&&(t=new Date(t)),e.getTime()<t.getTime())},dateAfter:function(e,t){return t==null?!0:e==null?!1:(typeof e==`string`&&(e=new Date(e)),typeof t==`string`&&(t=new Date(t)),e.getTime()>t.getTime())}},register:function(e,t){this.filters[e]=t}};function l(e){"@babel/helpers - typeof";return l=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},l(e)}function u(e,t){if(!(e instanceof t))throw TypeError(`Cannot call a class as a function`)}function d(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,`value`in r&&(r.writable=!0),Object.defineProperty(e,p(r.key),r)}}function f(e,t,n){return t&&d(e.prototype,t),Object.defineProperty(e,`prototype`,{writable:!1}),e}function p(e){var t=m(e,`string`);return l(t)==`symbol`?t:t+``}function m(e,t){if(l(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t);if(l(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return String(e)}var h=function(){function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(){};u(this,e),this.element=t,this.listener=n}return f(e,[{key:`bindScrollListener`,value:function(){this.scrollableParents=t(this.element);for(var e=0;e<this.scrollableParents.length;e++)this.scrollableParents[e].addEventListener(`scroll`,this.listener)}},{key:`unbindScrollListener`,value:function(){if(this.scrollableParents)for(var e=0;e<this.scrollableParents.length;e++)this.scrollableParents[e].removeEventListener(`scroll`,this.listener)}},{key:`destroy`,value:function(){this.unbindScrollListener(),this.element=null,this.listener=null,this.scrollableParents=null}}])}();export{i as n,c as r,h as t};
@@ -1 +1 @@
1
- import{m as e}from"./editor.api-DLXGyrN1.js";var t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a=(e,a,o,s)=>{if(a&&typeof a==`object`||typeof a==`function`)for(let c of r(a))!i.call(e,c)&&c!==o&&t(e,c,{get:()=>a[c],enumerable:!(s=n(a,c))||s.enumerable});return e},o=(e,t,n)=>(a(e,t,`default`),n&&a(n,t,`default`)),s={};o(s,e);var c={comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<`,`>`]],autoClosingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],surroundingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],onEnterRules:[{beforeText:RegExp(`<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:s.languages.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:s.languages.IndentAction.Indent}}]},l={defaultToken:``,tokenPostfix:`.xml`,ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,``],{include:`@whitespace`},[/(<)(@qualifiedName)/,[{token:`delimiter`},{token:`tag`,next:`@tag`}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:`delimiter`},{token:`tag`},``,{token:`delimiter`}]],[/(<\?)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/(<\!)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/<\!\[CDATA\[/,{token:`delimiter.cdata`,next:`@cdata`}],[/&\w+;/,`string.escape`]],cdata:[[/[^\]]+/,``],[/\]\]>/,{token:`delimiter.cdata`,next:`@pop`}],[/\]/,``]],tag:[[/[ \t\r\n]+/,``],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,[`attribute.name`,``,`attribute.value`]],[/@qualifiedName/,`attribute.name`],[/\?>/,{token:`delimiter`,next:`@pop`}],[/(\/)(>)/,[{token:`tag`},{token:`delimiter`,next:`@pop`}]],[/>/,{token:`delimiter`,next:`@pop`}]],whitespace:[[/[ \t\r\n]+/,``],[/<!--/,{token:`comment`,next:`@comment`}]],comment:[[/[^<\-]+/,`comment.content`],[/-->/,{token:`comment`,next:`@pop`}],[/<!--/,`comment.content.invalid`],[/[<\-]/,`comment.content`]]}};export{c as conf,l as language};
1
+ import{m as e}from"./editor.api-BU_q4v8i.js";var t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a=(e,a,o,s)=>{if(a&&typeof a==`object`||typeof a==`function`)for(let c of r(a))!i.call(e,c)&&c!==o&&t(e,c,{get:()=>a[c],enumerable:!(s=n(a,c))||s.enumerable});return e},o=(e,t,n)=>(a(e,t,`default`),n&&a(n,t,`default`)),s={};o(s,e);var c={comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<`,`>`]],autoClosingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],surroundingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],onEnterRules:[{beforeText:RegExp(`<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:s.languages.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:s.languages.IndentAction.Indent}}]},l={defaultToken:``,tokenPostfix:`.xml`,ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,``],{include:`@whitespace`},[/(<)(@qualifiedName)/,[{token:`delimiter`},{token:`tag`,next:`@tag`}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:`delimiter`},{token:`tag`},``,{token:`delimiter`}]],[/(<\?)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/(<\!)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/<\!\[CDATA\[/,{token:`delimiter.cdata`,next:`@cdata`}],[/&\w+;/,`string.escape`]],cdata:[[/[^\]]+/,``],[/\]\]>/,{token:`delimiter.cdata`,next:`@pop`}],[/\]/,``]],tag:[[/[ \t\r\n]+/,``],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,[`attribute.name`,``,`attribute.value`]],[/@qualifiedName/,`attribute.name`],[/\?>/,{token:`delimiter`,next:`@pop`}],[/(\/)(>)/,[{token:`tag`},{token:`delimiter`,next:`@pop`}]],[/>/,{token:`delimiter`,next:`@pop`}]],whitespace:[[/[ \t\r\n]+/,``],[/<!--/,{token:`comment`,next:`@comment`}]],comment:[[/[^<\-]+/,`comment.content`],[/-->/,{token:`comment`,next:`@pop`}],[/<!--/,`comment.content.invalid`],[/[<\-]/,`comment.content`]]}};export{c as conf,l as language};
@@ -1 +1 @@
1
- import{m as e}from"./editor.api-DLXGyrN1.js";var t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a=(e,a,o,s)=>{if(a&&typeof a==`object`||typeof a==`function`)for(let c of r(a))!i.call(e,c)&&c!==o&&t(e,c,{get:()=>a[c],enumerable:!(s=n(a,c))||s.enumerable});return e},o=(e,t,n)=>(a(e,t,`default`),n&&a(n,t,`default`)),s={};o(s,e);var c={comments:{lineComment:`#`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:s.languages.IndentAction.Indent}}]},l={tokenPostfix:`.yaml`,brackets:[{token:`delimiter.bracket`,open:`{`,close:`}`},{token:`delimiter.square`,open:`[`,close:`]`}],keywords:[`true`,`True`,`TRUE`,`false`,`False`,`FALSE`,`null`,`Null`,`Null`,`~`],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:`@whitespace`},{include:`@comment`},[/%[^ ]+.*$/,`meta.directive`],[/---/,`operators.directivesEnd`],[/\.{3}/,`operators.documentEnd`],[/[-?:](?= )/,`operators`],{include:`@anchor`},{include:`@tagHandle`},{include:`@flowCollections`},{include:`@blockStyle`},[/@numberInteger(?![ \t]*\S+)/,`number`],[/@numberFloat(?![ \t]*\S+)/,`number.float`],[/@numberOctal(?![ \t]*\S+)/,`number.octal`],[/@numberHex(?![ \t]*\S+)/,`number.hex`],[/@numberInfinity(?![ \t]*\S+)/,`number.infinity`],[/@numberNaN(?![ \t]*\S+)/,`number.nan`],[/@numberDate(?![ \t]*\S+)/,`number.date`],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,[`type`,`white`,`operators`,`white`]],{include:`@flowScalars`},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],object:[{include:`@whitespace`},{include:`@comment`},[/\}/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],[/:(?= )/,`operators`],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,`type`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\},]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],array:[{include:`@whitespace`},{include:`@comment`},[/\]/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\],]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],multiString:[[/^( +).+$/,`string`,`@multiStringContinued.$1`]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":`string`,"@default":{token:`@rematch`,next:`@popall`}}}]],whitespace:[[/[ \t\r\n]+/,`white`]],comment:[[/#.*$/,`comment`]],flowCollections:[[/\[/,`@brackets`,`@array`],[/\{/,`@brackets`,`@object`]],flowScalars:[[/"([^"\\]|\\.)*$/,`string.invalid`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/'[^']*'/,`string`],[/"/,`string`,`@doubleQuotedString`]],doubleQuotedString:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,`string`,`@pop`]],blockStyle:[[/[>|][0-9]*[+-]?$/,`operators`,`@multiString`]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,`number`],[/@numberFloat(?=[ \t]*[,\]\}])/,`number.float`],[/@numberOctal(?=[ \t]*[,\]\}])/,`number.octal`],[/@numberHex(?=[ \t]*[,\]\}])/,`number.hex`],[/@numberInfinity(?=[ \t]*[,\]\}])/,`number.infinity`],[/@numberNaN(?=[ \t]*[,\]\}])/,`number.nan`],[/@numberDate(?=[ \t]*[,\]\}])/,`number.date`]],tagHandle:[[/\![^ ]*/,`tag`]],anchor:[[/[&*][^ ]+/,`namespace`]]}};export{c as conf,l as language};
1
+ import{m as e}from"./editor.api-BU_q4v8i.js";var t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a=(e,a,o,s)=>{if(a&&typeof a==`object`||typeof a==`function`)for(let c of r(a))!i.call(e,c)&&c!==o&&t(e,c,{get:()=>a[c],enumerable:!(s=n(a,c))||s.enumerable});return e},o=(e,t,n)=>(a(e,t,`default`),n&&a(n,t,`default`)),s={};o(s,e);var c={comments:{lineComment:`#`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:s.languages.IndentAction.Indent}}]},l={tokenPostfix:`.yaml`,brackets:[{token:`delimiter.bracket`,open:`{`,close:`}`},{token:`delimiter.square`,open:`[`,close:`]`}],keywords:[`true`,`True`,`TRUE`,`false`,`False`,`FALSE`,`null`,`Null`,`Null`,`~`],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:`@whitespace`},{include:`@comment`},[/%[^ ]+.*$/,`meta.directive`],[/---/,`operators.directivesEnd`],[/\.{3}/,`operators.documentEnd`],[/[-?:](?= )/,`operators`],{include:`@anchor`},{include:`@tagHandle`},{include:`@flowCollections`},{include:`@blockStyle`},[/@numberInteger(?![ \t]*\S+)/,`number`],[/@numberFloat(?![ \t]*\S+)/,`number.float`],[/@numberOctal(?![ \t]*\S+)/,`number.octal`],[/@numberHex(?![ \t]*\S+)/,`number.hex`],[/@numberInfinity(?![ \t]*\S+)/,`number.infinity`],[/@numberNaN(?![ \t]*\S+)/,`number.nan`],[/@numberDate(?![ \t]*\S+)/,`number.date`],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,[`type`,`white`,`operators`,`white`]],{include:`@flowScalars`},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],object:[{include:`@whitespace`},{include:`@comment`},[/\}/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],[/:(?= )/,`operators`],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,`type`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\},]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],array:[{include:`@whitespace`},{include:`@comment`},[/\]/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\],]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],multiString:[[/^( +).+$/,`string`,`@multiStringContinued.$1`]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":`string`,"@default":{token:`@rematch`,next:`@popall`}}}]],whitespace:[[/[ \t\r\n]+/,`white`]],comment:[[/#.*$/,`comment`]],flowCollections:[[/\[/,`@brackets`,`@array`],[/\{/,`@brackets`,`@object`]],flowScalars:[[/"([^"\\]|\\.)*$/,`string.invalid`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/'[^']*'/,`string`],[/"/,`string`,`@doubleQuotedString`]],doubleQuotedString:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,`string`,`@pop`]],blockStyle:[[/[>|][0-9]*[+-]?$/,`operators`,`@multiString`]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,`number`],[/@numberFloat(?=[ \t]*[,\]\}])/,`number.float`],[/@numberOctal(?=[ \t]*[,\]\}])/,`number.octal`],[/@numberHex(?=[ \t]*[,\]\}])/,`number.hex`],[/@numberInfinity(?=[ \t]*[,\]\}])/,`number.infinity`],[/@numberNaN(?=[ \t]*[,\]\}])/,`number.nan`],[/@numberDate(?=[ \t]*[,\]\}])/,`number.date`]],tagHandle:[[/\![^ ]*/,`tag`]],anchor:[[/[&*][^ ]+/,`namespace`]]}};export{c as conf,l as language};
@@ -12,17 +12,20 @@
12
12
  var dark =
13
13
  stored === "dark" ||
14
14
  ((!stored || stored === "auto") && window.matchMedia("(prefers-color-scheme: dark)").matches)
15
+ document.documentElement.setAttribute("data-vxe-ui-theme", dark ? "dark" : "light")
15
16
  if (dark) document.documentElement.classList.add("jscb-dark")
16
17
  })()
17
18
  </script>
18
- <script type="module" crossorigin src="/assets/index-CKUXTDYj.js"></script>
19
- <link rel="modulepreload" crossorigin href="/assets/preload-helper-DWTEM3RW.js">
20
- <link rel="modulepreload" crossorigin href="/assets/button-kTMweGMc.js">
21
- <link rel="modulepreload" crossorigin href="/assets/table-schema-mJrrf9qw.js">
22
- <link rel="modulepreload" crossorigin href="/assets/api-client-Dsg4WOM9.js">
23
- <link rel="modulepreload" crossorigin href="/assets/dialog-CWuu7WjI.js">
24
- <link rel="modulepreload" crossorigin href="/assets/lib-C30cIFrm.js">
25
- <link rel="stylesheet" crossorigin href="/assets/index-DDFnprdM.css">
19
+ <script type="module" crossorigin src="/assets/index-CWy8KajQ.js"></script>
20
+ <link rel="modulepreload" crossorigin href="/assets/preload-helper-DgFuoWHe.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/button-Cdgr9Igy.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/object-utils-Cm2M3fPO.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/api-client-CIC2X8_4.js">
24
+ <link rel="modulepreload" crossorigin href="/assets/runtime-dom.esm-bundler-DZwuSnld.js">
25
+ <link rel="modulepreload" crossorigin href="/assets/dialog-8xaIXBKO.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/utils-CZhxh2Ya.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/dist-B5Yem2Jn.js">
28
+ <link rel="stylesheet" crossorigin href="/assets/index-BEorm4a5.css">
26
29
  </head>
27
30
  <body>
28
31
  <div id="app"></div>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aiex-cli",
3
3
  "type": "module",
4
- "version": "0.0.1-beta.9",
4
+ "version": "0.0.2-beta.1",
5
5
  "description": "JSON Schema → SQLite with AI-powered data extraction",
6
6
  "author": "OSpoon <zxin088@gmail.com>",
7
7
  "license": "MIT",
@@ -46,6 +46,10 @@
46
46
  "@ai-sdk/openai-compatible": "^2.0.47",
47
47
  "@clack/prompts": "^1.2.0",
48
48
  "@hono/node-server": "^1.0.0",
49
+ "@hono/zod-validator": "^0.8.0",
50
+ "@langfuse/otel": "^5.3.0",
51
+ "@notionhq/client": "^5.22.0",
52
+ "@opentelemetry/sdk-trace-node": "^2.7.1",
49
53
  "ai": "^6.0.182",
50
54
  "better-sqlite3": "^11.0.0",
51
55
  "citty": "^0.2.2",
@@ -57,9 +61,19 @@
57
61
  "drizzle-orm": "^0.38.4",
58
62
  "es-toolkit": "^1.46.1",
59
63
  "esbuild": "^0.19.12",
64
+ "execa": "^9.6.1",
60
65
  "hono": "^4.0.0",
66
+ "jsonfile": "^6.2.1",
67
+ "jsonrepair": "^3.14.0",
68
+ "kysely": "^0.29.2",
69
+ "mime": "^4.1.0",
70
+ "open": "^11.0.0",
71
+ "p-retry": "^7.1.0",
61
72
  "picocolors": "^1.1.1",
73
+ "proper-lockfile": "^4.1.2",
74
+ "tinyglobby": "^0.2.16",
62
75
  "tsx": "^4.21.0",
76
+ "unpdf": "^1.6.2",
63
77
  "update-notifier": "^7.3.1",
64
78
  "zod": "^3.23.0"
65
79
  },
@@ -67,7 +81,9 @@
67
81
  "@antfu/eslint-config": "^8.1.1",
68
82
  "@antfu/ni": "^30.1.0",
69
83
  "@types/better-sqlite3": "^7.6.0",
84
+ "@types/jsonfile": "^6.1.4",
70
85
  "@types/node": "^25.6.0",
86
+ "@types/proper-lockfile": "^4.1.4",
71
87
  "@types/update-notifier": "^6.0.8",
72
88
  "@vitest/coverage-v8": "^4.1.4",
73
89
  "eslint": "^10.2.0",
@@ -6,6 +6,8 @@ import process from 'node:process'
6
6
  import { fileURLToPath } from 'node:url'
7
7
  import Database from 'better-sqlite3'
8
8
  import * as esbuild from 'esbuild'
9
+ import { readFile as readJsonFile, writeFile as writeJsonFile } from 'jsonfile'
10
+ import lockfile from 'proper-lockfile'
9
11
  import { sanitizeMigrationName } from './migration-name'
10
12
 
11
13
  const require = createRequire(import.meta.url)
@@ -64,14 +66,14 @@ async function loadPrevSnapshot(migrationsPath: string): Promise<DrizzleSQLiteSn
64
66
  const metaPath = path.join(migrationsPath, 'meta', '_journal.json')
65
67
 
66
68
  try {
67
- const journal = JSON.parse(await fs.readFile(metaPath, 'utf-8'))
69
+ const journal = await readJsonFile(metaPath)
68
70
  if (!journal.entries?.length)
69
71
  return null
70
72
 
71
73
  const latestEntry = journal.entries[journal.entries.length - 1]
72
74
  const snapshotPath = path.join(migrationsPath, 'meta', `${latestEntry.tag}_snapshot.json`)
73
75
 
74
- return JSON.parse(await fs.readFile(snapshotPath, 'utf-8'))
76
+ return await readJsonFile(snapshotPath)
75
77
  }
76
78
  catch {
77
79
  return null
@@ -90,7 +92,7 @@ async function saveSnapshot(
90
92
  let journal: { version: string, dialect: string, entries: Array<{ idx: number, version: string, when: number, tag: string, breakpoints: boolean }> }
91
93
 
92
94
  try {
93
- journal = JSON.parse(await fs.readFile(journalPath, 'utf-8'))
95
+ journal = await readJsonFile(journalPath)
94
96
  }
95
97
  catch {
96
98
  journal = { version: '6', dialect: 'sqlite', entries: [] }
@@ -101,7 +103,7 @@ async function saveSnapshot(
101
103
  const tag = `${String(idx).padStart(4, '0')}_${suffix}`
102
104
 
103
105
  const snapshotPath = path.join(metaPath, `${tag}_snapshot.json`)
104
- await fs.writeFile(snapshotPath, JSON.stringify(snapshot, null, 2))
106
+ await writeJsonFile(snapshotPath, snapshot, { spaces: 2, EOL: '\n' })
105
107
 
106
108
  journal.entries.push({
107
109
  idx,
@@ -110,7 +112,7 @@ async function saveSnapshot(
110
112
  tag,
111
113
  breakpoints: true,
112
114
  })
113
- await fs.writeFile(journalPath, JSON.stringify(journal, null, 2))
115
+ await writeJsonFile(journalPath, journal, { spaces: 2, EOL: '\n' })
114
116
 
115
117
  return tag
116
118
  }
@@ -147,53 +149,27 @@ function applyMigrationWithTransaction(dbPath: string, sqlStatements: string[]):
147
149
  }
148
150
  }
149
151
 
150
- // Simple file lock mechanism
151
152
  const LOCK_FILE = '.migrate.lock'
152
153
 
153
- async function acquireLock(aiexDir: string): Promise<void> {
154
- const lockPath = path.join(aiexDir, LOCK_FILE)
154
+ async function acquireMigrationLock(aiexDir: string): Promise<() => Promise<void>> {
155
155
  await fs.mkdir(aiexDir, { recursive: true })
156
156
 
157
- // Try to create lock file atomically using exclusive write
158
157
  try {
159
- const fd = await fs.open(lockPath, 'wx') // 'wx' = exclusive write, fails if exists
160
- await fd.write(`${process.pid}\n${Date.now()}`)
161
- await fd.close()
158
+ return await lockfile.lock(aiexDir, {
159
+ lockfilePath: path.join(aiexDir, LOCK_FILE),
160
+ realpath: false,
161
+ stale: 300000,
162
+ update: 10000,
163
+ retries: 0,
164
+ })
162
165
  }
163
- catch (e: any) {
164
- if (e.code === 'EEXIST') {
165
- // Lock exists, read it and check if it's stale
166
- try {
167
- const content = await fs.readFile(lockPath, 'utf-8')
168
- const [pidStr, timestampStr] = content.split('\n')
169
- const lockPid = Number.parseInt(pidStr, 10)
170
- const lockTime = Number.parseInt(timestampStr, 10)
171
-
172
- // Check if lock is stale (> 5 minutes old) or process is dead
173
- const lockAge = Date.now() - lockTime
174
- if (lockAge > 300000) {
175
- // Lock is stale, remove it and retry
176
- await fs.unlink(lockPath)
177
- return acquireLock(aiexDir)
178
- }
179
-
180
- throw new Error(`Migration is already running (PID ${lockPid}, started ${Math.round(lockAge / 1000)}s ago). Wait for it to complete or remove ${lockPath} if stale.`)
181
- }
182
- catch {
183
- // Can't read lock file, it might be corrupted - remove and retry
184
- await fs.unlink(lockPath).catch(() => {})
185
- return acquireLock(aiexDir)
186
- }
187
- }
188
- throw e
166
+ catch (error) {
167
+ const lockPath = path.join(aiexDir, LOCK_FILE)
168
+ const message = error instanceof Error ? error.message : String(error)
169
+ throw new Error(`Migration is already running or the lock could not be acquired. Wait for it to complete or remove ${lockPath} if stale. ${message}`)
189
170
  }
190
171
  }
191
172
 
192
- async function releaseLock(aiexDir: string): Promise<void> {
193
- const lockPath = path.join(aiexDir, LOCK_FILE)
194
- await fs.unlink(lockPath).catch(() => {})
195
- }
196
-
197
173
  async function main(): Promise<void> {
198
174
  const args = process.argv.slice(2)
199
175
  const schemaPath = args[0]
@@ -209,11 +185,21 @@ async function main(): Promise<void> {
209
185
  try {
210
186
  // Acquire lock to prevent concurrent migrations
211
187
  const aiexDir = path.dirname(path.dirname(migrationsPath))
212
- await acquireLock(aiexDir)
188
+ const releaseLock = await acquireMigrationLock(aiexDir)
213
189
 
214
190
  try {
215
191
  const exports = await loadSchemaExports(schemaPath)
216
- const prevSnapshot = await loadPrevSnapshot(migrationsPath)
192
+
193
+ // Check if database file exists — if missing, force full migration
194
+ let dbMissing = false
195
+ try {
196
+ await fs.access(dbPath)
197
+ }
198
+ catch {
199
+ dbMissing = true
200
+ }
201
+
202
+ const prevSnapshot = dbMissing ? null : await loadPrevSnapshot(migrationsPath)
217
203
  const currentSnapshot = await generateSQLiteDrizzleJson(exports, prevSnapshot?.id)
218
204
 
219
205
  const prev = prevSnapshot || EMPTY_SNAPSHOT
@@ -237,7 +223,7 @@ async function main(): Promise<void> {
237
223
  console.log(JSON.stringify({ success: true, changes: sqlStatements.length, tag }))
238
224
  }
239
225
  finally {
240
- await releaseLock(aiexDir)
226
+ await releaseLock()
241
227
  }
242
228
  }
243
229
  catch (error: unknown) {