beanhub-cli 3.0.1__tar.gz → 3.1.1__tar.gz

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 (314) hide show
  1. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/PKG-INFO +5 -1
  2. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/connect/main.py +1 -0
  3. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/format.py +70 -50
  4. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/plaid_item_sync_state.py +1 -0
  5. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/main.py +1 -0
  6. beanhub_cli-3.1.1/beanhub_cli/mcp/app/main.py +16 -0
  7. beanhub_cli-3.1.1/beanhub_cli/mcp/app/routes.py +62 -0
  8. beanhub_cli-3.1.1/beanhub_cli/mcp/cli.py +10 -0
  9. beanhub_cli-3.1.1/beanhub_cli/mcp/main.py +38 -0
  10. beanhub_cli-3.1.1/beanhub_cli/mcp/schemes.py +20 -0
  11. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/data/internal-openapi.json +1 -1
  12. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/commands/connect.md +0 -7
  13. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/commands/login.md +0 -7
  14. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/pyproject.toml +6 -2
  15. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/scripts/gen-internal-api.sh +0 -0
  16. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/connect/test_sync.py +76 -0
  17. beanhub_cli-3.1.1/tests/forms/app/__init__.py +0 -0
  18. beanhub_cli-3.1.1/tests/inbox/__init__.py +0 -0
  19. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/uv.lock +648 -4
  20. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/.circleci/config.yml +0 -0
  21. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/.gitignore +0 -0
  22. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/.pre-commit-config.yaml +0 -0
  23. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/LICENSE +0 -0
  24. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/README.md +0 -0
  25. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/assets/beanhub.svg +0 -0
  26. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/assets/forms-screenshot.png +0 -0
  27. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/__init__.py +0 -0
  28. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/aliase.py +0 -0
  29. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/api_helpers.py +0 -0
  30. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/auth.py +0 -0
  31. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/cli.py +0 -0
  32. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/config.py +0 -0
  33. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/connect/__init__.py +0 -0
  34. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/connect/cli.py +0 -0
  35. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/encryption.py +0 -0
  36. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/environment.py +0 -0
  37. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/file_io.py +0 -0
  38. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/__init__.py +0 -0
  39. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/__init__.py +0 -0
  40. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/constants.py +0 -0
  41. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/data/sample_forms_doc.yaml +0 -0
  42. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/deps.py +0 -0
  43. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/helpers.py +0 -0
  44. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/main.py +0 -0
  45. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/routes.py +0 -0
  46. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/settings.py +0 -0
  47. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js +0 -0
  48. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js.LICENSE.txt +0 -0
  49. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/js/beanhub-web-react-0.3.0.js.map +0 -0
  50. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/LICENSE +0 -0
  51. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.css +0 -0
  52. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.css.map +0 -0
  53. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/css/bootstrap-datepicker.min.css +0 -0
  54. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/js/bootstrap-datepicker.js +0 -0
  55. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/js/bootstrap-datepicker.min.js +0 -0
  56. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker-en-CA.min.js +0 -0
  57. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar-DZ.min.js +0 -0
  58. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar-tn.min.js +0 -0
  59. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ar.min.js +0 -0
  60. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.az.min.js +0 -0
  61. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bg.min.js +0 -0
  62. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bm.min.js +0 -0
  63. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bn.min.js +0 -0
  64. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.br.min.js +0 -0
  65. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.bs.min.js +0 -0
  66. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ca.min.js +0 -0
  67. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.cs.min.js +0 -0
  68. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.cy.min.js +0 -0
  69. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.da.min.js +0 -0
  70. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.de.min.js +0 -0
  71. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.el.min.js +0 -0
  72. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-AU.min.js +0 -0
  73. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-CA.min.js +0 -0
  74. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-GB.min.js +0 -0
  75. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-IE.min.js +0 -0
  76. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-NZ.min.js +0 -0
  77. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-US.min.js +0 -0
  78. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.en-ZA.min.js +0 -0
  79. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.eo.min.js +0 -0
  80. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.es.min.js +0 -0
  81. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.et.min.js +0 -0
  82. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.eu.min.js +0 -0
  83. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fa.min.js +0 -0
  84. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fi.min.js +0 -0
  85. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fo.min.js +0 -0
  86. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fr-CH.min.js +0 -0
  87. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.fr.min.js +0 -0
  88. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.gl.min.js +0 -0
  89. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.he.min.js +0 -0
  90. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hi.min.js +0 -0
  91. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hr.min.js +0 -0
  92. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hu.min.js +0 -0
  93. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.hy.min.js +0 -0
  94. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.id.min.js +0 -0
  95. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.is.min.js +0 -0
  96. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.it-CH.min.js +0 -0
  97. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.it.min.js +0 -0
  98. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ja.min.js +0 -0
  99. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ka.min.js +0 -0
  100. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kh.min.js +0 -0
  101. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kk.min.js +0 -0
  102. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.km.min.js +0 -0
  103. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js +0 -0
  104. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.kr.min.js +0 -0
  105. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.lt.min.js +0 -0
  106. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.lv.min.js +0 -0
  107. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.me.min.js +0 -0
  108. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mk.min.js +0 -0
  109. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mn.min.js +0 -0
  110. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.mr.min.js +0 -0
  111. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ms.min.js +0 -0
  112. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.nl-BE.min.js +0 -0
  113. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.nl.min.js +0 -0
  114. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.no.min.js +0 -0
  115. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.oc.min.js +0 -0
  116. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pl.min.js +0 -0
  117. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pt-BR.min.js +0 -0
  118. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.pt.min.js +0 -0
  119. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ro.min.js +0 -0
  120. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.rs-latin.min.js +0 -0
  121. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.rs.min.js +0 -0
  122. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ru.min.js +0 -0
  123. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.si.min.js +0 -0
  124. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sk.min.js +0 -0
  125. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sl.min.js +0 -0
  126. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sq.min.js +0 -0
  127. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sr-latin.min.js +0 -0
  128. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sr.min.js +0 -0
  129. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sv.min.js +0 -0
  130. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.sw.min.js +0 -0
  131. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.ta.min.js +0 -0
  132. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tg.min.js +0 -0
  133. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.th.min.js +0 -0
  134. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tk.min.js +0 -0
  135. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.tr.min.js +0 -0
  136. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uk.min.js +0 -0
  137. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uz-cyrl.min.js +0 -0
  138. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.uz-latn.min.js +0 -0
  139. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.vi.min.js +0 -0
  140. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js +0 -0
  141. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.zh-TW.min.js +0 -0
  142. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/LICENSE.txt +0 -0
  143. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/css/all.min.css +0 -0
  144. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-brands-400.ttf +0 -0
  145. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-brands-400.woff2 +0 -0
  146. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-regular-400.ttf +0 -0
  147. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-regular-400.woff2 +0 -0
  148. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-solid-900.ttf +0 -0
  149. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-solid-900.woff2 +0 -0
  150. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-v4compatibility.ttf +0 -0
  151. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/fontawesome6/webfonts/fa-v4compatibility.woff2 +0 -0
  152. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/LICENSE.md +0 -0
  153. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/css/select2.css +0 -0
  154. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/css/select2.min.css +0 -0
  155. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/af.js +0 -0
  156. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ar.js +0 -0
  157. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/az.js +0 -0
  158. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bg.js +0 -0
  159. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bn.js +0 -0
  160. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/bs.js +0 -0
  161. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ca.js +0 -0
  162. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/cs.js +0 -0
  163. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/da.js +0 -0
  164. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/de.js +0 -0
  165. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/dsb.js +0 -0
  166. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/el.js +0 -0
  167. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/en.js +0 -0
  168. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/eo.js +0 -0
  169. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/es.js +0 -0
  170. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/et.js +0 -0
  171. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/eu.js +0 -0
  172. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fa.js +0 -0
  173. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fi.js +0 -0
  174. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/fr.js +0 -0
  175. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/gl.js +0 -0
  176. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/he.js +0 -0
  177. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hi.js +0 -0
  178. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hr.js +0 -0
  179. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hsb.js +0 -0
  180. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hu.js +0 -0
  181. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/hy.js +0 -0
  182. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/id.js +0 -0
  183. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/is.js +0 -0
  184. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/it.js +0 -0
  185. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ja.js +0 -0
  186. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ka.js +0 -0
  187. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/km.js +0 -0
  188. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ko.js +0 -0
  189. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/lt.js +0 -0
  190. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/lv.js +0 -0
  191. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/mk.js +0 -0
  192. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ms.js +0 -0
  193. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/nb.js +0 -0
  194. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ne.js +0 -0
  195. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/nl.js +0 -0
  196. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pa.js +0 -0
  197. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pl.js +0 -0
  198. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ps.js +0 -0
  199. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pt-BR.js +0 -0
  200. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/pt.js +0 -0
  201. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ro.js +0 -0
  202. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/ru.js +0 -0
  203. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sk.js +0 -0
  204. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sl.js +0 -0
  205. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sq.js +0 -0
  206. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sr-Cyrl.js +0 -0
  207. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sr.js +0 -0
  208. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/sv.js +0 -0
  209. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/te.js +0 -0
  210. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/th.js +0 -0
  211. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/tk.js +0 -0
  212. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/tr.js +0 -0
  213. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/uk.js +0 -0
  214. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/vi.js +0 -0
  215. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/zh-CN.js +0 -0
  216. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/i18n/zh-TW.js +0 -0
  217. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.full.js +0 -0
  218. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.full.min.js +0 -0
  219. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.js +0 -0
  220. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/static/vendor/select2/js/select2.min.js +0 -0
  221. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/templates/errors.html +0 -0
  222. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/templates/flash_messages.html +0 -0
  223. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/templates/footer.html +0 -0
  224. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/templates/form.html +0 -0
  225. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/templates/home.html +0 -0
  226. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/app/templates/layout.html +0 -0
  227. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/cli.py +0 -0
  228. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/main.py +0 -0
  229. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/forms/validator.py +0 -0
  230. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/import_cli.py +0 -0
  231. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/inbox/__init__.py +0 -0
  232. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/inbox/cli.py +0 -0
  233. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/inbox/main.py +0 -0
  234. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/__init__.py +0 -0
  235. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/__init__.py +0 -0
  236. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/auth/__init__.py +0 -0
  237. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/auth/create_auth_session.py +0 -0
  238. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/auth/poll_auth_session.py +0 -0
  239. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/connect/__init__.py +0 -0
  240. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/connect/create_dump_request.py +0 -0
  241. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/connect/create_sync_batch.py +0 -0
  242. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/connect/get_dump_request.py +0 -0
  243. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/connect/get_sync_batch.py +0 -0
  244. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/inbox/__init__.py +0 -0
  245. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/inbox/create_inbox_dump_request.py +0 -0
  246. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/inbox/get_inbox_dump_request.py +0 -0
  247. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/inbox/get_inbox_emails.py +0 -0
  248. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/repo/__init__.py +0 -0
  249. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/api/repo/list_repo.py +0 -0
  250. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/client.py +0 -0
  251. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/errors.py +0 -0
  252. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/__init__.py +0 -0
  253. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/auth_session_not_ready_response.py +0 -0
  254. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/auth_session_poll_response.py +0 -0
  255. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/auth_session_request.py +0 -0
  256. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/auth_session_response.py +0 -0
  257. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/create_dump_request_request.py +0 -0
  258. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/create_dump_request_response.py +0 -0
  259. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/create_inbox_dump_request.py +0 -0
  260. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/create_inbox_dump_request_response.py +0 -0
  261. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/create_sync_batch_response.py +0 -0
  262. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/dump_request_state.py +0 -0
  263. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/generic_error.py +0 -0
  264. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/get_dump_request_response.py +0 -0
  265. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/get_inbox_dump_request_response.py +0 -0
  266. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/get_inbox_email_response.py +0 -0
  267. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/get_sync_batch_response.py +0 -0
  268. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/http_validation_error.py +0 -0
  269. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/inbox_dump_request_state.py +0 -0
  270. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/inbox_email.py +0 -0
  271. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/inbox_email_headers.py +0 -0
  272. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/item_data.py +0 -0
  273. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/list_repositories_response.py +0 -0
  274. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/repository.py +0 -0
  275. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/repository_type.py +0 -0
  276. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/sync_data.py +0 -0
  277. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/models/validation_error.py +0 -0
  278. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/py.typed +0 -0
  279. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/internal_api/types.py +0 -0
  280. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/beanhub_cli/login.py +0 -0
  281. {beanhub_cli-3.0.1/tests → beanhub_cli-3.1.1/beanhub_cli/mcp}/__init__.py +0 -0
  282. {beanhub_cli-3.0.1/tests/connect → beanhub_cli-3.1.1/beanhub_cli/mcp/app}/__init__.py +0 -0
  283. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/data/internal-api-config.yaml +0 -0
  284. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/assets/favicon.svg +0 -0
  285. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/assets/logo.svg +0 -0
  286. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/commands/form.md +0 -0
  287. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/commands/format.md +0 -0
  288. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/commands/import.md +0 -0
  289. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/getting-started.md +0 -0
  290. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/img/auth-session-screenshot.png +0 -0
  291. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/img/beanhub-connect-list.png +0 -0
  292. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/img/beanhub-connect-pop-up.png +0 -0
  293. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/img/forms-screenshot.png +0 -0
  294. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/docs/index.md +0 -0
  295. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/mkdocs.yml +0 -0
  296. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/netlify.toml +0 -0
  297. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  298. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/docs/requirements.txt +0 -0
  299. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/pytest.ini +0 -0
  300. {beanhub_cli-3.0.1/tests/forms → beanhub_cli-3.1.1/tests}/__init__.py +0 -0
  301. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/conftest.py +0 -0
  302. {beanhub_cli-3.0.1/tests/forms/app → beanhub_cli-3.1.1/tests/connect}/__init__.py +0 -0
  303. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/connect/test_dump.py +0 -0
  304. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/connect/test_encryption.py +0 -0
  305. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/factories.py +0 -0
  306. {beanhub_cli-3.0.1/tests/inbox → beanhub_cli-3.1.1/tests/forms}/__init__.py +0 -0
  307. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/forms/app/conftest.py +0 -0
  308. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/forms/app/test_forms.py +0 -0
  309. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/forms/app/types_def.py +0 -0
  310. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/forms/test_validator.py +0 -0
  311. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/helper.py +0 -0
  312. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/inbox/test_dump.py +0 -0
  313. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/test_format.py +0 -0
  314. {beanhub_cli-3.0.1 → beanhub_cli-3.1.1}/tests/test_login.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beanhub-cli
