superacli 1.1.5 → 1.1.7

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 (1081) hide show
  1. package/README.md +77 -53
  2. package/__tests__/azd-plugin.test.js +109 -0
  3. package/__tests__/config.test.js +4 -3
  4. package/__tests__/discover.test.js +59 -0
  5. package/__tests__/goose-plugin.test.js +149 -0
  6. package/__tests__/help-json.test.js +2 -0
  7. package/__tests__/openhands-plugin.test.js +106 -0
  8. package/__tests__/plugin-cocoindex-code-uninstall.test.js +19 -0
  9. package/__tests__/plugin-cocoindex-code.test.js +37 -0
  10. package/__tests__/plugin-install-guidance.test.js +81 -0
  11. package/__tests__/plugins-registry.test.js +44 -0
  12. package/__tests__/plugins-store.test.js +40 -5
  13. package/__tests__/process-adapter.test.js +50 -1
  14. package/__tests__/resend-plugin.test.js +22 -1
  15. package/__tests__/server-app.test.js +1 -0
  16. package/__tests__/server-routes-commands.test.js +20 -2
  17. package/__tests__/server-routes-plugins.test.js +130 -0
  18. package/__tests__/skills.test.js +26 -0
  19. package/__tests__/squirrelscan-plugin.test.js +129 -0
  20. package/__tests__/uipath-plugin.test.js +104 -0
  21. package/__tests__/uipathcli-plugin.test.js +95 -0
  22. package/cli/adapters/mcp.js +2 -0
  23. package/cli/adapters/process.js +49 -2
  24. package/cli/config.js +240 -3
  25. package/cli/discover.js +157 -0
  26. package/cli/help-json.js +16 -1
  27. package/cli/plugin-install-guidance.js +92 -37
  28. package/cli/plugins-manager.js +1 -0
  29. package/cli/plugins-registry.js +74 -8
  30. package/cli/plugins-store.js +78 -17
  31. package/cli/skills-mcp.js +1 -1
  32. package/cli/skills.js +39 -2
  33. package/cli/supercli.js +87 -11
  34. package/docs/feature-gaps.md +8 -8
  35. package/docs/features/azd-uipath-plugins.md +43 -0
  36. package/docs/features/server-plugins.md +62 -0
  37. package/docs/features/skills.md +9 -5
  38. package/docs/{supported-harnesses.md → plugins-available.md} +4 -3
  39. package/docs/{plugin-harness-guide.md → plugins-how-to.md} +1 -1
  40. package/docs/plugins.md +26 -20
  41. package/docs/server-plugins-usage-guide.md +182 -0
  42. package/docs/skills-catalog.md +12 -10
  43. package/package.json +1 -1
  44. package/plugins/agent-browser/README.md +69 -0
  45. package/plugins/agent-browser/plugin.json +111 -0
  46. package/plugins/agent-browser/skills/quickstart/SKILL.md +66 -0
  47. package/plugins/aider/README.md +53 -0
  48. package/plugins/aider/plugin.json +105 -0
  49. package/plugins/aider/scripts/aider-wrapper.js +243 -0
  50. package/plugins/aider/scripts/setup-aider.js +37 -0
  51. package/plugins/aider/skills/dry-run-review.md +24 -0
  52. package/plugins/aider/skills/model-and-provider.md +24 -0
  53. package/plugins/aider/skills/one-shot-edits.md +30 -0
  54. package/plugins/aider/skills/quickstart/SKILL.md +51 -0
  55. package/plugins/azd/README.md +28 -0
  56. package/plugins/azd/plugin.json +87 -0
  57. package/plugins/azd/skills/quickstart/SKILL.md +41 -0
  58. package/plugins/blogwatcher/README.md +3 -3
  59. package/plugins/boxlite/Dockerfile +9 -0
  60. package/plugins/boxlite/README.md +62 -0
  61. package/plugins/boxlite/plugin.json +201 -0
  62. package/plugins/boxlite/scripts/run-boxlite.js +106 -0
  63. package/plugins/boxlite/skills/quickstart/SKILL.md +40 -0
  64. package/plugins/cass/plugin.json +150 -0
  65. package/plugins/cass/scripts/setup-cass.js +47 -0
  66. package/plugins/cass/skills/quickstart/SKILL.md +46 -0
  67. package/plugins/clever/README.md +46 -0
  68. package/plugins/clever/plugin.json +119 -0
  69. package/plugins/clever/scripts/setup-clever.js +28 -0
  70. package/plugins/clever/skills/auth-and-profile.md +29 -0
  71. package/plugins/clever/skills/passthrough-safety.md +21 -0
  72. package/plugins/clever/skills/quickstart/SKILL.md +45 -0
  73. package/plugins/clever/skills/resource-inventory.md +24 -0
  74. package/plugins/clix/README.md +4 -4
  75. package/plugins/cocoindex-code/README.md +64 -0
  76. package/plugins/cocoindex-code/plugin.json +81 -0
  77. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-310.pyc +0 -0
  78. package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-311.pyc +0 -0
  79. package/plugins/cocoindex-code/scripts/post-install.js +61 -0
  80. package/plugins/cocoindex-code/scripts/post-uninstall.js +25 -0
  81. package/plugins/cocoindex-code/scripts/query.py +88 -0
  82. package/plugins/cocoindex-code/scripts/run-query.js +50 -0
  83. package/plugins/cocoindex-code/skills/quickstart/SKILL.md +73 -0
  84. package/plugins/copilot/README.md +24 -0
  85. package/plugins/copilot/plugin.json +80 -0
  86. package/plugins/copilot/skills/quickstart/SKILL.md +44 -0
  87. package/plugins/gemini/README.md +24 -0
  88. package/plugins/gemini/plugin.json +98 -0
  89. package/plugins/gemini/skills/quickstart/SKILL.md +44 -0
  90. package/plugins/gifcap/plugin.json +119 -0
  91. package/plugins/gifcap/scripts/setup-gifcap.js +44 -0
  92. package/plugins/gifcap/skills/quickstart/SKILL.md +34 -0
  93. package/plugins/gifcap/test-record-quiet.gif +0 -0
  94. package/plugins/gifcap/test-record.gif +0 -0
  95. package/plugins/goose/README.md +36 -0
  96. package/plugins/goose/plugin.json +183 -0
  97. package/plugins/goose/skills/quickstart/SKILL.md +44 -0
  98. package/plugins/json-server/README.md +58 -0
  99. package/plugins/json-server/plugin.json +113 -0
  100. package/plugins/json-server/skills/quickstart/SKILL.md +57 -0
  101. package/plugins/lightpanda/README.md +145 -0
  102. package/plugins/lightpanda/package-lock.json +1375 -0
  103. package/plugins/lightpanda/package.json +12 -0
  104. package/plugins/lightpanda/plugin.json +116 -0
  105. package/plugins/lightpanda/scripts/lightpanda-contacts.js +494 -0
  106. package/plugins/lightpanda/scripts/lightpanda-generic-extract.js +403 -0
  107. package/plugins/lightpanda/scripts/lightpanda-wrapper.js +480 -0
  108. package/plugins/lightpanda/scripts/setup-lightpanda.js +39 -0
  109. package/plugins/lightpanda/skills/contact-discovery.md +51 -0
  110. package/plugins/lightpanda/skills/generic-extraction.md +66 -0
  111. package/plugins/lightpanda/skills/quickstart/SKILL.md +103 -0
  112. package/plugins/lightpanda/skills/resilient-navigation.md +42 -0
  113. package/plugins/monty/README.md +2 -2
  114. package/plugins/nullclaw/README.md +3 -3
  115. package/plugins/offline-ai/README.md +23 -0
  116. package/plugins/offline-ai/plugin.json +82 -0
  117. package/plugins/offline-ai/skills/quickstart/SKILL.md +43 -0
  118. package/plugins/openhands/README.md +25 -0
  119. package/plugins/openhands/plugin.json +116 -0
  120. package/plugins/openhands/skills/quickstart/SKILL.md +26 -0
  121. package/plugins/plandex/README.md +25 -0
  122. package/plugins/plandex/plugin.json +130 -0
  123. package/plugins/plandex/skills/quickstart/SKILL.md +50 -0
  124. package/plugins/plugins.json +190 -2
  125. package/plugins/resend/plugin.json +279 -2
  126. package/plugins/resend/skills/quickstart/SKILL.md +32 -13
  127. package/plugins/squirrelscan/Dockerfile +5 -0
  128. package/plugins/squirrelscan/README.md +47 -0
  129. package/plugins/squirrelscan/plugin.json +493 -0
  130. package/plugins/squirrelscan/scripts/post-install.js +33 -0
  131. package/plugins/squirrelscan/scripts/post-uninstall.js +25 -0
  132. package/plugins/squirrelscan/scripts/run-squirrel.js +73 -0
  133. package/plugins/squirrelscan/skills/audit-workflow/SKILL.md +33 -0
  134. package/plugins/squirrelscan/skills/publish-report/SKILL.md +33 -0
  135. package/plugins/squirrelscan/skills/quickstart/SKILL.md +41 -0
  136. package/plugins/uipath/README.md +27 -0
  137. package/plugins/uipath/plugin.json +86 -0
  138. package/plugins/uipath/skills/quickstart/SKILL.md +47 -0
  139. package/plugins/uipathcli/README.md +28 -0
  140. package/plugins/uipathcli/plugin.json +120 -0
  141. package/plugins/uipathcli/scripts/run-uipath-cli.js +49 -0
  142. package/plugins/uipathcli/skills/quickstart/SKILL.md +22 -0
  143. package/plugins/xurl/README.md +4 -4
  144. package/server/app.js +5 -2
  145. package/server/public/app.js +3 -0
  146. package/server/routes/commands.js +95 -12
  147. package/server/routes/plugins.js +262 -0
  148. package/server/services/pluginsService.js +303 -0
  149. package/server/views/command-edit.ejs +196 -14
  150. package/server/views/partials/head.ejs +1 -0
  151. package/server/views/plugins.ejs +264 -0
  152. package/tests/test-plugins-registry.js +30 -0
  153. package/tests/test-resend-smoke.sh +7 -3
  154. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +0 -20
  155. package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +0 -1
  156. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +0 -21
  157. package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +0 -1
  158. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +0 -22
  159. package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +0 -1
  160. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +0 -23
  161. package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +0 -1
  162. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +0 -24
  163. package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +0 -1
  164. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +0 -24
  165. package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +0 -1
  166. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +0 -24
  167. package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +0 -1
  168. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +0 -24
  169. package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +0 -1
  170. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +0 -24
  171. package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +0 -1
  172. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +0 -24
  173. package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +0 -1
  174. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +0 -24
  175. package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +0 -1
  176. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +0 -24
  177. package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +0 -1
  178. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +0 -24
  179. package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +0 -1
  180. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +0 -25
  181. package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +0 -1
  182. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +0 -25
  183. package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +0 -1
  184. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +0 -25
  185. package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +0 -1
  186. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +0 -26
  187. package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +0 -1
  188. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +0 -27
  189. package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +0 -1
  190. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +0 -28
  191. package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +0 -1
  192. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +0 -29
  193. package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +0 -1
  194. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +0 -30
  195. package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +0 -1
  196. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +0 -31
  197. package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +0 -1
  198. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +0 -32
  199. package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +0 -1
  200. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +0 -32
  201. package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +0 -1
  202. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +0 -32
  203. package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +0 -1
  204. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +0 -32
  205. package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +0 -1
  206. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +0 -32
  207. package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +0 -1
  208. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +0 -32
  209. package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +0 -1
  210. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +0 -32
  211. package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +0 -1
  212. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +0 -32
  213. package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +0 -1
  214. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +0 -32
  215. package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +0 -1
  216. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +0 -32
  217. package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +0 -1
  218. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +0 -32
  219. package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +0 -1
  220. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +0 -32
  221. package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +0 -1
  222. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +0 -32
  223. package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +0 -1
  224. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +0 -32
  225. package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +0 -1
  226. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +0 -33
  227. package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +0 -1
  228. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +0 -33
  229. package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +0 -1
  230. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +0 -34
  231. package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +0 -1
  232. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +0 -34
  233. package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +0 -1
  234. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +0 -35
  235. package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +0 -1
  236. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +0 -36
  237. package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +0 -1
  238. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +0 -37
  239. package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +0 -1
  240. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +0 -38
  241. package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +0 -1
  242. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +0 -39
  243. package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +0 -1
  244. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +0 -40
  245. package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +0 -1
  246. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +0 -41
  247. package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +0 -1
  248. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +0 -42
  249. package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +0 -1
  250. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +0 -43
  251. package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +0 -1
  252. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +0 -44
  253. package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +0 -1
  254. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +0 -45
  255. package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +0 -1
  256. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +0 -46
  257. package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +0 -1
  258. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +0 -47
  259. package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +0 -1
  260. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +0 -48
  261. package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +0 -1
  262. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +0 -49
  263. package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +0 -1
  264. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +0 -50
  265. package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +0 -1
  266. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +0 -51
  267. package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +0 -1
  268. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +0 -52
  269. package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +0 -1
  270. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +0 -53
  271. package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +0 -1
  272. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +0 -54
  273. package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +0 -1
  274. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +0 -55
  275. package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +0 -1
  276. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +0 -56
  277. package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +0 -1
  278. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +0 -57
  279. package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +0 -1
  280. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +0 -57
  281. package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +0 -1
  282. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +0 -57
  283. package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +0 -1
  284. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +0 -57
  285. package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +0 -1
  286. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +0 -57
  287. package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +0 -1
  288. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +0 -57
  289. package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +0 -1
  290. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +0 -57
  291. package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +0 -1
  292. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +0 -57
  293. package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +0 -1
  294. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +0 -57
  295. package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +0 -1
  296. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +0 -57
  297. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +0 -1
  298. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +0 -57
  299. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +0 -1
  300. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +0 -57
  301. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +0 -1
  302. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +0 -57
  303. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +0 -1
  304. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +0 -57
  305. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +0 -1
  306. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +0 -57
  307. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +0 -1
  308. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +0 -57
  309. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +0 -1
  310. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +0 -57
  311. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +0 -1
  312. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +0 -57
  313. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +0 -1
  314. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +0 -57
  315. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +0 -1
  316. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +0 -57
  317. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +0 -1
  318. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +0 -57
  319. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +0 -1
  320. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +0 -57
  321. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +0 -1
  322. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +0 -57
  323. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +0 -1
  324. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +0 -57
  325. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +0 -1
  326. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +0 -57
  327. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +0 -1
  328. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +0 -57
  329. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +0 -1
  330. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +0 -57
  331. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +0 -1
  332. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +0 -57
  333. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +0 -1
  334. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +0 -57
  335. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +0 -1
  336. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +0 -57
  337. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +0 -1
  338. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +0 -58
  339. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +0 -1
  340. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +0 -59
  341. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +0 -1
  342. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +0 -60
  343. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +0 -1
  344. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +0 -60
  345. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +0 -1
  346. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +0 -60
  347. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +0 -1
  348. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +0 -60
  349. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +0 -1
  350. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +0 -60
  351. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +0 -1
  352. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +0 -60
  353. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +0 -1
  354. package/.beads/config.yaml +0 -4
  355. package/.beads/issues.jsonl +0 -60
  356. package/.beads/metadata.json +0 -4
  357. package/docs/mcp-cheatsheet.md +0 -324
  358. package/docs/visual-overview.md +0 -21
  359. package/ref-monty/.cargo/config.toml +0 -3
  360. package/ref-monty/.claude/settings.json +0 -60
  361. package/ref-monty/.claude/skills/fastmod/SKILL.md +0 -22
  362. package/ref-monty/.claude/skills/python-playground/SKILL.md +0 -47
  363. package/ref-monty/.codecov.yml +0 -12
  364. package/ref-monty/.github/actions/build-pgo-wheel/action.yml +0 -72
  365. package/ref-monty/.github/workflows/ci.yml +0 -776
  366. package/ref-monty/.github/workflows/codspeed.yml +0 -45
  367. package/ref-monty/.github/workflows/init-npm-packages.yml +0 -82
  368. package/ref-monty/.pre-commit-config.yaml +0 -47
  369. package/ref-monty/.python-version +0 -1
  370. package/ref-monty/.rustfmt.toml +0 -4
  371. package/ref-monty/.zed/settings.json +0 -11
  372. package/ref-monty/CLAUDE.md +0 -535
  373. package/ref-monty/Cargo.lock +0 -3798
  374. package/ref-monty/Cargo.toml +0 -87
  375. package/ref-monty/LICENSE +0 -21
  376. package/ref-monty/Makefile +0 -216
  377. package/ref-monty/README.md +0 -430
  378. package/ref-monty/RELEASING.md +0 -47
  379. package/ref-monty/crates/fuzz/Cargo.toml +0 -30
  380. package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +0 -37
  381. package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +0 -552
  382. package/ref-monty/crates/monty/Cargo.toml +0 -68
  383. package/ref-monty/crates/monty/benches/main.rs +0 -247
  384. package/ref-monty/crates/monty/build.rs +0 -10
  385. package/ref-monty/crates/monty/src/args.rs +0 -733
  386. package/ref-monty/crates/monty/src/asyncio.rs +0 -179
  387. package/ref-monty/crates/monty/src/builtins/abs.rs +0 -55
  388. package/ref-monty/crates/monty/src/builtins/all.rs +0 -30
  389. package/ref-monty/crates/monty/src/builtins/any.rs +0 -30
  390. package/ref-monty/crates/monty/src/builtins/bin.rs +0 -59
  391. package/ref-monty/crates/monty/src/builtins/chr.rs +0 -46
  392. package/ref-monty/crates/monty/src/builtins/divmod.rs +0 -164
  393. package/ref-monty/crates/monty/src/builtins/enumerate.rs +0 -52
  394. package/ref-monty/crates/monty/src/builtins/filter.rs +0 -67
  395. package/ref-monty/crates/monty/src/builtins/getattr.rs +0 -65
  396. package/ref-monty/crates/monty/src/builtins/hash.rs +0 -28
  397. package/ref-monty/crates/monty/src/builtins/hex.rs +0 -58
  398. package/ref-monty/crates/monty/src/builtins/id.rs +0 -24
  399. package/ref-monty/crates/monty/src/builtins/isinstance.rs +0 -68
  400. package/ref-monty/crates/monty/src/builtins/len.rs +0 -25
  401. package/ref-monty/crates/monty/src/builtins/map.rs +0 -98
  402. package/ref-monty/crates/monty/src/builtins/min_max.rs +0 -113
  403. package/ref-monty/crates/monty/src/builtins/mod.rs +0 -246
  404. package/ref-monty/crates/monty/src/builtins/next.rs +0 -21
  405. package/ref-monty/crates/monty/src/builtins/oct.rs +0 -59
  406. package/ref-monty/crates/monty/src/builtins/ord.rs +0 -67
  407. package/ref-monty/crates/monty/src/builtins/pow.rs +0 -365
  408. package/ref-monty/crates/monty/src/builtins/print.rs +0 -141
  409. package/ref-monty/crates/monty/src/builtins/repr.rs +0 -16
  410. package/ref-monty/crates/monty/src/builtins/reversed.rs +0 -28
  411. package/ref-monty/crates/monty/src/builtins/round.rs +0 -174
  412. package/ref-monty/crates/monty/src/builtins/sorted.rs +0 -151
  413. package/ref-monty/crates/monty/src/builtins/sum.rs +0 -66
  414. package/ref-monty/crates/monty/src/builtins/type_.rs +0 -16
  415. package/ref-monty/crates/monty/src/builtins/zip.rs +0 -77
  416. package/ref-monty/crates/monty/src/bytecode/builder.rs +0 -699
  417. package/ref-monty/crates/monty/src/bytecode/code.rs +0 -310
  418. package/ref-monty/crates/monty/src/bytecode/compiler.rs +0 -3206
  419. package/ref-monty/crates/monty/src/bytecode/mod.rs +0 -24
  420. package/ref-monty/crates/monty/src/bytecode/op.rs +0 -617
  421. package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +0 -1058
  422. package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +0 -63
  423. package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +0 -487
  424. package/ref-monty/crates/monty/src/bytecode/vm/call.rs +0 -767
  425. package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +0 -741
  426. package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +0 -147
  427. package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +0 -297
  428. package/ref-monty/crates/monty/src/bytecode/vm/format.rs +0 -132
  429. package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +0 -1958
  430. package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +0 -620
  431. package/ref-monty/crates/monty/src/exception_private.rs +0 -1513
  432. package/ref-monty/crates/monty/src/exception_public.rs +0 -346
  433. package/ref-monty/crates/monty/src/expressions.rs +0 -694
  434. package/ref-monty/crates/monty/src/fstring.rs +0 -854
  435. package/ref-monty/crates/monty/src/function.rs +0 -119
  436. package/ref-monty/crates/monty/src/heap.rs +0 -1073
  437. package/ref-monty/crates/monty/src/heap_data.rs +0 -985
  438. package/ref-monty/crates/monty/src/heap_traits.rs +0 -312
  439. package/ref-monty/crates/monty/src/intern.rs +0 -837
  440. package/ref-monty/crates/monty/src/io.rs +0 -106
  441. package/ref-monty/crates/monty/src/lib.rs +0 -52
  442. package/ref-monty/crates/monty/src/modules/asyncio.rs +0 -144
  443. package/ref-monty/crates/monty/src/modules/math.rs +0 -1453
  444. package/ref-monty/crates/monty/src/modules/mod.rs +0 -120
  445. package/ref-monty/crates/monty/src/modules/os.rs +0 -116
  446. package/ref-monty/crates/monty/src/modules/pathlib.rs +0 -33
  447. package/ref-monty/crates/monty/src/modules/re.rs +0 -606
  448. package/ref-monty/crates/monty/src/modules/sys.rs +0 -60
  449. package/ref-monty/crates/monty/src/modules/typing.rs +0 -70
  450. package/ref-monty/crates/monty/src/namespace.rs +0 -21
  451. package/ref-monty/crates/monty/src/object.rs +0 -1040
  452. package/ref-monty/crates/monty/src/os.rs +0 -215
  453. package/ref-monty/crates/monty/src/parse.rs +0 -1730
  454. package/ref-monty/crates/monty/src/prepare.rs +0 -3015
  455. package/ref-monty/crates/monty/src/repl.rs +0 -1109
  456. package/ref-monty/crates/monty/src/resource.rs +0 -559
  457. package/ref-monty/crates/monty/src/run.rs +0 -457
  458. package/ref-monty/crates/monty/src/run_progress.rs +0 -821
  459. package/ref-monty/crates/monty/src/signature.rs +0 -651
  460. package/ref-monty/crates/monty/src/sorting.rs +0 -100
  461. package/ref-monty/crates/monty/src/types/bytes.rs +0 -2356
  462. package/ref-monty/crates/monty/src/types/dataclass.rs +0 -345
  463. package/ref-monty/crates/monty/src/types/dict.rs +0 -879
  464. package/ref-monty/crates/monty/src/types/dict_view.rs +0 -619
  465. package/ref-monty/crates/monty/src/types/iter.rs +0 -799
  466. package/ref-monty/crates/monty/src/types/list.rs +0 -929
  467. package/ref-monty/crates/monty/src/types/long_int.rs +0 -211
  468. package/ref-monty/crates/monty/src/types/mod.rs +0 -48
  469. package/ref-monty/crates/monty/src/types/module.rs +0 -146
  470. package/ref-monty/crates/monty/src/types/namedtuple.rs +0 -261
  471. package/ref-monty/crates/monty/src/types/path.rs +0 -596
  472. package/ref-monty/crates/monty/src/types/property.rs +0 -35
  473. package/ref-monty/crates/monty/src/types/py_trait.rs +0 -322
  474. package/ref-monty/crates/monty/src/types/range.rs +0 -285
  475. package/ref-monty/crates/monty/src/types/re_match.rs +0 -522
  476. package/ref-monty/crates/monty/src/types/re_pattern.rs +0 -726
  477. package/ref-monty/crates/monty/src/types/set.rs +0 -1373
  478. package/ref-monty/crates/monty/src/types/slice.rs +0 -257
  479. package/ref-monty/crates/monty/src/types/str.rs +0 -2051
  480. package/ref-monty/crates/monty/src/types/tuple.rs +0 -376
  481. package/ref-monty/crates/monty/src/types/type.rs +0 -407
  482. package/ref-monty/crates/monty/src/value.rs +0 -2558
  483. package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +0 -3
  484. package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +0 -3
  485. package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +0 -3
  486. package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +0 -3
  487. package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +0 -3
  488. package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +0 -3
  489. package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +0 -3
  490. package/ref-monty/crates/monty/test_cases/args__id_too_many.py +0 -2
  491. package/ref-monty/crates/monty/test_cases/args__len_no_args.py +0 -2
  492. package/ref-monty/crates/monty/test_cases/args__len_too_many.py +0 -2
  493. package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +0 -9
  494. package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +0 -9
  495. package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +0 -3
  496. package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +0 -3
  497. package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +0 -3
  498. package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +0 -3
  499. package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +0 -2
  500. package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +0 -2
  501. package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +0 -2
  502. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +0 -2
  503. package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +0 -2
  504. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +0 -2
  505. package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +0 -9
  506. package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +0 -2
  507. package/ref-monty/crates/monty/test_cases/assert__fail.py +0 -2
  508. package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +0 -2
  509. package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +0 -3
  510. package/ref-monty/crates/monty/test_cases/assert__ops.py +0 -11
  511. package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +0 -47
  512. package/ref-monty/crates/monty/test_cases/async__basic.py +0 -10
  513. package/ref-monty/crates/monty/test_cases/async__closure.py +0 -14
  514. package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +0 -16
  515. package/ref-monty/crates/monty/test_cases/async__exception.py +0 -10
  516. package/ref-monty/crates/monty/test_cases/async__ext_call.py +0 -73
  517. package/ref-monty/crates/monty/test_cases/async__gather_all.py +0 -85
  518. package/ref-monty/crates/monty/test_cases/async__nested_await.py +0 -15
  519. package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +0 -37
  520. package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +0 -10
  521. package/ref-monty/crates/monty/test_cases/async__not_imported.py +0 -14
  522. package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +0 -27
  523. package/ref-monty/crates/monty/test_cases/async__return_types.py +0 -31
  524. package/ref-monty/crates/monty/test_cases/async__sequential.py +0 -16
  525. package/ref-monty/crates/monty/test_cases/async__traceback.py +0 -19
  526. package/ref-monty/crates/monty/test_cases/async__with_args.py +0 -14
  527. package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +0 -9
  528. package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +0 -9
  529. package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +0 -12
  530. package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +0 -10
  531. package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +0 -10
  532. package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +0 -68
  533. package/ref-monty/crates/monty/test_cases/bool__ops.py +0 -20
  534. package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +0 -2
  535. package/ref-monty/crates/monty/test_cases/builtin__filter.py +0 -62
  536. package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +0 -11
  537. package/ref-monty/crates/monty/test_cases/builtin__getattr.py +0 -84
  538. package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +0 -42
  539. package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +0 -66
  540. package/ref-monty/crates/monty/test_cases/builtin__map.py +0 -74
  541. package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +0 -11
  542. package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +0 -154
  543. package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +0 -148
  544. package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +0 -10
  545. package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +0 -9
  546. package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +0 -12
  547. package/ref-monty/crates/monty/test_cases/builtin__repr.py +0 -3
  548. package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +0 -73
  549. package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +0 -18
  550. package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +0 -10
  551. package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +0 -10
  552. package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +0 -10
  553. package/ref-monty/crates/monty/test_cases/bytes__methods.py +0 -394
  554. package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +0 -9
  555. package/ref-monty/crates/monty/test_cases/bytes__ops.py +0 -90
  556. package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +0 -10
  557. package/ref-monty/crates/monty/test_cases/call_object.py +0 -3
  558. package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +0 -79
  559. package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +0 -81
  560. package/ref-monty/crates/monty/test_cases/closure__pep448.py +0 -203
  561. package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +0 -13
  562. package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +0 -120
  563. package/ref-monty/crates/monty/test_cases/comprehension__all.py +0 -208
  564. package/ref-monty/crates/monty/test_cases/comprehension__scope.py +0 -7
  565. package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +0 -14
  566. package/ref-monty/crates/monty/test_cases/dataclass__basic.py +0 -238
  567. package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +0 -12
  568. package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +0 -12
  569. package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +0 -11
  570. package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +0 -3
  571. package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +0 -2
  572. package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +0 -3
  573. package/ref-monty/crates/monty/test_cases/dict__methods.py +0 -151
  574. package/ref-monty/crates/monty/test_cases/dict__ops.py +0 -133
  575. package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +0 -4
  576. package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +0 -9
  577. package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +0 -3
  578. package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +0 -2
  579. package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +0 -2
  580. package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +0 -2
  581. package/ref-monty/crates/monty/test_cases/dict__views.py +0 -165
  582. package/ref-monty/crates/monty/test_cases/edge__all.py +0 -26
  583. package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +0 -2
  584. package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +0 -2
  585. package/ref-monty/crates/monty/test_cases/exc__args.py +0 -16
  586. package/ref-monty/crates/monty/test_cases/exc__str.py +0 -15
  587. package/ref-monty/crates/monty/test_cases/execute_ok__all.py +0 -54
  588. package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +0 -2
  589. package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +0 -2
  590. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +0 -2
  591. package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +0 -2
  592. package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +0 -2
  593. package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +0 -4
  594. package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +0 -2
  595. package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +0 -2
  596. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +0 -4
  597. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +0 -3
  598. package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +0 -4
  599. package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +0 -22
  600. package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +0 -17
  601. package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +0 -7
  602. package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +0 -34
  603. package/ref-monty/crates/monty/test_cases/ext_call__basic.py +0 -99
  604. package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +0 -37
  605. package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +0 -17
  606. package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +0 -16
  607. package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +0 -26
  608. package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +0 -18
  609. package/ref-monty/crates/monty/test_cases/ext_call__elif.py +0 -171
  610. package/ref-monty/crates/monty/test_cases/ext_call__exc.py +0 -4
  611. package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +0 -39
  612. package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +0 -17
  613. package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +0 -31
  614. package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +0 -171
  615. package/ref-monty/crates/monty/test_cases/ext_call__for.py +0 -114
  616. package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +0 -12
  617. package/ref-monty/crates/monty/test_cases/ext_call__if.py +0 -135
  618. package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +0 -37
  619. package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +0 -14
  620. package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +0 -40
  621. package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +0 -7
  622. package/ref-monty/crates/monty/test_cases/ext_call__literals.py +0 -17
  623. package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +0 -32
  624. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +0 -69
  625. package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +0 -4
  626. package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +0 -14
  627. package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +0 -19
  628. package/ref-monty/crates/monty/test_cases/ext_call__return.py +0 -28
  629. package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +0 -25
  630. package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +0 -7
  631. package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +0 -28
  632. package/ref-monty/crates/monty/test_cases/ext_call__try.py +0 -280
  633. package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +0 -10
  634. package/ref-monty/crates/monty/test_cases/ext_call__unary.py +0 -13
  635. package/ref-monty/crates/monty/test_cases/frozenset__ops.py +0 -178
  636. package/ref-monty/crates/monty/test_cases/fstring__all.py +0 -236
  637. package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +0 -3
  638. package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +0 -3
  639. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +0 -3
  640. package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +0 -3
  641. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +0 -4
  642. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +0 -4
  643. package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +0 -4
  644. package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +0 -3
  645. package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +0 -6
  646. package/ref-monty/crates/monty/test_cases/function__call_unpack.py +0 -42
  647. package/ref-monty/crates/monty/test_cases/function__defaults.py +0 -117
  648. package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +0 -7
  649. package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +0 -7
  650. package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +0 -9
  651. package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +0 -7
  652. package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +0 -7
  653. package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +0 -9
  654. package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +0 -7
  655. package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +0 -7
  656. package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +0 -7
  657. package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +0 -7
  658. package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +0 -7
  659. package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +0 -7
  660. package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +0 -7
  661. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +0 -7
  662. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +0 -9
  663. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +0 -13
  664. package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +0 -7
  665. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +0 -6
  666. package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +0 -8
  667. package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +0 -6
  668. package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +0 -6
  669. package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +0 -6
  670. package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +0 -173
  671. package/ref-monty/crates/monty/test_cases/function__ops.py +0 -294
  672. package/ref-monty/crates/monty/test_cases/function__return_none.py +0 -42
  673. package/ref-monty/crates/monty/test_cases/function__signatures.py +0 -47
  674. package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +0 -6
  675. package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +0 -6
  676. package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +0 -6
  677. package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +0 -6
  678. package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +0 -6
  679. package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +0 -6
  680. package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +0 -7
  681. package/ref-monty/crates/monty/test_cases/global__ops.py +0 -163
  682. package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +0 -2
  683. package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +0 -2
  684. package/ref-monty/crates/monty/test_cases/hash__ops.py +0 -153
  685. package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +0 -3
  686. package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +0 -5
  687. package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +0 -3
  688. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +0 -10
  689. package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +0 -6
  690. package/ref-monty/crates/monty/test_cases/id__ops.py +0 -97
  691. package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +0 -3
  692. package/ref-monty/crates/monty/test_cases/if__elif_else.py +0 -207
  693. package/ref-monty/crates/monty/test_cases/if__raise_elif.py +0 -11
  694. package/ref-monty/crates/monty/test_cases/if__raise_else.py +0 -13
  695. package/ref-monty/crates/monty/test_cases/if__raise_if.py +0 -9
  696. package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +0 -18
  697. package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +0 -16
  698. package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +0 -55
  699. package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +0 -9
  700. package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +0 -9
  701. package/ref-monty/crates/monty/test_cases/import__local_scope.py +0 -68
  702. package/ref-monty/crates/monty/test_cases/import__os.py +0 -25
  703. package/ref-monty/crates/monty/test_cases/import__relative_error.py +0 -9
  704. package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +0 -9
  705. package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +0 -14
  706. package/ref-monty/crates/monty/test_cases/import__star_error.py +0 -11
  707. package/ref-monty/crates/monty/test_cases/import__sys.py +0 -47
  708. package/ref-monty/crates/monty/test_cases/import__sys_monty.py +0 -28
  709. package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +0 -37
  710. package/ref-monty/crates/monty/test_cases/import__typing.py +0 -25
  711. package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +0 -4
  712. package/ref-monty/crates/monty/test_cases/int__bigint.py +0 -467
  713. package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +0 -260
  714. package/ref-monty/crates/monty/test_cases/int__ops.py +0 -219
  715. package/ref-monty/crates/monty/test_cases/int__overflow_division.py +0 -84
  716. package/ref-monty/crates/monty/test_cases/is_variant__all.py +0 -36
  717. package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +0 -2
  718. package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +0 -2
  719. package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +0 -4
  720. package/ref-monty/crates/monty/test_cases/iter__for.py +0 -243
  721. package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +0 -66
  722. package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +0 -20
  723. package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +0 -7
  724. package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +0 -3
  725. package/ref-monty/crates/monty/test_cases/lambda__all.py +0 -145
  726. package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +0 -7
  727. package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +0 -3
  728. package/ref-monty/crates/monty/test_cases/list__index_not_found.py +0 -9
  729. package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +0 -10
  730. package/ref-monty/crates/monty/test_cases/list__ops.py +0 -473
  731. package/ref-monty/crates/monty/test_cases/list__pop_empty.py +0 -9
  732. package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +0 -9
  733. package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +0 -9
  734. package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +0 -9
  735. package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +0 -13
  736. package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +0 -13
  737. package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +0 -10
  738. package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +0 -10
  739. package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +0 -2
  740. package/ref-monty/crates/monty/test_cases/longint__index_error.py +0 -3
  741. package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +0 -3
  742. package/ref-monty/crates/monty/test_cases/loop__break_continue.py +0 -113
  743. package/ref-monty/crates/monty/test_cases/loop__break_finally.py +0 -69
  744. package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +0 -13
  745. package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +0 -11
  746. package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +0 -55
  747. package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +0 -9
  748. package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +0 -81
  749. package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +0 -13
  750. package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +0 -11
  751. package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +0 -60
  752. package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +0 -9
  753. package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +0 -11
  754. package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +0 -11
  755. package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +0 -11
  756. package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +0 -11
  757. package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +0 -11
  758. package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +0 -11
  759. package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +0 -11
  760. package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +0 -11
  761. package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +0 -11
  762. package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +0 -11
  763. package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +0 -11
  764. package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +0 -11
  765. package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +0 -11
  766. package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +0 -11
  767. package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +0 -11
  768. package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +0 -11
  769. package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +0 -11
  770. package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +0 -11
  771. package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +0 -11
  772. package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +0 -11
  773. package/ref-monty/crates/monty/test_cases/math__module.py +0 -1432
  774. package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +0 -11
  775. package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +0 -11
  776. package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +0 -11
  777. package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +0 -11
  778. package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +0 -11
  779. package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +0 -259
  780. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +0 -19
  781. package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +0 -12
  782. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +0 -9
  783. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +0 -9
  784. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +0 -16
  785. package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +0 -9
  786. package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +0 -10
  787. package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +0 -11
  788. package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +0 -34
  789. package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +0 -3
  790. package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +0 -353
  791. package/ref-monty/crates/monty/test_cases/os__environ.py +0 -40
  792. package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +0 -5
  793. package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +0 -5
  794. package/ref-monty/crates/monty/test_cases/parse_error__complex.py +0 -3
  795. package/ref-monty/crates/monty/test_cases/pathlib__import.py +0 -11
  796. package/ref-monty/crates/monty/test_cases/pathlib__os.py +0 -136
  797. package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +0 -12
  798. package/ref-monty/crates/monty/test_cases/pathlib__pure.py +0 -81
  799. package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +0 -5
  800. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +0 -6
  801. package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +0 -5
  802. package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +0 -6
  803. package/ref-monty/crates/monty/test_cases/range__error_no_args.py +0 -2
  804. package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +0 -2
  805. package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +0 -2
  806. package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +0 -10
  807. package/ref-monty/crates/monty/test_cases/range__ops.py +0 -236
  808. package/ref-monty/crates/monty/test_cases/re__basic.py +0 -756
  809. package/ref-monty/crates/monty/test_cases/re__grouping.py +0 -241
  810. package/ref-monty/crates/monty/test_cases/re__match.py +0 -148
  811. package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +0 -26
  812. package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +0 -23
  813. package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +0 -46
  814. package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +0 -12
  815. package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +0 -13
  816. package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +0 -18
  817. package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +0 -12
  818. package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +0 -5
  819. package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +0 -5
  820. package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +0 -14
  821. package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +0 -6
  822. package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +0 -16
  823. package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +0 -18
  824. package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +0 -25
  825. package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +0 -4
  826. package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +0 -27
  827. package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +0 -6
  828. package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +0 -5
  829. package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +0 -5
  830. package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +0 -5
  831. package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +0 -5
  832. package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +0 -4
  833. package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +0 -37
  834. package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +0 -34
  835. package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +0 -31
  836. package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +0 -4
  837. package/ref-monty/crates/monty/test_cases/refcount__single_list.py +0 -3
  838. package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +0 -24
  839. package/ref-monty/crates/monty/test_cases/set__ops.py +0 -191
  840. package/ref-monty/crates/monty/test_cases/set__review_bugs.py +0 -35
  841. package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +0 -2
  842. package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +0 -2
  843. package/ref-monty/crates/monty/test_cases/slice__kwargs.py +0 -9
  844. package/ref-monty/crates/monty/test_cases/slice__no_args.py +0 -9
  845. package/ref-monty/crates/monty/test_cases/slice__ops.py +0 -149
  846. package/ref-monty/crates/monty/test_cases/slice__step_zero.py +0 -9
  847. package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +0 -9
  848. package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +0 -9
  849. package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +0 -9
  850. package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +0 -9
  851. package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +0 -9
  852. package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +0 -10
  853. package/ref-monty/crates/monty/test_cases/str__index_not_found.py +0 -9
  854. package/ref-monty/crates/monty/test_cases/str__join_no_args.py +0 -9
  855. package/ref-monty/crates/monty/test_cases/str__join_non_string.py +0 -9
  856. package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +0 -9
  857. package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +0 -9
  858. package/ref-monty/crates/monty/test_cases/str__methods.py +0 -327
  859. package/ref-monty/crates/monty/test_cases/str__ops.py +0 -162
  860. package/ref-monty/crates/monty/test_cases/str__partition_empty.py +0 -9
  861. package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +0 -9
  862. package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +0 -9
  863. package/ref-monty/crates/monty/test_cases/sys__types.py +0 -7
  864. package/ref-monty/crates/monty/test_cases/traceback__division_error.py +0 -30
  865. package/ref-monty/crates/monty/test_cases/traceback__index_error.py +0 -17
  866. package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +0 -10
  867. package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +0 -29
  868. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +0 -10
  869. package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +0 -24
  870. package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +0 -9
  871. package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +0 -23
  872. package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +0 -11
  873. package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +0 -16
  874. package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +0 -16
  875. package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +0 -16
  876. package/ref-monty/crates/monty/test_cases/try_except__all.py +0 -472
  877. package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +0 -2
  878. package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +0 -5
  879. package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +0 -3
  880. package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +0 -9
  881. package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +0 -10
  882. package/ref-monty/crates/monty/test_cases/tuple__methods.py +0 -19
  883. package/ref-monty/crates/monty/test_cases/tuple__ops.py +0 -133
  884. package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +0 -2
  885. package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +0 -9
  886. package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +0 -2
  887. package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +0 -9
  888. package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +0 -11
  889. package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +0 -2
  890. package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +0 -9
  891. package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +0 -9
  892. package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +0 -9
  893. package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +0 -2
  894. package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +0 -2
  895. package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +0 -9
  896. package/ref-monty/crates/monty/test_cases/type__ops.py +0 -200
  897. package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +0 -3
  898. package/ref-monty/crates/monty/test_cases/type__shadow_int.py +0 -9
  899. package/ref-monty/crates/monty/test_cases/type__shadow_len.py +0 -3
  900. package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +0 -2
  901. package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +0 -2
  902. package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +0 -2
  903. package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +0 -2
  904. package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +0 -3
  905. package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +0 -2
  906. package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +0 -2
  907. package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +0 -2
  908. package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +0 -2
  909. package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +0 -2
  910. package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +0 -6
  911. package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +0 -2
  912. package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +0 -3
  913. package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +0 -3
  914. package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +0 -4
  915. package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +0 -3
  916. package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +0 -4
  917. package/ref-monty/crates/monty/test_cases/typing__types.py +0 -24
  918. package/ref-monty/crates/monty/test_cases/unpack__nested.py +0 -48
  919. package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +0 -9
  920. package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +0 -9
  921. package/ref-monty/crates/monty/test_cases/unpack__ops.py +0 -153
  922. package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +0 -9
  923. package/ref-monty/crates/monty/test_cases/unpack__too_many.py +0 -9
  924. package/ref-monty/crates/monty/test_cases/version__cpython.py +0 -4
  925. package/ref-monty/crates/monty/test_cases/walrus__all.py +0 -178
  926. package/ref-monty/crates/monty/test_cases/while__all.py +0 -206
  927. package/ref-monty/crates/monty/tests/asyncio.rs +0 -764
  928. package/ref-monty/crates/monty/tests/binary_serde.rs +0 -185
  929. package/ref-monty/crates/monty/tests/bytecode_limits.rs +0 -248
  930. package/ref-monty/crates/monty/tests/datatest_runner.rs +0 -2029
  931. package/ref-monty/crates/monty/tests/inputs.rs +0 -420
  932. package/ref-monty/crates/monty/tests/json_serde.rs +0 -250
  933. package/ref-monty/crates/monty/tests/main.rs +0 -71
  934. package/ref-monty/crates/monty/tests/math_module.rs +0 -114
  935. package/ref-monty/crates/monty/tests/name_lookup.rs +0 -482
  936. package/ref-monty/crates/monty/tests/os_tests.rs +0 -459
  937. package/ref-monty/crates/monty/tests/parse_errors.rs +0 -441
  938. package/ref-monty/crates/monty/tests/print_writer.rs +0 -238
  939. package/ref-monty/crates/monty/tests/py_object.rs +0 -121
  940. package/ref-monty/crates/monty/tests/regex.rs +0 -90
  941. package/ref-monty/crates/monty/tests/repl.rs +0 -344
  942. package/ref-monty/crates/monty/tests/resource_limits.rs +0 -1826
  943. package/ref-monty/crates/monty/tests/try_from.rs +0 -167
  944. package/ref-monty/crates/monty-cli/Cargo.toml +0 -25
  945. package/ref-monty/crates/monty-cli/src/main.rs +0 -541
  946. package/ref-monty/crates/monty-js/.cargo/config.toml +0 -2
  947. package/ref-monty/crates/monty-js/.prettierignore +0 -8
  948. package/ref-monty/crates/monty-js/Cargo.toml +0 -32
  949. package/ref-monty/crates/monty-js/README.md +0 -207
  950. package/ref-monty/crates/monty-js/__test__/async.spec.ts +0 -350
  951. package/ref-monty/crates/monty-js/__test__/basic.spec.ts +0 -114
  952. package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +0 -427
  953. package/ref-monty/crates/monty-js/__test__/external.spec.ts +0 -354
  954. package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +0 -143
  955. package/ref-monty/crates/monty-js/__test__/limits.spec.ts +0 -162
  956. package/ref-monty/crates/monty-js/__test__/package.json +0 -3
  957. package/ref-monty/crates/monty-js/__test__/print.spec.ts +0 -229
  958. package/ref-monty/crates/monty-js/__test__/repl.spec.ts +0 -34
  959. package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +0 -205
  960. package/ref-monty/crates/monty-js/__test__/start.spec.ts +0 -443
  961. package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +0 -147
  962. package/ref-monty/crates/monty-js/__test__/types.spec.ts +0 -319
  963. package/ref-monty/crates/monty-js/build.rs +0 -61
  964. package/ref-monty/crates/monty-js/index-header.d.ts +0 -3
  965. package/ref-monty/crates/monty-js/package-lock.json +0 -4694
  966. package/ref-monty/crates/monty-js/package.json +0 -100
  967. package/ref-monty/crates/monty-js/scripts/smoke-test.sh +0 -69
  968. package/ref-monty/crates/monty-js/smoke-test/package.json +0 -17
  969. package/ref-monty/crates/monty-js/smoke-test/test.ts +0 -171
  970. package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +0 -11
  971. package/ref-monty/crates/monty-js/src/convert.rs +0 -648
  972. package/ref-monty/crates/monty-js/src/exceptions.rs +0 -293
  973. package/ref-monty/crates/monty-js/src/lib.rs +0 -41
  974. package/ref-monty/crates/monty-js/src/limits.rs +0 -53
  975. package/ref-monty/crates/monty-js/src/monty_cls.rs +0 -1407
  976. package/ref-monty/crates/monty-js/tsconfig.json +0 -17
  977. package/ref-monty/crates/monty-js/wrapper.ts +0 -701
  978. package/ref-monty/crates/monty-python/Cargo.toml +0 -38
  979. package/ref-monty/crates/monty-python/README.md +0 -134
  980. package/ref-monty/crates/monty-python/build.rs +0 -4
  981. package/ref-monty/crates/monty-python/example.py +0 -40
  982. package/ref-monty/crates/monty-python/exercise.py +0 -46
  983. package/ref-monty/crates/monty-python/pyproject.toml +0 -57
  984. package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +0 -281
  985. package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +0 -677
  986. package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +0 -933
  987. package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
  988. package/ref-monty/crates/monty-python/src/convert.rs +0 -273
  989. package/ref-monty/crates/monty-python/src/dataclass.rs +0 -461
  990. package/ref-monty/crates/monty-python/src/exceptions.rs +0 -557
  991. package/ref-monty/crates/monty-python/src/external.rs +0 -165
  992. package/ref-monty/crates/monty-python/src/lib.rs +0 -77
  993. package/ref-monty/crates/monty-python/src/limits.rs +0 -142
  994. package/ref-monty/crates/monty-python/src/monty_cls.rs +0 -1650
  995. package/ref-monty/crates/monty-python/src/repl.rs +0 -470
  996. package/ref-monty/crates/monty-python/src/serialization.rs +0 -761
  997. package/ref-monty/crates/monty-python/tests/test_async.py +0 -1201
  998. package/ref-monty/crates/monty-python/tests/test_basic.py +0 -66
  999. package/ref-monty/crates/monty-python/tests/test_dataclasses.py +0 -971
  1000. package/ref-monty/crates/monty-python/tests/test_exceptions.py +0 -361
  1001. package/ref-monty/crates/monty-python/tests/test_external.py +0 -367
  1002. package/ref-monty/crates/monty-python/tests/test_inputs.py +0 -126
  1003. package/ref-monty/crates/monty-python/tests/test_limits.py +0 -257
  1004. package/ref-monty/crates/monty-python/tests/test_os_access.py +0 -1286
  1005. package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +0 -731
  1006. package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +0 -483
  1007. package/ref-monty/crates/monty-python/tests/test_os_calls.py +0 -819
  1008. package/ref-monty/crates/monty-python/tests/test_print.py +0 -208
  1009. package/ref-monty/crates/monty-python/tests/test_re.py +0 -170
  1010. package/ref-monty/crates/monty-python/tests/test_readme_examples.py +0 -20
  1011. package/ref-monty/crates/monty-python/tests/test_repl.py +0 -749
  1012. package/ref-monty/crates/monty-python/tests/test_serialize.py +0 -284
  1013. package/ref-monty/crates/monty-python/tests/test_start.py +0 -346
  1014. package/ref-monty/crates/monty-python/tests/test_threading.py +0 -163
  1015. package/ref-monty/crates/monty-python/tests/test_type_check.py +0 -344
  1016. package/ref-monty/crates/monty-python/tests/test_types.py +0 -553
  1017. package/ref-monty/crates/monty-type-checking/Cargo.toml +0 -32
  1018. package/ref-monty/crates/monty-type-checking/src/db.rs +0 -116
  1019. package/ref-monty/crates/monty-type-checking/src/lib.rs +0 -4
  1020. package/ref-monty/crates/monty-type-checking/src/type_check.rs +0 -280
  1021. package/ref-monty/crates/monty-type-checking/tests/bad_types.py +0 -109
  1022. package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +0 -21
  1023. package/ref-monty/crates/monty-type-checking/tests/good_types.py +0 -475
  1024. package/ref-monty/crates/monty-type-checking/tests/main.rs +0 -205
  1025. package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +0 -56
  1026. package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +0 -41
  1027. package/ref-monty/crates/monty-typeshed/Cargo.toml +0 -29
  1028. package/ref-monty/crates/monty-typeshed/README.md +0 -11
  1029. package/ref-monty/crates/monty-typeshed/build.rs +0 -101
  1030. package/ref-monty/crates/monty-typeshed/custom/README.md +0 -1
  1031. package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +0 -138
  1032. package/ref-monty/crates/monty-typeshed/custom/os.pyi +0 -87
  1033. package/ref-monty/crates/monty-typeshed/custom/sys.pyi +0 -33
  1034. package/ref-monty/crates/monty-typeshed/src/lib.rs +0 -56
  1035. package/ref-monty/crates/monty-typeshed/update.py +0 -321
  1036. package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +0 -1
  1037. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +0 -20
  1038. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +0 -105
  1039. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +0 -394
  1040. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +0 -138
  1041. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +0 -1434
  1042. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +0 -527
  1043. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +0 -2
  1044. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +0 -502
  1045. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +0 -376
  1046. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +0 -149
  1047. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +0 -87
  1048. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +0 -395
  1049. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +0 -8
  1050. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +0 -337
  1051. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +0 -33
  1052. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +0 -741
  1053. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +0 -1217
  1054. package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +0 -716
  1055. package/ref-monty/docs/usage-guide.md +0 -117
  1056. package/ref-monty/examples/README.md +0 -3
  1057. package/ref-monty/examples/expense_analysis/README.md +0 -3
  1058. package/ref-monty/examples/expense_analysis/data.py +0 -124
  1059. package/ref-monty/examples/expense_analysis/main.py +0 -115
  1060. package/ref-monty/examples/sql_playground/README.md +0 -20
  1061. package/ref-monty/examples/sql_playground/external_functions.py +0 -129
  1062. package/ref-monty/examples/sql_playground/main.py +0 -81
  1063. package/ref-monty/examples/sql_playground/sandbox_code.py +0 -82
  1064. package/ref-monty/examples/sql_playground/type_stubs.pyi +0 -14
  1065. package/ref-monty/examples/web_scraper/README.md +0 -15
  1066. package/ref-monty/examples/web_scraper/browser.py +0 -56
  1067. package/ref-monty/examples/web_scraper/example_code.py +0 -59
  1068. package/ref-monty/examples/web_scraper/external_functions.py +0 -324
  1069. package/ref-monty/examples/web_scraper/main.py +0 -193
  1070. package/ref-monty/examples/web_scraper/sub_agent.py +0 -79
  1071. package/ref-monty/monty-npm.md +0 -235
  1072. package/ref-monty/pyproject.toml +0 -162
  1073. package/ref-monty/scripts/check_imports.py +0 -91
  1074. package/ref-monty/scripts/codecov_diff.py +0 -412
  1075. package/ref-monty/scripts/complete_tests.py +0 -146
  1076. package/ref-monty/scripts/flamegraph_to_text.py +0 -208
  1077. package/ref-monty/scripts/iter_test_methods.py +0 -540
  1078. package/ref-monty/scripts/run_traceback.py +0 -180
  1079. package/ref-monty/scripts/startup_performance.py +0 -130
  1080. package/ref-monty/uv.lock +0 -1779
  1081. /package/docs/{plugin-examples.md → plugins-examples.md} +0 -0
