runcell 0.1.17a2__py3-none-any.whl → 0.1.18a0__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 (529) hide show
  1. d5m_ai/_version.py +1 -1
  2. d5m_ai/agent/proxy_handler.py +85 -5
  3. d5m_ai/agent_v2/__init__.py +11 -0
  4. d5m_ai/agent_v2/proxy_handler.py +263 -0
  5. d5m_ai/chat/chat_proxy_handler.py +127 -11
  6. d5m_ai/chat/history.py +101 -41
  7. d5m_ai/extension.py +4 -0
  8. d5m_ai/image_generation/image_generation_handler.py +1 -1
  9. d5m_ai/labextension/package.json +2 -2
  10. d5m_ai/labextension/schemas/runcell/package.json.orig +1 -1
  11. d5m_ai/labextension/static/1038.3d4a95889322af3486c9.js +1 -0
  12. d5m_ai/labextension/static/1103.125b012d0cc21fcd4c17.js +1 -0
  13. d5m_ai/labextension/static/1462.95e60c119ee44dd5ce4d.js +1 -0
  14. d5m_ai/labextension/static/{5009.375c39a105e8068ec0c0.js → 1599.a81345569a22a67e586b.js} +1 -1
  15. d5m_ai/labextension/static/1668.ad21890aa4a84d053fd1.js +1 -0
  16. d5m_ai/labextension/static/1806.a135a1bece20818d019a.js +1 -0
  17. d5m_ai/labextension/static/2082.5f28bb724b308c004a03.js +1 -0
  18. d5m_ai/labextension/static/2287.62675b5f54fb3cdf9dad.js +1 -0
  19. d5m_ai/labextension/static/2331.b764c648e7b3ce99b9bd.js +48 -0
  20. d5m_ai/labextension/static/2439.691a80f552c192dcdd36.js +1 -0
  21. d5m_ai/labextension/static/2543.74f05520feb54f093874.js +1 -0
  22. d5m_ai/labextension/static/2963.24ce4624e5f00aba812e.js +1 -0
  23. d5m_ai/labextension/static/2989.415c278633d30c768280.js +1 -0
  24. d5m_ai/labextension/static/315.6269dcfbb2b4c1e62103.js +1 -0
  25. d5m_ai/labextension/static/3272.c14c7efa176ba27377ea.js +1 -0
  26. d5m_ai/labextension/static/3330.5e63016fbb98dce0cac6.js +1 -0
  27. d5m_ai/labextension/static/3939.87077bb549e80bc5709e.js +2 -0
  28. d5m_ai/labextension/static/4301.7b9d249c7d587cf0c423.js +1 -0
  29. d5m_ai/labextension/static/4637.94d9d3415a216176c874.js +1 -0
  30. d5m_ai/labextension/static/4789.5454fd8f02c1a04d9425.js +1 -0
  31. d5m_ai/labextension/static/5271.f866100834b03d222299.js +1 -0
  32. d5m_ai/labextension/static/5787.28fd320820307ce1cbe2.js +1 -0
  33. d5m_ai/labextension/static/5844.944056182693e52fc0ce.js +1 -0
  34. d5m_ai/labextension/static/5959.4c1c904a5c89f4c602a6.js +1 -0
  35. d5m_ai/labextension/static/6161.3968d5733678faff10bd.js +1 -0
  36. d5m_ai/labextension/static/6526.35de595b995332066e34.js +1 -0
  37. d5m_ai/labextension/static/735.77abd67c42730b4d946a.js +1 -0
  38. d5m_ai/labextension/static/7618.31ae485d97c185b7b482.js +1 -0
  39. d5m_ai/labextension/static/7933.5994a870ebd9b0333a75.js +1 -0
  40. d5m_ai/labextension/static/8263.794bec1a8fc1c8cdbccf.js +1 -0
  41. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4255.657770d29f05e3da360c.js → d5m_ai/labextension/static/8340.d7cd127e8e25a8ccccc7.js +1 -1
  42. d5m_ai/labextension/static/8420.2fc62e3dd5b4a52ac598.js +1 -0
  43. d5m_ai/labextension/static/8502.36e560c4ba2789e89fa2.js +1 -0
  44. d5m_ai/labextension/static/8565.df233b0467ad219c7e27.js +1 -0
  45. d5m_ai/labextension/static/{6619.04732600d85fbbc50931.js → 8613.5ccca913a70dc0f33de5.js} +1 -1
  46. d5m_ai/labextension/static/8936.1d6c52d6f461b01371c4.js +1 -0
  47. d5m_ai/labextension/static/9030.133f0e459e9f802be5ad.js +1 -0
  48. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/7023.f00c7a4596b9e4730708.js → d5m_ai/labextension/static/9404.f6ff67c04b5dfb52e3d9.js +1 -1
  49. d5m_ai/labextension/static/9407.72a128229179d870002b.js +1 -0
  50. d5m_ai/labextension/static/9471.33f5a763bc078ea0e425.js +1 -0
  51. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/2774.6c28665d8d562e2eafab.js → d5m_ai/labextension/static/9571.6b68c12d3afaa5cc9b22.js +1 -1
  52. d5m_ai/labextension/static/9673.efe1b35a74fdf47bb401.js +1 -0
  53. d5m_ai/labextension/static/9817.7ccf0d44d8222c7cc19e.js +1 -0
  54. d5m_ai/labextension/static/remoteEntry.691071d577b6013b3be4.js +1 -0
  55. d5m_ai/tools/__init__.py +6 -0
  56. d5m_ai/tools/cell_execute.py +54 -0
  57. d5m_ai/tools/create_notebook.py +53 -0
  58. d5m_ai/tools/frontend_ws.py +170 -0
  59. d5m_ai/tools/registry.py +32 -3
  60. d5m_ai/tools/shell_execute.py +261 -0
  61. d5m_ai/tools/write_file.py +51 -0
  62. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/package.json +2 -2
  63. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/schemas/runcell/package.json.orig +1 -1
  64. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1038.3d4a95889322af3486c9.js +1 -0
  65. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1103.125b012d0cc21fcd4c17.js +1 -0
  66. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1462.95e60c119ee44dd5ce4d.js +1 -0
  67. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/5009.375c39a105e8068ec0c0.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1599.a81345569a22a67e586b.js +1 -1
  68. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1668.ad21890aa4a84d053fd1.js +1 -0
  69. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/1806.a135a1bece20818d019a.js +1 -0
  70. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2082.5f28bb724b308c004a03.js +1 -0
  71. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2287.62675b5f54fb3cdf9dad.js +1 -0
  72. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2331.b764c648e7b3ce99b9bd.js +48 -0
  73. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2439.691a80f552c192dcdd36.js +1 -0
  74. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2543.74f05520feb54f093874.js +1 -0
  75. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2963.24ce4624e5f00aba812e.js +1 -0
  76. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2989.415c278633d30c768280.js +1 -0
  77. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/315.6269dcfbb2b4c1e62103.js +1 -0
  78. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3272.c14c7efa176ba27377ea.js +1 -0
  79. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3330.5e63016fbb98dce0cac6.js +1 -0
  80. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3939.87077bb549e80bc5709e.js +2 -0
  81. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/4301.7b9d249c7d587cf0c423.js +1 -0
  82. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/4637.94d9d3415a216176c874.js +1 -0
  83. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/4789.5454fd8f02c1a04d9425.js +1 -0
  84. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5271.f866100834b03d222299.js +1 -0
  85. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5787.28fd320820307ce1cbe2.js +1 -0
  86. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5844.944056182693e52fc0ce.js +1 -0
  87. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/5959.4c1c904a5c89f4c602a6.js +1 -0
  88. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/6161.3968d5733678faff10bd.js +1 -0
  89. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/6526.35de595b995332066e34.js +1 -0
  90. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/735.77abd67c42730b4d946a.js +1 -0
  91. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/7618.31ae485d97c185b7b482.js +1 -0
  92. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/7933.5994a870ebd9b0333a75.js +1 -0
  93. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8263.794bec1a8fc1c8cdbccf.js +1 -0
  94. d5m_ai/labextension/static/4255.657770d29f05e3da360c.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8340.d7cd127e8e25a8ccccc7.js +1 -1
  95. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8420.2fc62e3dd5b4a52ac598.js +1 -0
  96. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8502.36e560c4ba2789e89fa2.js +1 -0
  97. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8565.df233b0467ad219c7e27.js +1 -0
  98. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/6619.04732600d85fbbc50931.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8613.5ccca913a70dc0f33de5.js +1 -1
  99. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/8936.1d6c52d6f461b01371c4.js +1 -0
  100. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9030.133f0e459e9f802be5ad.js +1 -0
  101. d5m_ai/labextension/static/7023.f00c7a4596b9e4730708.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9404.f6ff67c04b5dfb52e3d9.js +1 -1
  102. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9407.72a128229179d870002b.js +1 -0
  103. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9471.33f5a763bc078ea0e425.js +1 -0
  104. d5m_ai/labextension/static/2774.6c28665d8d562e2eafab.js → runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9571.6b68c12d3afaa5cc9b22.js +1 -1
  105. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9673.efe1b35a74fdf47bb401.js +1 -0
  106. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/9817.7ccf0d44d8222c7cc19e.js +1 -0
  107. runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/remoteEntry.691071d577b6013b3be4.js +1 -0
  108. {runcell-0.1.17a2.dist-info → runcell-0.1.18a0.dist-info}/METADATA +1 -1
  109. {runcell-0.1.17a2.dist-info → runcell-0.1.18a0.dist-info}/RECORD +451 -444
  110. d5m_ai/labextension/static/1866.ab8af952d5f6e2abf015.js +0 -1
  111. d5m_ai/labextension/static/2331.cf0ae406b1f17e5c8518.js +0 -1
  112. d5m_ai/labextension/static/2732.afa510c6b53e86d62ca1.js +0 -1
  113. d5m_ai/labextension/static/3111.ebf975f4bcee6f078398.js +0 -1
  114. d5m_ai/labextension/static/315.3ac032285f86ff74de00.js +0 -1
  115. d5m_ai/labextension/static/3314.bba33288b1bf072a1159.js +0 -1
  116. d5m_ai/labextension/static/345.b6c86a74cbb739491375.js +0 -1
  117. d5m_ai/labextension/static/3475.4bb63668582c9ee1aa75.js +0 -1
  118. d5m_ai/labextension/static/3550.0f796cddf846567f6eda.js +0 -1
  119. d5m_ai/labextension/static/4163.c5b167ad4c431223b14a.js +0 -1
  120. d5m_ai/labextension/static/4398.20687aa11fadd8caab55.js +0 -1
  121. d5m_ai/labextension/static/4444.8776afd3310ade08de78.js +0 -1
  122. d5m_ai/labextension/static/4573.313f73d47b3e9e7e539a.js +0 -1
  123. d5m_ai/labextension/static/4640.c1c98b7c207045b8429e.js +0 -1
  124. d5m_ai/labextension/static/4712.867600779a30c292ecd7.js +0 -48
  125. d5m_ai/labextension/static/4797.6c1f52ca8940a1daa9ed.js +0 -1
  126. d5m_ai/labextension/static/5225.77ee82ef77687f707c86.js +0 -1
  127. d5m_ai/labextension/static/5307.0cf41cdf5b6c0c01dbe3.js +0 -1
  128. d5m_ai/labextension/static/5388.8b14c718c4703b72635f.js +0 -1
  129. d5m_ai/labextension/static/5481.20ece9f96e241e634f15.js +0 -1
  130. d5m_ai/labextension/static/553.bd198ad217a7dbfcef42.js +0 -1
  131. d5m_ai/labextension/static/5785.c6fc662855351bdde523.js +0 -1
  132. d5m_ai/labextension/static/5953.fb531c692611683ab5f7.js +0 -1
  133. d5m_ai/labextension/static/6047.ed21945649e91106bee2.js +0 -1
  134. d5m_ai/labextension/static/6145.8bfe956b3c3b5a40e58d.js +0 -1
  135. d5m_ai/labextension/static/6286.db1168ea85a057c6f189.js +0 -1
  136. d5m_ai/labextension/static/6734.e5919666c842cdf1276d.js +0 -1
  137. d5m_ai/labextension/static/6789.346356d4f19b92e62321.js +0 -1
  138. d5m_ai/labextension/static/6841.3906e65455bb5575b44b.js +0 -1
  139. d5m_ai/labextension/static/783.63f9d3340979bfb89716.js +0 -1
  140. d5m_ai/labextension/static/790.1c740b9b76f7fd2dc0d6.js +0 -1
  141. d5m_ai/labextension/static/877.e8b79ec87c1325c45f62.js +0 -2
  142. d5m_ai/labextension/static/8823.2fc995c832aa529c3519.js +0 -1
  143. d5m_ai/labextension/static/9064.5349664a3752925acab3.js +0 -1
  144. d5m_ai/labextension/static/9195.d0277553edf7593d967d.js +0 -1
  145. d5m_ai/labextension/static/9338.58debf8972aa5f8b68d7.js +0 -1
  146. d5m_ai/labextension/static/9404.f841eb045fbb87713d5e.js +0 -1
  147. d5m_ai/labextension/static/9575.8848adfb0c89daa1ca6b.js +0 -1
  148. d5m_ai/labextension/static/remoteEntry.5115a09269e95a73e7e8.js +0 -1
  149. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/1866.ab8af952d5f6e2abf015.js +0 -1
  150. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/2331.cf0ae406b1f17e5c8518.js +0 -1
  151. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/2732.afa510c6b53e86d62ca1.js +0 -1
  152. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/3111.ebf975f4bcee6f078398.js +0 -1
  153. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/315.3ac032285f86ff74de00.js +0 -1
  154. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/3314.bba33288b1bf072a1159.js +0 -1
  155. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/345.b6c86a74cbb739491375.js +0 -1
  156. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/3475.4bb63668582c9ee1aa75.js +0 -1
  157. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/3550.0f796cddf846567f6eda.js +0 -1
  158. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4163.c5b167ad4c431223b14a.js +0 -1
  159. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4398.20687aa11fadd8caab55.js +0 -1
  160. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4444.8776afd3310ade08de78.js +0 -1
  161. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4573.313f73d47b3e9e7e539a.js +0 -1
  162. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4640.c1c98b7c207045b8429e.js +0 -1
  163. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4712.867600779a30c292ecd7.js +0 -48
  164. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4797.6c1f52ca8940a1daa9ed.js +0 -1
  165. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/5225.77ee82ef77687f707c86.js +0 -1
  166. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/5307.0cf41cdf5b6c0c01dbe3.js +0 -1
  167. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/5388.8b14c718c4703b72635f.js +0 -1
  168. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/5481.20ece9f96e241e634f15.js +0 -1
  169. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/553.bd198ad217a7dbfcef42.js +0 -1
  170. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/5785.c6fc662855351bdde523.js +0 -1
  171. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/5953.fb531c692611683ab5f7.js +0 -1
  172. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/6047.ed21945649e91106bee2.js +0 -1
  173. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/6145.8bfe956b3c3b5a40e58d.js +0 -1
  174. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/6286.db1168ea85a057c6f189.js +0 -1
  175. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/6734.e5919666c842cdf1276d.js +0 -1
  176. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/6789.346356d4f19b92e62321.js +0 -1
  177. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/6841.3906e65455bb5575b44b.js +0 -1
  178. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/783.63f9d3340979bfb89716.js +0 -1
  179. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/790.1c740b9b76f7fd2dc0d6.js +0 -1
  180. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/877.e8b79ec87c1325c45f62.js +0 -2
  181. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/8823.2fc995c832aa529c3519.js +0 -1
  182. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/9064.5349664a3752925acab3.js +0 -1
  183. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/9195.d0277553edf7593d967d.js +0 -1
  184. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/9338.58debf8972aa5f8b68d7.js +0 -1
  185. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/9404.f841eb045fbb87713d5e.js +0 -1
  186. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/9575.8848adfb0c89daa1ca6b.js +0 -1
  187. runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/remoteEntry.5115a09269e95a73e7e8.js +0 -1
  188. /d5m_ai/labextension/static/{4712.867600779a30c292ecd7.js.LICENSE.txt → 2331.b764c648e7b3ce99b9bd.js.LICENSE.txt} +0 -0
  189. /d5m_ai/labextension/static/{877.e8b79ec87c1325c45f62.js.LICENSE.txt → 3939.87077bb549e80bc5709e.js.LICENSE.txt} +0 -0
  190. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/etc/jupyter/jupyter_server_config.d/d5m_ai.json +0 -0
  191. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/etc/jupyter/jupyter_server_config.d/runcell.json +0 -0
  192. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/install.json +0 -0
  193. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/schemas/runcell/file-browser-toggle.json +0 -0
  194. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/schemas/runcell/plugin.json +0 -0
  195. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1045.a76db59a7c20953976f0.js +0 -0
  196. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1055.87aafb19805530488a2c.js +0 -0
  197. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/108.d7dbe40ec7e0ae1a68f8.js +0 -0
  198. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1104.a2b939bacec5e69efd99.js +0 -0
  199. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1171.130d3cc54764cac92856.js +0 -0
  200. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1178.3e25fad4a45450e227c9.js +0 -0
  201. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1203.5deaeee9e57ffc718f19.js +0 -0
  202. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1226.ff48aa5741f77eb739fe.js +0 -0
  203. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1273.4c5992b03f129c9e3025.js +0 -0
  204. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1285.cf3bab9529c47ac9288d.js +0 -0
  205. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1307.d98ceb66a2401e5f4ddd.js +0 -0
  206. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1328.38964f7daa84901e866f.js +0 -0
  207. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1377.edf5c2163aedef75c6a1.js +0 -0
  208. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1391.ab61eb03aed289d9d44c.js +0 -0
  209. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1431.a691b4fa7cf229072fc0.js +0 -0
  210. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1521.9f3807c4a4dd19a6ab8c.js +0 -0
  211. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1524.188ff9d525210d499ff3.js +0 -0
  212. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1534.39ba9b2bf5712b697b63.js +0 -0
  213. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1540.9eba7e882fd8e00a782a.js +0 -0
  214. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1552.5203480dcdda6574ef51.js +0 -0
  215. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1555.686745d50bd19fd9d271.js +0 -0
  216. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1618.9abd2093263741894755.js +0 -0
  217. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1635.84bd383b17e41c9fe103.js +0 -0
  218. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1678.57b141401f73a26257c8.js +0 -0
  219. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1685.842997eb9757846fe690.js +0 -0
  220. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1745.e6bb2c6882da5bf9883a.js +0 -0
  221. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1752.8c4ecff560428215fe75.js +0 -0
  222. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1797.f8ca14c3ec1c0f51f403.js +0 -0
  223. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1897.7cca7a664a9ca9b486ac.js +0 -0
  224. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1902.364fa5e977055fe14150.js +0 -0
  225. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1915.b55b7d52608421a7fc41.js +0 -0
  226. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/1970.dff4fcccbb6cadb04d0c.js +0 -0
  227. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/200.f1d30c245c18bbb03312.js +0 -0
  228. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2031.155ab0916a863c8787a7.js +0 -0
  229. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2031.155ab0916a863c8787a7.js.LICENSE.txt +0 -0
  230. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/207.f5bd6d1b383a6b01ca69.js +0 -0
  231. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2072.a4d04cc98bb118e689a1.js +0 -0
  232. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2075.5d6a026d7308b71b70a1.js +0 -0
  233. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2111.a3c1f620c0a31e54cb9f.js +0 -0
  234. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2152.4db0fcf1f4dccf54b600.js +0 -0
  235. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2173.9fddf72b827a6d629bad.js +0 -0
  236. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2198.e195afcaabb2e4063da9.js +0 -0
  237. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2224.c86b12cf9e2165904033.js +0 -0
  238. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2225.8d31eec53891ca7775b7.js +0 -0
  239. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2271.69d9ea25d4ddd02710f6.js +0 -0
  240. /runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/4712.867600779a30c292ecd7.js.LICENSE.txt → /runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/2331.b764c648e7b3ce99b9bd.js.LICENSE.txt +0 -0
  241. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2349.e7c5b5e507c7a81d1427.js +0 -0
  242. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2353.7b6b36b3164a86427209.js +0 -0
  243. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2382.9e67478cc4b31aede22c.js +0 -0
  244. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2385.cd85a7dd4acb5be739da.js +0 -0
  245. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/248.693fd98760ec6ce42219.js +0 -0
  246. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2555.7168a2616a6071addb97.js +0 -0
  247. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2576.56496d8cba50d3d69eb5.js +0 -0
  248. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2639.eb2553a7be688366d9f3.js +0 -0
  249. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2654.2453f6b5846a4719dba4.js +0 -0
  250. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/267.829ce2ca38940b778c91.js +0 -0
  251. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/270.9409a2f5631a31c79cd9.js +0 -0
  252. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2768.9e5b7c6ed84b2486f835.js +0 -0
  253. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2789.12830cdb21c09111668d.js +0 -0
  254. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2824.d02df014c07b7288e78c.js +0 -0
  255. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2824.d02df014c07b7288e78c.js.LICENSE.txt +0 -0
  256. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2838.2e689afee276e5e21c57.js +0 -0
  257. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2843.65aeb8be3744d20229b8.js +0 -0
  258. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2897.7bc91ca284ea12b863e8.js +0 -0
  259. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2905.0d34ef7a481f9a968f05.js +0 -0
  260. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2922.8cdf00bb7d09c5419d78.js +0 -0
  261. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2922.8cdf00bb7d09c5419d78.js.LICENSE.txt +0 -0
  262. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/2971.60c60668c130ed05d493.js +0 -0
  263. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/299.8600f54b39a11eeff427.js +0 -0
  264. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3027.2226147340da305061f3.js +0 -0
  265. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3028.953cd3b9865063969086.js +0 -0
  266. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3041.4059f9ba4f9eba56672a.js +0 -0
  267. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3045.a457aa1d023ba5f799c2.js +0 -0
  268. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3092.fad665f8cdb1da61b55b.js +0 -0
  269. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3142.7df01050c977ede2b13b.js +0 -0
  270. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3157.bcb9f8ff06fa4af27b6a.js +0 -0
  271. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3214.a986c1896fa590b2da27.js +0 -0
  272. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3239.4562297487744a7cc1d4.js +0 -0
  273. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/325.bd1e5cab3b6e068b25bc.js +0 -0
  274. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3254.9e1aa1fee12644fea2d9.js +0 -0
  275. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3267.ff884bf47b52ac634854.js +0 -0
  276. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3291.156ad2d1520857115575.js +0 -0
  277. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3311.dc97fd544e85acac8477.js +0 -0
  278. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3319.687f07bb2f993c1dc44b.js +0 -0
  279. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3325.c100f45711f539a7f262.js +0 -0
  280. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3386.4c8eebdb8d318c2913ce.js +0 -0
  281. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3386.4c8eebdb8d318c2913ce.js.LICENSE.txt +0 -0
  282. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3407.cbbf99a2ff4805726f3e.js +0 -0
  283. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3424.92b1a820ff2aa6156c36.js +0 -0
  284. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3426.27afd4c41cfad8e1a63d.js +0 -0
  285. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3436.ea677bb3e7f3ce87d7fd.js +0 -0
  286. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3449.5d8818fac081c207ce79.js +0 -0
  287. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3514.c8a1863df3cfd5390617.js +0 -0
  288. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/355.45290b03d6d4be49a58e.js +0 -0
  289. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3551.87e6eb270a212d08b1b5.js +0 -0
  290. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/359.1463d2cf955623ecceae.js +0 -0
  291. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3619.3dfa7c4eaa067a407275.js +0 -0
  292. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3645.5ea37d9f483120f69f4e.js +0 -0
  293. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3659.056fa5e4e39b72bc358b.js +0 -0
  294. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3688.7bd1ba5006b22ed5616e.js +0 -0
  295. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3722.688cdfd335ffeac13492.js +0 -0
  296. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3724.06a5a1b542ff978df3b4.js +0 -0
  297. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/376.f9c52e5bbd650da7b67f.js +0 -0
  298. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3794.c0236d400b2129ac42a9.js +0 -0
  299. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/3930.b142768bad429b3ebb04.js +0 -0
  300. /runcell-0.1.17a2.data/data/share/jupyter/labextensions/runcell/static/877.e8b79ec87c1325c45f62.js.LICENSE.txt → /runcell-0.1.18a0.data/data/share/jupyter/labextensions/runcell/static/3939.87077bb549e80bc5709e.js.LICENSE.txt +0 -0
  301. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4003.95678dd199222938923b.js +0 -0
  302. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4017.d35a7557e5338be92770.js +0 -0
  303. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4050.00a6bfc9f23c6ef07199.js +0 -0
  304. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4087.ea430b62171512019400.js +0 -0
  305. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/410.fd643a255d72a83c1be6.js +0 -0
  306. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4127.0e783d9a497298e9fe18.js +0 -0
  307. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/415.0a1fdc1d9f76c0431d42.js +0 -0
  308. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4175.d23c246efa6921b45150.js +0 -0
  309. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4238.bd4642c4f9256441aea5.js +0 -0
  310. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4246.d8aedd2b15d1a95f1288.js +0 -0
  311. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4272.c92c9a0d98749863c853.js +0 -0
  312. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4296.7f1db6691a4ac120a383.js +0 -0
  313. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4317.1ba9f3c33b7a1484c5df.js +0 -0
  314. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/434.bfe4f51db2eb9644fbe7.js +0 -0
  315. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/434.bfe4f51db2eb9644fbe7.js.LICENSE.txt +0 -0
  316. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4353.6a83dae11a48e9d1b345.js +0 -0
  317. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4358.53a6106c5c93c3fda026.js +0 -0
  318. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4364.e87c307df69aa50a5b2a.js +0 -0
  319. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4365.b2b4496cc260301256b9.js +0 -0
  320. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4371.647bc44642d1ad0e99e4.js +0 -0
  321. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4390.1cafd3d4635b09e0c945.js +0 -0
  322. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4412.23a8cb5fb7377d3c81ab.js +0 -0
  323. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4412.23a8cb5fb7377d3c81ab.js.LICENSE.txt +0 -0
  324. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4425.a34c4f44daa5996eeec4.js +0 -0
  325. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4447.3ad32bafee045d2c0bab.js +0 -0
  326. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4477.d9e871faf650e6ad238a.js +0 -0
  327. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/45.560ee8b955f55e6a7471.js +0 -0
  328. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4503.794c4dd58c6bf2e6a66d.js +0 -0
  329. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4584.c610d4a425b036b86759.js +0 -0
  330. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4613.05840d3fc617590fff51.js +0 -0
  331. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4630.a78300f70b9af36897eb.js +0 -0
  332. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4682.1b69aa450cedd96227c9.js +0 -0
  333. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4713.4e4e598399fd6de85f5d.js +0 -0
  334. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4725.5447994a36dfeda58b9f.js +0 -0
  335. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4755.74d46f71eb4d23e4bca2.js +0 -0
  336. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4838.688e36ea43737e72dbdc.js +0 -0
  337. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/485.d27de91b0124447cf435.js +0 -0
  338. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4872.1404f5d25464532c27c2.js +0 -0
  339. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4886.443bcf6af7b83f72b4b5.js +0 -0
  340. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4913.d226f3c41ebb36489ce3.js +0 -0
  341. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/492.a7f5e972b35c8c877bf1.js +0 -0
  342. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/4928.5c8ad7f80ba081dfdbba.js +0 -0
  343. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5146.45d9b015343e5a7cace1.js +0 -0
  344. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5183.8c5527ebc7a807107471.js +0 -0
  345. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/524.927c6a42244b04ee834f.js +0 -0
  346. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5253.2cea0b927b50c952fe98.js +0 -0
  347. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5331.c971f98ac4fd9e9751a4.js +0 -0
  348. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5391.375b4314cb4b851f0915.js +0 -0
  349. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5391.375b4314cb4b851f0915.js.LICENSE.txt +0 -0
  350. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5408.07fc40e33d3fd1a3f7b6.js +0 -0
  351. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5431.528d309549815d363599.js +0 -0
  352. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5447.1267bc4aa4938bd0f08d.js +0 -0
  353. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5466.e1da4e862af22e314f82.js +0 -0
  354. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5473.7ac9ad0a3e047bfeceb0.js +0 -0
  355. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5509.c8c8ddebaabc3579daba.js +0 -0
  356. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5590.fd188e01caa78afb3ec4.js +0 -0
  357. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5620.cd3cd230d09209b34fb5.js +0 -0
  358. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5636.ca803ffcf0d43c2402c9.js +0 -0
  359. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5672.156ad2d1520857115575.js +0 -0
  360. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5695.0da6228c48571d9386f3.js +0 -0
  361. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5715.66ad4e7324b22a5e27fb.js +0 -0
  362. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5741.edd8fd814866705aad98.js +0 -0
  363. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5748.53eb48f5623074a948ba.js +0 -0
  364. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5765.e957d823cdfe2746a356.js +0 -0
  365. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5788.b9c62804c0698b91ca8a.js +0 -0
  366. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5882.b40b5d690d3f6f67f09a.js +0 -0
  367. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5885.8cd4d3e3008fdb31ce2a.js +0 -0
  368. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5900.6dca06924caef83a5b52.js +0 -0
  369. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5906.870c0d7bb4e022aaca9d.js +0 -0
  370. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5908.e81f83f7a9906d9d7542.js +0 -0
  371. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5973.4e08bf1ee13205326051.js +0 -0
  372. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5973.4e08bf1ee13205326051.js.LICENSE.txt +0 -0
  373. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/5977.d264e9baaebc417e35c0.js +0 -0
  374. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6007.987a9850d5891b1908ae.js +0 -0
  375. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6030.dd5fd07844168dbaa6f6.js +0 -0
  376. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6030.dd5fd07844168dbaa6f6.js.LICENSE.txt +0 -0
  377. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6079.5c80b9de6aabb0be08d2.js +0 -0
  378. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6084.bf8d6b1da6c4cad209bb.js +0 -0
  379. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6094.f96654ca0070f8f391b1.js +0 -0
  380. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/611.5ae7fb260af8629f1528.js +0 -0
  381. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6176.bd441d4d6fe942889bf3.js +0 -0
  382. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6221.457e64a4f06be421eaa4.js +0 -0
  383. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6266.4f2bcc95c2d61cdaacbc.js +0 -0
  384. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/627.84c4aa26f69662abb72d.js +0 -0
  385. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6293.823b9bfe50fdfd62dd42.js +0 -0
  386. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6299.b14c1d46ba4ad9799f63.js +0 -0
  387. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6306.8d22227d6aa1dfc32da5.js +0 -0
  388. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6320.b844d6686eebcb036643.js +0 -0
  389. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6322.997db39a5d4b63e72b21.js +0 -0
  390. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6336.92de365c5fb0f261f799.js +0 -0
  391. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6354.0025efd7872b7d32b46b.js +0 -0
  392. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6354.0025efd7872b7d32b46b.js.LICENSE.txt +0 -0
  393. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6366.5049626e7d5bb38a8574.js +0 -0
  394. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/640.ebfad36f1dde45e9cd05.js +0 -0
  395. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/642.817a48a77e1c16e6e65d.js +0 -0
  396. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6520.ff2a9ec2e50dd45868ac.js +0 -0
  397. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6573.7899a873adb98c3c0190.js +0 -0
  398. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6648.b7ed5e9a732275dc85ac.js +0 -0
  399. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6676.1a71900a6131dbe02aad.js +0 -0
  400. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6678.fe58c12ce33b0f5706f5.js +0 -0
  401. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6772.01fcccfcabd525210aee.js +0 -0
  402. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6774.1e0a751d7079179f8f73.js +0 -0
  403. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6795.1c49fa950817836e3f1e.js +0 -0
  404. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6803.eccda2da06d869b0acda.js +0 -0
  405. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6822.5bf91484ea172f864747.js +0 -0
  406. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6853.48004207e7c689ec55b4.js +0 -0
  407. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6880.c3cfce260b3d25d9ef5e.js +0 -0
  408. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6906.1f65b08daf64af8d1f27.js +0 -0
  409. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/6982.d9f1a29fe7834b53c855.js +0 -0
  410. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7005.9f8920f4e58652fe3ef9.js +0 -0
  411. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/711.5c259d7417620cf8eef8.js +0 -0
  412. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7131.cab088ddb371234f1fd6.js +0 -0
  413. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7161.f03be5c4590ae6db98c1.js +0 -0
  414. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7166.6e64d20ff3d06bb0726a.js +0 -0
  415. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7181.1d3f5611193e734beaf4.js +0 -0
  416. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/72.081fe34e2c76320135d0.js +0 -0
  417. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7232.5969981a73dac6835b93.js +0 -0
  418. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7273.9e6765278092fd30a14f.js +0 -0
  419. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7280.5862e5cf2b594fd45f82.js +0 -0
  420. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7336.b8136533f61cd1b71adc.js +0 -0
  421. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7359.7bc0ef939742600dba39.js +0 -0
  422. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7399.6fa42c5d34d3659f9f68.js +0 -0
  423. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7400.ea48afe8766bd82b3741.js +0 -0
  424. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7441.bce20fb0ea3d8638bc30.js +0 -0
  425. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7488.f63b5ad13eb23dbc3915.js +0 -0
  426. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/751.48ddf412afdd781e868f.js +0 -0
  427. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7572.937d1e5ce68a384389e9.js +0 -0
  428. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7652.cf086dfcd950ff2c4554.js +0 -0
  429. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7672.61e8e5299259407f1ee1.js +0 -0
  430. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7705.962a56002e394e3755aa.js +0 -0
  431. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7719.9dbadc40622a97c6fa90.js +0 -0
  432. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7771.efa5c4cf41907b4c8cfc.js +0 -0
  433. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7772.094d82c7ec81259764f4.js +0 -0
  434. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7772.094d82c7ec81259764f4.js.LICENSE.txt +0 -0
  435. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/779.c50f60eeca2b40bf96db.js +0 -0
  436. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7792.e67368a87fa703a97f25.js +0 -0
  437. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7812.1b53bb1f6cce555d0b70.js +0 -0
  438. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7890.c8c8ddebaabc3579daba.js +0 -0
  439. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7954.b02433d4bd38b648ec0e.js +0 -0
  440. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7959.75734676fe5e861ad899.js +0 -0
  441. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7967.ccc236f921abba961fcb.js +0 -0
  442. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/7981.c14b5974541e98a1b340.js +0 -0
  443. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8053.ebcecafa176e4cb5c439.js +0 -0
  444. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8053.ebcecafa176e4cb5c439.js.LICENSE.txt +0 -0
  445. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8056.06f4e4d87d7ccc1e4662.js +0 -0
  446. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8066.ad6692e614937d4dc480.js +0 -0
  447. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8122.f671cfb05d97b5e220fa.js +0 -0
  448. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8146.fc69595fa9fb4dc989ec.js +0 -0
  449. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8151.e18e503723ffa9d576f7.js +0 -0
  450. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8177.d8e81718e82279286385.js +0 -0
  451. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8179.33453f3165561d33347d.js +0 -0
  452. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8181.0f15741bcd037cfaf528.js +0 -0
  453. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8249.01410b92489460697717.js +0 -0
  454. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8295.39003c08c2539bf22593.js +0 -0
  455. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8304.075c39345f3b817edfb1.js +0 -0
  456. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8321.3ba6a40e5ed74b977afc.js +0 -0
  457. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8343.31e93467f566af5fb10e.js +0 -0
  458. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8354.3044135d1229985d61c6.js +0 -0
  459. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8354.3044135d1229985d61c6.js.LICENSE.txt +0 -0
  460. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8366.55b8257f92b23e6f49ec.js +0 -0
  461. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8369.80293e64ec102044c767.js +0 -0
  462. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/84.3575d43472885d2b7714.js +0 -0
  463. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8400.7d8ed1bca69c56f67486.js +0 -0
  464. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8404.1c1c675dc23d7d9d80de.js +0 -0
  465. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8437.795ac38d87895b50d98e.js +0 -0
  466. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8480.6698a41d2cf895aafe0f.js +0 -0
  467. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8482.85d03122dfec6d4f9307.js +0 -0
  468. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/851.9faa523fb28cedcd6b88.js +0 -0
  469. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8522.dd261948e958bcf4ae64.js +0 -0
  470. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8524.4c79a5ea5e22a1389a1f.js +0 -0
  471. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8649.b722755e4bccf4a39cd5.js +0 -0
  472. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8675.ffadeba0edbfd8d2285d.js +0 -0
  473. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8748.bb9c4496cf4ab7577e74.js +0 -0
  474. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8751.e80b9f51b9cdb544d16b.js +0 -0
  475. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8768.4aba875e6cfb350edfa7.js +0 -0
  476. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/880.0bcd5ab06196cb9533c4.js +0 -0
  477. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8824.4b08a890046be218bb35.js +0 -0
  478. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8829.c51ecb2bf77a1ca2a962.js +0 -0
  479. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8856.6e271445d6d3837302ec.js +0 -0
  480. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8860.c824d17d8869a6dd6207.js +0 -0
  481. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8887.6480b4ee0c5fa187c2d7.js +0 -0
  482. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8929.3329d360058c1764e201.js +0 -0
  483. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/8957.4f33250ba35099dbe048.js +0 -0
  484. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9014.0e67032c3d7119ce3370.js +0 -0
  485. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/904.60333ec0aebf2d092197.js +0 -0
  486. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9040.9376593b8e7caa5ed6a0.js +0 -0
  487. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9055.7b9ab3136d6a82b298a4.js +0 -0
  488. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9071.d8aea526bf53118639a9.js +0 -0
  489. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9113.f9e25015d31ee397e490.js +0 -0
  490. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9115.c30adf6f374eb1bd3b93.js +0 -0
  491. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9125.26a8a929493c19af9f50.js +0 -0
  492. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9165.8b0907227f85ba27306b.js +0 -0
  493. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9180.7d6cded0c9f36ac75093.js +0 -0
  494. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9184.33de87e8d509010a9bdf.js +0 -0
  495. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9193.3666b71cf376fdec58b4.js +0 -0
  496. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9205.a2f5f2a2c0b69582717e.js +0 -0
  497. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9251.822a5aa9397713d54ea2.js +0 -0
  498. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9255.ad693b359f0d12767fe1.js +0 -0
  499. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9262.bebc0ed75d7f86d722f2.js +0 -0
  500. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9277.f3623a34b457ca052d80.js +0 -0
  501. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9285.2d3c4984387ebca606d4.js +0 -0
  502. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9289.9fb56f7beb83d721e654.js +0 -0
  503. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/934.3ce5b696b827323e706e.js +0 -0
  504. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9402.b8868b6860051723bf48.js +0 -0
  505. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9412.fe8cf617636a0df90247.js +0 -0
  506. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9456.2f96fda82d4be6b0448e.js +0 -0
  507. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9494.b4ae8d6a63ec84cc4ec3.js +0 -0
  508. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9513.0db046603be52099c3ec.js +0 -0
  509. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9514.458d7630c50b4b658200.js +0 -0
  510. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9559.07e6563cb0b401ff88a6.js +0 -0
  511. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9576.b2d6c2e9831fda63f41f.js +0 -0
  512. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9607.a4f836281d0337527f6e.js +0 -0
  513. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9621.55ea68ee13d702908a10.js +0 -0
  514. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9640.c489050f3a1342328779.js +0 -0
  515. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9650.b4d4a115ac2fca1dfbe8.js +0 -0
  516. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9704.f4c6d15183531d37b825.js +0 -0
  517. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9734.63cf17414a5103d290bb.js +0 -0
  518. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9754.2f617d267f5167be63ed.js +0 -0
  519. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9885.f84ed1b0565de3b61e99.js +0 -0
  520. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9912.b6643895a628f9ea506c.js +0 -0
  521. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9926.6e52dbb62a19476aae87.js +0 -0
  522. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9939.eab64dfd409dd1df1844.js +0 -0
  523. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9986.e953beace913bfa7ba74.js +0 -0
  524. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/9997.1716894eb29a02d76575.js +0 -0
  525. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/style.js +0 -0
  526. {runcell-0.1.17a2.data → runcell-0.1.18a0.data}/data/share/jupyter/labextensions/runcell/static/third-party-licenses.json +0 -0
  527. {runcell-0.1.17a2.dist-info → runcell-0.1.18a0.dist-info}/WHEEL +0 -0
  528. {runcell-0.1.17a2.dist-info → runcell-0.1.18a0.dist-info}/entry_points.txt +0 -0
  529. {runcell-0.1.17a2.dist-info → runcell-0.1.18a0.dist-info}/licenses/LICENSE +0 -0