3
- Version: 3.0.1
3
+ Version: 3.1.1
4
4
  Summary: Command line tools for BeanHub and Beancount users
5
5
  Project-URL: Documentation, https://beanhub-cli-docs.beanhub.io
6
6
  Author-email: Fang-Pen Lin <fangpen@launchplatform.com>
@@ -9,6 +9,8 @@ License-File: LICENSE
9
9
  Requires-Python: ~=3.10
10
10
  Requires-Dist: attrs>=22.2.0
11
11
  Requires-Dist: beancount-black<2,>=1.0.1
12
+ Requires-Dist: beancount-data>=3.0.2
13
+ Requires-Dist: beancount-exporter>=3.0.0
12
14
  Requires-Dist: beancount-parser<1.3.0,>=1.2.3
13
15
  Requires-Dist: beanhub-extract<1.0.0,>=0.1.0
14
16
  Requires-Dist: beanhub-forms<0.2,>=0.1.3
@@ -16,9 +18,11 @@ Requires-Dist: beanhub-import<2.0.0,>=1.0.0
16
18
  Requires-Dist: beanhub-inbox<0.3.0,>=0.2.3
17
19
  Requires-Dist: click<9,>=8.1.7
18
20
  Requires-Dist: cryptography>=44.0.0
21
+ Requires-Dist: fastapi-mcp>=0.3.7
19
22
  Requires-Dist: fastapi<1.0.0,>=0.98.0