@@ -1,1058 +0,0 @@
1
- //! Async execution support for the VM.
2
- //!
3
- //! This module contains all async-related methods for the VM including:
4
- //! - Awaiting coroutines, external futures, and gather futures
5
- //! - Task scheduling and context switching
6
- //! - Task completion and failure handling
7
- //! - External future resolution
8
-
9
- use super::{AwaitResult, CallFrame, VM};
10
- use crate::{
11
- InvalidInputError, MontyObject,
12
- args::ArgValues,
13
- asyncio::{CallId, CoroutineState, GatherItem, TaskId},
14
- bytecode::vm::scheduler::{PendingCallData, Scheduler, SerializedTaskFrame, TaskState},
15
- defer_drop,
16
- exception_private::{ExcType, RunError, SimpleException},
17
- heap::{HeapData, HeapGuard, HeapId},
18
- heap_data::HeapDataMut,
19
- intern::FunctionId,
20
- resource::ResourceTracker,
21
- types::{List, PyTrait},
22
- value::Value,
23
- };
24
-
25
- impl<T: ResourceTracker> VM<'_, '_, T> {
26
- /// Gets or creates the scheduler for async operations.
27
- ///
28
- /// The scheduler is created lazily on first use to avoid allocations for
29
- /// synchronous code paths. If a scheduler already exists, returns it.
30
- /// If one doesn't exist, creates a new one, transferring the `next_call_id`
31
- /// counter so that call IDs remain unique.
32
- #[inline]
33
- pub(super) fn get_or_create_scheduler(&mut self) -> &mut Scheduler {
34
- let next_call_id = self.next_call_id;
35
- self.scheduler.get_or_insert_with(|| {
36
- let mut scheduler = Scheduler::new();
37
- // Transfer the call ID counter to maintain uniqueness
38
- scheduler.set_next_call_id(next_call_id);
39
- scheduler
40
- })
41
- }
42
-
43
- /// Returns a mutable reference to the scheduler.
44
- ///
45
- /// # Panics
46
- /// Panics if the scheduler hasn't been created yet. Only use this in code
47
- /// paths where async operations have already been initiated (after
48
- /// `get_or_create_scheduler` has been called at least once).
49
- #[inline]
50
- pub(super) fn scheduler_mut(&mut self) -> &mut Scheduler {
51
- self.scheduler.as_mut().expect("scheduler must exist in async context")
52
- }
53
-
54
- /// Returns a reference to the scheduler (read-only access).
55
- ///
56
- /// # Panics
57
- /// Panics if the scheduler hasn't been created yet. Only use this in code
58
- /// paths where async operations have already been initiated.
59
- #[inline]
60
- pub(super) fn scheduler(&self) -> &Scheduler {
61
- self.scheduler.as_ref().expect("scheduler must exist in async context")
62
- }
63
-
64
- /// Executes the Await opcode.
65
- ///
66
- /// Pops the awaitable from the stack and handles it based on its type:
67
- /// - `Coroutine`: validates state is New, then pushes a frame to execute it
68
- /// - `ExternalFuture`: blocks until resolved or yields if not ready
69
- /// - `GatherFuture`: spawns tasks for coroutines and tracks external futures
70
- ///
71
- /// Returns `AwaitResult` indicating what action the VM should take.
72
- pub(super) fn exec_get_awaitable(&mut self) -> Result<AwaitResult, RunError> {
73
- let awaitable = self.pop();
74
-
75
- let mut awaitable_guard = HeapGuard::new(awaitable, self);
76
- let (awaitable, this) = awaitable_guard.as_parts();
77
-
78
- match awaitable {
79
- Value::Ref(heap_id) => {
80
- let heap_id = *heap_id;
81
- let heap_data_type = match this.heap.get(heap_id) {
82
- HeapData::Coroutine(_) => Some(AwaitableType::Coroutine),
83
- HeapData::GatherFuture(_) => Some(AwaitableType::GatherFuture),
84
- _ => None,
85
- };
86
-
87
- match heap_data_type {
88
- Some(AwaitableType::Coroutine) => {
89
- let (awaitable, this) = awaitable_guard.into_parts();
90
- this.await_coroutine(heap_id, awaitable)
91
- }
92
- Some(AwaitableType::GatherFuture) => {
93
- let (awaitable, this) = awaitable_guard.into_parts();
94
- this.await_gather_future(heap_id, awaitable)
95
- }
96
- None => Err(ExcType::object_not_awaitable(awaitable.py_type(this.heap))),
97
- }
98
- }
99
- &Value::ExternalFuture(call_id) => this.await_external_future(call_id),
100
- _ => Err(ExcType::object_not_awaitable(awaitable.py_type(this.heap))),
101
- }
102
- }
103
-
104
- /// Awaits a coroutine by pushing a frame to execute it.
105
- ///
106
- /// Validates the coroutine is in `New` state, extracts its captured namespace
107
- /// and cells, marks it as `Running`, and pushes a frame to execute the coroutine body.
108
- fn await_coroutine(&mut self, heap_id: HeapId, awaitable: Value) -> Result<AwaitResult, RunError> {
109
- let this = self;
110
- defer_drop!(awaitable, this);
111
-
112
- let HeapData::Coroutine(coro) = this.heap.get(heap_id) else {
113
- unreachable!("await_coroutine called with non-coroutine heap_id")
114
- };
115
-
116
- // Check if coroutine can be awaited (must be New)
117
- if coro.state != CoroutineState::New {
118
- return Err(
119
- SimpleException::new_msg(ExcType::RuntimeError, "cannot reuse already awaited coroutine").into(),
120
- );
121
- }
122
-
123
- // Extract coroutine data before mutating
124
- let func_id = coro.func_id;
125
- let namespace_values: Vec<Value> = coro.namespace.iter().map(|v| v.clone_with_heap(this.heap)).collect();
126
-
127
- // Mark coroutine as Running
128
- if let HeapDataMut::Coroutine(coro_mut) = this.heap.get_mut(heap_id) {
129
- coro_mut.state = CoroutineState::Running;
130
- }
131
-
132
- // Create namespace and push frame (guard drops awaitable at scope exit)
133
- this.start_coroutine_frame(func_id, namespace_values)?;
134
-
135
- Ok(AwaitResult::FramePushed)
136
- }
137
-
138
- /// Awaits a gather future by spawning tasks for coroutines and tracking external futures.
139
- ///
140
- /// For each item in the gather:
141
- /// - Coroutines are spawned as tasks
142
- /// - External futures are checked for resolution or registered for tracking
143
- ///
144
- /// If all items are already resolved, returns immediately. Otherwise blocks
145
- /// the current task and switches to a ready task or yields to the host.
146
- fn await_gather_future(&mut self, heap_id: HeapId, awaitable: Value) -> Result<AwaitResult, RunError> {
147
- let this = self;
148
- let mut awaitable_guard = HeapGuard::new(awaitable, this);
149
- let (_, this) = awaitable_guard.as_parts();
150
-
151
- let HeapData::GatherFuture(gather) = this.heap.get(heap_id) else {
152
- unreachable!("await_gather_future called with non-gather heap_id")
153
- };
154
-
155
- // Check if already being waited on (double-await)
156
- if gather.waiter.is_some() {
157
- return Err(SimpleException::new_msg(ExcType::RuntimeError, "cannot reuse already awaited gather").into());
158
- }
159
-
160
- // If no items to gather, return empty list immediately
161
- if gather.item_count() == 0 {
162
- let list_id = this.heap.allocate(HeapData::List(List::new(vec![])))?;
163
- return Ok(AwaitResult::ValueReady(Value::Ref(list_id)));
164
- }
165
-
166
- // Set waiter and clone items to process
167
- // Note: We clone instead of mem::take because GatherItem::Coroutine holds HeapIds
168
- // that need to stay in gather.items for proper ref counting when the gather is dropped.
169
- let current_task = this.get_or_create_scheduler().current_task_id();
170
- let items: Vec<GatherItem> = if let HeapDataMut::GatherFuture(gather_mut) = this.heap.get_mut(heap_id) {
171
- gather_mut.waiter = current_task;
172
- gather_mut.items.clone()
173
- } else {
174
- vec![]
175
- };
176
-
177
- // Process each item
178
- let mut task_ids = Vec::new();
179
- let mut pending_calls = Vec::new();
180
-
181
- for (idx, item) in items.iter().enumerate() {
182
- match item {
183
- GatherItem::Coroutine(coro_id) => {
184
- // Spawn as task with the item index as result index
185
- let task_id = this.scheduler_mut().spawn(*coro_id, Some(heap_id), Some(idx));
186
- task_ids.push(task_id);
187
- }
188
- GatherItem::ExternalFuture(call_id) => {
189
- // Check if already resolved
190
- let scheduler = this.get_or_create_scheduler();
191
- scheduler.mark_consumed(*call_id);
192
-
193
- if let Some(value) = this.scheduler_mut().take_resolved(*call_id) {
194
- // Already resolved - store result immediately
195
- if let HeapDataMut::GatherFuture(gather_mut) = this.heap.get_mut(heap_id) {
196
- gather_mut.results[idx] = Some(value);
197
- }
198
- } else {
199
- // Not resolved yet - track it
200
- pending_calls.push(*call_id);
201
- // Register gather as waiting on this call
202
- this.scheduler_mut().register_gather_for_call(*call_id, heap_id, idx);
203
- }
204
- }
205
- }
206
- }
207
-
208
- // Store task IDs and pending calls in the gather
209
- if let HeapDataMut::GatherFuture(gather_mut) = this.heap.get_mut(heap_id) {
210
- gather_mut.task_ids = task_ids;
211
- gather_mut.pending_calls.clone_from(&pending_calls);
212
- }
213
-
214
- // Check if all items are already complete (only external futures, all resolved)
215
- let all_complete = {
216
- if let HeapData::GatherFuture(gather) = this.heap.get(heap_id) {
217
- gather.task_ids.is_empty() && gather.pending_calls.is_empty()
218
- } else {
219
- false
220
- }
221
- };
222
-
223
- if all_complete {
224
- // All external futures were already resolved - return results immediately
225
- // Steal results using mem::take - avoids refcount dance since we're dropping
226
- // the GatherFuture anyway via awaitable.drop_with_heap below
227
- let results: Vec<Value> = if let HeapDataMut::GatherFuture(gather) = this.heap.get_mut(heap_id) {
228
- std::mem::take(&mut gather.results)
229
- .into_iter()
230
- .map(|r| r.expect("all results should be filled"))
231
- .collect()
232
- } else {
233
- vec![]
234
- };
235
-
236
- let list_id = this.heap.allocate(HeapData::List(List::new(results)))?;
237
- return Ok(AwaitResult::ValueReady(Value::Ref(list_id)));
238
- }
239
-
240
- // Block current task on this gather
241
- this.scheduler_mut().block_current_on_gather(heap_id);
242
-
243
- // Consume the awaitable without decrementing refcount - the GatherFuture
244
- // must stay alive for result collection. It will be dec_ref'd when
245
- // the gather completes (in handle_task_completion).
246
- let (awaitable, this) = awaitable_guard.into_parts();
247
- #[cfg_attr(
248
- not(feature = "ref-count-panic"),
249
- expect(clippy::forget_non_drop, reason = "has Drop with ref-count-panic feature")
250
- )]
251
- std::mem::forget(awaitable);
252
-
253
- // Switch to next ready task (spawned tasks) or yield for external futures
254
- this.switch_or_yield()
255
- }
256
-
257
- /// Awaits an external future by blocking until it's resolved.
258
- ///
259
- /// If the future is already resolved, returns the value immediately.
260
- /// Otherwise blocks the current task and switches to a ready task or yields to the host.
261
- fn await_external_future(&mut self, call_id: CallId) -> Result<AwaitResult, RunError> {
262
- // Check if already consumed (double-await error)
263
- // If no scheduler exists, call can't have been consumed
264
- if self.scheduler.as_ref().is_some_and(|s| s.is_consumed(call_id)) {
265
- return Err(SimpleException::new_msg(ExcType::RuntimeError, "cannot reuse already awaited future").into());
266
- }
267
-
268
- // Mark as consumed (creates scheduler if needed)
269
- let scheduler = self.get_or_create_scheduler();
270
- scheduler.mark_consumed(call_id);
271
-
272
- // Check if the future is already resolved
273
- if let Some(value) = scheduler.take_resolved(call_id) {
274
- Ok(AwaitResult::ValueReady(value))
275
- } else {
276
- // Block current task on this call
277
- self.scheduler_mut().block_current_on_call(call_id);
278
-
279
- // Switch to next ready task or yield to host
280
- self.switch_or_yield()
281
- }
282
- }
283
-
284
- /// Starts execution of a coroutine by pushing its locals onto the stack.
285
- ///
286
- /// Extends the VM stack with the coroutine's pre-bound namespace values
287
- /// and pushes a new frame to execute the coroutine's function body.
288
- fn start_coroutine_frame(&mut self, func_id: FunctionId, namespace_values: Vec<Value>) -> Result<(), RunError> {
289
- let call_position = self.current_position();
290
- let func = self.interns.get_function(func_id);
291
- let locals_count = u16::try_from(namespace_values.len()).expect("coroutine namespace size exceeds u16");
292
-
293
- // Track memory for the locals
294
- let size = namespace_values.len() * std::mem::size_of::<Value>();
295
- self.heap.tracker_mut().on_allocate(|| size)?;
296
-
297
- // Extend the stack with the coroutine's pre-bound locals
298
- let stack_base = self.stack.len();
299
- self.stack.extend(namespace_values);
300
-
301
- // Push frame to execute the coroutine
302
- self.push_frame(CallFrame::new_function(
303
- &func.code,
304
- stack_base,
305
- locals_count,
306
- func_id,
307
- Some(call_position),
308
- ))?;
309
-
310
- Ok(())
311
- }
312
-
313
- /// Attempts to switch to the next ready task or yields if all tasks are blocked.
314
- ///
315
- /// This method is called when the current task blocks (e.g., awaiting an unresolved
316
- /// future or gather). It performs task context switching:
317
- /// 1. Saves current VM context to the current task in the scheduler
318
- /// 2. Gets the next ready task from the scheduler
319
- /// 3. Loads that task's context into the VM (or initializes a new task from its coroutine)
320
- ///
321
- /// Returns `Yield(pending_calls)` if no ready tasks (all blocked), or continues
322
- /// the run loop if a task was switched to.
323
- fn switch_or_yield(&mut self) -> Result<AwaitResult, RunError> {
324
- // Get next ready task (scheduler must exist - we're in async context)
325
- let scheduler = self.scheduler_mut();
326
- if let Some(next_task_id) = scheduler.next_ready_task() {
327
- // Save current task context ONLY when switching to another task.
328
- // This is critical: if we're about to yield (no ready tasks), the main task's
329
- // frames must stay in the VM so they're included in the snapshot.
330
- if let Some(current_task_id) = scheduler.current_task_id() {
331
- self.save_task_context(current_task_id);
332
- }
333
-
334
- self.scheduler_mut().set_current_task(Some(next_task_id));
335
-
336
- // Load or initialize the next task's context
337
- self.load_or_init_task(next_task_id)?;
338
-
339
- // Continue execution - return FramePushed to reload cache and continue run loop
340
- Ok(AwaitResult::FramePushed)
341
- } else {
342
- // No ready tasks - yield control to host.
343
- // Don't save the main task's context - frames stay in VM for the snapshot.
344
- let pending = self.scheduler().pending_call_ids();
345
- Ok(AwaitResult::Yield(pending))
346
- }
347
- }
348
-
349
- /// Handles completion of a spawned task.
350
- ///
351
- /// Called when a spawned task's coroutine returns. This:
352
- /// 1. Marks the task as completed in the scheduler
353
- /// 2. If the task belongs to a gather, stores the result and checks if gather is complete
354
- /// 3. If gather is complete, unblocks the waiter and provides the collected results
355
- /// 4. Otherwise, switches to the next ready task
356
- pub(super) fn handle_task_completion(&mut self, result: Value) -> Result<AwaitResult, RunError> {
357
- // Get task info (scheduler must exist - we're in async context)
358
- let scheduler = self.scheduler_mut();
359
- let task_id = scheduler
360
- .current_task_id()
361
- .expect("handle_task_completion called without current task");
362
- let task = scheduler.get_task(task_id);
363
- let gather_id = task.gather_id;
364
- let gather_result_idx = task.gather_result_idx;
365
- let coroutine_id = task.coroutine_id;
366
-
367
- // Mark coroutine as completed
368
- if let Some(coro_id) = coroutine_id
369
- && let HeapDataMut::Coroutine(coro) = self.heap.get_mut(coro_id)
370
- {
371
- coro.state = CoroutineState::Completed;
372
- }
373
-
374
- // Mark task as completed and store result in task state
375
- let task_result = result.clone_with_heap(self);
376
- self.scheduler_mut().complete_task(task_id, task_result);
377
-
378
- // If task belongs to a gather, store result and check if gather is complete
379
- if let Some(gid) = gather_id {
380
- // Store result in gather.results at the correct index
381
- if let Some(idx) = gather_result_idx
382
- && let HeapDataMut::GatherFuture(gather) = self.heap.get_mut(gid)
383
- {
384
- gather.results[idx] = Some(result);
385
- } else {
386
- result.drop_with_heap(self);
387
- }
388
-
389
- // Extract gather metadata - clone task_ids since we need to check completion
390
- // but gather might not be complete yet. We only take task_ids later when
391
- // we know gather is complete and will be destroyed.
392
- let (task_ids, waiter, pending_calls_empty) = if let HeapData::GatherFuture(gather) = self.heap.get(gid) {
393
- (gather.task_ids.clone(), gather.waiter, gather.pending_calls.is_empty())
394
- } else {
395
- (vec![], None, true)
396
- };
397
-
398
- // Check if all tasks are complete AND all external futures are resolved
399
- let all_tasks_complete = task_ids.iter().all(|tid| {
400
- matches!(
401
- self.scheduler().get_task(*tid).state,
402
- TaskState::Completed(_) | TaskState::Failed(_)
403
- )
404
- });
405
- let all_external_resolved = pending_calls_empty;
406
- let all_complete = all_tasks_complete && all_external_resolved;
407
-
408
- if all_complete {
409
- // First check if any task failed
410
- let failed_task = task_ids
411
- .iter()
412
- .find(|tid| matches!(self.scheduler().get_task(**tid).state, TaskState::Failed(_)));
413
-
414
- if let Some(&failed_tid) = failed_task {
415
- // Get the error from the failed task
416
- let task = self.scheduler_mut().get_task_mut(failed_tid);
417
- if let TaskState::Failed(err) = std::mem::replace(&mut task.state, TaskState::Ready) {
418
- self.heap.dec_ref(gid);
419
-
420
- // Switch to waiter so error is raised in its context
421
- if let Some(waiter_id) = waiter {
422
- self.cleanup_current_task();
423
- self.scheduler_mut().set_current_task(Some(waiter_id));
424
- self.load_or_init_task(waiter_id)?;
425
- }
426
-
427
- return Err(err);
428
- }
429
- }
430
-
431
- // Steal results from gather using mem::take - avoids refcount dance
432
- // (copy + inc_ref + dec_ref on gather drop). Since gather is being
433
- // destroyed, we can take ownership of the values directly.
434
- let results: Vec<Value> = if let HeapDataMut::GatherFuture(gather) = self.heap.get_mut(gid) {
435
- std::mem::take(&mut gather.results)
436
- .into_iter()
437
- .map(|r| r.expect("all results should be filled when gather is complete"))
438
- .collect()
439
- } else {
440
- vec![]
441
- };
442
-
443
- // Create result list
444
- let list_id = self.heap.allocate(HeapData::List(List::new(results)))?;
445
-
446
- // Release the GatherFuture - this will cascade to release coroutines
447
- self.heap.dec_ref(gid);
448
-
449
- // Unblock waiter and switch to it
450
- if let Some(waiter_id) = waiter {
451
- let scheduler = self.scheduler_mut();
452
- scheduler.make_ready(waiter_id);
453
- // Remove from ready queue since we're switching directly to it
454
- scheduler.remove_from_ready_queue(waiter_id);
455
- // Clear current task's state since it's done
456
- self.cleanup_current_task();
457
- // Switch to waiter
458
- self.scheduler_mut().set_current_task(Some(waiter_id));
459
- self.load_or_init_task(waiter_id)?;
460
- // Push the result onto the waiter's stack
461
- self.push(Value::Ref(list_id));
462
- return Ok(AwaitResult::FramePushed);
463
- }
464
-
465
- // No waiter (shouldn't happen but handle gracefully)
466
- return Ok(AwaitResult::ValueReady(Value::Ref(list_id)));
467
- }
468
- } else {
469
- // Drop the result (it's stored in the task state now)
470
- result.drop_with_heap(self);
471
- }
472
-
473
- // Gather not complete or no gather - switch to next task
474
- self.cleanup_current_task();
475
-
476
- // Get next ready task
477
- let scheduler = self.scheduler_mut();
478
- scheduler.set_current_task(None);
479
- if let Some(next_task_id) = scheduler.next_ready_task() {
480
- self.scheduler_mut().set_current_task(Some(next_task_id));
481
- self.load_or_init_task(next_task_id)?;
482
- Ok(AwaitResult::FramePushed)
483
- } else {
484
- // No ready tasks - yield to host
485
- let pending = self.scheduler().pending_call_ids();
486
- Ok(AwaitResult::Yield(pending))
487
- }
488
- }
489
-
490
- /// Returns true if the current task is a spawned task (not main).
491
- ///
492
- /// Used by exception handling to determine if an unhandled exception
493
- /// should fail the task rather than propagate out.
494
- #[inline]
495
- pub(super) fn is_spawned_task(&self) -> bool {
496
- self.scheduler
497
- .as_ref()
498
- .and_then(super::scheduler::Scheduler::current_task_id)
499
- .is_some_and(|id: TaskId| !id.is_main())
500
- }
501
-
502
- /// Handles failure of a spawned task due to an unhandled exception.
503
- ///
504
- /// Called when an exception escapes all frames in a spawned task. This:
505
- /// 1. Marks the task as failed in the scheduler
506
- /// 2. If the task belongs to a gather, cleans up and propagates to waiter
507
- /// 3. Otherwise, switches to the next ready task
508
- ///
509
- /// # Returns
510
- /// - `Ok(())` - Switched to next task, continue execution
511
- /// - `Err(error)` - Switched to waiter, handle error in waiter's context
512
- ///
513
- /// # Panics
514
- /// Panics if called for the main task.
515
- pub(super) fn handle_task_failure(&mut self, error: RunError) -> Result<(), RunError> {
516
- // Get task info (scheduler must exist - we're in async context)
517
- let scheduler = self.scheduler_mut();
518
- let task_id = scheduler
519
- .current_task_id()
520
- .expect("handle_task_failure called without current task");
521
- debug_assert!(!task_id.is_main(), "handle_task_failure called for main task");
522
-
523
- // Get task's gather_id before marking failed
524
- let gather_id = scheduler.get_task(task_id).gather_id;
525
-
526
- // If part of a gather, propagate error to waiter
527
- if let Some(gid) = gather_id {
528
- // Get waiter and take task_ids from GatherFuture - gather is being destroyed anyway
529
- let (waiter, task_ids) = if let HeapDataMut::GatherFuture(gather) = self.heap.get_mut(gid) {
530
- (gather.waiter, std::mem::take(&mut gather.task_ids))
531
- } else {
532
- (None, vec![])
533
- };
534
-
535
- // Mark task as failed
536
- self.scheduler_mut().fail_task(task_id, error);
537
-
538
- // Cancel sibling tasks (filter out self and already-finished tasks inline)
539
- for sibling_id in task_ids {
540
- if sibling_id != task_id && !self.scheduler().get_task(sibling_id).is_finished() {
541
- self.scheduler
542
- .as_mut()
543
- .expect("scheduler must exist")
544
- .cancel_task(sibling_id, self.heap);
545
- }
546
- }
547
-
548
- // Clean up the gather
549
- self.heap.dec_ref(gid);
550
-
551
- // Switch to waiter and propagate the error
552
- if let Some(waiter_id) = waiter {
553
- self.cleanup_current_task();
554
- self.scheduler_mut().set_current_task(Some(waiter_id));
555
- self.load_or_init_task(waiter_id)?;
556
- // Get error back from task state to return
557
- let task = self.scheduler_mut().get_task_mut(task_id);
558
- if let TaskState::Failed(err) = std::mem::replace(&mut task.state, TaskState::Ready) {
559
- return Err(err);
560
- }
561
- }
562
- } else {
563
- // No gather - just mark task as failed (ignore returned gather_id which is None)
564
- let _ = self.scheduler_mut().fail_task(task_id, error);
565
- }
566
-
567
- // No gather or no waiter - switch to next task
568
- self.cleanup_current_task();
569
-
570
- let scheduler = self.scheduler_mut();
571
- scheduler.set_current_task(None);
572
- if let Some(next_task_id) = scheduler.next_ready_task() {
573
- self.scheduler_mut().set_current_task(Some(next_task_id));
574
- self.load_or_init_task(next_task_id)?;
575
- }
576
- // If no ready tasks, frames will be empty and run loop will yield
577
-
578
- Ok(())
579
- }
580
-
581
- /// Saves the current VM context into the given task in the scheduler.
582
- ///
583
- /// Serializes frames, moves stack/exception_stack, stores instruction_ip,
584
- /// and adjusts the global recursion depth counter.
585
- fn save_task_context(&mut self, task_id: TaskId) {
586
- // Collect data before borrowing scheduler to avoid borrow conflicts
587
- let frames: Vec<SerializedTaskFrame> = self
588
- .frames
589
- .drain(..)
590
- .map(|f| SerializedTaskFrame {
591
- function_id: f.function_id,
592
- ip: f.ip,
593
- stack_base: f.stack_base,
594
- locals_count: f.locals_count,
595
- call_position: f.call_position,
596
- })
597
- .collect();
598
- let stack = std::mem::take(&mut self.stack);
599
- let exception_stack = std::mem::take(&mut self.exception_stack);
600
- let instruction_ip = self.instruction_ip;
601
-
602
- // Count this task's recursion depth contribution and subtract it from
603
- // the global counter so the next task gets a clean budget.
604
- let task_depth = frames.len().saturating_sub(1); // root frame doesn't contribute to recursion depth
605
- let global_depth = self.heap.get_recursion_depth();
606
- self.heap.set_recursion_depth(global_depth - task_depth);
607
-
608
- // Now assign to task (scheduler must exist - we're in async context)
609
- let task = self.scheduler_mut().get_task_mut(task_id);
610
- task.frames = frames;
611
- task.stack = stack;
612
- task.exception_stack = exception_stack;
613
- task.instruction_ip = instruction_ip;
614
- }
615
-
616
- /// Loads an existing task's context or initializes a new task from its coroutine.
617
- ///
618
- /// If the task has stored frames, restores them into the VM. If the task was
619
- /// unblocked by an external future resolution, pushes the resolved value onto
620
- /// the restored stack so execution can continue past the AWAIT opcode.
621
- /// If the task has a coroutine_id but no frames, starts the coroutine.
622
- ///
623
- /// Restores the task's recursion depth contribution to the global counter
624
- /// (balances the subtraction in `save_task_context`).
625
- fn load_or_init_task(&mut self, task_id: TaskId) -> Result<(), RunError> {
626
- // Extract data from task before assigning to self to avoid borrow conflicts
627
- // (scheduler must exist - we're in async context)
628
- let (frames, stack, exception_stack, instruction_ip, coroutine_id) = {
629
- let task = self.scheduler_mut().get_task_mut(task_id);
630
- (
631
- std::mem::take(&mut task.frames),
632
- std::mem::take(&mut task.stack),
633
- std::mem::take(&mut task.exception_stack),
634
- task.instruction_ip,
635
- task.coroutine_id,
636
- )
637
- };
638
-
639
- // Restore this task's recursion depth contribution to the global counter
640
- let task_depth = frames.len().saturating_sub(1); // root frame doesn't contribute to recursion depth
641
- let global_depth = self.heap.get_recursion_depth();
642
- self.heap.set_recursion_depth(global_depth + task_depth);
643
-
644
- if !frames.is_empty() {
645
- // Task has existing context - restore it
646
- self.stack = stack;
647
- self.exception_stack = exception_stack;
648
- self.instruction_ip = instruction_ip;
649
-
650
- // Reconstruct CallFrames from serialized form
651
- self.frames = frames
652
- .into_iter()
653
- .map(|sf| {
654
- let code = match sf.function_id {
655
- Some(func_id) => &self.interns.get_function(func_id).code,
656
- None => {
657
- // This happens for the main task's module-level code
658
- self.module_code.expect("module_code not set for main task frame")
659
- }
660
- };
661
- CallFrame {
662
- code,
663
- ip: sf.ip,
664
- stack_base: sf.stack_base,
665
- locals_count: sf.locals_count,
666
- function_id: sf.function_id,
667
- call_position: sf.call_position,
668
- should_return: false,
669
- }
670
- })
671
- .collect();
672
- } else if let Some(coro_id) = coroutine_id {
673
- // New task - start from coroutine
674
- self.init_task_from_coroutine(coro_id)?;
675
- } else {
676
- // This shouldn't happen - task with no frames and no coroutine
677
- panic!("task has no frames and no coroutine_id");
678
- }
679
-
680
- // If this task was unblocked by a resolved external future, push the
681
- // resolved value onto the stack. The AWAIT opcode already advanced the IP
682
- // past itself before the task was saved, so execution will continue with
683
- // the resolved value on top of the stack.
684
- if let Some(value) = self.scheduler_mut().take_resolved_for_task(task_id) {
685
- self.push(value);
686
- }
687
-
688
- Ok(())
689
- }
690
-
691
- /// Initializes the VM state to run a coroutine for a spawned task.
692
- ///
693
- /// Similar to exec_get_awaitable's coroutine handling, but for task initialization.
694
- fn init_task_from_coroutine(&mut self, coroutine_id: HeapId) -> Result<(), RunError> {
695
- // Get coroutine data
696
- let heap_data = self.heap.get(coroutine_id);
697
- let HeapData::Coroutine(coro) = heap_data else {
698
- panic!("task coroutine_id doesn't point to a Coroutine")
699
- };
700
-
701
- // Check state
702
- if coro.state != CoroutineState::New {
703
- return Err(
704
- SimpleException::new_msg(ExcType::RuntimeError, "cannot reuse already awaited coroutine").into(),
705
- );
706
- }
707
-
708
- // Extract coroutine data
709
- let func_id = coro.func_id;
710
- let namespace_values: Vec<Value> = coro.namespace.iter().map(|v| v.clone_with_heap(self)).collect();
711
-
712
- // Mark coroutine as Running
713
- if let HeapDataMut::Coroutine(coro_mut) = self.heap.get_mut(coroutine_id) {
714
- coro_mut.state = CoroutineState::Running;
715
- }
716
-
717
- // Push locals onto stack and push frame directly (can't use start_coroutine_frame
718
- // because that needs a current frame for call_position, but spawned tasks
719
- // don't have a parent frame — the coroutine is the root)
720
- let func = self.interns.get_function(func_id);
721
- let locals_count = u16::try_from(namespace_values.len()).expect("coroutine namespace size exceeds u16");
722
-
723
- // Track memory for the locals
724
- let size = namespace_values.len() * std::mem::size_of::<Value>();
725
- self.heap.tracker_mut().on_allocate(|| size)?;
726
-
727
- let stack_base = self.stack.len();
728
- self.stack.extend(namespace_values);
729
-
730
- self.push_frame(CallFrame::new_function(
731
- &func.code,
732
- stack_base,
733
- locals_count,
734
- func_id,
735
- None, // No call position — this is the root frame for a spawned task
736
- ))?;
737
-
738
- Ok(())
739
- }
740
-
741
- /// Resolves an external future with a value.
742
- ///
743
- /// Called by the host when an async external call completes.
744
- /// Stores the result in the scheduler, which will unblock any task
745
- /// waiting on this CallId.
746
- ///
747
- /// If the task that created this call has been cancelled or failed,
748
- /// the result is silently ignored and the value is dropped.
749
- pub fn resolve_future(&mut self, call_id: u32, obj: MontyObject) -> Result<(), InvalidInputError> {
750
- let call_id = CallId::new(call_id);
751
- // Check if the creator task has been cancelled/failed
752
- // (scheduler must exist if we're resolving futures)
753
- let scheduler = self.scheduler_mut();
754
- if let Some(creator_task) = scheduler.get_pending_call_creator(call_id)
755
- && scheduler.is_task_failed(creator_task)
756
- {
757
- // Task was cancelled - silently ignore the result
758
- return Ok(());
759
- }
760
- let value = obj.to_value(self)?;
761
-
762
- // Check if a gather is waiting on this CallId
763
- if let Some((gather_id, result_idx)) = self.scheduler_mut().take_gather_waiter(call_id) {
764
- // Remove from scheduler's pending_calls so it doesn't appear in get_pending_call_ids()
765
- self.scheduler_mut().remove_pending_call(call_id);
766
- // Store result directly in gather (move, not clone) and check completion
767
- let (pending_empty, task_ids, waiter) =
768
- if let HeapDataMut::GatherFuture(gather) = self.heap.get_mut(gather_id) {
769
- gather.results[result_idx] = Some(value); // Move value directly, no clone needed
770
- // Remove from pending_calls
771
- gather.pending_calls.retain(|&cid| cid != call_id);
772
- // Take task_ids to avoid clone - we're checking completion so gather may be destroyed
773
- (
774
- gather.pending_calls.is_empty(),
775
- std::mem::take(&mut gather.task_ids),
776
- gather.waiter,
777
- )
778
- } else {
779
- (true, vec![], None)
780
- };
781
-
782
- // Check if gather is now complete (all external futures resolved and all tasks complete)
783
- if pending_empty {
784
- let all_tasks_complete = task_ids.is_empty()
785
- || task_ids.iter().all(|tid| {
786
- matches!(
787
- self.scheduler().get_task(*tid).state,
788
- TaskState::Completed(_) | TaskState::Failed(_)
789
- )
790
- });
791
- if all_tasks_complete {
792
- // Gather is complete - build result and push to waiter's stack
793
- if let Some(waiter_id) = waiter {
794
- // Steal results from gather using mem::take - avoids refcount dance
795
- // (copy + inc_ref + dec_ref on gather drop). Since gather is being
796
- // destroyed, we can take ownership of the values directly.
797
- let results: Vec<Value> =
798
- if let HeapDataMut::GatherFuture(gather) = self.heap.get_mut(gather_id) {
799
- std::mem::take(&mut gather.results)
800
- .into_iter()
801
- .map(|r| r.expect("all results should be filled when gather is complete"))
802
- .collect()
803
- } else {
804
- vec![]
805
- };
806
-
807
- // Create result list - if this fails, we can't do much, just skip
808
- if let Ok(list_id) = self.heap.allocate(HeapData::List(List::new(results))) {
809
- // Release the GatherFuture (results already taken, so no double-drop)
810
- self.heap.dec_ref(gather_id);
811
-
812
- // Push result onto waiter's stack and mark as ready.
813
- // Check if the waiter's context is currently in the VM (frames not saved
814
- // to the task). This is the case when the waiter is the current task
815
- // and hasn't been switched away from (e.g., external-only gather).
816
- let waiter_context_in_vm =
817
- self.scheduler().current_task_id() == Some(waiter_id) && !self.frames.is_empty();
818
-
819
- if waiter_context_in_vm {
820
- // Waiter's frames are in the VM - push directly onto VM stack
821
- self.stack.push(Value::Ref(list_id));
822
- // Mark as ready but don't add to ready_queue
823
- self.scheduler_mut().get_task_mut(waiter_id).state = TaskState::Ready;
824
- } else {
825
- // Waiter's context is saved in the task (either spawned task,
826
- // or main task that was saved when switching to spawned tasks)
827
- let scheduler = self.scheduler_mut();
828
- scheduler.get_task_mut(waiter_id).stack.push(Value::Ref(list_id));
829
- scheduler.make_ready(waiter_id);
830
- }
831
- }
832
- }
833
- }
834
- }
835
- } else {
836
- // Normal resolution for single awaiter
837
- self.scheduler_mut().resolve(call_id, value);
838
- }
839
- Ok(())
840
- }
841
-
842
- /// Fails an external future with an error.
843
- ///
844
- /// Called by the host when an async external call fails with an exception.
845
- /// Finds the task blocked on this CallId and fails it with the error.
846
- /// If the task is part of a gather, cancels sibling tasks.
847
- pub fn fail_future(&mut self, call_id: u32, error: RunError) {
848
- let call_id = CallId::new(call_id);
849
-
850
- // Check if a gather is waiting on this CallId
851
- if let Some((gather_id, _result_idx)) = self.get_or_create_scheduler().take_gather_waiter(call_id) {
852
- // Remove from pending_calls so it doesn't appear in get_pending_call_ids()
853
- // (fail_for_call handles this for the non-gather case)
854
- self.scheduler_mut().remove_pending_call(call_id);
855
-
856
- // Get the gather's waiter, task_ids, and OTHER pending calls
857
- // We need to remove all pending calls for this gather from gather_waiters
858
- // before we dec_ref the gather, otherwise subsequent errors for the same
859
- // gather would try to access a freed heap object.
860
- // Use get_mut and take to avoid allocations - gather is being destroyed anyway.
861
- let (waiter, task_ids, other_pending_calls) =
862
- if let HeapDataMut::GatherFuture(gather) = self.heap.get_mut(gather_id) {
863
- let mut other_calls = std::mem::take(&mut gather.pending_calls);
864
- other_calls.retain(|&cid| cid != call_id);
865
- (gather.waiter, std::mem::take(&mut gather.task_ids), other_calls)
866
- } else {
867
- (None, vec![], vec![])
868
- };
869
-
870
- // Remove all other pending calls for this gather from gather_waiters and pending_calls
871
- // This prevents subsequent errors from trying to access the freed gather
872
- let scheduler = self.scheduler_mut();
873
- for other_call_id in other_pending_calls {
874
- scheduler.take_gather_waiter(other_call_id);
875
- scheduler.remove_pending_call(other_call_id);
876
- }
877
-
878
- // Cancel all sibling tasks in the gather
879
- for sibling_id in task_ids {
880
- self.scheduler
881
- .as_mut()
882
- .expect("scheduler must exist")
883
- .cancel_task(sibling_id, self.heap);
884
- }
885
-
886
- // Fail the waiter task (the task that awaited the gather)
887
- if let Some(waiter_id) = waiter {
888
- // Mark the waiter task as failed
889
- self.scheduler_mut().fail_task(waiter_id, error);
890
- // Release the GatherFuture
891
- self.heap.dec_ref(gather_id);
892
- }
893
- } else if let Some((task_id, Some(gid))) = self.scheduler_mut().fail_for_call(call_id, error) {
894
- // Original path: task is directly BlockedOnCall and part of a gather
895
- // Take task_ids from GatherFuture - gather is being destroyed anyway
896
- let task_ids: Vec<TaskId> = if let HeapDataMut::GatherFuture(gather) = self.heap.get_mut(gid) {
897
- std::mem::take(&mut gather.task_ids)
898
- } else {
899
- vec![]
900
- };
901
-
902
- // Cancel sibling tasks (filter out self and already-finished tasks)
903
- for sibling_id in task_ids {
904
- if sibling_id != task_id && !self.scheduler().get_task(sibling_id).is_finished() {
905
- self.scheduler
906
- .as_mut()
907
- .expect("scheduler must exist")
908
- .cancel_task(sibling_id, self.heap);
909
- }
910
- }
911
- }
912
- }
913
-
914
- /// Adds pending call data for an external function call.
915
- ///
916
- /// Called by `run_pending()` when the host chooses async resolution.
917
- /// This stores the call data in the scheduler so we can:
918
- /// 1. Track which task created the call (to ignore results if cancelled)
919
- /// 2. Return pending call info when all tasks are blocked
920
- ///
921
- /// Note: The args are empty because the host already has them from the
922
- /// `FunctionCall` return value. We only need to track the creator task.
923
- pub fn add_pending_call(&mut self, call_id: CallId) {
924
- let scheduler = self.get_or_create_scheduler();
925
- let current_task = scheduler.current_task_id().unwrap_or_default();
926
- scheduler.add_pending_call(
927
- call_id,
928
- PendingCallData {
929
- args: ArgValues::Empty,
930
- creator_task: current_task,
931
- },
932
- );
933
- }
934
-
935
- /// Prepares the current task to continue after futures are resolved.
936
- ///
937
- /// When the current task (main or spawned) was blocked on an external future and
938
- /// that future is now resolved, this method takes the resolved value from the
939
- /// scheduler and pushes it onto the VM's stack so execution can continue.
940
- ///
941
- /// This is called by `FutureSnapshot::resume()` after resolving futures but before
942
- /// calling `vm.run()`. It handles the task whose frames are currently in the VM.
943
- /// Other unblocked tasks get their resolved values during task switching in
944
- /// `load_or_init_task`.
945
- ///
946
- /// # Returns
947
- /// `true` if a value was pushed, `false` if no task was ready to continue.
948
- pub fn prepare_current_task_after_resolve(&mut self) -> bool {
949
- let Some(scheduler) = &mut self.scheduler else {
950
- return false;
951
- };
952
-
953
- // Check if there's a current task (main or spawned)
954
- let Some(current_task_id) = scheduler.current_task_id() else {
955
- return false;
956
- };
957
-
958
- // Take the resolved value for the current task (if it was unblocked)
959
- if let Some(value) = scheduler.take_resolved_for_task(current_task_id) {
960
- // Remove task from ready_queue since we're handling it directly.
961
- // resolve() added it to ready_queue, but since frames are already
962
- // in the VM (not saved/restored), we handle it here instead of via task switching.
963
- scheduler.remove_from_ready_queue(current_task_id);
964
- self.push(value);
965
- true
966
- } else {
967
- false
968
- }
969
- }
970
-
971
- /// Loads a ready task if the VM needs one.
972
- ///
973
- /// This is called by `FutureSnapshot::resume()` after resolving futures but before
974
- /// calling `vm.run()`. It handles two cases:
975
- /// 1. **No frames in VM**: A task context needs to be loaded from the scheduler
976
- /// (e.g., gather completed while tasks were running and we yielded with no frames).
977
- /// 2. **Current task is blocked**: The current task's frames are in the VM but it's
978
- /// still blocked (e.g., only some futures were resolved in incremental resolution).
979
- /// Saves the blocked task's context and switches to a ready task.
980
- ///
981
- /// # Returns
982
- /// - `Ok(true)` if a task was loaded and execution can continue
983
- /// - `Ok(false)` if no task switch is needed (current task is runnable or no ready tasks)
984
- /// - `Err(error)` if loading the task failed
985
- pub fn load_ready_task_if_needed(&mut self) -> Result<bool, RunError> {
986
- // If frames exist, check if the current task is blocked. If it's not blocked
987
- // (i.e., it was just unblocked), there's nothing to do - it will continue running.
988
- if !self.frames.is_empty() {
989
- let current_blocked = self.scheduler.as_ref().is_some_and(|s| {
990
- s.current_task_id().is_some_and(|tid| {
991
- matches!(
992
- s.get_task(tid).state,
993
- TaskState::BlockedOnCall(_) | TaskState::BlockedOnGather(_)
994
- )
995
- })
996
- });
997
- if !current_blocked {
998
- return Ok(false);
999
- }
1000
-
1001
- // Current task is blocked - save its context before switching
1002
- if let Some(tid) = self.scheduler.as_ref().and_then(Scheduler::current_task_id) {
1003
- self.save_task_context(tid);
1004
- }
1005
- }
1006
-
1007
- // Check if there's a ready task to load
1008
- let next_task_id = self.scheduler.as_mut().and_then(Scheduler::next_ready_task);
1009
- let Some(next_task_id) = next_task_id else {
1010
- return Ok(false);
1011
- };
1012
-
1013
- self.scheduler_mut().set_current_task(Some(next_task_id));
1014
- self.load_or_init_task(next_task_id)?;
1015
- Ok(true)
1016
- }
1017
-
1018
- /// Gets the pending call IDs from the scheduler.
1019
- ///
1020
- /// Returns an empty vec if no scheduler exists.
1021
- pub fn get_pending_call_ids(&self) -> Vec<CallId> {
1022
- self.scheduler
1023
- .as_ref()
1024
- .map_or_else(Vec::new, Scheduler::pending_call_ids)
1025
- }
1026
-
1027
- /// Takes the error from a failed task if the current task has failed.
1028
- ///
1029
- /// Returns `Some(error)` if the current task is in `TaskState::Failed`, `None` otherwise.
1030
- /// Used by `FutureSnapshot::resume` to propagate errors after resolving futures.
1031
- ///
1032
- /// Only replaces the state when the task has actually failed - other states
1033
- /// (e.g., `BlockedOnCall`) are left untouched.
1034
- pub fn take_failed_task_error(&mut self) -> Option<RunError> {
1035
- let scheduler = self.scheduler.as_mut()?;
1036
- let current_task_id = scheduler.current_task_id()?;
1037
- let task = scheduler.get_task_mut(current_task_id);
1038
-
1039
- // Only replace state if it's actually Failed - otherwise we'd corrupt
1040
- // the task's real state (e.g., BlockedOnCall) by overwriting it with Ready.
1041
- if matches!(task.state, TaskState::Failed(_))
1042
- && let TaskState::Failed(error) = std::mem::replace(&mut task.state, TaskState::Ready)
1043
- {
1044
- return Some(error);
1045
- }
1046
- None
1047
- }
1048
- }
1049
-
1050
- /// Internal enum for dispatching await operations by heap data type.
1051
- ///
1052
- /// Used in `exec_get_awaitable` to determine which handler to call after
1053
- /// inspecting the heap data type. This avoids borrow conflicts between
1054
- /// the heap reference and `&mut self` needed by the handler methods.
1055
- enum AwaitableType {
1056
- Coroutine,
1057
- GatherFuture,
1058
- }