d5m_ai/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '0.1.17a2'
4
+ __version__ = VERSION = '0.1.18a0'
@@ -47,6 +47,7 @@ class AIJLAgentProxyHandler(WebSocketHandler):
47
47
  def initialize(self, **kwargs):
48
48
  self.connection_id: str = str(uuid.uuid4())
49
49
  self.current_request_id: str | None = None
50
+ self.local_only = False
50
51
 
51
52
  # Frontend WebSocket connection state
52
53
  self._is_closed = False
@@ -127,6 +128,12 @@ class AIJLAgentProxyHandler(WebSocketHandler):
127
128
  """Handle WebSocket connection opening from frontend."""
128
129
  # Get user token from local file
129
130
  user_token = self._get_user_token()
131
+ try:
132
+ local_only_param = self.get_query_argument("local_only", default="0")
133
+ except Exception:
134
+ local_only_param = "0"
135
+ # local_only keeps the frontend<->proxy WS for tools but avoids proxy<->remote WS.
136
+ self.local_only = str(local_only_param).lower() in {"1", "true", "yes"}
130
137
 
131
138
  if not user_token:
132
139
  print("[PROXY] ❌ No authentication token available")
@@ -147,11 +154,16 @@ class AIJLAgentProxyHandler(WebSocketHandler):
147
154
  "connection_id": self.connection_id