20
23
  Requires-Dist: httpx<0.29.0,>=0.20.0
21
24
  Requires-Dist: jinja2<4.0.0,>=3.1.2
25
+ Requires-Dist: orjson>=3.11.0
22
26
  Requires-Dist: pydantic-settings<3,>=2.0.3
23
27
  Requires-Dist: pydantic<3,>=2.4.0
24
28
  Requires-Dist: pynacl<2,>=1.5.0
@@ -55,6 +55,7 @@ def run_sync(env: Environment, config: AuthConfig):
55
55
  [
56
56
  PlaidItemSyncState.IMPORT_FAILED,
57
57
  PlaidItemSyncState.SYNC_FAILED,
58
+ PlaidItemSyncState.SKIPPED,
58
59
  ]
59
60
  )
60
61
 
@@ -1,5 +1,6 @@
1
1
  import copy
2
2
  import functools
3
+ import logging
3
4
  import pathlib
4
5
  import shutil
5
6
  import sys
@@ -115,54 +116,26 @@ def combine_transforms(
115
116
  return tree_or_token
116
117
 
117
118
 
118
- @cli.command(name="format", help="Format Beancount files with beancount-black")
119
- @click.argument("filename", type=click.Path(exists=False, dir_okay=False), nargs=-1)
120
- @click.option(
121
- "--backup-suffix", type=str, default=".backup", help="suffix of backup file"
122
- )
123
- @click.option(
124
- "-ra",
125
- "--rename-account",
126
- type=(str, str),
127
- help="rename account names",
128
- nargs=2,
129
- multiple=True,
130
- )
131
- @click.option(
132
- "-rc",
133
- "--rename-currency",
134
- type=(str, str),
135
- help="rename currency names",
136
- nargs=2,
137
- multiple=True,
138
- )
139
- @click.option(
140
- "-s",
141
- "--stdin-mode",
142
- is_flag=True,
143
- help="Read beancount file data from stdin and output result to stdout",
144
- )
145
- @click.option("-b", "--backup", is_flag=True, help="Create backup file")
146
- @pass_env
147
- def main(
148
- env: Environment,
149
- filename: list[click.Path],
150
- backup_suffix: str,
151
- rename_account: list[tuple[str, str]],
152
- rename_currency: list[tuple[str, str]],
153
- stdin_mode: bool,
154
- backup: bool,
119
+ def format_beancount(
120
+ filenames: list[pathlib.Path],
121
+ backup_suffix: str = ".backup",
122
+ rename_account: list[tuple[str, str]] | None = None,
123
+ rename_currency: list[tuple[str, str]] | None = None,
124
+ stdin_mode: bool = False,
125
+ backup: bool = False,
126
+ logger: logging.Logger | None = None,
155
127
  ):
128
+ logger = logger or logging.getLogger(__name__)
156
129
  tree_transformers: list[typing.Callable] = []
157
130
  if rename_account:
158
131
  for from_val, to_val in rename_account:
159
- env.logger.info("Renaming account from %s to %s", from_val, to_val)
132
+ logger.info("Renaming account from %s to %s", from_val, to_val)
160
133
  tree_transformers.append(
161
134
  functools.partial(rename_account_transform, dict(rename_account))
162
135
  )
163
136
  if rename_currency:
164
137
  for from_val, to_val in rename_currency:
165
- env.logger.info("Renaming currency from %s to %s", from_val, to_val)
138
+ logger.info("Renaming currency from %s to %s", from_val, to_val)
166
139
  tree_transformers.append(
167
140
  functools.partial(rename_commodity_transform, dict(rename_currency))
168
141
  )
@@ -170,28 +143,28 @@ def main(
170
143
  # TODO: support follow include statements
171
144
  parser = make_parser()
172
145
  if stdin_mode:
173
- env.logger.info("Processing in stdin mode")
146
+ logger.info("Processing in stdin mode")
174
147
  input_content = sys.stdin.read()
175
148
  tree = parser.parse(input_content)
176
149
  formatter = Formatter()
177
150
  formatter.format(tree, sys.stdout)
178
151
  else:
179
- if filename:
152
+ if filenames:
180
153
  iterator = file_tree_iterator(
181
154
  parser=parser,
182
- filenames=map(lambda item: pathlib.Path(str(item)), filename),
155
+ filenames=filenames,
183
156
  )
184
157
  else:
185
- env.logger.info("No files provided, traverse starting from main.bean")
158
+ logger.info("No files provided, traverse starting from main.bean")
186
159
  iterator = traverse(
187
160
  parser=parser,
188
161
  bean_file=pathlib.Path("main.bean"),
189
162
  root_dir=pathlib.Path.cwd(),
190
163
  )
191
164
  for filepath, tree in iterator:
192
- env.logger.info("Processing file %s", filepath)
165
+ logger.info("Processing file %s", filepath)
193
166
  if tree_transformers:
194
- env.logger.info(
167
+ logger.info(
195
168
  "Running %s transforms against file %s ...",
196
169
  len(tree_transformers),
197
170
  filepath,
@@ -207,14 +180,61 @@ def main(
207
180
  output_content = output_file.read()
208
181
  input_content = filepath.read_text()
209
182
  if input_content == output_content:
210
- env.logger.info("File %s is not changed, skip", filepath)
183
+ logger.info("File %s is not changed, skip", filepath)
211
184
  continue
212
185
  if backup:
213
186
  backup_path = create_backup(src=filepath, suffix=backup_suffix)
214
- env.logger.info(
215
- "File %s changed, backup to %s", filepath, backup_path
216
- )
187
+ logger.info("File %s changed, backup to %s", filepath, backup_path)
217
188
  output_file.seek(0)
218
189
  with open(filepath, "wt") as input_file:
219
190
  shutil.copyfileobj(output_file, input_file)
220
- env.logger.info("done")
191
+ logger.info("done")
192
+
193
+
194
+ @cli.command(name="format", help="Format Beancount files with beancount-black")
195
+ @click.argument("filename", type=click.Path(exists=False, dir_okay=False), nargs=-1)
196
+ @click.option(
197
+ "--backup-suffix", type=str, default=".backup", help="suffix of backup file"
198
+ )
199
+ @click.option(
200
+ "-ra",
201
+ "--rename-account",
202
+ type=(str, str),
203
+ help="rename account names",
204
+ nargs=2,
205
+ multiple=True,
206
+ )
207
+ @click.option(
208
+ "-rc",
209
+ "--rename-currency",
210
+ type=(str, str),
211
+ help="rename currency names",
212
+ nargs=2,
213
+ multiple=True,
214
+ )
215
+ @click.option(
216
+ "-s",
217
+ "--stdin-mode",
218
+ is_flag=True,
219
+ help="Read beancount file data from stdin and output result to stdout",
220
+ )
221
+ @click.option("-b", "--backup", is_flag=True, help="Create backup file")
222
+ @pass_env
223
+ def main(
224
+ env: Environment,
225
+ filename: list[click.Path],
226
+ backup_suffix: str,
227
+ rename_account: list[tuple[str, str]],
228
+ rename_currency: list[tuple[str, str]],
229
+ stdin_mode: bool,
230
+ backup: bool,
231
+ ):
232
+ format_beancount(
233
+ filenames=list(map(lambda item: pathlib.Path(str(item)), filename)),
234
+ backup_suffix=backup_suffix,
235
+ rename_account=rename_account,
236
+ rename_currency=rename_currency,
237
+ stdin_mode=stdin_mode,
238
+ backup=backup,
239
+ logger=env.logger,
240
+ )
@@ -7,6 +7,7 @@ class PlaidItemSyncState(str, Enum):
7
7
  IMPORT_FAILED = "IMPORT_FAILED"
8
8
  PENDING = "PENDING"
9
9
  PROCESSING = "PROCESSING"
10
+ SKIPPED = "SKIPPED"
10
11
  SYNC_COMPLETE = "SYNC_COMPLETE"
11
12
  SYNC_FAILED = "SYNC_FAILED"
12
13
 
@@ -5,6 +5,7 @@ from .forms import main as forms # noqa
5
5
  from .import_cli import main as import_cli # noqa
6
6
  from .inbox import main as inbox # noqa
7
7
  from .login import main as login # noqa
8
+ from .mcp import main as mcp # noqa
8
9
 
9
10
  __ALL__ = [cli]
10
11
 
@@ -0,0 +1,16 @@
1
+ from fastapi import FastAPI
2
+ from fastapi_mcp import FastApiMCP
3
+
4
+ from .routes import router
5
+
6
+
7
+ def make_app() -> FastAPI:
8
+ app = FastAPI(
9
+ openapi_url="",
10
+ docs_url=None,
11
+ redoc_url=None,
12
+ )
13
+ app.include_router(router)
14
+ mcp = FastApiMCP(app)
15
+ mcp.mount()
16
+ return app
@@ -0,0 +1,62 @@
1
+ import json
2
+ import logging
3
+ import pathlib
4
+ import subprocess
5
+ import sys
6
+
7
+ from beancount_data.data_types import EntryUnion
8
+ from beancount_data.data_types import ValidationResult
9
+ from fastapi import APIRouter
10
+ from fastapi import Request
11
+ from pydantic import TypeAdapter
12
+
13
+ from ...format import format_beancount
14
+ from ..schemes import ExportBeancountResult
15
+ from ..schemes import FormatResult
16
+
17
+ router = APIRouter()
18
+ logger = logging.getLogger(__name__)
19
+ entry_adapter = TypeAdapter(EntryUnion)
20
+
21
+
22
+ @router.get(
23
+ "/entries",
24
+ response_model=ExportBeancountResult,
25
+ operation_id="list-entries",
26
+ description="List all Beancount entries for the given Beancount file",
27
+ )
28
+ async def list_entries(
29
+ request: Request, beancount_file: str = "main.bean"
30
+ ) -> ExportBeancountResult:
31
+ proc = subprocess.run(
32
+ (sys.executable, "-m", "beancount_exporter.main", beancount_file),
33
+ timeout=10,
34
+ capture_output=True,
35
+ )
36
+ lines = proc.stdout.splitlines()
37
+ result = ExportBeancountResult(
38
+ ok=proc.returncode == 0,
39
+ error=proc.stderr.decode("utf8"),
40
+ )
41
+ if proc.returncode == 0:
42
+ result.options = json.loads(lines[0])
43
+ result.validation_result = ValidationResult.model_validate_json(lines[2])
44
+ result.entries = list(map(entry_adapter.validate_json, lines[4:]))
45
+ else:
46
+ logger.error("Failed to export entries: %s", result.error)
47
+ return result
48
+
49
+
50
+ @router.get(
51
+ "/format",
52
+ response_model=FormatResult,
53
+ operation_id="format-beancount-file",
54
+ description="Format beancount files",
55
+ )
56
+ async def format_beancount_file(
57
+ request: Request, beancount_file: str = "main.bean"
58
+ ) -> FormatResult:
59
+ format_beancount(filenames=[pathlib.Path(beancount_file)])
60
+ return FormatResult(
61
+ ok=True,
62
+ )
@@ -0,0 +1,10 @@
1
+ from ..aliase import AliasedGroup
2
+ from ..cli import cli as root_cli
3
+
4
+
5
+ @root_cli.group(
6
+ name="mcp",
7
+ help="Run Model Context Protocol (MCP) server for LLM to access your Beancount books",
8
+ )
9
+ def cli():
10
+ pass
@@ -0,0 +1,38 @@
1
+ import click
2
+ import uvicorn
3
+
4
+ from ..environment import Environment
5
+ from ..environment import pass_env
6
+ from .app.main import make_app
7
+ from .cli import cli
8
+
9
+
10
+ @cli.command(name="server", help="Run a web server for the MCP service")
11
+ @click.option(
12
+ "-p",
13
+ "--port",
14
+ type=int,
15
+ default=8080,
16
+ show_default=True,
17
+ help="Port number for serving the MCP web app.",
18
+ )
19
+ @click.option(
20
+ "-h",
21
+ "--host",
22
+ type=str,
23
+ default="127.0.0.1",
24
+ show_default=True,
25
+ help="Host for serving the MCP web app.",
26
+ )
27
+ @click.option(
28
+ "--uvicorn-log-level",
29
+ default="info",
30
+ show_default=True,
31
+ help="Log level for Uvicorn web server.",
32
+ )
33
+ @pass_env
34
+ def run_server(env: Environment, port: int, host: str, uvicorn_log_level: str):
35
+ app = make_app()
36
+ config = uvicorn.Config(app=app, port=port, host=host, log_level=uvicorn_log_level)
37
+ server = uvicorn.Server(config=config)
38
+ server.run()
@@ -0,0 +1,20 @@
1
+ import typing
2
+
3
+ from beancount_data.data_types import EntryUnion
4
+ from beancount_data.data_types import ValidationResult
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class ResultBase(BaseModel):
9
+ ok: bool
10
+ error: typing.Optional[str] = None
11
+
12
+
13
+ class ExportBeancountResult(ResultBase):
14
+ options: typing.Optional[typing.Dict[str, typing.Any]] = None
15
+ validation_result: typing.Optional[ValidationResult] = None
16
+ entries: typing.Optional[EntryUnion] = None
17
+
18
+
19
+ class FormatResult(ResultBase):
20
+ pass
@@ -1 +1 @@
1
- {"openapi": "3.1.0", "info": {"title": "BeanHub Internal API", "description": "The BeanHub API for public access but not published yet, so they are subject to changes. Please do not rely on it.", "version": "0.0.1"}, "paths": {"/v1/auth/sessions": {"post": {"tags": ["auth"], "summary": "Create auth session", "operationId": "create_auth_session", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AuthSessionRequest"}}}, "required": true}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AuthSessionResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/auth/sessions/{auth_session_id}/poll": {"get": {"tags": ["auth"], "summary": "Poll auth session status", "operationId": "poll_auth_session", "parameters": [{"name": "auth_session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Auth Session Id"}}, {"name": "secret_token", "in": "query", "required": true, "schema": {"type": "string", "title": "Secret Token"}}], "responses": {"200": {"description": "Auth session is ready", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AuthSessionPollResponse"}, "example": {"token": "5308cd91-d7d7-488c-b9a9-ed984f58c01b", "repositories": ["username/repo"]}}}}, "202": {"description": "Not granted yet, please try again later", "content": {"application/json": {"example": {"code": "try_again", "message": "still waiting for auth"}, "schema": {"$ref": "#/components/schemas/AuthSessionNotReadyResponse"}}}}, "404": {"description": "Auth session not found", "content": {"application/json": {"example": {"detail": "Auth session not found"}, "schema": {"$ref": "#/components/schemas/GenericError"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/sync_batches": {"post": {"tags": ["connect"], "summary": "Create a sync batch", "operationId": "create_sync_batch", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateSyncBatchResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/sync_batches/{sync_batch_id}": {"get": {"tags": ["connect"], "summary": "Get a sync batch", "operationId": "get_sync_batch", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "sync_batch_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Sync Batch Id"}}, {"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetSyncBatchResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/dumps": {"post": {"tags": ["connect"], "summary": "Create a dump request", "operationId": "create_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateDumpRequestRequest"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/dumps/{dump_request_id}": {"get": {"tags": ["connect"], "summary": "Get a dump request", "operationId": "get_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "dump_request_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Dump Request Id"}}, {"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/inbox/emails": {"get": {"tags": ["inbox"], "summary": "Get inbox emails", "operationId": "get_inbox_emails", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}, {"name": "cursor", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetInboxEmailResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/inbox/dumps": {"post": {"tags": ["inbox"], "summary": "Create an inbox dump request", "operationId": "create_inbox_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateInboxDumpRequest"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateInboxDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/inbox/dumps/{dump_request_id}": {"get": {"tags": ["inbox"], "summary": "Get an inbox dump request", "operationId": "get_inbox_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "dump_request_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Dump Request Id"}}, {"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetInboxDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repositories": {"get": {"tags": ["repo"], "summary": "List repositories", "operationId": "list_repo", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListRepositoriesResponse"}}}}}, "security": [{"APIKeyHeader": []}]}}}, "components": {"schemas": {"AuthSessionNotReadyResponse": {"properties": {"code": {"type": "string", "title": "Code"}, "message": {"type": "string", "title": "Message"}}, "type": "object", "required": ["code", "message"], "title": "AuthSessionNotReadyResponse"}, "AuthSessionPollResponse": {"properties": {"token": {"type": "string", "title": "Token"}, "repositories": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Repositories", "deprecated": true}}, "type": "object", "required": ["token"], "title": "AuthSessionPollResponse"}, "AuthSessionRequest": {"properties": {"hostname": {"type": "string", "title": "Hostname"}}, "type": "object", "required": ["hostname"], "title": "AuthSessionRequest"}, "AuthSessionResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "code": {"type": "string", "title": "Code"}, "auth_url": {"type": "string", "title": "Auth Url"}, "secret_token": {"type": "string", "title": "Secret Token"}, "poll_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Poll Url", "deprecated": true}}, "type": "object", "required": ["id", "code", "auth_url", "secret_token"], "title": "AuthSessionResponse"}, "CreateDumpRequestRequest": {"properties": {"public_key": {"type": "string", "title": "Public Key"}, "output_accounts": {"type": "boolean", "title": "Output Accounts", "default": false}}, "type": "object", "required": ["public_key"], "title": "CreateDumpRequestRequest"}, "CreateDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}}, "type": "object", "required": ["id"], "title": "CreateDumpRequestResponse"}, "CreateInboxDumpRequest": {"properties": {"public_key": {"type": "string", "title": "Public Key"}, "email_ids": {"items": {"type": "string"}, "type": "array", "title": "Email Ids"}}, "type": "object", "required": ["public_key", "email_ids"], "title": "CreateInboxDumpRequest"}, "CreateInboxDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}}, "type": "object", "required": ["id"], "title": "CreateInboxDumpRequestResponse"}, "CreateSyncBatchResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}}, "type": "object", "required": ["id"], "title": "CreateSyncBatchResponse"}, "DumpRequestState": {"type": "string", "enum": ["PENDING", "PROCESSING", "COMPLETE", "FAILED"], "title": "DumpRequestState"}, "GenericError": {"properties": {"detail": {"title": "Detail"}}, "type": "object", "title": "GenericError"}, "GetDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "state": {"$ref": "#/components/schemas/DumpRequestState"}, "encryption_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Encryption Key"}, "download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Download Url"}, "accounts_download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Accounts Download Url"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}}, "type": "object", "required": ["id", "state"], "title": "GetDumpRequestResponse"}, "GetInboxDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "state": {"$ref": "#/components/schemas/InboxDumpRequestState"}, "encryption_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Encryption Key"}, "download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Download Url"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}}, "type": "object", "required": ["id", "state"], "title": "GetInboxDumpRequestResponse"}, "GetInboxEmailResponse": {"properties": {"emails": {"items": {"$ref": "#/components/schemas/InboxEmail"}, "type": "array", "title": "Emails"}, "cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}}, "type": "object", "required": ["emails"], "title": "GetInboxEmailResponse"}, "GetSyncBatchResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "syncs": {"items": {"$ref": "#/components/schemas/SyncData"}, "type": "array", "title": "Syncs"}}, "type": "object", "required": ["id", "syncs"], "title": "GetSyncBatchResponse"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "InboxDumpRequestState": {"type": "string", "enum": ["PENDING", "PROCESSING", "COMPLETE", "FAILED"], "title": "InboxDumpRequestState"}, "InboxEmail": {"properties": {"id": {"type": "string", "title": "Id"}, "message_id": {"type": "string", "title": "Message Id"}, "headers": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Headers"}, "subject": {"type": "string", "title": "Subject"}, "from_addresses": {"items": {"type": "string"}, "type": "array", "title": "From Addresses"}, "recipients": {"items": {"type": "string"}, "type": "array", "title": "Recipients"}, "tags": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Tags"}}, "type": "object", "required": ["id", "message_id", "headers", "subject", "from_addresses", "recipients"], "title": "InboxEmail"}, "ItemData": {"properties": {"id": {"type": "string", "title": "Id"}, "institution_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Institution Name"}}, "type": "object", "required": ["id", "institution_name"], "title": "ItemData"}, "ListRepositoriesResponse": {"properties": {"repositories": {"items": {"$ref": "#/components/schemas/Repository"}, "type": "array", "title": "Repositories"}}, "type": "object", "required": ["repositories"], "title": "ListRepositoriesResponse"}, "PlaidItemSyncState": {"type": "string", "enum": ["PENDING", "PROCESSING", "SYNC_COMPLETE", "SYNC_FAILED", "IMPORT_COMPLETE", "IMPORT_COMPLETE_NO_CHANGES", "IMPORT_FAILED"], "title": "PlaidItemSyncState"}, "Repository": {"properties": {"username": {"type": "string", "title": "Username"}, "name": {"type": "string", "title": "Name"}, "type": {"$ref": "#/components/schemas/RepositoryType"}, "public": {"type": "boolean", "title": "Public"}, "active": {"type": "boolean", "title": "Active"}}, "type": "object", "required": ["username", "name", "type", "public", "active"], "title": "Repository"}, "RepositoryType": {"type": "string", "enum": ["GIT", "CONNECT"], "title": "RepositoryType"}, "SyncData": {"properties": {"id": {"type": "string", "title": "Id"}, "state": {"$ref": "#/components/schemas/PlaidItemSyncState"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "item": {"$ref": "#/components/schemas/ItemData"}}, "type": "object", "required": ["id", "state", "item"], "title": "SyncData"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}}, "securitySchemes": {"APIKeyHeader": {"type": "apiKey", "in": "header", "name": "access-token"}}}}
1
+ {"openapi": "3.1.0", "info": {"title": "BeanHub Internal API", "description": "The BeanHub API for public access but not published yet, so they are subject to changes. Please do not rely on it.", "version": "0.0.1"}, "paths": {"/v1/auth/sessions": {"post": {"tags": ["auth"], "summary": "Create auth session", "operationId": "create_auth_session", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AuthSessionRequest"}}}, "required": true}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AuthSessionResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/auth/sessions/{auth_session_id}/poll": {"get": {"tags": ["auth"], "summary": "Poll auth session status", "operationId": "poll_auth_session", "parameters": [{"name": "auth_session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Auth Session Id"}}, {"name": "secret_token", "in": "query", "required": true, "schema": {"type": "string", "title": "Secret Token"}}], "responses": {"200": {"description": "Auth session is ready", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AuthSessionPollResponse"}, "example": {"token": "5308cd91-d7d7-488c-b9a9-ed984f58c01b", "repositories": ["username/repo"]}}}}, "202": {"description": "Not granted yet, please try again later", "content": {"application/json": {"example": {"code": "try_again", "message": "still waiting for auth"}, "schema": {"$ref": "#/components/schemas/AuthSessionNotReadyResponse"}}}}, "404": {"description": "Auth session not found", "content": {"application/json": {"example": {"detail": "Auth session not found"}, "schema": {"$ref": "#/components/schemas/GenericError"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/sync_batches": {"post": {"tags": ["connect"], "summary": "Create a sync batch", "operationId": "create_sync_batch", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateSyncBatchResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/sync_batches/{sync_batch_id}": {"get": {"tags": ["connect"], "summary": "Get a sync batch", "operationId": "get_sync_batch", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "sync_batch_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Sync Batch Id"}}, {"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetSyncBatchResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/dumps": {"post": {"tags": ["connect"], "summary": "Create a dump request", "operationId": "create_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateDumpRequestRequest"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/connect/dumps/{dump_request_id}": {"get": {"tags": ["connect"], "summary": "Get a dump request", "operationId": "get_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "dump_request_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Dump Request Id"}}, {"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/inbox/emails": {"get": {"tags": ["inbox"], "summary": "Get inbox emails", "operationId": "get_inbox_emails", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}, {"name": "cursor", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetInboxEmailResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/inbox/dumps": {"post": {"tags": ["inbox"], "summary": "Create an inbox dump request", "operationId": "create_inbox_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateInboxDumpRequest"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateInboxDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repos/{username}/{repo_name}/inbox/dumps/{dump_request_id}": {"get": {"tags": ["inbox"], "summary": "Get an inbox dump request", "operationId": "get_inbox_dump_request", "security": [{"APIKeyHeader": []}], "parameters": [{"name": "dump_request_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Dump Request Id"}}, {"name": "username", "in": "path", "required": true, "schema": {"type": "string", "title": "Username"}}, {"name": "repo_name", "in": "path", "required": true, "schema": {"type": "string", "title": "Repo Name"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetInboxDumpRequestResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/repositories": {"get": {"tags": ["repo"], "summary": "List repositories", "operationId": "list_repo", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListRepositoriesResponse"}}}}}, "security": [{"APIKeyHeader": []}]}}}, "components": {"schemas": {"AuthSessionNotReadyResponse": {"properties": {"code": {"type": "string", "title": "Code"}, "message": {"type": "string", "title": "Message"}}, "type": "object", "required": ["code", "message"], "title": "AuthSessionNotReadyResponse"}, "AuthSessionPollResponse": {"properties": {"token": {"type": "string", "title": "Token"}, "repositories": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Repositories", "deprecated": true}}, "type": "object", "required": ["token"], "title": "AuthSessionPollResponse"}, "AuthSessionRequest": {"properties": {"hostname": {"type": "string", "title": "Hostname"}}, "type": "object", "required": ["hostname"], "title": "AuthSessionRequest"}, "AuthSessionResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "code": {"type": "string", "title": "Code"}, "auth_url": {"type": "string", "title": "Auth Url"}, "secret_token": {"type": "string", "title": "Secret Token"}, "poll_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Poll Url", "deprecated": true}}, "type": "object", "required": ["id", "code", "auth_url", "secret_token"], "title": "AuthSessionResponse"}, "CreateDumpRequestRequest": {"properties": {"public_key": {"type": "string", "title": "Public Key"}, "output_accounts": {"type": "boolean", "title": "Output Accounts", "default": false}}, "type": "object", "required": ["public_key"], "title": "CreateDumpRequestRequest"}, "CreateDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}}, "type": "object", "required": ["id"], "title": "CreateDumpRequestResponse"}, "CreateInboxDumpRequest": {"properties": {"public_key": {"type": "string", "title": "Public Key"}, "email_ids": {"items": {"type": "string"}, "type": "array", "minItems": 1, "title": "Email Ids"}}, "type": "object", "required": ["public_key", "email_ids"], "title": "CreateInboxDumpRequest"}, "CreateInboxDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}}, "type": "object", "required": ["id"], "title": "CreateInboxDumpRequestResponse"}, "CreateSyncBatchResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}}, "type": "object", "required": ["id"], "title": "CreateSyncBatchResponse"}, "DumpRequestState": {"type": "string", "enum": ["PENDING", "PROCESSING", "COMPLETE", "FAILED"], "title": "DumpRequestState"}, "GenericError": {"properties": {"detail": {"title": "Detail"}}, "type": "object", "title": "GenericError"}, "GetDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "state": {"$ref": "#/components/schemas/DumpRequestState"}, "encryption_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Encryption Key"}, "download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Download Url"}, "accounts_download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Accounts Download Url"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}}, "type": "object", "required": ["id", "state"], "title": "GetDumpRequestResponse"}, "GetInboxDumpRequestResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "state": {"$ref": "#/components/schemas/InboxDumpRequestState"}, "encryption_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Encryption Key"}, "download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Download Url"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}}, "type": "object", "required": ["id", "state"], "title": "GetInboxDumpRequestResponse"}, "GetInboxEmailResponse": {"properties": {"emails": {"items": {"$ref": "#/components/schemas/InboxEmail"}, "type": "array", "title": "Emails"}, "cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}}, "type": "object", "required": ["emails"], "title": "GetInboxEmailResponse"}, "GetSyncBatchResponse": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "syncs": {"items": {"$ref": "#/components/schemas/SyncData"}, "type": "array", "title": "Syncs"}}, "type": "object", "required": ["id", "syncs"], "title": "GetSyncBatchResponse"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "InboxDumpRequestState": {"type": "string", "enum": ["PENDING", "PROCESSING", "COMPLETE", "FAILED"], "title": "InboxDumpRequestState"}, "InboxEmail": {"properties": {"id": {"type": "string", "title": "Id"}, "message_id": {"type": "string", "title": "Message Id"}, "headers": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Headers"}, "subject": {"type": "string", "title": "Subject"}, "from_addresses": {"items": {"type": "string"}, "type": "array", "title": "From Addresses"}, "recipients": {"items": {"type": "string"}, "type": "array", "title": "Recipients"}, "tags": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Tags"}}, "type": "object", "required": ["id", "message_id", "headers", "subject", "from_addresses", "recipients"], "title": "InboxEmail"}, "ItemData": {"properties": {"id": {"type": "string", "title": "Id"}, "institution_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Institution Name"}}, "type": "object", "required": ["id", "institution_name"], "title": "ItemData"}, "ListRepositoriesResponse": {"properties": {"repositories": {"items": {"$ref": "#/components/schemas/Repository"}, "type": "array", "title": "Repositories"}}, "type": "object", "required": ["repositories"], "title": "ListRepositoriesResponse"}, "PlaidItemSyncState": {"type": "string", "enum": ["PENDING", "PROCESSING", "SYNC_COMPLETE", "SYNC_FAILED", "IMPORT_COMPLETE", "IMPORT_COMPLETE_NO_CHANGES", "IMPORT_FAILED", "SKIPPED"], "title": "PlaidItemSyncState"}, "Repository": {"properties": {"username": {"type": "string", "title": "Username"}, "name": {"type": "string", "title": "Name"}, "type": {"$ref": "#/components/schemas/RepositoryType"}, "public": {"type": "boolean", "title": "Public"}, "active": {"type": "boolean", "title": "Active"}}, "type": "object", "required": ["username", "name", "type", "public", "active"], "title": "Repository"}, "RepositoryType": {"type": "string", "enum": ["GIT", "CONNECT"], "title": "RepositoryType"}, "SyncData": {"properties": {"id": {"type": "string", "title": "Id"}, "state": {"$ref": "#/components/schemas/PlaidItemSyncState"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "item": {"$ref": "#/components/schemas/ItemData"}}, "type": "object", "required": ["id", "state", "item"], "title": "SyncData"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}}, "securitySchemes": {"APIKeyHeader": {"type": "apiKey", "in": "header", "name": "access-token"}}}}
@@ -10,13 +10,6 @@ Originally, this feature imports data as Git commits only to BeanHub's repositor
10
10
  Later on, we added the standalone commands to make it possible to pull bank transactions directly into your local work environment without relying on updates in BeanHub's Git repository.
11
11
  You can read our blog post [Direct Connect: Pulling transactions as CSV files from banks via Plaid directly](https://beanhub.io/blog/2025/01/16/direct-connect-repository/) to learn more.
12
12
 
13
- Please note that connect commands require some extra optional Python dependencies.
14
- Therefore, when installing BeanHub-CLI Python package, please make sure to include `connect` extra dependencies like this:
15
-
16
- ```bash
17
- pip install "beanhub-cli[connect]"
18
- ```
19
-
20
13
  ## Pre-requirements
21
14
 
22
15
  To pull transaction data from your bank automatically, you need to first log into your BeanHub account on our web app and then go to your repository.
@@ -4,13 +4,6 @@ We provide BeanHub-CLI as a standalone tool to work without a [BeanHub](https://
4
4
  However, some features are for paid BeanHub members only and require access to your BeanHub account, such as [BeanHub Connect](https://beanhub.io/blog/2024/06/24/introduction-of-beanhub-connect/)'s sync and dump.
5
5
  For those operations, you need to run the login command first.
6
6
 
7
- Please note that BeanHub-CLI login command requires some extra optional Python dependencies.
8
- Therefore, when installing BeanHub-CLI Python package, please make sure to include `login` extra dependencies like this:
9
-
10
- ```bash
11
- pip install "beanhub-cli[login]"
12
- ```
13
-
14
7
  It's very easy to log in to your BeanHub account with BeanHub-CLI. Simply run:
15
8
 
16
9
  ```bash
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "beanhub-cli"
3
- version = "3.0.1"
3
+ version = "3.1.1"
4
4
  description = "Command line tools for BeanHub and Beancount users"
5
5
  authors = [{ name = "Fang-Pen Lin", email = "fangpen@launchplatform.com" }]
6
6
  requires-python = "~=3.10"
@@ -27,8 +27,12 @@ dependencies = [
27
27
  "beanhub-import>= 1.0.0, <2.0.0",
28
28
  "beanhub-extract>= 0.1.0, <1.0.0",
29
29
  "beancount-parser>= 1.2.3, <1.3.0",
30
- "beanhub-inbox>=0.2.3, <0.3.0",
30
+ "beanhub-inbox>=0.2.3,<0.3.0",
31
31
  "cryptography>=44.0.0",
32
+ "fastapi-mcp>=0.3.7",
33
+ "beancount-data>=3.0.2",
34
+ "beancount-exporter>=3.0.0",
35
+ "orjson>=3.11.0",
32
36
  ]
33
37
 
34
38
  [project.urls]
@@ -82,6 +82,82 @@ def test_sync(
82
82
  assert result.exit_code == 0
83
83
 
84
84
 
85
+ def test_sync_with_skipped_state(
86
+ cli_runner: CliRunner,
87
+ mock_config: Config,
88
+ httpx_mock: HTTPXMock,
89
+ ):
90
+ batch_id = uuid.uuid4()
91
+ httpx_mock.add_response(
92
+ url=f"https://api.beanhub.io/v1/repos/{mock_config.repo.default}/connect/sync_batches",
93
+ method="POST",
94
+ status_code=201,
95
+ json=dict(
96
+ id=str(batch_id),
97
+ ),
98
+ match_headers={"access-token": mock_config.access_token.token},
99
+ )
100
+ httpx_mock.add_response(
101
+ url=f"https://api.beanhub.io/v1/repos/{mock_config.repo.default}/connect/sync_batches/{batch_id}",
102
+ method="GET",
103
+ status_code=200,
104
+ json=dict(
105
+ id=str(batch_id),
106
+ syncs=[
107
+ dict(
108
+ id="SYNC0",
109
+ state="PROCESSING",
110
+ item=dict(
111
+ id="MOCK_ITEM0",
112
+ institution_name="Chase",
113
+ ),
114
+ ),
115
+ dict(
116
+ id="SYNC1",
117
+ state="PROCESSING",
118
+ item=dict(
119
+ id="MOCK_ITEM1",
120
+ institution_name="Chase",
121
+ ),
122
+ ),
123
+ ],
124
+ ),
125
+ match_headers={"access-token": mock_config.access_token.token},
126
+ )
127
+ httpx_mock.add_response(
128
+ url=f"https://api.beanhub.io/v1/repos/{mock_config.repo.default}/connect/sync_batches/{batch_id}",
129
+ method="GET",
130
+ status_code=200,
131
+ json=dict(
132
+ id=str(batch_id),
133
+ syncs=[
134
+ dict(
135
+ id="SYNC0",
136
+ state="IMPORT_COMPLETE_NO_CHANGES",
137
+ item=dict(
138
+ id="MOCK_ITEM0",
139
+ institution_name="Chase",
140
+ ),
141
+ ),
142
+ dict(
143
+ id="SYNC1",
144
+ state="SKIPPED",
145
+ item=dict(
146
+ id="MOCK_ITEM1",
147
+ institution_name="Chase",
148
+ ),
149
+ error_message='Your login session has expired, please use the "Update" button to login to your bank account with Plaid again',
150
+ ),
151
+ ],
152
+ ),
153
+ match_headers={"access-token": mock_config.access_token.token},
154
+ )
155
+ cli_runner.mix_stderr = False
156
+ result = cli_runner.invoke(cli, ["connect", "sync"])
157
+ assert result.exit_code == 0
158
+ assert "Your login session has expired" in result.stdout.replace("\n", "")
159
+
160
+
85
161
  def test_sync_not_logged_in(
86
162
  cli_runner: CliRunner,
87
163
  mock_home: pathlib.Path,
File without changes
File without changes