abstra 3.24.7__py3-none-any.whl → 3.24.9__py3-none-any.whl

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 (254) hide show
  1. {abstra-3.24.7.dist-info → abstra-3.24.9.dist-info}/METADATA +1 -1
  2. {abstra-3.24.7.dist-info → abstra-3.24.9.dist-info}/RECORD +185 -184
  3. abstra_internals/contracts_generated.py +916 -762
  4. abstra_internals/controllers/git.py +18 -20
  5. abstra_internals/controllers/main.py +8 -4
  6. abstra_internals/repositories/git/git_test.py +2 -2
  7. abstra_internals/repositories/git/native.py +96 -44
  8. abstra_internals/repositories/git/types.py +9 -7
  9. abstra_internals/repositories/tasks.py +22 -21
  10. abstra_internals/services/fs.py +25 -0
  11. abstra_internals/services/sql_storage.py +2 -1
  12. abstra_statics/dist/assets/{AbstraButton.vue_vue_type_script_setup_true_lang.865dcbf3.js → AbstraButton.vue_vue_type_script_setup_true_lang.6efe348a.js} +2 -2
  13. abstra_statics/dist/assets/AbstraLogo.vue_vue_type_script_setup_true_lang.f628a3a7.js +2 -0
  14. abstra_statics/dist/assets/ApiKeys.5b43091f.js +2 -0
  15. abstra_statics/dist/assets/App.7a6ee8e5.js +2 -0
  16. abstra_statics/dist/assets/App.vue_vue_type_style_index_0_lang.1a83eeea.js +2 -0
  17. abstra_statics/dist/assets/{BaseLayout.31267389.js → BaseLayout.3c6f8614.js} +2 -2
  18. abstra_statics/dist/assets/{Billing.44f40d95.js → Billing.884bb3ce.js} +2 -2
  19. abstra_statics/dist/assets/{Breadcrumb.bc48ca6d.js → Breadcrumb.438b89fb.js} +2 -2
  20. abstra_statics/dist/assets/{Builds.5c884494.js → Builds.51e0c49e.js} +2 -2
  21. abstra_statics/dist/assets/{Card.eab9832f.js → Card.50ce0913.js} +2 -2
  22. abstra_statics/dist/assets/{CircularLoading.a4bd5a70.js → CircularLoading.50b3862c.js} +2 -2
  23. abstra_statics/dist/assets/CloseCircleOutlined.eab14c9c.js +2 -0
  24. abstra_statics/dist/assets/ConnectorsView.35cc6db6.js +2 -0
  25. abstra_statics/dist/assets/ConnectorsView.36fa866f.css +1 -0
  26. abstra_statics/dist/assets/ConsoleOmniChat.vue_vue_type_script_setup_true_lang.1c984a14.js +2 -0
  27. abstra_statics/dist/assets/ContentLayout.a0d4199d.js +2 -0
  28. abstra_statics/dist/assets/{CrudView.f8f7347d.js → CrudView.7997b881.js} +2 -2
  29. abstra_statics/dist/assets/{DocsButton.vue_vue_type_script_setup_true_lang.264a92d9.js → DocsButton.vue_vue_type_script_setup_true_lang.39638c19.js} +2 -2
  30. abstra_statics/dist/assets/{EditorLogin.b8cbc772.js → EditorLogin.6506bc42.js} +2 -2
  31. abstra_statics/dist/assets/{EditorsView.580cabb0.js → EditorsView.2aad2cdc.js} +2 -2
  32. abstra_statics/dist/assets/EnvVars.e641237f.js +2 -0
  33. abstra_statics/dist/assets/Error.a11619e5.js +2 -0
  34. abstra_statics/dist/assets/ExclamationCircleOutlined.1d559548.js +2 -0
  35. abstra_statics/dist/assets/ExecutionContext.2933148d.js +2 -0
  36. abstra_statics/dist/assets/ExecutionStatusIcon.vue_vue_type_script_setup_true_lang.0b0c149c.js +2 -0
  37. abstra_statics/dist/assets/Files.7c98a5f9.css +1 -0
  38. abstra_statics/dist/assets/Files.db066999.js +3 -0
  39. abstra_statics/dist/assets/{Form.7ffaca31.js → Form.d99de13a.js} +2 -2
  40. abstra_statics/dist/assets/{FormRunner.eae15d54.js → FormRunner.8a803ade.js} +2 -2
  41. abstra_statics/dist/assets/{Home.5a499863.js → Home.a8e67e38.js} +2 -2
  42. abstra_statics/dist/assets/Home.c02c53bc.js +2 -0
  43. abstra_statics/dist/assets/LoadingContainer.b8fe55e6.js +2 -0
  44. abstra_statics/dist/assets/LoadingOutlined.d3cb97d3.js +2 -0
  45. abstra_statics/dist/assets/Login.ca3df8f4.js +2 -0
  46. abstra_statics/dist/assets/{Login.779e9007.js → Login.ec7eb4db.js} +2 -2
  47. abstra_statics/dist/assets/Login.vue_vue_type_script_setup_true_lang.be982e9b.js +2 -0
  48. abstra_statics/dist/assets/Logo.29f26be1.js +2 -0
  49. abstra_statics/dist/assets/Logs.bc7d3080.js +2 -0
  50. abstra_statics/dist/assets/Main.17301685.js +2 -0
  51. abstra_statics/dist/assets/{MockForm.2aa4fc17.js → MockForm.8af08260.js} +2 -2
  52. abstra_statics/dist/assets/{Navbar.89b7a1da.js → Navbar.5991f141.js} +2 -2
  53. abstra_statics/dist/assets/NewEditor.133f8c4b.js +8 -0
  54. abstra_statics/dist/assets/OidcLoginCallback.7b41f933.js +2 -0
  55. abstra_statics/dist/assets/OidcLogoutCallback.80bebb62.js +2 -0
  56. abstra_statics/dist/assets/{OmniChat.60ee26c8.css → OmniChat.3576ab7f.css} +1 -1
  57. abstra_statics/dist/assets/OmniChat.724f1121.js +6 -0
  58. abstra_statics/dist/assets/OnboardingView.7f418009.js +2 -0
  59. abstra_statics/dist/assets/Organization.127db14f.js +2 -0
  60. abstra_statics/dist/assets/Organizations.5f418cc7.js +2 -0
  61. abstra_statics/dist/assets/{PhArrowCounterClockwise.vue.9a0ef441.js → PhArrowCounterClockwise.vue.de1d3ce9.js} +2 -2
  62. abstra_statics/dist/assets/{PhArrowSquareOut.vue.e64bebdd.js → PhArrowSquareOut.vue.1a0f1395.js} +2 -2
  63. abstra_statics/dist/assets/PhArrowUp.vue.1c6a4ae8.js +2 -0
  64. abstra_statics/dist/assets/{PhClockCounterClockwise.vue.090be995.js → PhClockCounterClockwise.vue.3e79a514.js} +2 -2
  65. abstra_statics/dist/assets/{PhCopy.vue.2163dc9b.js → PhCopy.vue.d2b17064.js} +2 -2
  66. abstra_statics/dist/assets/{PhCopySimple.vue.df39762b.js → PhCopySimple.vue.f2bb863a.js} +2 -2
  67. abstra_statics/dist/assets/{PhCube.vue.099137c1.js → PhCube.vue.be696878.js} +2 -2
  68. abstra_statics/dist/assets/PhDatabase.vue.3c4ba68c.js +2 -0
  69. abstra_statics/dist/assets/{PhDotsThreeVertical.vue.e9b1faec.js → PhDotsThreeVertical.vue.2c9a03d5.js} +2 -2
  70. abstra_statics/dist/assets/{PhDownloadSimple.vue.cba09010.js → PhDownloadSimple.vue.72db4fbb.js} +2 -2
  71. abstra_statics/dist/assets/{PhFileArrowUp.vue.8f2790df.js → PhFileArrowUp.vue.b7060fd8.js} +2 -2
  72. abstra_statics/dist/assets/{PhFilePlus.vue.18b183d7.js → PhFilePlus.vue.77ba2f5f.js} +2 -2
  73. abstra_statics/dist/assets/{PhFolderPlus.vue.8dc4e304.js → PhFolderPlus.vue.57ec5e0d.js} +2 -2
  74. abstra_statics/dist/assets/{PhGear.vue.15aaccf5.js → PhGear.vue.5abfda30.js} +2 -2
  75. abstra_statics/dist/assets/{PhKey.vue.55642d36.js → PhKey.vue.dbf6964c.js} +2 -2
  76. abstra_statics/dist/assets/{PhPencil.vue.ea9f0def.js → PhPencil.vue.e6eaa716.js} +2 -2
  77. abstra_statics/dist/assets/{PhPencilSimple.vue.2d6e76ca.js → PhPencilSimple.vue.a65250cc.js} +2 -2
  78. abstra_statics/dist/assets/{PhRocket.vue.ec0249c6.js → PhRocket.vue.9dde7cdd.js} +2 -2
  79. abstra_statics/dist/assets/{PhSignOut.vue.1cca1af4.js → PhSignOut.vue.4b3b1f31.js} +2 -2
  80. abstra_statics/dist/assets/{PhSparkle.vue.5ff46bd3.js → PhSparkle.vue.efe111c8.js} +2 -2
  81. abstra_statics/dist/assets/{PhTranslate.vue.077070e7.js → PhTranslate.vue.7ad27dac.js} +2 -2
  82. abstra_statics/dist/assets/{PhUsersThree.vue.a78365b2.js → PhUsersThree.vue.5f9bb416.js} +2 -2
  83. abstra_statics/dist/assets/{PhWarningCircle.vue.40ea25aa.js → PhWarningCircle.vue.365e8c06.js} +2 -2
  84. abstra_statics/dist/assets/{PhWebhooksLogo.vue.a73cf99c.js → PhWebhooksLogo.vue.1684b943.js} +2 -2
  85. abstra_statics/dist/assets/{PlayerConfigProvider.8a1d38e8.js → PlayerConfigProvider.26c6fb0a.js} +2 -2
  86. abstra_statics/dist/assets/{PlayerNavbar.53f81c7f.js → PlayerNavbar.a0d1fdc3.js} +2 -2
  87. abstra_statics/dist/assets/Project.6575adc1.css +1 -0
  88. abstra_statics/dist/assets/Project.a4f24e83.js +2 -0
  89. abstra_statics/dist/assets/{ProjectLogin.972cff72.js → ProjectLogin.abc78e95.js} +2 -2
  90. abstra_statics/dist/assets/{ProjectSettings.183e39d3.js → ProjectSettings.de3aa0d0.js} +2 -2
  91. abstra_statics/dist/assets/{ProjectsView.31637152.js → ProjectsView.e4e50735.js} +2 -2
  92. abstra_statics/dist/assets/{SaveButton.8e4a5fbe.js → SaveButton.8a907e20.js} +2 -2
  93. abstra_statics/dist/assets/ScrollArea.vue_vue_type_script_setup_true_lang.22f3f279.js +2 -0
  94. abstra_statics/dist/assets/{Sidebar.adfed738.js → Sidebar.ea97a608.js} +2 -2
  95. abstra_statics/dist/assets/{Sql.bf31b294.js → Sql.3130cb2f.js} +3 -3
  96. abstra_statics/dist/assets/Steps.df853a47.js +2 -0
  97. abstra_statics/dist/assets/{TableCard.f71238a1.js → TableCard.0cffd3d6.js} +2 -2
  98. abstra_statics/dist/assets/TableEditor.52c6ffee.js +2 -0
  99. abstra_statics/dist/assets/Tables.933a0fea.js +2 -0
  100. abstra_statics/dist/assets/{TablesDiagram.29966818.js → TablesDiagram.687f6dfe.js} +3 -3
  101. abstra_statics/dist/assets/TablesTabs.vue_vue_type_script_setup_true_lang.9649d1a2.js +2 -0
  102. abstra_statics/dist/assets/Tasks.331fcc80.js +2 -0
  103. abstra_statics/dist/assets/{UploadOutlined.654fb655.js → UploadOutlined.1c845819.js} +2 -2
  104. abstra_statics/dist/assets/{View.64f7c00a.js → View.8fb0d3d7.js} +2 -2
  105. abstra_statics/dist/assets/{View.vue_vue_type_script_setup_true_lang.8892f80d.js → View.vue_vue_type_script_setup_true_lang.df0afc8c.js} +2 -2
  106. abstra_statics/dist/assets/{Watermark.2b4d030d.js → Watermark.b19c8a2c.js} +2 -2
  107. abstra_statics/dist/assets/{WebEditor.a5e97d7a.js → WebEditor.52fc4d61.js} +2 -2
  108. abstra_statics/dist/assets/WidgetPreview.fab6933f.js +2 -0
  109. abstra_statics/dist/assets/WorkflowViewer.5d223e7a.css +1 -0
  110. abstra_statics/dist/assets/WorkflowViewer.b0072dc6.js +2 -0
  111. abstra_statics/dist/assets/ant-design.3284f24b.js +2 -0
  112. abstra_statics/dist/assets/{apiKey.1bb9c6d2.js → apiKey.66dca0fa.js} +2 -2
  113. abstra_statics/dist/assets/asyncComputed.515034b4.js +2 -0
  114. abstra_statics/dist/assets/{build.bfc699c6.js → build.11c6f0e3.js} +2 -2
  115. abstra_statics/dist/assets/colorHelpers.43bbe7b2.js +2 -0
  116. abstra_statics/dist/assets/{console.21189c1b.js → console.f9961195.js} +2 -2
  117. abstra_statics/dist/assets/constants.2cdc2025.js +2 -0
  118. abstra_statics/dist/assets/contracts.generated.36d5f7a5.js +2 -0
  119. abstra_statics/dist/assets/{cssMode.766de8eb.js → cssMode.38709828.js} +2 -2
  120. abstra_statics/dist/assets/datetime.cc6674fd.js +2 -0
  121. abstra_statics/dist/assets/dayjs.aa0a07d8.js +2 -0
  122. abstra_statics/dist/assets/editor.90099ba3.js +2 -0
  123. abstra_statics/dist/assets/editor.main.a098da72.js +2 -0
  124. abstra_statics/dist/assets/fetch.331404cf.js +2 -0
  125. abstra_statics/dist/assets/file.0cd01b5c.js +2 -0
  126. abstra_statics/dist/assets/folder.304ce6aa.js +2 -0
  127. abstra_statics/dist/assets/{freemarker2.a1e074e9.js → freemarker2.16d5855a.js} +2 -2
  128. abstra_statics/dist/assets/{handlebars.ef746198.js → handlebars.3657e980.js} +2 -2
  129. abstra_statics/dist/assets/{html.36bc618f.js → html.cbb1f517.js} +3 -3
  130. abstra_statics/dist/assets/{htmlMode.2557714f.js → htmlMode.97252017.js} +2 -2
  131. abstra_statics/dist/assets/{index.cfbca287.js → index.1a374af6.js} +3 -3
  132. abstra_statics/dist/assets/{index.95966207.js → index.1f86e84b.js} +2 -2
  133. abstra_statics/dist/assets/{index.88a43c5d.js → index.64d118e9.js} +2 -2
  134. abstra_statics/dist/assets/{index.b57ea477.js → index.97648248.js} +2 -2
  135. abstra_statics/dist/assets/{index.8391f105.js → index.9a7dc377.js} +2 -2
  136. abstra_statics/dist/assets/{index.cb46e99b.js → index.9f357119.js} +2 -2
  137. abstra_statics/dist/assets/{index.0389f2ff.js → index.c7722f54.js} +2 -2
  138. abstra_statics/dist/assets/index.dcd602fc.js +2 -0
  139. abstra_statics/dist/assets/{index.6a5e28c0.js → index.ed2240ea.js} +2 -2
  140. abstra_statics/dist/assets/{javascript.3ef3ca8e.js → javascript.d13ce088.js} +3 -3
  141. abstra_statics/dist/assets/{jsonMode.bc3f9dc2.js → jsonMode.24ae805f.js} +2 -2
  142. abstra_statics/dist/assets/{jwt-decode.aa5b9ed3.css → jwt-decode.1a092264.css} +1 -1
  143. abstra_statics/dist/assets/{jwt-decode.esm.b9bb33e7.js → jwt-decode.esm.f87c17f7.js} +166 -161
  144. abstra_statics/dist/assets/linters.6d68fd4f.js +2 -0
  145. abstra_statics/dist/assets/{liquid.b8dbec9f.js → liquid.0cf9f71b.js} +3 -3
  146. abstra_statics/dist/assets/{member.a66ab498.js → member.c8206c64.js} +2 -2
  147. abstra_statics/dist/assets/{metadata.17375f25.js → metadata.f67c3158.js} +2 -2
  148. abstra_statics/dist/assets/{omniChatStore.c81c7dd1.js → omniChatStore.e205a0cd.js} +4 -4
  149. abstra_statics/dist/assets/{organization.31d7490b.js → organization.70cdf915.js} +2 -2
  150. abstra_statics/dist/assets/{os.cc382050.js → os.227120cb.js} +2 -2
  151. abstra_statics/dist/assets/player.58f997ee.js +2 -0
  152. abstra_statics/dist/assets/{plotly.min.e2ba2e19.js → plotly.min.6d8ffa2b.js} +2 -2
  153. abstra_statics/dist/assets/polling.9bc57b91.js +2 -0
  154. abstra_statics/dist/assets/project.25a396d4.js +2 -0
  155. abstra_statics/dist/assets/{python.ca19a8f2.js → python.0d8b442d.js} +3 -3
  156. abstra_statics/dist/assets/{razor.b73e652a.js → razor.4398e452.js} +2 -2
  157. abstra_statics/dist/assets/record.a8da6046.js +2 -0
  158. abstra_statics/dist/assets/{redirect.9d08109f.js → redirect.42fceb5c.js} +2 -2
  159. abstra_statics/dist/assets/{repository.819ee626.js → repository.c782b2ca.js} +2 -2
  160. abstra_statics/dist/assets/router.09566602.js +18 -0
  161. abstra_statics/dist/assets/router.9ee10098.js +2 -0
  162. abstra_statics/dist/assets/{string.04644599.js → string.0c102318.js} +2 -2
  163. abstra_statics/dist/assets/{tables.d6f8baad.js → tables.1b5568d1.js} +2 -2
  164. abstra_statics/dist/assets/tasksController.009192fc.js +4 -0
  165. abstra_statics/dist/assets/{toggleHighContrast.5c061b5e.js → toggleHighContrast.79cdeb2d.js} +7 -7
  166. abstra_statics/dist/assets/{tsMode.75ac2754.js → tsMode.0d573de8.js} +2 -2
  167. abstra_statics/dist/assets/{typescript.3c9ee25c.js → typescript.c72f7347.js} +3 -3
  168. abstra_statics/dist/assets/url.acca5643.js +2 -0
  169. abstra_statics/dist/assets/{useCodebaseEvents.fd37c61f.js → useCodebaseEvents.dc121de8.js} +2 -2
  170. abstra_statics/dist/assets/useTables.8402092e.js +2 -0
  171. abstra_statics/dist/assets/userStore.3989ac4e.js +2 -0
  172. abstra_statics/dist/assets/uuid.405a6e8d.js +2 -0
  173. abstra_statics/dist/assets/{vue-flow-background.6bb2a806.js → vue-flow-background.bbe978bf.js} +2 -2
  174. abstra_statics/dist/assets/{vue-flow-core.0cbcaed0.js → vue-flow-core.8bb3991b.js} +2 -2
  175. abstra_statics/dist/assets/{vue-quill.esm-bundler.6713b0a3.js → vue-quill.esm-bundler.4dc84b4c.js} +2 -2
  176. abstra_statics/dist/assets/{workspaceStore.583d9afd.js → workspaceStore.ef7daa80.js} +2 -2
  177. abstra_statics/dist/assets/xlsx.89ea120e.js +106 -0
  178. abstra_statics/dist/assets/{xml.046c0d24.js → xml.5ff29ab6.js} +3 -3
  179. abstra_statics/dist/assets/{yaml.ebe5a918.js → yaml.6d4103d3.js} +3 -3
  180. abstra_statics/dist/console.html +15 -15
  181. abstra_statics/dist/editor.html +14 -14
  182. abstra_statics/dist/player.html +10 -10
  183. abstra_statics/dist/assets/AbstraLogo.vue_vue_type_script_setup_true_lang.8204f8e4.js +0 -2
  184. abstra_statics/dist/assets/ApiKeys.0ebb0b5f.js +0 -2
  185. abstra_statics/dist/assets/App.fa5bd988.js +0 -2
  186. abstra_statics/dist/assets/App.vue_vue_type_style_index_0_lang.35b9297a.js +0 -2
  187. abstra_statics/dist/assets/CloseCircleOutlined.87d100e7.js +0 -2
  188. abstra_statics/dist/assets/ConnectorsView.89e278ce.js +0 -2
  189. abstra_statics/dist/assets/ConnectorsView.b594798e.css +0 -1
  190. abstra_statics/dist/assets/ConsoleOmniChat.vue_vue_type_script_setup_true_lang.b3c015f9.js +0 -2
  191. abstra_statics/dist/assets/ContentLayout.8cfadb43.js +0 -2
  192. abstra_statics/dist/assets/EnvVars.8f5b7bdb.js +0 -2
  193. abstra_statics/dist/assets/Error.ee721fce.js +0 -2
  194. abstra_statics/dist/assets/ExclamationCircleOutlined.40ff37b4.js +0 -2
  195. abstra_statics/dist/assets/ExecutionContext.3f4e1ec7.js +0 -2
  196. abstra_statics/dist/assets/ExecutionStatusIcon.vue_vue_type_script_setup_true_lang.4f510b9a.js +0 -2
  197. abstra_statics/dist/assets/Files.39b07d88.css +0 -1
  198. abstra_statics/dist/assets/Files.db0a38ea.js +0 -2
  199. abstra_statics/dist/assets/Home.31aa421b.js +0 -2
  200. abstra_statics/dist/assets/LoadingContainer.6b2e55a8.js +0 -2
  201. abstra_statics/dist/assets/LoadingOutlined.bcf2a831.js +0 -2
  202. abstra_statics/dist/assets/Login.53d97380.js +0 -2
  203. abstra_statics/dist/assets/Login.vue_vue_type_script_setup_true_lang.f1a48ab2.js +0 -2
  204. abstra_statics/dist/assets/Logo.c4ca8242.js +0 -2
  205. abstra_statics/dist/assets/Logs.ef6eb243.js +0 -2
  206. abstra_statics/dist/assets/Main.b3e5d5fe.js +0 -2
  207. abstra_statics/dist/assets/NewEditor.0cd895fd.js +0 -8
  208. abstra_statics/dist/assets/OidcLoginCallback.9dd86a22.js +0 -2
  209. abstra_statics/dist/assets/OidcLogoutCallback.a60b6160.js +0 -2
  210. abstra_statics/dist/assets/OmniChat.00da5ca5.js +0 -6
  211. abstra_statics/dist/assets/OnboardingView.86178ead.js +0 -2
  212. abstra_statics/dist/assets/Organization.9bf814e7.js +0 -2
  213. abstra_statics/dist/assets/Organizations.7473e524.js +0 -2
  214. abstra_statics/dist/assets/PhDatabase.vue.33681014.js +0 -2
  215. abstra_statics/dist/assets/Project.1b9b8eee.js +0 -2
  216. abstra_statics/dist/assets/Project.9c418d2e.css +0 -1
  217. abstra_statics/dist/assets/ScrollArea.vue_vue_type_script_setup_true_lang.2a9a82d1.js +0 -2
  218. abstra_statics/dist/assets/Steps.a55d381b.js +0 -2
  219. abstra_statics/dist/assets/TableEditor.1f5f6b45.js +0 -2
  220. abstra_statics/dist/assets/Tables.ae22a918.js +0 -39
  221. abstra_statics/dist/assets/TablesTabs.vue_vue_type_script_setup_true_lang.9567dc60.js +0 -2
  222. abstra_statics/dist/assets/Tasks.db070216.js +0 -2
  223. abstra_statics/dist/assets/WidgetPreview.40cbebe3.js +0 -2
  224. abstra_statics/dist/assets/WorkflowViewer.0a209003.css +0 -1
  225. abstra_statics/dist/assets/WorkflowViewer.b9f96c37.js +0 -2
  226. abstra_statics/dist/assets/ant-design.5ec0b6b3.js +0 -2
  227. abstra_statics/dist/assets/asyncComputed.7ddee0b0.js +0 -2
  228. abstra_statics/dist/assets/colorHelpers.53158244.js +0 -2
  229. abstra_statics/dist/assets/constants.0deee127.js +0 -2
  230. abstra_statics/dist/assets/contracts.generated.0a04f0c8.js +0 -2
  231. abstra_statics/dist/assets/datetime.0048a7b9.js +0 -2
  232. abstra_statics/dist/assets/dayjs.618c5367.js +0 -2
  233. abstra_statics/dist/assets/editor.64e4d209.js +0 -2
  234. abstra_statics/dist/assets/editor.main.08984606.js +0 -2
  235. abstra_statics/dist/assets/fetch.7b0def40.js +0 -2
  236. abstra_statics/dist/assets/files.8583d431.js +0 -2
  237. abstra_statics/dist/assets/folder.c07afb46.js +0 -2
  238. abstra_statics/dist/assets/index.36af13ac.js +0 -2
  239. abstra_statics/dist/assets/linters.f033aedb.js +0 -2
  240. abstra_statics/dist/assets/player.4ba2218c.js +0 -2
  241. abstra_statics/dist/assets/polling.bdac3134.js +0 -2
  242. abstra_statics/dist/assets/project.f3f1cd2e.js +0 -2
  243. abstra_statics/dist/assets/record.c01e7f08.js +0 -2
  244. abstra_statics/dist/assets/repository.88fdba21.js +0 -2
  245. abstra_statics/dist/assets/router.135b49e3.js +0 -18
  246. abstra_statics/dist/assets/router.d8fe262e.js +0 -2
  247. abstra_statics/dist/assets/tasksController.866fa385.js +0 -4
  248. abstra_statics/dist/assets/url.7fa35693.js +0 -2
  249. abstra_statics/dist/assets/useTables.1d5bf2b4.js +0 -2
  250. abstra_statics/dist/assets/userStore.3a2d2697.js +0 -2
  251. abstra_statics/dist/assets/uuid.40423699.js +0 -2
  252. {abstra-3.24.7.dist-info → abstra-3.24.9.dist-info}/WHEEL +0 -0
  253. {abstra-3.24.7.dist-info → abstra-3.24.9.dist-info}/entry_points.txt +0 -0
  254. {abstra-3.24.7.dist-info → abstra-3.24.9.dist-info}/top_level.txt +0 -0