148
155
  })
149
156
 
150
- # Establish connection to remote backend
151
- await self._connect_to_remote_backend()
157
+ # Establish connection to remote backend unless running local-only tools.
158
+ if not self.local_only:
159
+ await self._connect_to_remote_backend()
160
+ else:
161
+ print("[PROXY] Local-only WebSocket enabled; skipping remote backend connection")
152
162
 
153
163
  async def _connect_to_remote_backend(self):
154
164
  """Establish WebSocket connection to remote backend server."""
165
+ if self.local_only:
166
+ return
155
167
  try:
156
168
  async with self._remote_connection_lock:
157
169
  if self.remote_websocket is None or self._is_remote_connection_closed():
@@ -635,6 +647,9 @@ class AIJLAgentProxyHandler(WebSocketHandler):
635
647
 
636
648
  async def _forward_to_remote_backend(self, msg):
637
649
  """Forward message to remote backend."""
650
+ if self.local_only:
651
+ print("[PROXY] Local-only mode: skipping forward to remote backend")
652
+ return
638
653
  # Add connection ID for routing
639
654
  msg["connection_id"] = self.connection_id
640
655
 
@@ -658,19 +673,24 @@ class AIJLAgentProxyHandler(WebSocketHandler):
658
673
  request_id = msg.get("request_id")
659
674
 
660
675
  if request_id:
676
+ if handler.local_only:
677
+ # In local-only mode there is no remote backend to reply to; resolve the waiter directly.
678
+ await self._process_cell_result(handler, result)
679
+ return
680
+
661
681
  # This is from a remote backend tool call, forward it back
662
682
  print(f"[PROXY] Forwarding cell_result to remote backend with request_id: {request_id}")
663
-
683
+
664
684
  # Clean up pending request tracking
665
685
  if hasattr(self, '_pending_frontend_requests'):
666
686
  self._pending_frontend_requests.discard(request_id)
667
-
687
+
668
688
  # Process the result to check for image data
669
689
  if '"image/png"' in result:
670
690
  print(f"[PROXY] Detected image/png data in cell_result")
671
691
  modified_result = await handler.image_processor.replace_base64_with_urls(result)
672
692
  result = modified_result
673
-
693
+
674
694
  await self._send_to_remote_backend({
675
695
  "type": "tool_call_result",
676
696
  "request_id": request_id,
@@ -689,6 +709,11 @@ class AIJLAgentProxyHandler(WebSocketHandler):
689
709
  if '"image/png"' in result:
690
710
  modified_result = await handler.image_processor.replace_base64_with_urls(result)
691
711
  result = modified_result
712
+
713
+ if handler.local_only:
714
+ # Local-only mode resolves the waiter directly instead of forwarding to remote.
715
+ await self._process_cell_result(handler, result)
716
+ return
692
717
 
693
718
  # Always forward the result back to remote backend with request_id
694
719
  if request_id:
@@ -711,6 +736,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
711
736
  modified_result = await handler.image_processor.replace_base64_with_urls(result)
712
737
  result = modified_result
713
738
 
739
+ if handler.local_only:
740
+ if handler.waiter and not handler.waiter.done():
741
+ handler.waiter.set_result(result)
742
+ else:
743
+ print(f"[PROXY] Handler waiter not available for edit_markdown_cell result")
744
+ return
745
+
714
746
  if request_id:
715
747
  await self._send_to_remote_backend({
716
748
  "type": "tool_call_result",
@@ -738,6 +770,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
738
770
  elif msg_type == "rerun_all_cells_result":
739
771
  result = msg.get("result", "No result provided")
740
772
  request_id = msg.get("request_id")
773
+
774
+ if handler.local_only:
775
+ if handler.waiter and not handler.waiter.done():
776
+ handler.waiter.set_result(result)
777
+ else:
778
+ print(f"[PROXY] Handler waiter not available for rerun_all_cells result")
779
+ return
741
780
 
742
781
  # If this result is from a remote backend tool call, forward it back
743
782
  if request_id:
@@ -764,6 +803,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
764
803
  else:
765
804
  error = msg.get("error", "Unknown error occurred")
766
805
  result = f"Error inserting markdown cell: {error}"
806
+
807
+ if handler.local_only:
808
+ if handler.waiter and not handler.waiter.done():
809
+ handler.waiter.set_result(result)
810
+ else:
811
+ print(f"[PROXY] Handler waiter not available for insert markdown cell result")
812
+ return
767
813
 
768
814
  # If this result is from a remote backend tool call, forward it back
769
815
  if request_id:
@@ -799,6 +845,14 @@ class AIJLAgentProxyHandler(WebSocketHandler):
799
845
  result = msg.get("result", "file is opened in tab")
800
846
  else:
801
847
  result = msg.get("error", "Unknown error occurred")
848
+
849
+ if handler.local_only:
850
+ if handler.waiter and not handler.waiter.done():
851
+ handler.waiter.set_result(result)
852
+ else:
853
+ print(f"[PROXY] Handler waiter not available for open tab result")
854
+ return
855
+
802
856
  if request_id:
803
857
  print(f"[PROXY] Forwarding open_tab to remote backend")
804
858
  await self._send_to_remote_backend({
@@ -815,6 +869,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
815
869
  elif msg_type == "insert_cell_result":
816
870
  result = msg.get("result", "No result provided")
817
871
  request_id = msg.get("request_id")
872
+
873
+ if handler.local_only:
874
+ if handler.waiter and not handler.waiter.done():
875
+ handler.waiter.set_result(result)
876
+ else:
877
+ print(f"[PROXY] Handler waiter not available for insert_cell result")
878
+ return
818
879
 
819
880
  if request_id:
820
881
  print(f"[PROXY] Forwarding insert_cell_result to remote backend")
@@ -839,6 +900,10 @@ class AIJLAgentProxyHandler(WebSocketHandler):
839
900
  print(f"[PROXY] Detected image/png data in run_cell_result")
840
901
  modified_result = await handler.image_processor.replace_base64_with_urls(result)
841
902
  result = modified_result
903
+
904
+ if handler.local_only:
905
+ await self._process_cell_result(handler, result)
906
+ return
842
907
 
843
908
  if request_id:
844
909
  print(f"[PROXY] Forwarding run_cell_result to remote backend")
@@ -857,6 +922,13 @@ class AIJLAgentProxyHandler(WebSocketHandler):
857
922
  elif msg_type == "delete_cell_result":
858
923
  result = msg.get("result", "No result provided")
859
924
  request_id = msg.get("request_id")
925
+
926
+ if handler.local_only:
927
+ if handler.waiter and not handler.waiter.done():
928
+ handler.waiter.set_result(result)
929
+ else:
930
+ print(f"[PROXY] Handler waiter not available for delete_cell result")
931
+ return
860
932
 
861
933
  if request_id:
862
934
  print(f"[PROXY] Forwarding delete_cell_result to remote backend")
@@ -879,6 +951,14 @@ class AIJLAgentProxyHandler(WebSocketHandler):
879
951
  result = msg.get("result", "Terminal created")
880
952
  else:
881
953
  result = msg.get("error", "Unknown error occurred")
954
+
955
+ if handler.local_only:
956
+ if handler.waiter and not handler.waiter.done():
957
+ handler.waiter.set_result(result)
958
+ else:
959
+ print(f"[PROXY] Handler waiter not available for run_long_terminal result")
960
+ return
961
+
882
962
  if request_id:
883
963
  print(f"[PROXY] Forwarding run_long_terminal_result to remote backend")
884
964
  await self._send_to_remote_backend({
@@ -0,0 +1,11 @@
1
+ """
2
+ Agent V2 proxy handlers.
3
+
4
+ This module introduces a versioned HTTP/SSE agent endpoint that reuses the
5
+ ask-mode tool loop pattern while keeping the existing WebSocket agent intact.
6
+ """
7
+
8
+ from .proxy_handler import AIAgentV2ProxyHandler
9
+
10
+ __all__ = ["AIAgentV2ProxyHandler"]
11
+
@@ -0,0 +1,263 @@
1
+ """
2
+ Agent V2 HTTP/SSE proxy handler.
3
+
4
+ MVP design:
5
+ - Frontend <-> proxy may still use a local-only WebSocket for notebook tools.
6
+ - Proxy <-> remote backend is strictly HTTP/SSE.
7
+ - Tool execution reuses the ask-mode registry for now.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import aiohttp
13
+ import json
14
+ import logging
15
+ import ssl
16
+ from typing import Any, Dict
17
+
18
+ import certifi
19
+
20
+ from .._version import __version__ as client_version
21
+ from ..chat.chat_proxy_handler import AIChatProxyHandler
22
+ from tornado import web
23
+
24
+
25
+ class AIAgentV2ProxyHandler(AIChatProxyHandler):
26
+ """
27
+ Versioned agent proxy that routes to `/v2/agent/chat` on the remote backend.
28
+
29
+ This intentionally subclasses the ask-mode proxy so we can validate the
30
+ HTTP tool loop end-to-end before migrating agent-specific tools/prompts.
31
+ """
32
+
33
+ def __init__(self, *args, **kwargs):
34
+ super().__init__(*args, **kwargs)
35
+ logging.info(
36
+ f"[AGENT-V2-PROXY] Initialized with remote backend: {self.remote_backend_url}"
37
+ )
38
+
39
+ async def _forward_to_remote_backend(
40
+ self, body_data: Dict[str, Any], stream: bool, user_token: str
41
+ ):
42
+ """Forward request to the versioned remote backend and handle response."""
43
+ try:
44
+ remote_url = f"{self.remote_backend_url}/v2/agent/chat"
45
+
46
+ if not hasattr(self, "_unified_content_index"):
47
+ starting_index = body_data.get("starting_content_index")
48
+ if starting_index is None:
49
+ starting_index = body_data.get("last_content_index")
50
+ if starting_index is not None:
51
+ try:
52
+ self._unified_content_index = max(0, int(starting_index))
53
+ except (TypeError, ValueError):
54
+ self._unified_content_index = 0
55
+
56
+ if hasattr(self, "_unified_content_index") and self._unified_content_index > 0:
57
+ body_data["starting_content_index"] = self._unified_content_index
58
+ logging.info(
59
+ "[AGENT-V2-PROXY] Continuing conversation with starting_content_index: "
60
+ f"{self._unified_content_index}"
61
+ )
62
+
63
+ body_data["client_version"] = client_version
64
+
65
+ headers = {
66
+ "Content-Type": "application/json",
67
+ "Authorization": f"Bearer {user_token}",
68
+ }
69
+
70
+ try:
71
+ ssl_context = ssl.create_default_context(cafile=certifi.where())
72
+ except Exception as exc:
73
+ logging.warning(
74
+ f"[AGENT-V2-PROXY] Failed to create SSL context with certifi: {exc}"
75
+ )
76
+ ssl_context = ssl.create_default_context()
77
+
78
+ connector = aiohttp.TCPConnector(ssl=ssl_context)
79
+
80
+ async with aiohttp.ClientSession(connector=connector) as session:
81
+ async with session.post(remote_url, json=body_data, headers=headers) as response:
82
+ if response.status != 200:
83
+ error_text = await response.text()
84
+ logging.error(
85
+ f"[AGENT-V2-PROXY] Remote backend error {response.status}: {error_text}"
86
+ )
87
+
88
+ try:
89
+ error_data = json.loads(error_text)
90
+ error_status = error_data.get("status", "error")
91
+ error_message = error_data.get("error", error_text)
92
+
93
+ if response.status == 401:
94
+ self.set_status(401)
95
+ self.finish(
96
+ json.dumps(
97
+ {
98
+ "error": "Authentication failed. Please log in again.",
99
+ "status": "auth_error",
100
+ }
101
+ )
102
+ )
103
+ elif response.status == 402:
104
+ self.set_status(402)
105
+ self.finish(
106
+ json.dumps(
107
+ {
108
+ "error": error_message,
109
+ "status": "insufficient_credits",
110
+ }
111
+ )
112
+ )
113
+ else:
114
+ self.set_status(response.status)
115
+ self.finish(
116
+ json.dumps(
117
+ {"error": error_message, "status": error_status}
118
+ )
119
+ )
120
+ except json.JSONDecodeError:
121
+ self.set_status(response.status)
122
+ self.finish(
123
+ json.dumps(
124
+ {
125
+ "error": f"Remote backend error: {error_text}",
126
+ "status": "error",
127
+ }
128
+ )
129
+ )
130
+ return
131
+
132
+ if stream:
133
+ if not hasattr(self, "_unified_content_index"):
134
+ self._unified_content_index = 0
135
+
136
+ pending_tool_data = await self._handle_streaming_response(
137
+ response, self._unified_content_index
138
+ )
139
+ if pending_tool_data:
140
+ self._unified_content_index = pending_tool_data.get(
141
+ "max_content_index", self._unified_content_index
142
+ )
143
+ await self._handle_pending_tool_call(
144
+ pending_tool_data, body_data, user_token
145
+ )
146
+ else:
147
+ response_data = await response.json()
148
+ self.finish(json.dumps(response_data))
149
+
150
+ except aiohttp.ClientConnectorError as exc:
151
+ logging.error(
152
+ "[AGENT-V2-PROXY] Cannot connect to remote backend at "
153
+ f"{self.remote_backend_url}: {exc}"
154
+ )
155
+ self.set_status(503)
156
+ self.finish(
157
+ json.dumps(
158
+ {
159
+ "error": (
160
+ "Cannot connect to agent v2 remote backend. "
161
+ f"Please ensure the remote backend server is running at {self.remote_backend_url}"
162
+ ),
163
+ "status": "error",
164
+ }
165
+ )
166
+ )
167
+ except Exception as exc:
168
+ logging.error(f"[AGENT-V2-PROXY] Error forwarding to remote backend: {exc}")
169
+ self.set_status(500)
170
+ self.finish(json.dumps({"error": str(exc), "status": "error"}))
171
+
172
+
173
+ class AIAgentV2SessionProxyHandler(AIChatProxyHandler):
174
+ """Proxy handler for agent v2 session endpoints."""
175
+
176
+ @web.authenticated
177
+ async def get(self):
178
+ user_token = await self.get_user_token() or self.get_test_token_from_env()
179
+ if not user_token:
180
+ self.set_status(401)
181
+ self.finish(
182
+ json.dumps(
183
+ {
184
+ "error": "Authentication required. Please log in again.",
185
+ "status": "auth_required",
186
+ }
187
+ )
188
+ )
189
+ return
190
+
191
+ remote_url = f"{self.remote_backend_url}/v2/agent/session"
192
+ headers = {
193
+ "Content-Type": "application/json",
194
+ "Authorization": f"Bearer {user_token}",
195
+ }
196
+
197
+ try:
198
+ ssl_context = ssl.create_default_context(cafile=certifi.where())
199
+ except Exception as exc:
200
+ logging.warning(
201
+ f"[AGENT-V2-PROXY] Failed to create SSL context with certifi: {exc}"
202
+ )
203
+ ssl_context = ssl.create_default_context()
204
+
205
+ connector = aiohttp.TCPConnector(ssl=ssl_context)
206
+ async with aiohttp.ClientSession(connector=connector) as session:
207
+ async with session.get(remote_url, params=self.request.query, headers=headers) as response:
208
+ payload_text = await response.text()
209
+ if response.status != 200:
210
+ self.set_status(response.status)
211
+ self.finish(payload_text)
212
+ return
213
+ self.finish(payload_text)
214
+
215
+ @web.authenticated
216
+ async def post(self):
217
+ user_token = await self.get_user_token() or self.get_test_token_from_env()
218
+ if not user_token:
219
+ self.set_status(401)
220
+ self.finish(
221
+ json.dumps(
222
+ {
223
+ "error": "Authentication required. Please log in again.",
224
+ "status": "auth_required",
225
+ }
226
+ )
227
+ )
228
+ return
229
+
230
+ try:
231
+ body_data = json.loads(self.request.body.decode("utf-8")) if self.request.body else {}
232
+ except Exception:
233
+ body_data = {}
234
+
235
+ remote_url = f"{self.remote_backend_url}/v2/agent/session"
236
+ headers = {
237
+ "Content-Type": "application/json",
238
+ "Authorization": f"Bearer {user_token}",
239
+ }
240
+
241
+ try:
242
+ ssl_context = ssl.create_default_context(cafile=certifi.where())
243
+ except Exception as exc:
244
+ logging.warning(
245
+ f"[AGENT-V2-PROXY] Failed to create SSL context with certifi: {exc}"
246
+ )
247
+ ssl_context = ssl.create_default_context()
248
+
249
+ connector = aiohttp.TCPConnector(ssl=ssl_context)
250
+ async with aiohttp.ClientSession(connector=connector) as session:
251
+ async with session.post(remote_url, json=body_data, headers=headers) as response:
252
+ payload_text = await response.text()
253
+ if response.status != 200:
254
+ self.set_status(response.status)
255
+ self.finish(payload_text)
256
+ return
257
+ self.finish(payload_text)
258
+
259
+ async def options(self):
260
+ self.set_header("Access-Control-Allow-Origin", "*")
261
+ self.set_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
262
+ self.set_header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-User-Token")
263
+ self.set_status(200)
@@ -25,13 +25,26 @@ from typing import Dict, Any, Optional
25
25
  from jupyter_server.base.handlers import APIHandler
26
26
  from tornado import web
27
27
 
28
- from ..utils import build_remote_backend_url
28
+ from ..utils import build_remote_backend_url, get_server_url_from_handler
29
29
  from ..auth.token_handler import get_current_user_token_string
30
30
  from ..tools.registry import run_ask_tool
31
31
  from .._version import __version__ as client_version
32
+ from ..agent.image_processor import ImageProcessor
32
33
 
33
34
  logging.basicConfig(level=logging.INFO)
34
35
 
36
+ FRONTEND_NOTEBOOK_TOOLS = {
37
+ "cell_execute",
38
+ "edit_cell",
39
+ "edit_markdown_cell",
40
+ "insert_markdown_cell",
41
+ "insert_cell",
42
+ "run_cell",
43
+ "delete_cell",
44
+ "open_tab",
45
+ "rerun_all_cells",
46
+ }
47
+
35
48
 
36
49
  class AIChatProxyHandler(APIHandler):
37
50
  """Proxy handler for AI chat requests that forwards to remote backend."""
@@ -43,6 +56,10 @@ class AIChatProxyHandler(APIHandler):
43
56
 
44
57
  logging.info(f"[CHAT-PROXY] Initialized with remote backend: {self.remote_backend_url}")
45
58
  logging.info("[CHAT-PROXY] Token authentication enabled - will forward tokens to remote backend")
59
+
60
+ # Lazily initialized when we first need to process cell images.
61
+ self._image_processor: ImageProcessor | None = None
62
+ self._image_processor_connection_id: str | None = None
46
63
 
47
64
  async def get_user_token(self) -> Optional[str]:
48
65
  """
@@ -429,10 +446,79 @@ class AIChatProxyHandler(APIHandler):
429
446
  self.write(f"data: {event_text}\n\n")
430
447
  await self.flush()
431
448
 
449
+ def _normalize_frontend_tool_args(
450
+ self, tool_name: str, tool_args: Dict[str, Any]
451
+ ) -> tuple[Dict[str, Any], str | None]:
452
+ """Normalize frontend tool args so Jupyter contents paths are used."""
453
+ if not tool_args or tool_name not in FRONTEND_NOTEBOOK_TOOLS:
454
+ return tool_args, None
455
+
456
+ normalized = dict(tool_args)
457
+ file_path = normalized.get("file_path")
458
+ if file_path:
459
+ resolved_path, error_message = self._resolve_contents_path(file_path)
460
+ if error_message:
461
+ return {}, error_message
462
+ normalized["file_path"] = resolved_path
463
+ return normalized, None
464
+
465
+ def _resolve_contents_path(self, file_path: str) -> tuple[str, str | None]:
466
+ """Convert absolute filesystem paths to Jupyter contents paths when possible."""
467
+ from ..agent.path_utils import resolve_contents_path
468
+
469
+ root_dir = getattr(getattr(self, "contents_manager", None), "root_dir", None)
470
+ if not root_dir:
471
+ contents_manager = self.settings.get("contents_manager")
472
+ root_dir = getattr(contents_manager, "root_dir", None) if contents_manager else None
473
+ if not root_dir:
474
+ root_dir = (
475
+ self.settings.get("server_root_dir")
476
+ or self.settings.get("root_dir")
477
+ or os.getcwd()
478
+ )
479
+ return resolve_contents_path(file_path, root_dir)
480
+
481
+ def _get_image_processor(self, connection_id: str | None) -> ImageProcessor:
482
+ """Create/reuse an ImageProcessor for replacing base64 image outputs."""
483
+ if not self._image_processor or self._image_processor_connection_id != connection_id:
484
+ server_url = get_server_url_from_handler(
485
+ self,
486
+ fallback=os.environ.get("SERVER_URL", "http://localhost:8888"),
487
+ )
488
+ self._image_processor = ImageProcessor(connection_id or "unknown", server_url)
489
+ self._image_processor_connection_id = connection_id
490
+ return self._image_processor
491
+
492
+ async def _replace_base64_images(
493
+ self,
494
+ tool_name: str,
495
+ tool_result: Any,
496
+ sse_output: Any,
497
+ connection_id: str | None,
498
+ ) -> tuple[Any, Any]:
499
+ """Replace base64 image payloads with URLs for notebook tool outputs."""
500
+ if tool_name not in FRONTEND_NOTEBOOK_TOOLS:
501
+ return tool_result, sse_output
502
+
503
+ processor = None
504
+
505
+ if isinstance(tool_result, str) and '"image/png"' in tool_result:
506
+ processor = self._get_image_processor(connection_id)
507
+ tool_result = await processor.replace_base64_with_urls(tool_result)
508
+
509
+ if isinstance(sse_output, str) and '"image/png"' in sse_output:
510
+ if processor is None:
511
+ processor = self._get_image_processor(connection_id)
512
+ sse_output = await processor.replace_base64_with_urls(sse_output)
513
+
514
+ return tool_result, sse_output
515
+
432
516
  async def _handle_pending_tool_call(self, pending_data: Dict[str, Any], body_data: Dict[str, Any], user_token: str):
433
517
  """Execute local tools and continue the conversation with the remote backend."""
434
- tool_calls = pending_data.get('tool_calls', []) or []
435
- if not tool_calls:
518
+ client_tool_calls = pending_data.get('tool_calls', []) or []
519
+ server_tool_calls = pending_data.get('server_tool_calls', []) or []
520
+ server_tool_results = pending_data.get('server_tool_results', []) or []
521
+ if not client_tool_calls and not server_tool_calls:
436
522
  logging.warning("[CHAT-PROXY] Pending tool payload without tool_calls")
437
523
  return
438
524
 
@@ -448,7 +534,7 @@ class AIChatProxyHandler(APIHandler):
448
534
  thinking_blocks = deepcopy(thinking_blocks)
449
535
 
450
536
  assistant_tool_calls = []
451
- for tool_call in tool_calls:
537
+ for tool_call in server_tool_calls + client_tool_calls:
452
538
  function_info = tool_call.get('function', {}) or {}
453
539
  assistant_tool_calls.append({
454
540
  'id': tool_call.get('id', ''),
@@ -477,7 +563,16 @@ class AIChatProxyHandler(APIHandler):
477
563
 
478
564
  messages.append(assistant_message)
479
565
 
480
- for idx, tool_call in enumerate(tool_calls):
566
+ if server_tool_results:
567
+ for idx, tool_result in enumerate(server_tool_results):
568
+ call_id = tool_result.get('tool_call_id') or tool_result.get('call_id') or f'server_tool_call_{idx}'
569
+ messages.append({
570
+ 'role': 'tool',
571
+ 'tool_call_id': call_id,
572
+ 'content': tool_result.get('content', '')
573
+ })
574
+
575
+ for idx, tool_call in enumerate(client_tool_calls):
481
576
  function_info = tool_call.get('function', {}) or {}
482
577
  tool_name = function_info.get('name', '')
483
578
  raw_arguments = function_info.get('arguments', '') or ''
@@ -487,14 +582,35 @@ class AIChatProxyHandler(APIHandler):
487
582
  except json.JSONDecodeError:
488
583
  logging.warning(f"[CHAT-PROXY] Failed to parse tool arguments for {tool_name}: {raw_arguments}")
489
584
  parsed_args = {}
490
-
491
- tool_run = await run_ask_tool(tool_name, parsed_args)
492
- if tool_run is None:
493
- tool_result = f"Error: Unsupported tool '{tool_name}' in ask mode"
585
+ # Inject connection_id for tools that require frontend WebSocket (e.g., cell_execute).
586
+ if 'connection_id' not in parsed_args:
587
+ # This comes from the ask-mode local-only WS established by the frontend.
588
+ parsed_args['connection_id'] = body_data.get('connection_id')
589
+
590
+ normalized_args, error_message = self._normalize_frontend_tool_args(
591
+ tool_name, parsed_args
592
+ )
593
+ if error_message:
594
+ logging.warning(
595
+ f"[CHAT-PROXY] Path resolution error for {tool_name}: {error_message}"
596
+ )
597
+ tool_result = error_message
494
598
  sse_output = tool_result
495
599
  else:
496
- tool_result = tool_run["llm_output"]
497
- sse_output = tool_run["sse_output"]
600
+ tool_run = await run_ask_tool(tool_name, normalized_args)
601
+ if tool_run is None:
602
+ tool_result = f"Error: Unsupported tool '{tool_name}' in ask mode"
603
+ sse_output = tool_result
604
+ else:
605
+ tool_result = tool_run["llm_output"]
606
+ sse_output = tool_run["sse_output"]
607
+
608
+ tool_result, sse_output = await self._replace_base64_images(
609
+ tool_name,
610
+ tool_result,
611
+ sse_output,
612
+ body_data.get("connection_id"),
613
+ )
498
614
 
499
615
  call_id = tool_call.get('id', f'tool_call_{idx}')
500
616