@@ -179,23 +179,17 @@ class GitController:
179
179
  return status_response.to_dict()
180
180
 
181
181
  def checkout_branch(self, branch_name: str) -> Dict[str, Any]:
182
- success = self.git_repository.checkout_branch(branch_name)
182
+ success, error_message = self.git_repository.checkout_branch(branch_name)
183
183
 
184
- message = (
185
- f"Switched to branch '{branch_name}'"
186
- if success
187
- else f"Failed to switch to branch '{branch_name}'"
188
- )
184
+ message = f"Switched to branch '{branch_name}'" if success else error_message
189
185
 
190
186
  return {"success": success, "message": message}
191
187
 
192
188
  def checkout_commit(self, commit_hash: str) -> Dict[str, Any]:
193
- success = self.git_repository.checkout_commit(commit_hash)
189
+ success, error_message = self.git_repository.checkout_commit(commit_hash)
194
190
 
195
191
  message = (
196
- f"Switched to commit '{commit_hash[:8]}'"
197
- if success
198
- else f"Failed to switch to commit '{commit_hash[:8]}'"
192
+ f"Switched to commit '{commit_hash[:8]}'" if success else error_message
199
193
  )
200
194
 
201
195
  return {"success": success, "message": message}
@@ -205,13 +199,13 @@ class GitController:
205
199
  ) -> Dict[str, Any]:
206
200
  self._ensure_authentication()
207
201
 
208
- success = self.git_repository.pull_changes(
202
+ success, error_message = self.git_repository.pull_changes(
209
203
  strategy=strategy,
210
204
  allow_unrelated=allow_unrelated,
211
205
  conflict_resolution=conflict_resolution,
212
206
  )
213
207
 
214
- message = "Successfully pulled changes" if success else "Failed to pull changes"
208
+ message = "Successfully pulled changes" if success else error_message
215
209
 
216
210
  return {"success": success, "message": message}
217
211
 
@@ -222,21 +216,25 @@ class GitController:
222
216
  if not commit_message:
223
217
  return {"success": False, "message": "Commit message cannot be empty"}
224
218
 
225
- success = self.git_repository.commit_changes(commit_message, author)
219
+ success, error_message = self.git_repository.commit_changes(
220
+ commit_message, author
221
+ )
226
222
 
227
223
  message = (
228
224
  f"Successfully committed changes: {commit_message}"
229
225
  if success
230
- else "Failed to commit changes"
226
+ else error_message or "Commit failed"
231
227
  )
232
228
 
233
229
  return {"success": success, "message": message}
234
230
 
235
231
  def stash_changes(self, message: str = "WIP") -> Dict[str, Any]:
236
- success = self.git_repository.stash_changes(message)
232
+ success, error_message = self.git_repository.stash_changes(message)
237
233
 
238
234
  message = (
239
- "Successfully stashed changes" if success else "Failed to stash changes"
235
+ "Successfully stashed changes"
236
+ if success
237
+ else error_message or "Stash failed"
240
238
  )
241
239
 
242
240
  return {"success": success, "message": message}
@@ -256,12 +254,12 @@ class GitController:
256
254
  def push_and_deploy(self, branch: str = "main") -> Dict[str, Any]:
257
255
  self._ensure_authentication()
258
256
 
259
- success = self.git_repository.push_and_deploy(branch)
257
+ success, error_message = self.git_repository.push_and_deploy(branch)
260
258
 
261
259
  message = (
262
260
  f"Successfully deployed branch '{branch}' to Abstra"
263
261
  if success
264
- else f"Failed to deploy branch '{branch}' to Abstra. Push operation failed."
262
+ else error_message
265
263
  )
266
264
 
267
265
  return {"success": success, "message": message}
@@ -284,12 +282,12 @@ class GitController:
284
282
  return {"success": False, "message": f"Commit {commit_hash[:8]} not found"}
285
283
 
286
284
  try:
287
- success = self.git_repository.revert_commit(commit_hash)
285
+ success, error_message = self.git_repository.revert_commit(commit_hash)
288
286
 
289
287
  message = (
290
288
  f"Successfully restored content from commit: {commit_to_revert.message}. A new commit was created with the content from that version."
291
289
  if success
292
- else f"Failed to restore content from commit {commit_hash[:8]}. Make sure there are no uncommitted changes and the commit exists."
290
+ else error_message
293
291
  )
294
292
 
295
293
  return {"success": success, "message": message}
@@ -888,7 +888,8 @@ class MainController:
888
888
 
889
889
  def get_scripts(self) -> List[ScriptStage]:
890
890
  project = self.repositories.project.load()
891
- return project.scripts
891
+ sorted_scripts = sorted(project.scripts, key=lambda s: s.title.lower())
892
+ return sorted_scripts
892
893
 
893
894
  def get_script(self, id: str) -> Optional[ScriptStage]:
894
895
  project = self.repositories.project.load()
@@ -994,7 +995,8 @@ class MainController:
994
995
 
995
996
  def get_forms(self) -> List[FormStage]:
996
997
  project = self.repositories.project.load()
997
- return project.forms
998
+ sorted_forms = sorted(project.forms, key=lambda f: f.title.lower())
999
+ return sorted_forms
998
1000
 
999
1001
  def get_form(self, id: str) -> Optional[FormStage]:
1000
1002
  project = self.repositories.project.load()
@@ -1122,7 +1124,8 @@ class MainController:
1122
1124
 
1123
1125
  def get_hooks(self) -> List[HookStage]:
1124
1126
  project = self.repositories.project.load()
1125
- return project.hooks
1127
+ sorted_hooks = sorted(project.hooks, key=lambda h: h.title.lower())
1128
+ return sorted_hooks
1126
1129
 
1127
1130
  def get_hook_by_path(self, path: str) -> Optional[HookStage]:
1128
1131
  project = self.repositories.project.load()
@@ -1170,7 +1173,8 @@ class MainController:
1170
1173
  project = self.repositories.project.load(
1171
1174
  include_disabled_stages=include_disabled_jobs
1172
1175
  )
1173
- return project.jobs
1176
+ sorted_jobs = sorted(project.jobs, key=lambda j: j.title.lower())
1177
+ return sorted_jobs
1174
1178
 
1175
1179
  def get_job(self, id: str) -> Optional[JobStage]:
1176
1180
  project = self.repositories.project.load()
@@ -2,7 +2,7 @@ import shutil
2
2
  import tempfile
3
3
  import unittest
4
4
  from pathlib import Path
5
- from typing import Optional
5
+ from typing import Optional, Tuple
6
6
 
7
7
  from abstra_internals.repositories.git.native import NativeGitRepository
8
8
  from abstra_internals.repositories.git.types import (
@@ -23,7 +23,7 @@ class NativeGitRepositoryTest(unittest.TestCase):
23
23
 
24
24
  def _commit_changes_wrapper(
25
25
  self, message: str, author: Optional[str] = None
26
- ) -> bool:
26
+ ) -> Tuple[bool, Optional[str]]:
27
27
  """Wrapper for commit_changes that ensures git is configured"""
28
28
  self.ensure_git_configured()
29
29
  return self._original_commit_changes(message, author)
@@ -316,33 +316,44 @@ class NativeGitRepository(GitRepositoryInterface):
316
316
  if "original_working_dir" in locals() and original_working_dir is not None:
317
317
  self.working_directory = original_working_dir
318
318
 
319
- def checkout_branch(self, branch_name: str) -> bool:
319
+ def checkout_branch(self, branch_name: str) -> Tuple[bool, Optional[str]]:
320
320
  """Switch to a different branch"""
321
321
  if not self.is_git_repository():
322
- return False
322
+ return False, "Not a git repository"
323
323
 
324
- success, _, stderr = self._run_git_command(["checkout", branch_name])
325
- if not success and "did not match any file(s) known to git" in stderr:
326
- success, _, _ = self._run_git_command(
324
+ success, _, checkout_err = self._run_git_command(["checkout", branch_name])
325
+ error_message = (
326
+ None if success else f"Git checkout failed with error: {checkout_err}"
327
+ )
328
+
329
+ if not success and "did not match any file(s) known to git" in checkout_err:
330
+ success, _, create_branch_err = self._run_git_command(
327
331
  ["checkout", "-b", branch_name, f"origin/{branch_name}"]
328
332
  )
333
+ error_message = (
334
+ None
335
+ if success
336
+ else f"Git checkout failed with error: {create_branch_err}"
337
+ )
329
338
 
330
- return success
339
+ return success, error_message
331
340
 
332
- def checkout_commit(self, commit_hash: str) -> bool:
341
+ def checkout_commit(self, commit_hash: str) -> Tuple[bool, Optional[str]]:
333
342
  """Switch to a specific commit (detached HEAD state)"""
334
343
  if not self.is_git_repository():
335
- return False
344
+ return False, "Not a git repository"
336
345
 
337
- success, _, _ = self._run_git_command(["checkout", commit_hash])
338
- return success
346
+ success, _, error = self._run_git_command(["checkout", commit_hash])
347
+ error_message = None if success else f"Git checkout failed with error: {error}"
348
+
349
+ return success, error_message
339
350
 
340
351
  def pull_changes(
341
352
  self,
342
353
  strategy: str = "merge",
343
354
  allow_unrelated: bool = True,
344
355
  conflict_resolution: Optional[str] = "theirs",
345
- ) -> bool:
356
+ ) -> Tuple[bool, Optional[str]]:
346
357
  """Pull changes from abstra remote repository
347
358
 
348
359
  Args:
@@ -357,7 +368,7 @@ class NativeGitRepository(GitRepositoryInterface):
357
368
  - None: Handle conflicts manually (default)
358
369
  """
359
370
  if not self.is_git_repository():
360
- return False
371
+ return False, "Not a git repository"
361
372
 
362
373
  pull_cmd = ["pull"]
363
374
 
@@ -381,39 +392,74 @@ class NativeGitRepository(GitRepositoryInterface):
381
392
  pull_cmd.extend([REMOTE_NAME, "main"])
382
393
 
383
394
  success, _, e = self._run_git_command(pull_cmd)
395
+ error_message = None if success else f"Git pull failed with error: {e}"
396
+
397
+ return success, error_message
398
+
399
+ def add_all_files(self) -> Tuple[bool, Optional[str]]:
400
+ """Add all changes to staging area"""
401
+ if not self.is_git_repository():
402
+ return False, "Not a git repository"
403
+
404
+ success, _, error = self._run_git_command(["add", "."])
384
405
  if not success:
385
- print("There was an error during git pull:", e)
406
+ changed_files = self.get_changed_files()
407
+ failed_files = []
386
408
 
387
- return success
409
+ for file in changed_files:
410
+ file_success, _, _ = self._run_git_command(["add", file])
411
+ if not file_success:
412
+ failed_files.append(file)
413
+
414
+ if failed_files:
415
+ return (
416
+ False,
417
+ f"Git add failed for the following files: {', '.join(failed_files)}",
418
+ )
388
419
 
389
- def commit_changes(self, message: str, author: Optional[str] = None) -> bool:
420
+ if not changed_files:
421
+ return False, f"Git add failed with error: {error}"
422
+
423
+ return True, None
424
+
425
+ def commit_changes(
426
+ self, message: str, author: Optional[str] = None
427
+ ) -> Tuple[bool, Optional[str]]:
390
428
  """Commit changes with a message"""
391
429
  if not self.is_git_repository():
392
- return False
430
+ return False, "Not a git repository"
393
431
 
394
- success, _, _ = self._run_git_command(["add", "."])
395
- if not success:
396
- return False
432
+ git_add_success, git_add_error_message = self.add_all_files()
433
+ if not git_add_success:
434
+ return False, git_add_error_message
397
435
 
398
436
  if author and "@" in author:
399
437
  author_str = f"{author.split('@')[0]} <{author}>"
400
- success, _, _ = self._run_git_command(
438
+ success, _, error = self._run_git_command(
401
439
  ["commit", "-m", message, "--author", author_str]
402
440
  )
403
- return success
441
+ error_message = (
442
+ None if success else f"Git commit failed with error: {error}"
443
+ )
404
444
 
405
- success, _, _ = self._run_git_command(["commit", "-m", message])
406
- return success
445
+ return success, error_message
446
+
447
+ success, _, error = self._run_git_command(["commit", "-m", message])
448
+ error_message = None if success else f"Git commit failed with error: {error}"
449
+
450
+ return success, error_message
407
451
 
408
- def stash_changes(self, message: str = "WIP") -> bool:
452
+ def stash_changes(self, message: str = "WIP") -> Tuple[bool, Optional[str]]:
409
453
  """Stash uncommitted changes"""
410
454
  if not self.is_git_repository():
411
- return False
455
+ return False, "Not a git repository"
412
456
 
413
- success, _, _ = self._run_git_command(
457
+ success, _, err = self._run_git_command(
414
458
  ["stash", "push", "-m", message, "--include-untracked"]
415
459
  )
416
- return success
460
+ error_message = None if success else f"Git stash failed with error: {err}"
461
+
462
+ return success, error_message
417
463
 
418
464
  def get_remotes(self) -> List[str]:
419
465
  """Get list of remote names"""
@@ -506,55 +552,61 @@ class NativeGitRepository(GitRepositoryInterface):
506
552
 
507
553
  return (ahead_count, behind_count)
508
554
 
509
- def push_and_deploy(self, branch: str = "main") -> bool:
555
+ def push_and_deploy(self, branch: str = "main") -> Tuple[bool, Optional[str]]:
510
556
  """Deploy to Abstra remote (push to abstra remote)"""
511
557
  if not self.is_git_repository():
512
- return False
558
+ return False, "Not a git repository"
513
559
 
514
560
  if not self.has_remote(REMOTE_NAME):
515
- return False
561
+ return False, "Abstra Remote not found"
516
562
 
517
- success, _, _ = self._run_git_command(["push", REMOTE_NAME, branch])
563
+ success, _, err = self._run_git_command(["push", REMOTE_NAME, branch])
564
+ error_message = None if success else f"Git push failed with error: {err}"
518
565
 
519
- return success
566
+ return success, error_message
520
567
 
521
- def revert_commit(self, commit_hash: str) -> bool:
568
+ def revert_commit(self, commit_hash: str) -> Tuple[bool, Optional[str]]:
522
569
  """Reset working directory to match a previous commit and create a new commit with that content"""
523
570
  if not self.is_git_repository():
524
- return False
571
+ return False, "Not a git repository"
525
572
 
526
573
  if not commit_hash.strip():
527
- return False
574
+ return False, "Invalid commit hash"
528
575
 
529
576
  if self.has_uncommitted_changes():
530
- return False
577
+ return False, "Uncommitted changes present"
531
578
 
532
579
  try:
533
580
  # Step 1: Reset the working directory and index to match the target commit
534
581
  # This will replace all files with their state from the target commit
535
- success_reset, _, _ = self._run_git_command(
582
+ success_reset, _, err = self._run_git_command(
536
583
  ["reset", "--hard", commit_hash]
537
584
  )
538
585
  if not success_reset:
539
- return False
586
+ return False, f"Git reset failed with error: {err}"
540
587
 
541
588
  # Step 2: Reset HEAD back to the original position (soft reset)
542
589
  # This keeps the files from target commit but moves HEAD back
543
- success_soft, _, _ = self._run_git_command(["reset", "--soft", "HEAD@{1}"])
590
+ success_soft, _, err = self._run_git_command(
591
+ ["reset", "--soft", "HEAD@{1}"]
592
+ )
544
593
  if not success_soft:
545
- return False
594
+ return False, f"Git soft reset failed with error: {err}"
546
595
 
547
596
  # Step 3: Create a new commit with the restored content
548
597
  commit_message = f"Restore content from commit {commit_hash[:8]}"
549
- success_commit, _, _ = self._run_git_command(
598
+ success_commit, _, err = self._run_git_command(
550
599
  ["commit", "-m", commit_message]
551
600
  )
601
+ error_message = (
602
+ None if success_commit else f"Git commit failed with error: {err}"
603
+ )
552
604
 
553
- return success_commit
605
+ return success_commit, error_message
554
606
 
555
607
  except Exception:
556
608
  self._run_git_command(["reset", "--hard", "HEAD"])
557
- return False
609
+ return False, "An error occurred during revert"
558
610
 
559
611
  def check_merge_conflicts(self, remote_commit: str) -> bool:
560
612
  """Check if merging with remote commit would cause conflicts"""
@@ -647,7 +699,7 @@ class NativeGitRepository(GitRepositoryInterface):
647
699
  try:
648
700
  # Use git check-ignore with stdin for batch processing
649
701
  input_data = "\n".join(relative_paths)
650
- success, stdout, _ = self._run_git_command(
702
+ _, stdout, _ = self._run_git_command(
651
703
  ["check-ignore", "--stdin"],
652
704
  cwd=self.working_directory,
653
705
  input=input_data,
@@ -191,12 +191,12 @@ class GitRepositoryInterface(ABC):
191
191
  pass
192
192
 
193
193
  @abstractmethod
194
- def checkout_branch(self, branch_name: str) -> bool:
194
+ def checkout_branch(self, branch_name: str) -> Tuple[bool, Optional[str]]:
195
195
  """Switch to a different branch"""
196
196
  pass
197
197
 
198
198
  @abstractmethod
199
- def checkout_commit(self, commit_hash: str) -> bool:
199
+ def checkout_commit(self, commit_hash: str) -> Tuple[bool, Optional[str]]:
200
200
  """Switch to a specific commit (detached HEAD state)"""
201
201
  pass
202
202
 
@@ -206,17 +206,19 @@ class GitRepositoryInterface(ABC):
206
206
  strategy: str = "merge",
207
207
  allow_unrelated: bool = True,
208
208
  conflict_resolution: Optional[str] = "theirs",
209
- ) -> bool:
209
+ ) -> Tuple[bool, Optional[str]]:
210
210
  """Pull changes from remote repository"""
211
211
  pass
212
212
 
213
213
  @abstractmethod
214
- def commit_changes(self, message: str, author: Optional[str] = None) -> bool:
214
+ def commit_changes(
215
+ self, message: str, author: Optional[str] = None
216
+ ) -> Tuple[bool, Optional[str]]:
215
217
  """Commit changes with a message"""
216
218
  pass
217
219
 
218
220
  @abstractmethod
219
- def stash_changes(self, message: str = "WIP") -> bool:
221
+ def stash_changes(self, message: str = "WIP") -> Tuple[bool, Optional[str]]:
220
222
  """Stash uncommitted changes"""
221
223
  pass
222
224
 
@@ -251,12 +253,12 @@ class GitRepositoryInterface(ABC):
251
253
  pass
252
254
 
253
255
  @abstractmethod
254
- def push_and_deploy(self, branch: str = "main") -> bool:
256
+ def push_and_deploy(self, branch: str = "main") -> Tuple[bool, Optional[str]]:
255
257
  """Deploy to Abstra remote (push to abstra remote)"""
256
258
  pass
257
259
 
258
260
  @abstractmethod
259
- def revert_commit(self, commit_hash: str) -> bool:
261
+ def revert_commit(self, commit_hash: str) -> Tuple[bool, Optional[str]]:
260
262
  """Restore content from a previous commit by creating a new commit with that content"""
261
263
  pass
262
264
 
@@ -6,6 +6,11 @@ from uuid import uuid4
6
6
 
7
7
  from abstra_internals.cloud_api.http_client import HTTPClient
8
8
  from abstra_internals.consts.filepaths import TASKS_DIR_PATH
9
+ from abstra_internals.contracts_generated import (
10
+ CloudApiCliTasksUpdateTaskRequest,
11
+ CloudApiConsoleWorkflowUpdateTaskRequestCompleted,
12
+ CloudApiConsoleWorkflowUpdateTaskRequestLocked,
13
+ )
9
14
  from abstra_internals.repositories.multiprocessing import MPContext
10
15
  from abstra_internals.services.sql_storage import SqlStorage
11
16
  from abstra_internals.utils.datetime import to_utc_iso_string
@@ -296,16 +301,14 @@ class ProductionTasksRepository(TasksRepository):
296
301
  ) -> None:
297
302
  r = self.client.patch(
298
303
  endpoint=f"/tasks/{task_id}",
299
- json={
300
- "status": "locked",
301
- "locked": {
302
- "at": to_utc_iso_string(
303
- datetime.datetime.now(datetime.timezone.utc)
304
- ),
305
- "byExecutionId": execution_id,
306
- "byStageId": stage_id,
307
- },
308
- },
304
+ json=CloudApiCliTasksUpdateTaskRequest(
305
+ status="locked",
306
+ locked=CloudApiConsoleWorkflowUpdateTaskRequestLocked(
307
+ at=datetime.datetime.now(datetime.timezone.utc),
308
+ by_execution_id=execution_id,
309
+ by_stage_id=stage_id,
310
+ ),
311
+ ).to_dict(),
309
312
  )
310
313
 
311
314
  if r.status_code == 409:
@@ -318,16 +321,14 @@ class ProductionTasksRepository(TasksRepository):
318
321
  ) -> None:
319
322
  r = self.client.patch(
320
323
  endpoint=f"/tasks/{task_id}",
321
- json={
322
- "status": "completed",
323
- "completed": {
324
- "at": to_utc_iso_string(
325
- datetime.datetime.now(datetime.timezone.utc)
326
- ),
327
- "byExecutionId": execution_id,
328
- "byStageId": stage_id,
329
- },
330
- },
324
+ json=CloudApiCliTasksUpdateTaskRequest(
325
+ status="completed",
326
+ completed=CloudApiConsoleWorkflowUpdateTaskRequestCompleted(
327
+ at=datetime.datetime.now(datetime.timezone.utc),
328
+ by_execution_id=execution_id,
329
+ by_stage_id=stage_id,
330
+ ),
331
+ ).to_dict(),
331
332
  )
332
333
 
333
334
  if r.status_code == 409:
@@ -338,7 +339,7 @@ class ProductionTasksRepository(TasksRepository):
338
339
  def set_task_to_pending(self, task_id: str) -> None:
339
340
  r = self.client.patch(
340
341
  endpoint=f"/tasks/{task_id}",
341
- json={"status": "pending"},
342
+ json=CloudApiCliTasksUpdateTaskRequest(status="pending").to_dict(),
342
343
  )
343
344
 
344
345
  if r.status_code == 409:
@@ -15,6 +15,7 @@ class FileSystemService:
15
15
  _git_ignore_cache: Dict[Path, bool] = {}
16
16
  _git_ignore_cache_lock = threading.Lock()
17
17
  _git_repository = None
18
+ _gitignore_mtime: Optional[float] = None
18
19
 
19
20
  # Fallback cache for Python .gitignore parsing (when git unavailable)
20
21
  _gitignore_cache: Dict[Path, List[str]] = {}
@@ -35,12 +36,33 @@ class FileSystemService:
35
36
  git_repo = FileSystemService._get_git_repository()
36
37
  return git_repo.is_git_repository()
37
38
 
39
+ @staticmethod
40
+ def _check_gitignore_modified():
41
+ """Check if .gitignore has been modified since last cache, and clear if needed."""
42
+ gitignore_path = Settings.root_path / GITIGNORE_FILEPATH
43
+ if gitignore_path.exists():
44
+ try:
45
+ current_mtime = gitignore_path.stat().st_mtime
46
+ if FileSystemService._gitignore_mtime is None:
47
+ FileSystemService._gitignore_mtime = current_mtime
48
+ elif FileSystemService._gitignore_mtime != current_mtime:
49
+ FileSystemService.clear_gitignore_cache()
50
+ FileSystemService._gitignore_mtime = current_mtime
51
+ except OSError:
52
+ pass
53
+ elif FileSystemService._gitignore_mtime is not None:
54
+ # .gitignore was deleted
55
+ FileSystemService.clear_gitignore_cache()
56
+ FileSystemService._gitignore_mtime = None
57
+
38
58
  @staticmethod
39
59
  def _check_git_ignore_batch(paths: List[Path]) -> Dict[Path, bool]:
40
60
  """
41
61
  Check multiple paths at once using git check-ignore --stdin.
42
62
  Much more efficient than checking one at a time.
43
63
  """
64
+ FileSystemService._check_gitignore_modified()
65
+
44
66
  if not FileSystemService._is_git_available():
45
67
  return {path: False for path in paths}
46
68
 
@@ -126,6 +148,9 @@ class FileSystemService:
126
148
  # Clear git repository cache to avoid using stale repository instances
127
149
  FileSystemService._git_repository = None
128
150
 
151
+ # Reset mtime tracking
152
+ FileSystemService._gitignore_mtime = None
153
+
129
154
  @staticmethod
130
155
  def venv_path() -> Optional[Path]:
131
156
  str_path = os.getenv("VIRTUAL_ENV") or os.getenv("CONDA_PREFIX")
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import threading
2
3
  from pathlib import Path
3
4
  from typing import Generic, List, Optional, Type, TypeVar
4
5
 
@@ -17,7 +18,7 @@ T = TypeVar("T", bound=Serializable)
17
18
 
18
19
  class SqlStorage(Generic[T]):
19
20
  def __init__(self, mp_context: MPContext, directory: str, model: Type[T]):
20
- self.lock = mp_context.RLock()
21
+ self.lock = threading.RLock()
21
22
  self.directory = directory
22
23
  self.model = model
23
24
  self.table_name = "data"
@@ -1,2 +1,2 @@
1
- import{d as c,c as b,a as r,b as a,u as n,eG as d,ed as g,o as i,f as l,dj as p,ae as u,h as y,eH as m,bY as f,b0 as _}from"./jwt-decode.esm.b9bb33e7.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},e=new Error().stack;e&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[e]="50914e28-a556-409b-b8a1-d7d6e4a42e7b",t._sentryDebugIdIdentifier="sentry-dbid-50914e28-a556-409b-b8a1-d7d6e4a42e7b")}catch{}})();const h=c({__name:"AbstraButton",props:{disabledTooltip:{},tooltip:{},prefixCls:{},type:{},htmlType:{},shape:{},size:{},loading:{type:[Boolean,Object]},disabled:{type:Boolean},ghost:{type:Boolean},block:{type:Boolean},danger:{type:Boolean},icon:{},href:{},target:{},title:{},onClick:{type:[Function,Array]},onMousedown:{type:[Function,Array]}},setup(t){const e=t,s=b(()=>e.disabledTooltip&&e.disabled?e.disabledTooltip:e.tooltip);return(o,k)=>s.value?(i(),r(n(_),{key:0,title:s.value},{default:a(()=>[l(n(f),d(m(o.$props)),{default:a(()=>[l(n(p),{style:{display:"flex","align-items":"center","justify-content":"center",gap:"5px"}},{default:a(()=>[o.loading?y("",!0):u(o.$slots,"default",{key:0})]),_:3})]),_:3},16)]),_:3},8,["title"])):(i(),r(n(f),d(g({key:1},o.$props)),{default:a(()=>[l(n(p),{style:{display:"flex","align-items":"center","justify-content":"center",gap:"5px"}},{default:a(()=>[o.loading?y("",!0):u(o.$slots,"default",{key:0})]),_:3})]),_:3},16))}});export{h as _};
2
- //# sourceMappingURL=AbstraButton.vue_vue_type_script_setup_true_lang.865dcbf3.js.map
1
+ import{d as c,c as b,a as r,b as a,u as n,eI as d,ed as g,o as i,f as l,dj as p,ae as u,h as f,eJ as m,bY as y,b0 as _}from"./jwt-decode.esm.f87c17f7.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},e=new Error().stack;e&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[e]="651eae24-fc7e-4e77-b25d-b0f45c7d8826",t._sentryDebugIdIdentifier="sentry-dbid-651eae24-fc7e-4e77-b25d-b0f45c7d8826")}catch{}})();const h=c({__name:"AbstraButton",props:{disabledTooltip:{},tooltip:{},prefixCls:{},type:{},htmlType:{},shape:{},size:{},loading:{type:[Boolean,Object]},disabled:{type:Boolean},ghost:{type:Boolean},block:{type:Boolean},danger:{type:Boolean},icon:{},href:{},target:{},title:{},onClick:{type:[Function,Array]},onMousedown:{type:[Function,Array]}},setup(t){const e=t,s=b(()=>e.disabledTooltip&&e.disabled?e.disabledTooltip:e.tooltip);return(o,k)=>s.value?(i(),r(n(_),{key:0,title:s.value},{default:a(()=>[l(n(y),d(m(o.$props)),{default:a(()=>[l(n(p),{style:{display:"flex","align-items":"center","justify-content":"center",gap:"5px"}},{default:a(()=>[o.loading?f("",!0):u(o.$slots,"default",{key:0})]),_:3})]),_:3},16)]),_:3},8,["title"])):(i(),r(n(y),d(g({key:1},o.$props)),{default:a(()=>[l(n(p),{style:{display:"flex","align-items":"center","justify-content":"center",gap:"5px"}},{default:a(()=>[o.loading?f("",!0):u(o.$slots,"default",{key:0})]),_:3})]),_:3},16))}});export{h as _};
2
+ //# sourceMappingURL=AbstraButton.vue_vue_type_script_setup_true_lang.6efe348a.js.map
@@ -0,0 +1,2 @@
1
+ import{L as a}from"./Logo.29f26be1.js";import{d as n,o as r,a as f,u as d}from"./jwt-decode.esm.f87c17f7.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},s=new Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="50762156-b5ff-4735-ad4f-f4ec712ecf8c",e._sentryDebugIdIdentifier="sentry-dbid-50762156-b5ff-4735-ad4f-f4ec712ecf8c")}catch{}})();const i="/assets/logo.0faadfa2.svg",u=n({__name:"AbstraLogo",props:{hideText:{type:Boolean},size:{}},setup(e){return(s,t)=>{var o;return r(),f(a,{"image-url":d(i),"brand-name":"Abstra","hide-text":s.hideText,size:(o=s.size)!=null?o:"small"},null,8,["image-url","hide-text","size"])}}});export{u as _};
2
+ //# sourceMappingURL=AbstraLogo.vue_vue_type_script_setup_true_lang.f628a3a7.js.map
@@ -0,0 +1,2 @@
1
+ import{C as x}from"./CrudView.7997b881.js";import{d as I,r as A,i as e,ei as C,c as h,ac as D,f as d,u as t,b as p,aY as M,o as P,de as T,g as y,t as f,df as j,M as V,ek as B,et as E}from"./jwt-decode.esm.f87c17f7.js";import{a as N}from"./asyncComputed.515034b4.js";import{A as c}from"./apiKey.66dca0fa.js";import"./router.09566602.js";import{M as $}from"./member.c8206c64.js";import{a as z}from"./project.25a396d4.js";import"./tables.1b5568d1.js";import"./DocsButton.vue_vue_type_script_setup_true_lang.39638c19.js";import"./constants.2cdc2025.js";import"./url.acca5643.js";import"./PhDotsThreeVertical.vue.2c9a03d5.js";import"./index.97648248.js";import"./index.9f357119.js";import"./record.a8da6046.js";import"./string.0c102318.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},o=new Error().stack;o&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[o]="4ddd36ba-2470-44d6-9568-d34f1daa140c",s._sentryDebugIdIdentifier="sentry-dbid-4ddd36ba-2470-44d6-9568-d34f1daa140c")}catch{}})();const te=I({__name:"ApiKeys",setup(s){const o=A(null),_=[{key:"name",label:e.translate("i18n_apikeysview_field_name")}],r=C().params.projectId,w=new $,{loading:v,result:k,refetch:m}=N(async()=>Promise.all([c.list(r),z.get(r).then(a=>w.list(a.organizationId))]).then(([a,n])=>a.map(i=>({apiKey:i,member:n.find(l=>l.authorId===i.ownerId)})))),b=async a=>{const n=await c.create({projectId:r,name:a.name});m(),o.value=n.value},g=h(()=>{var a,n;return{columns:[{title:e.translate("i18n_apikeysview_column_name")},{title:e.translate("i18n_apikeysview_column_creation_date")},{title:e.translate("i18n_apikeysview_column_owner")},{title:"",align:"right"}],rows:(n=(a=k.value)==null?void 0:a.map(({apiKey:i,member:l})=>{var u;return{key:i.id,cells:[{type:"text",text:i.name},{type:"text",text:B(i.createdAt)},{type:"text",text:(u=l==null?void 0:l.email)!=null?u:e.translate("i18n_apikeysview_owner_unknown")},{type:"actions",actions:[{label:e.translate("i18n_apikeysview_action_delete"),icon:E,dangerous:!0,onClick:async()=>{await c.delete(r,i.id),m()}}]}]}}))!=null?n:[]}});return(a,n)=>(P(),D(M,null,[d(x,{"entity-name":t(e).translate("i18n_apikeysview_entity_name"),"create-button-text":t(e).translate("i18n_apikeysview_create_button"),loading:t(v),title:t(e).translate("i18n_apikeysview_title"),description:t(e).translate("i18n_apikeysview_description"),"empty-title":t(e).translate("i18n_apikeysview_empty_title"),table:g.value,fields:_,create:b},null,8,["entity-name","create-button-text","loading","title","description","empty-title","table"]),d(t(V),{open:!!o.value,title:t(e).translate("i18n_apikeysview_modal_title"),onCancel:n[0]||(n[0]=i=>o.value=null)},{footer:p(()=>[]),default:p(()=>[d(t(T),null,{default:p(()=>[y(f(t(e).translate("i18n_apikeysview_modal_description")),1)]),_:1}),d(t(j),{code:"",copyable:""},{default:p(()=>[y(f(o.value),1)]),_:1})]),_:1},8,["open","title"])],64))}});export{te as default};
2
+ //# sourceMappingURL=ApiKeys.5b43091f.js.map
@@ -0,0 +1,2 @@
1
+ import"./App.vue_vue_type_style_index_0_lang.1a83eeea.js";import{_ as u}from"./App.vue_vue_type_style_index_0_lang.1a83eeea.js";import"./userStore.3989ac4e.js";import"./jwt-decode.esm.f87c17f7.js";import"./PlayerConfigProvider.26c6fb0a.js";import"./colorHelpers.43bbe7b2.js";import"./workspaceStore.ef7daa80.js";import"./url.acca5643.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},t=new Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="d22a2f76-d432-4e87-92af-523724e474be",e._sentryDebugIdIdentifier="sentry-dbid-d22a2f76-d432-4e87-92af-523724e474be")}catch{}})();export{u as default};
2
+ //# sourceMappingURL=App.7a6ee8e5.js.map
@@ -0,0 +1,2 @@
1
+ import{u as r}from"./userStore.3989ac4e.js";import{W as n}from"./PlayerConfigProvider.26c6fb0a.js";import{u as c}from"./workspaceStore.ef7daa80.js";import{d as f,w as i,j as p,u as o,a as u,b as d,h as l,o as m,f as _}from"./jwt-decode.esm.f87c17f7.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},a=new Error().stack;a&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[a]="4f86579f-0b3e-4888-9ec7-205f905c3954",t._sentryDebugIdIdentifier="sentry-dbid-4f86579f-0b3e-4888-9ec7-205f905c3954")}catch{}})();const v=f({__name:"App",setup(t){const a=r(),e=c();return e.actions.fetch(),i(()=>a.jwt,e.actions.fetch),(w,y)=>{const s=p("RouterView");return o(e).state.workspace?(m(),u(n,{key:0,"main-color":o(e).state.workspace.mainColor,background:o(e).state.workspace.theme,"font-family":o(e).state.workspace.fontFamily,locale:o(e).state.workspace.language},{default:d(()=>[_(s,{style:{height:"100vh",width:"100%"}})]),_:1},8,["main-color","background","font-family","locale"])):l("",!0)}}});export{v as _};
2
+ //# sourceMappingURL=App.vue_vue_type_style_index_0_lang.1a83eeea.js.map
@@ -1,2 +1,2 @@
1
- import{_ as c,o,ac as n,ae as s,e as d,h as a}from"./jwt-decode.esm.b9bb33e7.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},t=new Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="bb2f9150-ec18-47f3-861c-b5685c72b7a8",e._sentryDebugIdIdentifier="sentry-dbid-bb2f9150-ec18-47f3-861c-b5685c72b7a8")}catch{}})();const r={},i={class:"base-layout"},_={class:"base-middle"},f={class:"content"},l={class:"left"},u={key:0,class:"base-footer"},b={key:0};function y(e,t){return o(),n("div",i,[s(e.$slots,"sidebar",{},void 0,!0),d("section",_,[s(e.$slots,"navbar",{},void 0,!0),d("section",f,[d("section",l,[s(e.$slots,"content",{},void 0,!0),e.$slots.footer?(o(),n("section",u,[s(e.$slots,"footer",{},void 0,!0)])):a("",!0)]),e.$slots.chat?(o(),n("section",b,[s(e.$slots,"chat",{},void 0,!0)])):a("",!0)])])])}const g=c(r,[["render",y],["__scopeId","data-v-da85ecdc"]]);export{g as B};
2
- //# sourceMappingURL=BaseLayout.31267389.js.map
1
+ import{_ as c,o,ac as n,ae as s,e as d,h as a}from"./jwt-decode.esm.f87c17f7.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},t=new Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="c9cdbea9-7122-4108-84ab-33b52267c876",e._sentryDebugIdIdentifier="sentry-dbid-c9cdbea9-7122-4108-84ab-33b52267c876")}catch{}})();const r={},i={class:"base-layout"},_={class:"base-middle"},l={class:"content"},u={class:"left"},f={key:0,class:"base-footer"},b={key:0};function y(e,t){return o(),n("div",i,[s(e.$slots,"sidebar",{},void 0,!0),d("section",_,[s(e.$slots,"navbar",{},void 0,!0),d("section",l,[d("section",u,[s(e.$slots,"content",{},void 0,!0),e.$slots.footer?(o(),n("section",f,[s(e.$slots,"footer",{},void 0,!0)])):a("",!0)]),e.$slots.chat?(o(),n("section",b,[s(e.$slots,"chat",{},void 0,!0)])):a("",!0)])])])}const g=c(r,[["render",y],["__scopeId","data-v-da85ecdc"]]);export{g as B};
2
+ //# sourceMappingURL=BaseLayout.3c6f8614.js.map