superacli 1.1.6 → 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.
- package/README.md +77 -53
- package/__tests__/azd-plugin.test.js +109 -0
- package/__tests__/config.test.js +4 -3
- package/__tests__/discover.test.js +59 -0
- package/__tests__/goose-plugin.test.js +149 -0
- package/__tests__/help-json.test.js +2 -0
- package/__tests__/openhands-plugin.test.js +106 -0
- package/__tests__/plugin-cocoindex-code-uninstall.test.js +19 -0
- package/__tests__/plugin-cocoindex-code.test.js +37 -0
- package/__tests__/plugin-install-guidance.test.js +81 -0
- package/__tests__/plugins-registry.test.js +44 -0
- package/__tests__/plugins-store.test.js +40 -5
- package/__tests__/process-adapter.test.js +50 -1
- package/__tests__/server-app.test.js +1 -0
- package/__tests__/server-routes-commands.test.js +20 -2
- package/__tests__/server-routes-plugins.test.js +130 -0
- package/__tests__/skills.test.js +26 -0
- package/__tests__/squirrelscan-plugin.test.js +129 -0
- package/__tests__/uipath-plugin.test.js +104 -0
- package/__tests__/uipathcli-plugin.test.js +95 -0
- package/cli/adapters/mcp.js +2 -0
- package/cli/adapters/process.js +49 -2
- package/cli/config.js +240 -3
- package/cli/discover.js +157 -0
- package/cli/help-json.js +16 -1
- package/cli/plugin-install-guidance.js +92 -37
- package/cli/plugins-manager.js +1 -0
- package/cli/plugins-registry.js +74 -8
- package/cli/plugins-store.js +78 -17
- package/cli/skills-mcp.js +1 -1
- package/cli/skills.js +39 -2
- package/cli/supercli.js +87 -11
- package/docs/feature-gaps.md +8 -8
- package/docs/features/azd-uipath-plugins.md +43 -0
- package/docs/features/server-plugins.md +62 -0
- package/docs/features/skills.md +9 -5
- package/docs/{supported-harnesses.md → plugins-available.md} +4 -3
- package/docs/{plugin-harness-guide.md → plugins-how-to.md} +1 -1
- package/docs/plugins.md +26 -20
- package/docs/server-plugins-usage-guide.md +182 -0
- package/docs/skills-catalog.md +12 -10
- package/package.json +1 -1
- package/plugins/agent-browser/README.md +69 -0
- package/plugins/agent-browser/plugin.json +111 -0
- package/plugins/agent-browser/skills/quickstart/SKILL.md +66 -0
- package/plugins/aider/README.md +53 -0
- package/plugins/aider/plugin.json +105 -0
- package/plugins/aider/scripts/aider-wrapper.js +243 -0
- package/plugins/aider/scripts/setup-aider.js +37 -0
- package/plugins/aider/skills/dry-run-review.md +24 -0
- package/plugins/aider/skills/model-and-provider.md +24 -0
- package/plugins/aider/skills/one-shot-edits.md +30 -0
- package/plugins/aider/skills/quickstart/SKILL.md +51 -0
- package/plugins/azd/README.md +28 -0
- package/plugins/azd/plugin.json +87 -0
- package/plugins/azd/skills/quickstart/SKILL.md +41 -0
- package/plugins/blogwatcher/README.md +3 -3
- package/plugins/boxlite/Dockerfile +9 -0
- package/plugins/boxlite/README.md +62 -0
- package/plugins/boxlite/plugin.json +201 -0
- package/plugins/boxlite/scripts/run-boxlite.js +106 -0
- package/plugins/boxlite/skills/quickstart/SKILL.md +40 -0
- package/plugins/cass/plugin.json +150 -0
- package/plugins/cass/scripts/setup-cass.js +47 -0
- package/plugins/cass/skills/quickstart/SKILL.md +46 -0
- package/plugins/clever/README.md +46 -0
- package/plugins/clever/plugin.json +119 -0
- package/plugins/clever/scripts/setup-clever.js +28 -0
- package/plugins/clever/skills/auth-and-profile.md +29 -0
- package/plugins/clever/skills/passthrough-safety.md +21 -0
- package/plugins/clever/skills/quickstart/SKILL.md +45 -0
- package/plugins/clever/skills/resource-inventory.md +24 -0
- package/plugins/clix/README.md +4 -4
- package/plugins/cocoindex-code/README.md +64 -0
- package/plugins/cocoindex-code/plugin.json +81 -0
- package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-310.pyc +0 -0
- package/plugins/cocoindex-code/scripts/__pycache__/query.cpython-311.pyc +0 -0
- package/plugins/cocoindex-code/scripts/post-install.js +61 -0
- package/plugins/cocoindex-code/scripts/post-uninstall.js +25 -0
- package/plugins/cocoindex-code/scripts/query.py +88 -0
- package/plugins/cocoindex-code/scripts/run-query.js +50 -0
- package/plugins/cocoindex-code/skills/quickstart/SKILL.md +73 -0
- package/plugins/copilot/README.md +24 -0
- package/plugins/copilot/plugin.json +80 -0
- package/plugins/copilot/skills/quickstart/SKILL.md +44 -0
- package/plugins/gemini/README.md +24 -0
- package/plugins/gemini/plugin.json +98 -0
- package/plugins/gemini/skills/quickstart/SKILL.md +44 -0
- package/plugins/gifcap/plugin.json +119 -0
- package/plugins/gifcap/scripts/setup-gifcap.js +44 -0
- package/plugins/gifcap/skills/quickstart/SKILL.md +34 -0
- package/plugins/gifcap/test-record-quiet.gif +0 -0
- package/plugins/gifcap/test-record.gif +0 -0
- package/plugins/goose/README.md +36 -0
- package/plugins/goose/plugin.json +183 -0
- package/plugins/goose/skills/quickstart/SKILL.md +44 -0
- package/plugins/json-server/README.md +58 -0
- package/plugins/json-server/plugin.json +113 -0
- package/plugins/json-server/skills/quickstart/SKILL.md +57 -0
- package/plugins/lightpanda/README.md +145 -0
- package/plugins/lightpanda/package-lock.json +1375 -0
- package/plugins/lightpanda/package.json +12 -0
- package/plugins/lightpanda/plugin.json +116 -0
- package/plugins/lightpanda/scripts/lightpanda-contacts.js +494 -0
- package/plugins/lightpanda/scripts/lightpanda-generic-extract.js +403 -0
- package/plugins/lightpanda/scripts/lightpanda-wrapper.js +480 -0
- package/plugins/lightpanda/scripts/setup-lightpanda.js +39 -0
- package/plugins/lightpanda/skills/contact-discovery.md +51 -0
- package/plugins/lightpanda/skills/generic-extraction.md +66 -0
- package/plugins/lightpanda/skills/quickstart/SKILL.md +103 -0
- package/plugins/lightpanda/skills/resilient-navigation.md +42 -0
- package/plugins/monty/README.md +2 -2
- package/plugins/nullclaw/README.md +3 -3
- package/plugins/offline-ai/README.md +23 -0
- package/plugins/offline-ai/plugin.json +82 -0
- package/plugins/offline-ai/skills/quickstart/SKILL.md +43 -0
- package/plugins/openhands/README.md +25 -0
- package/plugins/openhands/plugin.json +116 -0
- package/plugins/openhands/skills/quickstart/SKILL.md +26 -0
- package/plugins/plandex/README.md +25 -0
- package/plugins/plandex/plugin.json +130 -0
- package/plugins/plandex/skills/quickstart/SKILL.md +50 -0
- package/plugins/plugins.json +188 -0
- package/plugins/squirrelscan/Dockerfile +5 -0
- package/plugins/squirrelscan/README.md +47 -0
- package/plugins/squirrelscan/plugin.json +493 -0
- package/plugins/squirrelscan/scripts/post-install.js +33 -0
- package/plugins/squirrelscan/scripts/post-uninstall.js +25 -0
- package/plugins/squirrelscan/scripts/run-squirrel.js +73 -0
- package/plugins/squirrelscan/skills/audit-workflow/SKILL.md +33 -0
- package/plugins/squirrelscan/skills/publish-report/SKILL.md +33 -0
- package/plugins/squirrelscan/skills/quickstart/SKILL.md +41 -0
- package/plugins/uipath/README.md +27 -0
- package/plugins/uipath/plugin.json +86 -0
- package/plugins/uipath/skills/quickstart/SKILL.md +47 -0
- package/plugins/uipathcli/README.md +28 -0
- package/plugins/uipathcli/plugin.json +120 -0
- package/plugins/uipathcli/scripts/run-uipath-cli.js +49 -0
- package/plugins/uipathcli/skills/quickstart/SKILL.md +22 -0
- package/plugins/xurl/README.md +4 -4
- package/server/app.js +5 -2
- package/server/public/app.js +3 -0
- package/server/routes/commands.js +95 -12
- package/server/routes/plugins.js +262 -0
- package/server/services/pluginsService.js +303 -0
- package/server/views/command-edit.ejs +196 -14
- package/server/views/partials/head.ejs +1 -0
- package/server/views/plugins.ejs +264 -0
- package/tests/test-plugins-registry.js +30 -0
- package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +0 -20
- package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +0 -21
- package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +0 -22
- package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +0 -23
- package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +0 -24
- package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +0 -25
- package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +0 -25
- package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +0 -25
- package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +0 -26
- package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +0 -27
- package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +0 -28
- package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +0 -29
- package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +0 -30
- package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +0 -31
- package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +0 -32
- package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +0 -33
- package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +0 -33
- package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +0 -34
- package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +0 -34
- package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +0 -35
- package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +0 -36
- package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +0 -37
- package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +0 -38
- package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +0 -39
- package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +0 -40
- package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +0 -41
- package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +0 -42
- package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +0 -43
- package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +0 -44
- package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +0 -45
- package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +0 -46
- package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +0 -47
- package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +0 -48
- package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +0 -49
- package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +0 -50
- package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +0 -51
- package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +0 -52
- package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +0 -53
- package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +0 -54
- package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +0 -55
- package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +0 -56
- package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +0 -57
- package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +0 -57
- package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +0 -58
- package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +0 -59
- package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +0 -60
- package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +0 -60
- package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +0 -60
- package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +0 -60
- package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +0 -60
- package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +0 -1
- package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +0 -60
- package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +0 -1
- package/.beads/config.yaml +0 -4
- package/.beads/issues.jsonl +0 -60
- package/.beads/metadata.json +0 -4
- package/docs/mcp-cheatsheet.md +0 -324
- package/docs/visual-overview.md +0 -21
- package/ref-monty/.cargo/config.toml +0 -3
- package/ref-monty/.claude/settings.json +0 -60
- package/ref-monty/.claude/skills/fastmod/SKILL.md +0 -22
- package/ref-monty/.claude/skills/python-playground/SKILL.md +0 -47
- package/ref-monty/.codecov.yml +0 -12
- package/ref-monty/.github/actions/build-pgo-wheel/action.yml +0 -72
- package/ref-monty/.github/workflows/ci.yml +0 -776
- package/ref-monty/.github/workflows/codspeed.yml +0 -45
- package/ref-monty/.github/workflows/init-npm-packages.yml +0 -82
- package/ref-monty/.pre-commit-config.yaml +0 -47
- package/ref-monty/.python-version +0 -1
- package/ref-monty/.rustfmt.toml +0 -4
- package/ref-monty/.zed/settings.json +0 -11
- package/ref-monty/CLAUDE.md +0 -535
- package/ref-monty/Cargo.lock +0 -3798
- package/ref-monty/Cargo.toml +0 -87
- package/ref-monty/LICENSE +0 -21
- package/ref-monty/Makefile +0 -216
- package/ref-monty/README.md +0 -430
- package/ref-monty/RELEASING.md +0 -47
- package/ref-monty/crates/fuzz/Cargo.toml +0 -30
- package/ref-monty/crates/fuzz/fuzz_targets/string_input_panic.rs +0 -37
- package/ref-monty/crates/fuzz/fuzz_targets/tokens_input_panic.rs +0 -552
- package/ref-monty/crates/monty/Cargo.toml +0 -68
- package/ref-monty/crates/monty/benches/main.rs +0 -247
- package/ref-monty/crates/monty/build.rs +0 -10
- package/ref-monty/crates/monty/src/args.rs +0 -733
- package/ref-monty/crates/monty/src/asyncio.rs +0 -179
- package/ref-monty/crates/monty/src/builtins/abs.rs +0 -55
- package/ref-monty/crates/monty/src/builtins/all.rs +0 -30
- package/ref-monty/crates/monty/src/builtins/any.rs +0 -30
- package/ref-monty/crates/monty/src/builtins/bin.rs +0 -59
- package/ref-monty/crates/monty/src/builtins/chr.rs +0 -46
- package/ref-monty/crates/monty/src/builtins/divmod.rs +0 -164
- package/ref-monty/crates/monty/src/builtins/enumerate.rs +0 -52
- package/ref-monty/crates/monty/src/builtins/filter.rs +0 -67
- package/ref-monty/crates/monty/src/builtins/getattr.rs +0 -65
- package/ref-monty/crates/monty/src/builtins/hash.rs +0 -28
- package/ref-monty/crates/monty/src/builtins/hex.rs +0 -58
- package/ref-monty/crates/monty/src/builtins/id.rs +0 -24
- package/ref-monty/crates/monty/src/builtins/isinstance.rs +0 -68
- package/ref-monty/crates/monty/src/builtins/len.rs +0 -25
- package/ref-monty/crates/monty/src/builtins/map.rs +0 -98
- package/ref-monty/crates/monty/src/builtins/min_max.rs +0 -113
- package/ref-monty/crates/monty/src/builtins/mod.rs +0 -246
- package/ref-monty/crates/monty/src/builtins/next.rs +0 -21
- package/ref-monty/crates/monty/src/builtins/oct.rs +0 -59
- package/ref-monty/crates/monty/src/builtins/ord.rs +0 -67
- package/ref-monty/crates/monty/src/builtins/pow.rs +0 -365
- package/ref-monty/crates/monty/src/builtins/print.rs +0 -141
- package/ref-monty/crates/monty/src/builtins/repr.rs +0 -16
- package/ref-monty/crates/monty/src/builtins/reversed.rs +0 -28
- package/ref-monty/crates/monty/src/builtins/round.rs +0 -174
- package/ref-monty/crates/monty/src/builtins/sorted.rs +0 -151
- package/ref-monty/crates/monty/src/builtins/sum.rs +0 -66
- package/ref-monty/crates/monty/src/builtins/type_.rs +0 -16
- package/ref-monty/crates/monty/src/builtins/zip.rs +0 -77
- package/ref-monty/crates/monty/src/bytecode/builder.rs +0 -699
- package/ref-monty/crates/monty/src/bytecode/code.rs +0 -310
- package/ref-monty/crates/monty/src/bytecode/compiler.rs +0 -3206
- package/ref-monty/crates/monty/src/bytecode/mod.rs +0 -24
- package/ref-monty/crates/monty/src/bytecode/op.rs +0 -617
- package/ref-monty/crates/monty/src/bytecode/vm/async_exec.rs +0 -1058
- package/ref-monty/crates/monty/src/bytecode/vm/attr.rs +0 -63
- package/ref-monty/crates/monty/src/bytecode/vm/binary.rs +0 -487
- package/ref-monty/crates/monty/src/bytecode/vm/call.rs +0 -767
- package/ref-monty/crates/monty/src/bytecode/vm/collections.rs +0 -741
- package/ref-monty/crates/monty/src/bytecode/vm/compare.rs +0 -147
- package/ref-monty/crates/monty/src/bytecode/vm/exceptions.rs +0 -297
- package/ref-monty/crates/monty/src/bytecode/vm/format.rs +0 -132
- package/ref-monty/crates/monty/src/bytecode/vm/mod.rs +0 -1958
- package/ref-monty/crates/monty/src/bytecode/vm/scheduler.rs +0 -620
- package/ref-monty/crates/monty/src/exception_private.rs +0 -1513
- package/ref-monty/crates/monty/src/exception_public.rs +0 -346
- package/ref-monty/crates/monty/src/expressions.rs +0 -694
- package/ref-monty/crates/monty/src/fstring.rs +0 -854
- package/ref-monty/crates/monty/src/function.rs +0 -119
- package/ref-monty/crates/monty/src/heap.rs +0 -1073
- package/ref-monty/crates/monty/src/heap_data.rs +0 -985
- package/ref-monty/crates/monty/src/heap_traits.rs +0 -312
- package/ref-monty/crates/monty/src/intern.rs +0 -837
- package/ref-monty/crates/monty/src/io.rs +0 -106
- package/ref-monty/crates/monty/src/lib.rs +0 -52
- package/ref-monty/crates/monty/src/modules/asyncio.rs +0 -144
- package/ref-monty/crates/monty/src/modules/math.rs +0 -1453
- package/ref-monty/crates/monty/src/modules/mod.rs +0 -120
- package/ref-monty/crates/monty/src/modules/os.rs +0 -116
- package/ref-monty/crates/monty/src/modules/pathlib.rs +0 -33
- package/ref-monty/crates/monty/src/modules/re.rs +0 -606
- package/ref-monty/crates/monty/src/modules/sys.rs +0 -60
- package/ref-monty/crates/monty/src/modules/typing.rs +0 -70
- package/ref-monty/crates/monty/src/namespace.rs +0 -21
- package/ref-monty/crates/monty/src/object.rs +0 -1040
- package/ref-monty/crates/monty/src/os.rs +0 -215
- package/ref-monty/crates/monty/src/parse.rs +0 -1730
- package/ref-monty/crates/monty/src/prepare.rs +0 -3015
- package/ref-monty/crates/monty/src/repl.rs +0 -1109
- package/ref-monty/crates/monty/src/resource.rs +0 -559
- package/ref-monty/crates/monty/src/run.rs +0 -457
- package/ref-monty/crates/monty/src/run_progress.rs +0 -821
- package/ref-monty/crates/monty/src/signature.rs +0 -651
- package/ref-monty/crates/monty/src/sorting.rs +0 -100
- package/ref-monty/crates/monty/src/types/bytes.rs +0 -2356
- package/ref-monty/crates/monty/src/types/dataclass.rs +0 -345
- package/ref-monty/crates/monty/src/types/dict.rs +0 -879
- package/ref-monty/crates/monty/src/types/dict_view.rs +0 -619
- package/ref-monty/crates/monty/src/types/iter.rs +0 -799
- package/ref-monty/crates/monty/src/types/list.rs +0 -929
- package/ref-monty/crates/monty/src/types/long_int.rs +0 -211
- package/ref-monty/crates/monty/src/types/mod.rs +0 -48
- package/ref-monty/crates/monty/src/types/module.rs +0 -146
- package/ref-monty/crates/monty/src/types/namedtuple.rs +0 -261
- package/ref-monty/crates/monty/src/types/path.rs +0 -596
- package/ref-monty/crates/monty/src/types/property.rs +0 -35
- package/ref-monty/crates/monty/src/types/py_trait.rs +0 -322
- package/ref-monty/crates/monty/src/types/range.rs +0 -285
- package/ref-monty/crates/monty/src/types/re_match.rs +0 -522
- package/ref-monty/crates/monty/src/types/re_pattern.rs +0 -726
- package/ref-monty/crates/monty/src/types/set.rs +0 -1373
- package/ref-monty/crates/monty/src/types/slice.rs +0 -257
- package/ref-monty/crates/monty/src/types/str.rs +0 -2051
- package/ref-monty/crates/monty/src/types/tuple.rs +0 -376
- package/ref-monty/crates/monty/src/types/type.rs +0 -407
- package/ref-monty/crates/monty/src/value.rs +0 -2558
- package/ref-monty/crates/monty/test_cases/args__dict_get_no_args.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__dict_get_too_many.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__dict_items_with_args.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__dict_keys_with_args.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__dict_pop_no_args.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__dict_pop_too_many.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__dict_values_with_args.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__id_too_many.py +0 -2
- package/ref-monty/crates/monty/test_cases/args__len_no_args.py +0 -2
- package/ref-monty/crates/monty/test_cases/args__len_too_many.py +0 -2
- package/ref-monty/crates/monty/test_cases/args__len_type_error_int.py +0 -9
- package/ref-monty/crates/monty/test_cases/args__len_type_error_none.py +0 -9
- package/ref-monty/crates/monty/test_cases/args__list_append_no_args.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__list_append_too_many.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__list_insert_too_few.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__list_insert_too_many.py +0 -3
- package/ref-monty/crates/monty/test_cases/args__repr_no_args.py +0 -2
- package/ref-monty/crates/monty/test_cases/arith__div_zero_float.py +0 -2
- package/ref-monty/crates/monty/test_cases/arith__div_zero_int.py +0 -2
- package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_float.py +0 -2
- package/ref-monty/crates/monty/test_cases/arith__floordiv_zero_int.py +0 -2
- package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg.py +0 -2
- package/ref-monty/crates/monty/test_cases/arith__pow_zero_neg_builtin.py +0 -9
- package/ref-monty/crates/monty/test_cases/assert__expr_fail.py +0 -2
- package/ref-monty/crates/monty/test_cases/assert__fail.py +0 -2
- package/ref-monty/crates/monty/test_cases/assert__fail_msg.py +0 -2
- package/ref-monty/crates/monty/test_cases/assert__fn_fail.py +0 -3
- package/ref-monty/crates/monty/test_cases/assert__ops.py +0 -11
- package/ref-monty/crates/monty/test_cases/async__asyncio_run.py +0 -47
- package/ref-monty/crates/monty/test_cases/async__basic.py +0 -10
- package/ref-monty/crates/monty/test_cases/async__closure.py +0 -14
- package/ref-monty/crates/monty/test_cases/async__double_await_coroutine.py +0 -16
- package/ref-monty/crates/monty/test_cases/async__exception.py +0 -10
- package/ref-monty/crates/monty/test_cases/async__ext_call.py +0 -73
- package/ref-monty/crates/monty/test_cases/async__gather_all.py +0 -85
- package/ref-monty/crates/monty/test_cases/async__nested_await.py +0 -15
- package/ref-monty/crates/monty/test_cases/async__nested_gather_ext.py +0 -37
- package/ref-monty/crates/monty/test_cases/async__not_awaitable.py +0 -10
- package/ref-monty/crates/monty/test_cases/async__not_imported.py +0 -14
- package/ref-monty/crates/monty/test_cases/async__recursion_depth_isolation.py +0 -27
- package/ref-monty/crates/monty/test_cases/async__return_types.py +0 -31
- package/ref-monty/crates/monty/test_cases/async__sequential.py +0 -16
- package/ref-monty/crates/monty/test_cases/async__traceback.py +0 -19
- package/ref-monty/crates/monty/test_cases/async__with_args.py +0 -14
- package/ref-monty/crates/monty/test_cases/attr__get_int_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/attr__get_list_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/attr__set_frozen_nonfield.py +0 -12
- package/ref-monty/crates/monty/test_cases/attr__set_int_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/attr__set_list_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/bench__kitchen_sink.py +0 -68
- package/ref-monty/crates/monty/test_cases/bool__ops.py +0 -20
- package/ref-monty/crates/monty/test_cases/builtin__add_type_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/builtin__filter.py +0 -62
- package/ref-monty/crates/monty/test_cases/builtin__filter_not_iterable.py +0 -11
- package/ref-monty/crates/monty/test_cases/builtin__getattr.py +0 -84
- package/ref-monty/crates/monty/test_cases/builtin__iter_funcs.py +0 -42
- package/ref-monty/crates/monty/test_cases/builtin__iter_next.py +0 -66
- package/ref-monty/crates/monty/test_cases/builtin__map.py +0 -74
- package/ref-monty/crates/monty/test_cases/builtin__map_not_iterable.py +0 -11
- package/ref-monty/crates/monty/test_cases/builtin__math_funcs.py +0 -154
- package/ref-monty/crates/monty/test_cases/builtin__more_iter_funcs.py +0 -148
- package/ref-monty/crates/monty/test_cases/builtin__next_stop_iteration.py +0 -10
- package/ref-monty/crates/monty/test_cases/builtin__print_invalid_kwarg.py +0 -9
- package/ref-monty/crates/monty/test_cases/builtin__print_kwargs.py +0 -12
- package/ref-monty/crates/monty/test_cases/builtin__repr.py +0 -3
- package/ref-monty/crates/monty/test_cases/builtin__string_funcs.py +0 -73
- package/ref-monty/crates/monty/test_cases/bytes__decode_invalid_utf8.py +0 -18
- package/ref-monty/crates/monty/test_cases/bytes__endswith_str_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/bytes__getitem_index_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/bytes__index_start_gt_end.py +0 -10
- package/ref-monty/crates/monty/test_cases/bytes__methods.py +0 -394
- package/ref-monty/crates/monty/test_cases/bytes__negative_count.py +0 -9
- package/ref-monty/crates/monty/test_cases/bytes__ops.py +0 -90
- package/ref-monty/crates/monty/test_cases/bytes__startswith_str_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/call_object.py +0 -3
- package/ref-monty/crates/monty/test_cases/chain_comparison__all.py +0 -79
- package/ref-monty/crates/monty/test_cases/closure__param_shadows_outer.py +0 -81
- package/ref-monty/crates/monty/test_cases/closure__pep448.py +0 -203
- package/ref-monty/crates/monty/test_cases/closure__undefined_nonlocal.py +0 -13
- package/ref-monty/crates/monty/test_cases/compare__mixed_types.py +0 -120
- package/ref-monty/crates/monty/test_cases/comprehension__all.py +0 -208
- package/ref-monty/crates/monty/test_cases/comprehension__scope.py +0 -7
- package/ref-monty/crates/monty/test_cases/comprehension__unbound_local.py +0 -14
- package/ref-monty/crates/monty/test_cases/dataclass__basic.py +0 -238
- package/ref-monty/crates/monty/test_cases/dataclass__call_field_error.py +0 -12
- package/ref-monty/crates/monty/test_cases/dataclass__frozen_set_error.py +0 -12
- package/ref-monty/crates/monty/test_cases/dataclass__get_missing_attr_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/dict__get_unhashable_key.py +0 -3
- package/ref-monty/crates/monty/test_cases/dict__literal_unhashable_key.py +0 -2
- package/ref-monty/crates/monty/test_cases/dict__method_pop_missing_error.py +0 -3
- package/ref-monty/crates/monty/test_cases/dict__methods.py +0 -151
- package/ref-monty/crates/monty/test_cases/dict__ops.py +0 -133
- package/ref-monty/crates/monty/test_cases/dict__pop_unhashable_key.py +0 -4
- package/ref-monty/crates/monty/test_cases/dict__popitem_empty.py +0 -9
- package/ref-monty/crates/monty/test_cases/dict__subscript_missing_key.py +0 -3
- package/ref-monty/crates/monty/test_cases/dict__unhashable_dict_key.py +0 -2
- package/ref-monty/crates/monty/test_cases/dict__unhashable_list_key.py +0 -2
- package/ref-monty/crates/monty/test_cases/dict__unpack_type_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/dict__views.py +0 -165
- package/ref-monty/crates/monty/test_cases/edge__all.py +0 -26
- package/ref-monty/crates/monty/test_cases/edge__float_int_mod.py +0 -2
- package/ref-monty/crates/monty/test_cases/edge__int_float_mod.py +0 -2
- package/ref-monty/crates/monty/test_cases/exc__args.py +0 -16
- package/ref-monty/crates/monty/test_cases/exc__str.py +0 -15
- package/ref-monty/crates/monty/test_cases/execute_ok__all.py +0 -54
- package/ref-monty/crates/monty/test_cases/execute_raise__error_instance_str.py +0 -2
- package/ref-monty/crates/monty/test_cases/execute_raise__error_no_args.py +0 -2
- package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg.py +0 -2
- package/ref-monty/crates/monty/test_cases/execute_raise__error_string_arg_quotes.py +0 -2
- package/ref-monty/crates/monty/test_cases/execute_raise__error_type.py +0 -2
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_instance_via_var.py +0 -4
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_list.py +0 -2
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_number.py +0 -2
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_call_via_var.py +0 -4
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_direct.py +0 -3
- package/ref-monty/crates/monty/test_cases/execute_raise__raise_type_via_var.py +0 -4
- package/ref-monty/crates/monty/test_cases/ext_call__arg_side_effect_bug.py +0 -22
- package/ref-monty/crates/monty/test_cases/ext_call__augmented.py +0 -17
- package/ref-monty/crates/monty/test_cases/ext_call__augmented_refcount_bug.py +0 -7
- package/ref-monty/crates/monty/test_cases/ext_call__bare_raise_after_resume.py +0 -34
- package/ref-monty/crates/monty/test_cases/ext_call__basic.py +0 -99
- package/ref-monty/crates/monty/test_cases/ext_call__boolean.py +0 -37
- package/ref-monty/crates/monty/test_cases/ext_call__boolean_side_effect_hang.py +0 -17
- package/ref-monty/crates/monty/test_cases/ext_call__closure_bug.py +0 -16
- package/ref-monty/crates/monty/test_cases/ext_call__comparison.py +0 -26
- package/ref-monty/crates/monty/test_cases/ext_call__deep_call_stack.py +0 -18
- package/ref-monty/crates/monty/test_cases/ext_call__elif.py +0 -171
- package/ref-monty/crates/monty/test_cases/ext_call__exc.py +0 -4
- package/ref-monty/crates/monty/test_cases/ext_call__exc_deep_stack.py +0 -39
- package/ref-monty/crates/monty/test_cases/ext_call__exc_in_function.py +0 -17
- package/ref-monty/crates/monty/test_cases/ext_call__exc_nested_functions.py +0 -31
- package/ref-monty/crates/monty/test_cases/ext_call__ext_exc.py +0 -171
- package/ref-monty/crates/monty/test_cases/ext_call__for.py +0 -114
- package/ref-monty/crates/monty/test_cases/ext_call__fstring.py +0 -12
- package/ref-monty/crates/monty/test_cases/ext_call__if.py +0 -135
- package/ref-monty/crates/monty/test_cases/ext_call__if_condition.py +0 -37
- package/ref-monty/crates/monty/test_cases/ext_call__in_closure.py +0 -14
- package/ref-monty/crates/monty/test_cases/ext_call__in_function.py +0 -40
- package/ref-monty/crates/monty/test_cases/ext_call__in_function_simple.py +0 -7
- package/ref-monty/crates/monty/test_cases/ext_call__literals.py +0 -17
- package/ref-monty/crates/monty/test_cases/ext_call__multi_in_func.py +0 -32
- package/ref-monty/crates/monty/test_cases/ext_call__name_lookup.py +0 -69
- package/ref-monty/crates/monty/test_cases/ext_call__name_lookup_undefined.py +0 -4
- package/ref-monty/crates/monty/test_cases/ext_call__nested_calls.py +0 -14
- package/ref-monty/crates/monty/test_cases/ext_call__recursion_bug.py +0 -19
- package/ref-monty/crates/monty/test_cases/ext_call__return.py +0 -28
- package/ref-monty/crates/monty/test_cases/ext_call__side_effects.py +0 -25
- package/ref-monty/crates/monty/test_cases/ext_call__subscript.py +0 -7
- package/ref-monty/crates/monty/test_cases/ext_call__ternary.py +0 -28
- package/ref-monty/crates/monty/test_cases/ext_call__try.py +0 -280
- package/ref-monty/crates/monty/test_cases/ext_call__try_simple.py +0 -10
- package/ref-monty/crates/monty/test_cases/ext_call__unary.py +0 -13
- package/ref-monty/crates/monty/test_cases/frozenset__ops.py +0 -178
- package/ref-monty/crates/monty/test_cases/fstring__all.py +0 -236
- package/ref-monty/crates/monty/test_cases/fstring__error_eq_align_on_str.py +0 -3
- package/ref-monty/crates/monty/test_cases/fstring__error_float_f_on_str.py +0 -3
- package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_float.py +0 -3
- package/ref-monty/crates/monty/test_cases/fstring__error_int_d_on_str.py +0 -3
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec.py +0 -4
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_dynamic.py +0 -4
- package/ref-monty/crates/monty/test_cases/fstring__error_invalid_spec_str.py +0 -4
- package/ref-monty/crates/monty/test_cases/fstring__error_str_s_on_int.py +0 -3
- package/ref-monty/crates/monty/test_cases/function__call_duplicate_kwargs.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__call_unpack.py +0 -42
- package/ref-monty/crates/monty/test_cases/function__defaults.py +0 -117
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_arg.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_first_arg.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_duplicate_kwarg_cleanup.py +0 -9
- package/ref-monty/crates/monty/test_cases/function__err_kwonly_as_positional.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_missing_all_posonly.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_missing_heap_cleanup.py +0 -9
- package/ref-monty/crates/monty/test_cases/function__err_missing_kwonly.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_missing_posonly_with_kwarg.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_missing_with_posonly.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_posonly_as_kwarg.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_posonly_first_as_kwarg.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_too_many_posonly.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_too_many_with_kwonly.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_cleanup.py +0 -9
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_quote.py +0 -13
- package/ref-monty/crates/monty/test_cases/function__err_unexpected_kwarg_simple.py +0 -7
- package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_arg.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__err_unpack_duplicate_heap.py +0 -8
- package/ref-monty/crates/monty/test_cases/function__err_unpack_int.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__err_unpack_nonstring_key.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__err_unpack_not_mapping.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__kwargs_unpacking.py +0 -173
- package/ref-monty/crates/monty/test_cases/function__ops.py +0 -294
- package/ref-monty/crates/monty/test_cases/function__return_none.py +0 -42
- package/ref-monty/crates/monty/test_cases/function__signatures.py +0 -47
- package/ref-monty/crates/monty/test_cases/function__too_few_args_all.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__too_few_args_one.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__too_few_args_two.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__too_many_args_one.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__too_many_args_two.py +0 -6
- package/ref-monty/crates/monty/test_cases/function__too_many_args_zero.py +0 -6
- package/ref-monty/crates/monty/test_cases/global__error_assigned_before.py +0 -7
- package/ref-monty/crates/monty/test_cases/global__ops.py +0 -163
- package/ref-monty/crates/monty/test_cases/hash__dict_unhashable.py +0 -2
- package/ref-monty/crates/monty/test_cases/hash__list_unhashable.py +0 -2
- package/ref-monty/crates/monty/test_cases/hash__ops.py +0 -153
- package/ref-monty/crates/monty/test_cases/id__bytes_literals_distinct.py +0 -3
- package/ref-monty/crates/monty/test_cases/id__int_copy_distinct.py +0 -5
- package/ref-monty/crates/monty/test_cases/id__is_number_is_number.py +0 -3
- package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_distinct_types.py +0 -10
- package/ref-monty/crates/monty/test_cases/id__non_overlapping_lifetimes_same_types.py +0 -6
- package/ref-monty/crates/monty/test_cases/id__ops.py +0 -97
- package/ref-monty/crates/monty/test_cases/id__str_literals_same.py +0 -3
- package/ref-monty/crates/monty/test_cases/if__elif_else.py +0 -207
- package/ref-monty/crates/monty/test_cases/if__raise_elif.py +0 -11
- package/ref-monty/crates/monty/test_cases/if__raise_else.py +0 -13
- package/ref-monty/crates/monty/test_cases/if__raise_if.py +0 -9
- package/ref-monty/crates/monty/test_cases/if__raise_in_elif_condition.py +0 -18
- package/ref-monty/crates/monty/test_cases/if__raise_in_if_condition.py +0 -16
- package/ref-monty/crates/monty/test_cases/if_else_expr__all.py +0 -55
- package/ref-monty/crates/monty/test_cases/import__error_cannot_import.py +0 -9
- package/ref-monty/crates/monty/test_cases/import__error_module_not_found.py +0 -9
- package/ref-monty/crates/monty/test_cases/import__local_scope.py +0 -68
- package/ref-monty/crates/monty/test_cases/import__os.py +0 -25
- package/ref-monty/crates/monty/test_cases/import__relative_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/import__relative_no_module_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/import__runtime_error_when_executed.py +0 -14
- package/ref-monty/crates/monty/test_cases/import__star_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/import__sys.py +0 -47
- package/ref-monty/crates/monty/test_cases/import__sys_monty.py +0 -28
- package/ref-monty/crates/monty/test_cases/import__type_checking_guard.py +0 -37
- package/ref-monty/crates/monty/test_cases/import__typing.py +0 -25
- package/ref-monty/crates/monty/test_cases/import__typing_type_ignore.py +0 -4
- package/ref-monty/crates/monty/test_cases/int__bigint.py +0 -467
- package/ref-monty/crates/monty/test_cases/int__bigint_errors.py +0 -260
- package/ref-monty/crates/monty/test_cases/int__ops.py +0 -219
- package/ref-monty/crates/monty/test_cases/int__overflow_division.py +0 -84
- package/ref-monty/crates/monty/test_cases/is_variant__all.py +0 -36
- package/ref-monty/crates/monty/test_cases/isinstance__arg2_list_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/isinstance__arg2_type_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/iter__dict_mutation.py +0 -4
- package/ref-monty/crates/monty/test_cases/iter__for.py +0 -243
- package/ref-monty/crates/monty/test_cases/iter__for_loop_unpacking.py +0 -66
- package/ref-monty/crates/monty/test_cases/iter__generator_expr.py +0 -20
- package/ref-monty/crates/monty/test_cases/iter__generator_expr_type.py +0 -7
- package/ref-monty/crates/monty/test_cases/iter__not_iterable.py +0 -3
- package/ref-monty/crates/monty/test_cases/lambda__all.py +0 -145
- package/ref-monty/crates/monty/test_cases/list__extend_not_iterable.py +0 -7
- package/ref-monty/crates/monty/test_cases/list__getitem_out_of_bounds.py +0 -3
- package/ref-monty/crates/monty/test_cases/list__index_not_found.py +0 -9
- package/ref-monty/crates/monty/test_cases/list__index_start_gt_end.py +0 -10
- package/ref-monty/crates/monty/test_cases/list__ops.py +0 -473
- package/ref-monty/crates/monty/test_cases/list__pop_empty.py +0 -9
- package/ref-monty/crates/monty/test_cases/list__pop_out_of_range.py +0 -9
- package/ref-monty/crates/monty/test_cases/list__pop_type_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/list__remove_not_found.py +0 -9
- package/ref-monty/crates/monty/test_cases/list__setitem_dict_index.py +0 -13
- package/ref-monty/crates/monty/test_cases/list__setitem_huge_int_index.py +0 -13
- package/ref-monty/crates/monty/test_cases/list__setitem_index_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/list__setitem_type_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/list__unpack_type_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/longint__index_error.py +0 -3
- package/ref-monty/crates/monty/test_cases/longint__repeat_error.py +0 -3
- package/ref-monty/crates/monty/test_cases/loop__break_continue.py +0 -113
- package/ref-monty/crates/monty/test_cases/loop__break_finally.py +0 -69
- package/ref-monty/crates/monty/test_cases/loop__break_in_function_error.py +0 -13
- package/ref-monty/crates/monty/test_cases/loop__break_in_if_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/loop__break_nested_except_clears.py +0 -55
- package/ref-monty/crates/monty/test_cases/loop__break_outside_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/loop__continue_finally.py +0 -81
- package/ref-monty/crates/monty/test_cases/loop__continue_in_function_error.py +0 -13
- package/ref-monty/crates/monty/test_cases/loop__continue_in_if_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/loop__continue_nested_except_clears.py +0 -60
- package/ref-monty/crates/monty/test_cases/loop__continue_outside_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/math__acos_domain_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__acosh_domain_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__asin_domain_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__atanh_domain_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__cos_inf_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__cosh_overflow_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__exp_overflow_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__factorial_float_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__factorial_negative_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__floor_inf_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__floor_nan_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__floor_str_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__fmod_inf_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__gamma_neg_int_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__gcd_float_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__isqrt_negative_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__ldexp_overflow_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__log1p_domain_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__log_base1_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__log_zero_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__module.py +0 -1432
- package/ref-monty/crates/monty/test_cases/math__pow_domain_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__sin_inf_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__sqrt_negative_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__tan_inf_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/math__trunc_str_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/method__args_kwargs_unpacking.py +0 -259
- package/ref-monty/crates/monty/test_cases/name_error__unbound_local_func.py +0 -19
- package/ref-monty/crates/monty/test_cases/name_error__unbound_local_module.py +0 -12
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_chained.py +0 -9
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_expr.py +0 -9
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_in_function.py +0 -16
- package/ref-monty/crates/monty/test_cases/name_error__undefined_call_with_args.py +0 -9
- package/ref-monty/crates/monty/test_cases/name_error__undefined_global.py +0 -10
- package/ref-monty/crates/monty/test_cases/namedtuple__missing_attr.py +0 -11
- package/ref-monty/crates/monty/test_cases/namedtuple__ops.py +0 -34
- package/ref-monty/crates/monty/test_cases/nonlocal__error_module_level.py +0 -3
- package/ref-monty/crates/monty/test_cases/nonlocal__ops.py +0 -353
- package/ref-monty/crates/monty/test_cases/os__environ.py +0 -40
- package/ref-monty/crates/monty/test_cases/os__getenv_key_list_error.py +0 -5
- package/ref-monty/crates/monty/test_cases/os__getenv_key_type_error.py +0 -5
- package/ref-monty/crates/monty/test_cases/parse_error__complex.py +0 -3
- package/ref-monty/crates/monty/test_cases/pathlib__import.py +0 -11
- package/ref-monty/crates/monty/test_cases/pathlib__os.py +0 -136
- package/ref-monty/crates/monty/test_cases/pathlib__os_read_error.py +0 -12
- package/ref-monty/crates/monty/test_cases/pathlib__pure.py +0 -81
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_dict_self.py +0 -5
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_dict.py +0 -6
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_list_self.py +0 -5
- package/ref-monty/crates/monty/test_cases/pyobject__cycle_multiple_refs.py +0 -6
- package/ref-monty/crates/monty/test_cases/range__error_no_args.py +0 -2
- package/ref-monty/crates/monty/test_cases/range__error_step_zero.py +0 -2
- package/ref-monty/crates/monty/test_cases/range__error_too_many_args.py +0 -2
- package/ref-monty/crates/monty/test_cases/range__getitem_index_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/range__ops.py +0 -236
- package/ref-monty/crates/monty/test_cases/re__basic.py +0 -756
- package/ref-monty/crates/monty/test_cases/re__grouping.py +0 -241
- package/ref-monty/crates/monty/test_cases/re__match.py +0 -148
- package/ref-monty/crates/monty/test_cases/recursion__deep_drop.py +0 -26
- package/ref-monty/crates/monty/test_cases/recursion__deep_eq.py +0 -23
- package/ref-monty/crates/monty/test_cases/recursion__deep_hash.py +0 -46
- package/ref-monty/crates/monty/test_cases/recursion__deep_repr.py +0 -12
- package/ref-monty/crates/monty/test_cases/recursion__function_depth.py +0 -13
- package/ref-monty/crates/monty/test_cases/refcount__cycle_mutual_reference.py +0 -18
- package/ref-monty/crates/monty/test_cases/refcount__cycle_self_reference.py +0 -12
- package/ref-monty/crates/monty/test_cases/refcount__dict_basic.py +0 -5
- package/ref-monty/crates/monty/test_cases/refcount__dict_get.py +0 -5
- package/ref-monty/crates/monty/test_cases/refcount__dict_keys_and.py +0 -14
- package/ref-monty/crates/monty/test_cases/refcount__dict_overwrite.py +0 -6
- package/ref-monty/crates/monty/test_cases/refcount__gather_cleanup.py +0 -16
- package/ref-monty/crates/monty/test_cases/refcount__gather_exception.py +0 -18
- package/ref-monty/crates/monty/test_cases/refcount__gather_nested_cancel.py +0 -25
- package/ref-monty/crates/monty/test_cases/refcount__immediate_skipped.py +0 -4
- package/ref-monty/crates/monty/test_cases/refcount__kwargs_unpacking.py +0 -27
- package/ref-monty/crates/monty/test_cases/refcount__list_append_multiple.py +0 -6
- package/ref-monty/crates/monty/test_cases/refcount__list_append_ref.py +0 -5
- package/ref-monty/crates/monty/test_cases/refcount__list_concat.py +0 -5
- package/ref-monty/crates/monty/test_cases/refcount__list_getitem.py +0 -5
- package/ref-monty/crates/monty/test_cases/refcount__list_iadd.py +0 -5
- package/ref-monty/crates/monty/test_cases/refcount__nested_list.py +0 -4
- package/ref-monty/crates/monty/test_cases/refcount__re_pattern_sub_error_paths.py +0 -37
- package/ref-monty/crates/monty/test_cases/refcount__re_search_match.py +0 -34
- package/ref-monty/crates/monty/test_cases/refcount__re_sub_error_paths.py +0 -31
- package/ref-monty/crates/monty/test_cases/refcount__shared_reference.py +0 -4
- package/ref-monty/crates/monty/test_cases/refcount__single_list.py +0 -3
- package/ref-monty/crates/monty/test_cases/repr__cycle_detection.py +0 -24
- package/ref-monty/crates/monty/test_cases/set__ops.py +0 -191
- package/ref-monty/crates/monty/test_cases/set__review_bugs.py +0 -35
- package/ref-monty/crates/monty/test_cases/set__unpack_type_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/slice__invalid_indices.py +0 -2
- package/ref-monty/crates/monty/test_cases/slice__kwargs.py +0 -9
- package/ref-monty/crates/monty/test_cases/slice__no_args.py +0 -9
- package/ref-monty/crates/monty/test_cases/slice__ops.py +0 -149
- package/ref-monty/crates/monty/test_cases/slice__step_zero.py +0 -9
- package/ref-monty/crates/monty/test_cases/slice__step_zero_bytes.py +0 -9
- package/ref-monty/crates/monty/test_cases/slice__step_zero_range.py +0 -9
- package/ref-monty/crates/monty/test_cases/slice__step_zero_str.py +0 -9
- package/ref-monty/crates/monty/test_cases/slice__step_zero_tuple.py +0 -9
- package/ref-monty/crates/monty/test_cases/slice__too_many_args.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__getitem_index_error.py +0 -10
- package/ref-monty/crates/monty/test_cases/str__index_not_found.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__join_no_args.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__join_non_string.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__join_not_iterable.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__join_too_many_args.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__methods.py +0 -327
- package/ref-monty/crates/monty/test_cases/str__ops.py +0 -162
- package/ref-monty/crates/monty/test_cases/str__partition_empty.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__rsplit_empty_sep.py +0 -9
- package/ref-monty/crates/monty/test_cases/str__split_empty_sep.py +0 -9
- package/ref-monty/crates/monty/test_cases/sys__types.py +0 -7
- package/ref-monty/crates/monty/test_cases/traceback__division_error.py +0 -30
- package/ref-monty/crates/monty/test_cases/traceback__index_error.py +0 -17
- package/ref-monty/crates/monty/test_cases/traceback__insert_as_int.py +0 -10
- package/ref-monty/crates/monty/test_cases/traceback__nested_call.py +0 -29
- package/ref-monty/crates/monty/test_cases/traceback__nonlocal_module_scope.py +0 -10
- package/ref-monty/crates/monty/test_cases/traceback__nonlocal_unbound.py +0 -24
- package/ref-monty/crates/monty/test_cases/traceback__range_as_int.py +0 -9
- package/ref-monty/crates/monty/test_cases/traceback__recursion_error.py +0 -23
- package/ref-monty/crates/monty/test_cases/traceback__set_mutation.py +0 -11
- package/ref-monty/crates/monty/test_cases/traceback__undefined_attr_call.py +0 -16
- package/ref-monty/crates/monty/test_cases/traceback__undefined_call.py +0 -16
- package/ref-monty/crates/monty/test_cases/traceback__undefined_raise.py +0 -16
- package/ref-monty/crates/monty/test_cases/try_except__all.py +0 -472
- package/ref-monty/crates/monty/test_cases/try_except__bare_raise_no_context.py +0 -2
- package/ref-monty/crates/monty/test_cases/try_except__invalid_type.py +0 -5
- package/ref-monty/crates/monty/test_cases/tuple__getitem_out_of_bounds.py +0 -3
- package/ref-monty/crates/monty/test_cases/tuple__index_not_found.py +0 -9
- package/ref-monty/crates/monty/test_cases/tuple__index_start_gt_end.py +0 -10
- package/ref-monty/crates/monty/test_cases/tuple__methods.py +0 -19
- package/ref-monty/crates/monty/test_cases/tuple__ops.py +0 -133
- package/ref-monty/crates/monty/test_cases/tuple__unpack_type_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/type__builtin_attr_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/type__bytes_negative.py +0 -2
- package/ref-monty/crates/monty/test_cases/type__cell_not_builtin.py +0 -9
- package/ref-monty/crates/monty/test_cases/type__exception_attr_error.py +0 -11
- package/ref-monty/crates/monty/test_cases/type__float_conversion_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/type__float_repr_both_quotes.py +0 -9
- package/ref-monty/crates/monty/test_cases/type__float_repr_newline.py +0 -9
- package/ref-monty/crates/monty/test_cases/type__float_repr_single_quote.py +0 -9
- package/ref-monty/crates/monty/test_cases/type__int_conversion_error.py +0 -2
- package/ref-monty/crates/monty/test_cases/type__list_not_iterable.py +0 -2
- package/ref-monty/crates/monty/test_cases/type__non_builtin_name_error.py +0 -9
- package/ref-monty/crates/monty/test_cases/type__ops.py +0 -200
- package/ref-monty/crates/monty/test_cases/type__shadow_exc.py +0 -3
- package/ref-monty/crates/monty/test_cases/type__shadow_int.py +0 -9
- package/ref-monty/crates/monty/test_cases/type__shadow_len.py +0 -3
- package/ref-monty/crates/monty/test_cases/type__tuple_not_iterable.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__int_add_list.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__int_div_str.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__int_floordiv_str.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__int_iadd_str.py +0 -3
- package/ref-monty/crates/monty/test_cases/type_error__int_mod_str.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__int_pow_str.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__int_sub_str.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__list_add_int.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__list_add_str.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__list_iadd_int.py +0 -6
- package/ref-monty/crates/monty/test_cases/type_error__str_add_int.py +0 -2
- package/ref-monty/crates/monty/test_cases/type_error__str_iadd_int.py +0 -3
- package/ref-monty/crates/monty/test_cases/type_error__unary_invert_str.py +0 -3
- package/ref-monty/crates/monty/test_cases/type_error__unary_minus_str.py +0 -4
- package/ref-monty/crates/monty/test_cases/type_error__unary_neg_str.py +0 -3
- package/ref-monty/crates/monty/test_cases/type_error__unary_plus_str.py +0 -4
- package/ref-monty/crates/monty/test_cases/typing__types.py +0 -24
- package/ref-monty/crates/monty/test_cases/unpack__nested.py +0 -48
- package/ref-monty/crates/monty/test_cases/unpack__non_sequence.py +0 -9
- package/ref-monty/crates/monty/test_cases/unpack__not_enough.py +0 -9
- package/ref-monty/crates/monty/test_cases/unpack__ops.py +0 -153
- package/ref-monty/crates/monty/test_cases/unpack__star_not_enough.py +0 -9
- package/ref-monty/crates/monty/test_cases/unpack__too_many.py +0 -9
- package/ref-monty/crates/monty/test_cases/version__cpython.py +0 -4
- package/ref-monty/crates/monty/test_cases/walrus__all.py +0 -178
- package/ref-monty/crates/monty/test_cases/while__all.py +0 -206
- package/ref-monty/crates/monty/tests/asyncio.rs +0 -764
- package/ref-monty/crates/monty/tests/binary_serde.rs +0 -185
- package/ref-monty/crates/monty/tests/bytecode_limits.rs +0 -248
- package/ref-monty/crates/monty/tests/datatest_runner.rs +0 -2029
- package/ref-monty/crates/monty/tests/inputs.rs +0 -420
- package/ref-monty/crates/monty/tests/json_serde.rs +0 -250
- package/ref-monty/crates/monty/tests/main.rs +0 -71
- package/ref-monty/crates/monty/tests/math_module.rs +0 -114
- package/ref-monty/crates/monty/tests/name_lookup.rs +0 -482
- package/ref-monty/crates/monty/tests/os_tests.rs +0 -459
- package/ref-monty/crates/monty/tests/parse_errors.rs +0 -441
- package/ref-monty/crates/monty/tests/print_writer.rs +0 -238
- package/ref-monty/crates/monty/tests/py_object.rs +0 -121
- package/ref-monty/crates/monty/tests/regex.rs +0 -90
- package/ref-monty/crates/monty/tests/repl.rs +0 -344
- package/ref-monty/crates/monty/tests/resource_limits.rs +0 -1826
- package/ref-monty/crates/monty/tests/try_from.rs +0 -167
- package/ref-monty/crates/monty-cli/Cargo.toml +0 -25
- package/ref-monty/crates/monty-cli/src/main.rs +0 -541
- package/ref-monty/crates/monty-js/.cargo/config.toml +0 -2
- package/ref-monty/crates/monty-js/.prettierignore +0 -8
- package/ref-monty/crates/monty-js/Cargo.toml +0 -32
- package/ref-monty/crates/monty-js/README.md +0 -207
- package/ref-monty/crates/monty-js/__test__/async.spec.ts +0 -350
- package/ref-monty/crates/monty-js/__test__/basic.spec.ts +0 -114
- package/ref-monty/crates/monty-js/__test__/exceptions.spec.ts +0 -427
- package/ref-monty/crates/monty-js/__test__/external.spec.ts +0 -354
- package/ref-monty/crates/monty-js/__test__/inputs.spec.ts +0 -143
- package/ref-monty/crates/monty-js/__test__/limits.spec.ts +0 -162
- package/ref-monty/crates/monty-js/__test__/package.json +0 -3
- package/ref-monty/crates/monty-js/__test__/print.spec.ts +0 -229
- package/ref-monty/crates/monty-js/__test__/repl.spec.ts +0 -34
- package/ref-monty/crates/monty-js/__test__/serialize.spec.ts +0 -205
- package/ref-monty/crates/monty-js/__test__/start.spec.ts +0 -443
- package/ref-monty/crates/monty-js/__test__/type_check.spec.ts +0 -147
- package/ref-monty/crates/monty-js/__test__/types.spec.ts +0 -319
- package/ref-monty/crates/monty-js/build.rs +0 -61
- package/ref-monty/crates/monty-js/index-header.d.ts +0 -3
- package/ref-monty/crates/monty-js/package-lock.json +0 -4694
- package/ref-monty/crates/monty-js/package.json +0 -100
- package/ref-monty/crates/monty-js/scripts/smoke-test.sh +0 -69
- package/ref-monty/crates/monty-js/smoke-test/package.json +0 -17
- package/ref-monty/crates/monty-js/smoke-test/test.ts +0 -171
- package/ref-monty/crates/monty-js/smoke-test/tsconfig.json +0 -11
- package/ref-monty/crates/monty-js/src/convert.rs +0 -648
- package/ref-monty/crates/monty-js/src/exceptions.rs +0 -293
- package/ref-monty/crates/monty-js/src/lib.rs +0 -41
- package/ref-monty/crates/monty-js/src/limits.rs +0 -53
- package/ref-monty/crates/monty-js/src/monty_cls.rs +0 -1407
- package/ref-monty/crates/monty-js/tsconfig.json +0 -17
- package/ref-monty/crates/monty-js/wrapper.ts +0 -701
- package/ref-monty/crates/monty-python/Cargo.toml +0 -38
- package/ref-monty/crates/monty-python/README.md +0 -134
- package/ref-monty/crates/monty-python/build.rs +0 -4
- package/ref-monty/crates/monty-python/example.py +0 -40
- package/ref-monty/crates/monty-python/exercise.py +0 -46
- package/ref-monty/crates/monty-python/pyproject.toml +0 -57
- package/ref-monty/crates/monty-python/python/pydantic_monty/__init__.py +0 -281
- package/ref-monty/crates/monty-python/python/pydantic_monty/_monty.pyi +0 -677
- package/ref-monty/crates/monty-python/python/pydantic_monty/os_access.py +0 -933
- package/ref-monty/crates/monty-python/python/pydantic_monty/py.typed +0 -0
- package/ref-monty/crates/monty-python/src/convert.rs +0 -273
- package/ref-monty/crates/monty-python/src/dataclass.rs +0 -461
- package/ref-monty/crates/monty-python/src/exceptions.rs +0 -557
- package/ref-monty/crates/monty-python/src/external.rs +0 -165
- package/ref-monty/crates/monty-python/src/lib.rs +0 -77
- package/ref-monty/crates/monty-python/src/limits.rs +0 -142
- package/ref-monty/crates/monty-python/src/monty_cls.rs +0 -1650
- package/ref-monty/crates/monty-python/src/repl.rs +0 -470
- package/ref-monty/crates/monty-python/src/serialization.rs +0 -761
- package/ref-monty/crates/monty-python/tests/test_async.py +0 -1201
- package/ref-monty/crates/monty-python/tests/test_basic.py +0 -66
- package/ref-monty/crates/monty-python/tests/test_dataclasses.py +0 -971
- package/ref-monty/crates/monty-python/tests/test_exceptions.py +0 -361
- package/ref-monty/crates/monty-python/tests/test_external.py +0 -367
- package/ref-monty/crates/monty-python/tests/test_inputs.py +0 -126
- package/ref-monty/crates/monty-python/tests/test_limits.py +0 -257
- package/ref-monty/crates/monty-python/tests/test_os_access.py +0 -1286
- package/ref-monty/crates/monty-python/tests/test_os_access_compat.py +0 -731
- package/ref-monty/crates/monty-python/tests/test_os_access_raw.py +0 -483
- package/ref-monty/crates/monty-python/tests/test_os_calls.py +0 -819
- package/ref-monty/crates/monty-python/tests/test_print.py +0 -208
- package/ref-monty/crates/monty-python/tests/test_re.py +0 -170
- package/ref-monty/crates/monty-python/tests/test_readme_examples.py +0 -20
- package/ref-monty/crates/monty-python/tests/test_repl.py +0 -749
- package/ref-monty/crates/monty-python/tests/test_serialize.py +0 -284
- package/ref-monty/crates/monty-python/tests/test_start.py +0 -346
- package/ref-monty/crates/monty-python/tests/test_threading.py +0 -163
- package/ref-monty/crates/monty-python/tests/test_type_check.py +0 -344
- package/ref-monty/crates/monty-python/tests/test_types.py +0 -553
- package/ref-monty/crates/monty-type-checking/Cargo.toml +0 -32
- package/ref-monty/crates/monty-type-checking/src/db.rs +0 -116
- package/ref-monty/crates/monty-type-checking/src/lib.rs +0 -4
- package/ref-monty/crates/monty-type-checking/src/type_check.rs +0 -280
- package/ref-monty/crates/monty-type-checking/tests/bad_types.py +0 -109
- package/ref-monty/crates/monty-type-checking/tests/bad_types_output.txt +0 -21
- package/ref-monty/crates/monty-type-checking/tests/good_types.py +0 -475
- package/ref-monty/crates/monty-type-checking/tests/main.rs +0 -205
- package/ref-monty/crates/monty-type-checking/tests/reveal_types.py +0 -56
- package/ref-monty/crates/monty-type-checking/tests/reveal_types_output.txt +0 -41
- package/ref-monty/crates/monty-typeshed/Cargo.toml +0 -29
- package/ref-monty/crates/monty-typeshed/README.md +0 -11
- package/ref-monty/crates/monty-typeshed/build.rs +0 -101
- package/ref-monty/crates/monty-typeshed/custom/README.md +0 -1
- package/ref-monty/crates/monty-typeshed/custom/asyncio.pyi +0 -138
- package/ref-monty/crates/monty-typeshed/custom/os.pyi +0 -87
- package/ref-monty/crates/monty-typeshed/custom/sys.pyi +0 -33
- package/ref-monty/crates/monty-typeshed/src/lib.rs +0 -56
- package/ref-monty/crates/monty-typeshed/update.py +0 -321
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/source_commit.txt +0 -1
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/VERSIONS +0 -20
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_collections_abc.pyi +0 -105
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/_typeshed/__init__.pyi +0 -394
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/asyncio.pyi +0 -138
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/builtins.pyi +0 -1434
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/__init__.pyi +0 -527
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/collections/abc.pyi +0 -2
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/dataclasses.pyi +0 -502
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/enum.pyi +0 -376
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/math.pyi +0 -149
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/os.pyi +0 -87
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/__init__.pyi +0 -395
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/pathlib/types.pyi +0 -8
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/re.pyi +0 -337
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/sys.pyi +0 -33
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/types.pyi +0 -741
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing.pyi +0 -1217
- package/ref-monty/crates/monty-typeshed/vendor/typeshed/stdlib/typing_extensions.pyi +0 -716
- package/ref-monty/docs/usage-guide.md +0 -117
- package/ref-monty/examples/README.md +0 -3
- package/ref-monty/examples/expense_analysis/README.md +0 -3
- package/ref-monty/examples/expense_analysis/data.py +0 -124
- package/ref-monty/examples/expense_analysis/main.py +0 -115
- package/ref-monty/examples/sql_playground/README.md +0 -20
- package/ref-monty/examples/sql_playground/external_functions.py +0 -129
- package/ref-monty/examples/sql_playground/main.py +0 -81
- package/ref-monty/examples/sql_playground/sandbox_code.py +0 -82
- package/ref-monty/examples/sql_playground/type_stubs.pyi +0 -14
- package/ref-monty/examples/web_scraper/README.md +0 -15
- package/ref-monty/examples/web_scraper/browser.py +0 -56
- package/ref-monty/examples/web_scraper/example_code.py +0 -59
- package/ref-monty/examples/web_scraper/external_functions.py +0 -324
- package/ref-monty/examples/web_scraper/main.py +0 -193
- package/ref-monty/examples/web_scraper/sub_agent.py +0 -79
- package/ref-monty/monty-npm.md +0 -235
- package/ref-monty/pyproject.toml +0 -162
- package/ref-monty/scripts/check_imports.py +0 -91
- package/ref-monty/scripts/codecov_diff.py +0 -412
- package/ref-monty/scripts/complete_tests.py +0 -146
- package/ref-monty/scripts/flamegraph_to_text.py +0 -208
- package/ref-monty/scripts/iter_test_methods.py +0 -540
- package/ref-monty/scripts/run_traceback.py +0 -180
- package/ref-monty/scripts/startup_performance.py +0 -130
- package/ref-monty/uv.lock +0 -1779
- package/temp_resend_cli/repo/.github/scripts/pr-title-check.js +0 -34
- package/temp_resend_cli/repo/.github/workflows/ci.yml +0 -67
- package/temp_resend_cli/repo/.github/workflows/post-release.yml +0 -51
- package/temp_resend_cli/repo/.github/workflows/pr-title-check.yml +0 -13
- package/temp_resend_cli/repo/.github/workflows/release.yml +0 -175
- package/temp_resend_cli/repo/.github/workflows/test-install-unix.yml +0 -34
- package/temp_resend_cli/repo/.github/workflows/test-install-windows.yml +0 -48
- package/temp_resend_cli/repo/CHANGELOG.md +0 -31
- package/temp_resend_cli/repo/LICENSE +0 -21
- package/temp_resend_cli/repo/README.md +0 -450
- package/temp_resend_cli/repo/biome.json +0 -36
- package/temp_resend_cli/repo/install.ps1 +0 -141
- package/temp_resend_cli/repo/install.sh +0 -301
- package/temp_resend_cli/repo/package.json +0 -61
- package/temp_resend_cli/repo/pnpm-lock.yaml +0 -2439
- package/temp_resend_cli/repo/renovate.json +0 -4
- package/temp_resend_cli/repo/src/cli.ts +0 -98
- package/temp_resend_cli/repo/src/commands/api-keys/create.ts +0 -114
- package/temp_resend_cli/repo/src/commands/api-keys/delete.ts +0 -47
- package/temp_resend_cli/repo/src/commands/api-keys/index.ts +0 -26
- package/temp_resend_cli/repo/src/commands/api-keys/list.ts +0 -35
- package/temp_resend_cli/repo/src/commands/api-keys/utils.ts +0 -8
- package/temp_resend_cli/repo/src/commands/auth/index.ts +0 -20
- package/temp_resend_cli/repo/src/commands/auth/login.ts +0 -234
- package/temp_resend_cli/repo/src/commands/auth/logout.ts +0 -105
- package/temp_resend_cli/repo/src/commands/broadcasts/create.ts +0 -196
- package/temp_resend_cli/repo/src/commands/broadcasts/delete.ts +0 -46
- package/temp_resend_cli/repo/src/commands/broadcasts/get.ts +0 -59
- package/temp_resend_cli/repo/src/commands/broadcasts/index.ts +0 -43
- package/temp_resend_cli/repo/src/commands/broadcasts/list.ts +0 -60
- package/temp_resend_cli/repo/src/commands/broadcasts/send.ts +0 -56
- package/temp_resend_cli/repo/src/commands/broadcasts/update.ts +0 -95
- package/temp_resend_cli/repo/src/commands/broadcasts/utils.ts +0 -35
- package/temp_resend_cli/repo/src/commands/contact-properties/create.ts +0 -118
- package/temp_resend_cli/repo/src/commands/contact-properties/delete.ts +0 -48
- package/temp_resend_cli/repo/src/commands/contact-properties/get.ts +0 -46
- package/temp_resend_cli/repo/src/commands/contact-properties/index.ts +0 -48
- package/temp_resend_cli/repo/src/commands/contact-properties/list.ts +0 -68
- package/temp_resend_cli/repo/src/commands/contact-properties/update.ts +0 -88
- package/temp_resend_cli/repo/src/commands/contact-properties/utils.ts +0 -17
- package/temp_resend_cli/repo/src/commands/contacts/add-segment.ts +0 -78
- package/temp_resend_cli/repo/src/commands/contacts/create.ts +0 -122
- package/temp_resend_cli/repo/src/commands/contacts/delete.ts +0 -49
- package/temp_resend_cli/repo/src/commands/contacts/get.ts +0 -53
- package/temp_resend_cli/repo/src/commands/contacts/index.ts +0 -58
- package/temp_resend_cli/repo/src/commands/contacts/list.ts +0 -57
- package/temp_resend_cli/repo/src/commands/contacts/remove-segment.ts +0 -48
- package/temp_resend_cli/repo/src/commands/contacts/segments.ts +0 -39
- package/temp_resend_cli/repo/src/commands/contacts/topics.ts +0 -45
- package/temp_resend_cli/repo/src/commands/contacts/update-topics.ts +0 -90
- package/temp_resend_cli/repo/src/commands/contacts/update.ts +0 -77
- package/temp_resend_cli/repo/src/commands/contacts/utils.ts +0 -119
- package/temp_resend_cli/repo/src/commands/doctor.ts +0 -216
- package/temp_resend_cli/repo/src/commands/domains/create.ts +0 -83
- package/temp_resend_cli/repo/src/commands/domains/delete.ts +0 -42
- package/temp_resend_cli/repo/src/commands/domains/get.ts +0 -47
- package/temp_resend_cli/repo/src/commands/domains/index.ts +0 -35
- package/temp_resend_cli/repo/src/commands/domains/list.ts +0 -53
- package/temp_resend_cli/repo/src/commands/domains/update.ts +0 -75
- package/temp_resend_cli/repo/src/commands/domains/utils.ts +0 -44
- package/temp_resend_cli/repo/src/commands/domains/verify.ts +0 -38
- package/temp_resend_cli/repo/src/commands/emails/batch.ts +0 -140
- package/temp_resend_cli/repo/src/commands/emails/get.ts +0 -44
- package/temp_resend_cli/repo/src/commands/emails/index.ts +0 -30
- package/temp_resend_cli/repo/src/commands/emails/list.ts +0 -84
- package/temp_resend_cli/repo/src/commands/emails/receiving/attachment.ts +0 -55
- package/temp_resend_cli/repo/src/commands/emails/receiving/attachments.ts +0 -68
- package/temp_resend_cli/repo/src/commands/emails/receiving/get.ts +0 -58
- package/temp_resend_cli/repo/src/commands/emails/receiving/index.ts +0 -28
- package/temp_resend_cli/repo/src/commands/emails/receiving/list.ts +0 -59
- package/temp_resend_cli/repo/src/commands/emails/receiving/utils.ts +0 -38
- package/temp_resend_cli/repo/src/commands/emails/send.ts +0 -189
- package/temp_resend_cli/repo/src/commands/open.ts +0 -27
- package/temp_resend_cli/repo/src/commands/segments/create.ts +0 -50
- package/temp_resend_cli/repo/src/commands/segments/delete.ts +0 -47
- package/temp_resend_cli/repo/src/commands/segments/get.ts +0 -38
- package/temp_resend_cli/repo/src/commands/segments/index.ts +0 -36
- package/temp_resend_cli/repo/src/commands/segments/list.ts +0 -58
- package/temp_resend_cli/repo/src/commands/segments/utils.ts +0 -7
- package/temp_resend_cli/repo/src/commands/teams/index.ts +0 -10
- package/temp_resend_cli/repo/src/commands/teams/list.ts +0 -35
- package/temp_resend_cli/repo/src/commands/teams/remove.ts +0 -86
- package/temp_resend_cli/repo/src/commands/teams/switch.ts +0 -76
- package/temp_resend_cli/repo/src/commands/topics/create.ts +0 -73
- package/temp_resend_cli/repo/src/commands/topics/delete.ts +0 -47
- package/temp_resend_cli/repo/src/commands/topics/get.ts +0 -42
- package/temp_resend_cli/repo/src/commands/topics/index.ts +0 -42
- package/temp_resend_cli/repo/src/commands/topics/list.ts +0 -34
- package/temp_resend_cli/repo/src/commands/topics/update.ts +0 -59
- package/temp_resend_cli/repo/src/commands/topics/utils.ts +0 -16
- package/temp_resend_cli/repo/src/commands/webhooks/create.ts +0 -128
- package/temp_resend_cli/repo/src/commands/webhooks/delete.ts +0 -49
- package/temp_resend_cli/repo/src/commands/webhooks/get.ts +0 -42
- package/temp_resend_cli/repo/src/commands/webhooks/index.ts +0 -42
- package/temp_resend_cli/repo/src/commands/webhooks/list.ts +0 -55
- package/temp_resend_cli/repo/src/commands/webhooks/listen.ts +0 -379
- package/temp_resend_cli/repo/src/commands/webhooks/update.ts +0 -83
- package/temp_resend_cli/repo/src/commands/webhooks/utils.ts +0 -36
- package/temp_resend_cli/repo/src/commands/whoami.ts +0 -71
- package/temp_resend_cli/repo/src/lib/actions.ts +0 -157
- package/temp_resend_cli/repo/src/lib/client.ts +0 -37
- package/temp_resend_cli/repo/src/lib/config.ts +0 -217
- package/temp_resend_cli/repo/src/lib/files.ts +0 -15
- package/temp_resend_cli/repo/src/lib/help-text.ts +0 -38
- package/temp_resend_cli/repo/src/lib/output.ts +0 -56
- package/temp_resend_cli/repo/src/lib/pagination.ts +0 -36
- package/temp_resend_cli/repo/src/lib/prompts.ts +0 -149
- package/temp_resend_cli/repo/src/lib/spinner.ts +0 -100
- package/temp_resend_cli/repo/src/lib/table.ts +0 -57
- package/temp_resend_cli/repo/src/lib/tty.ts +0 -28
- package/temp_resend_cli/repo/src/lib/update-check.ts +0 -169
- package/temp_resend_cli/repo/src/lib/version.ts +0 -4
- package/temp_resend_cli/repo/tests/commands/api-keys/create.test.ts +0 -196
- package/temp_resend_cli/repo/tests/commands/api-keys/delete.test.ts +0 -157
- package/temp_resend_cli/repo/tests/commands/api-keys/list.test.ts +0 -134
- package/temp_resend_cli/repo/tests/commands/auth/login.test.ts +0 -153
- package/temp_resend_cli/repo/tests/commands/auth/logout.test.ts +0 -153
- package/temp_resend_cli/repo/tests/commands/broadcasts/create.test.ts +0 -454
- package/temp_resend_cli/repo/tests/commands/broadcasts/delete.test.ts +0 -183
- package/temp_resend_cli/repo/tests/commands/broadcasts/get.test.ts +0 -147
- package/temp_resend_cli/repo/tests/commands/broadcasts/list.test.ts +0 -199
- package/temp_resend_cli/repo/tests/commands/broadcasts/send.test.ts +0 -162
- package/temp_resend_cli/repo/tests/commands/broadcasts/update.test.ts +0 -288
- package/temp_resend_cli/repo/tests/commands/contact-properties/create.test.ts +0 -251
- package/temp_resend_cli/repo/tests/commands/contact-properties/delete.test.ts +0 -184
- package/temp_resend_cli/repo/tests/commands/contact-properties/get.test.ts +0 -145
- package/temp_resend_cli/repo/tests/commands/contact-properties/list.test.ts +0 -181
- package/temp_resend_cli/repo/tests/commands/contact-properties/update.test.ts +0 -217
- package/temp_resend_cli/repo/tests/commands/contacts/add-segment.test.ts +0 -189
- package/temp_resend_cli/repo/tests/commands/contacts/create.test.ts +0 -271
- package/temp_resend_cli/repo/tests/commands/contacts/delete.test.ts +0 -193
- package/temp_resend_cli/repo/tests/commands/contacts/get.test.ts +0 -149
- package/temp_resend_cli/repo/tests/commands/contacts/list.test.ts +0 -176
- package/temp_resend_cli/repo/tests/commands/contacts/remove-segment.test.ts +0 -167
- package/temp_resend_cli/repo/tests/commands/contacts/segments.test.ts +0 -168
- package/temp_resend_cli/repo/tests/commands/contacts/topics.test.ts +0 -164
- package/temp_resend_cli/repo/tests/commands/contacts/update-topics.test.ts +0 -248
- package/temp_resend_cli/repo/tests/commands/contacts/update.test.ts +0 -206
- package/temp_resend_cli/repo/tests/commands/doctor.test.ts +0 -164
- package/temp_resend_cli/repo/tests/commands/domains/create.test.ts +0 -193
- package/temp_resend_cli/repo/tests/commands/domains/delete.test.ts +0 -157
- package/temp_resend_cli/repo/tests/commands/domains/get.test.ts +0 -138
- package/temp_resend_cli/repo/tests/commands/domains/list.test.ts +0 -165
- package/temp_resend_cli/repo/tests/commands/domains/update.test.ts +0 -224
- package/temp_resend_cli/repo/tests/commands/domains/verify.test.ts +0 -118
- package/temp_resend_cli/repo/tests/commands/emails/batch.test.ts +0 -324
- package/temp_resend_cli/repo/tests/commands/emails/get.test.ts +0 -132
- package/temp_resend_cli/repo/tests/commands/emails/receiving/attachment.test.ts +0 -141
- package/temp_resend_cli/repo/tests/commands/emails/receiving/attachments.test.ts +0 -169
- package/temp_resend_cli/repo/tests/commands/emails/receiving/get.test.ts +0 -141
- package/temp_resend_cli/repo/tests/commands/emails/receiving/list.test.ts +0 -182
- package/temp_resend_cli/repo/tests/commands/emails/send.test.ts +0 -312
- package/temp_resend_cli/repo/tests/commands/segments/create.test.ts +0 -164
- package/temp_resend_cli/repo/tests/commands/segments/delete.test.ts +0 -183
- package/temp_resend_cli/repo/tests/commands/segments/get.test.ts +0 -138
- package/temp_resend_cli/repo/tests/commands/segments/list.test.ts +0 -174
- package/temp_resend_cli/repo/tests/commands/teams/list.test.ts +0 -62
- package/temp_resend_cli/repo/tests/commands/teams/remove.test.ts +0 -110
- package/temp_resend_cli/repo/tests/commands/teams/switch.test.ts +0 -103
- package/temp_resend_cli/repo/tests/commands/topics/create.test.ts +0 -192
- package/temp_resend_cli/repo/tests/commands/topics/delete.test.ts +0 -157
- package/temp_resend_cli/repo/tests/commands/topics/get.test.ts +0 -126
- package/temp_resend_cli/repo/tests/commands/topics/list.test.ts +0 -125
- package/temp_resend_cli/repo/tests/commands/topics/update.test.ts +0 -178
- package/temp_resend_cli/repo/tests/commands/webhooks/create.test.ts +0 -225
- package/temp_resend_cli/repo/tests/commands/webhooks/delete.test.ts +0 -157
- package/temp_resend_cli/repo/tests/commands/webhooks/get.test.ts +0 -126
- package/temp_resend_cli/repo/tests/commands/webhooks/list.test.ts +0 -178
- package/temp_resend_cli/repo/tests/commands/webhooks/update.test.ts +0 -207
- package/temp_resend_cli/repo/tests/commands/whoami.test.ts +0 -98
- package/temp_resend_cli/repo/tests/e2e/smoke.test.ts +0 -93
- package/temp_resend_cli/repo/tests/helpers.ts +0 -86
- package/temp_resend_cli/repo/tests/lib/client.test.ts +0 -71
- package/temp_resend_cli/repo/tests/lib/config.test.ts +0 -451
- package/temp_resend_cli/repo/tests/lib/files.test.ts +0 -73
- package/temp_resend_cli/repo/tests/lib/help-text.test.ts +0 -97
- package/temp_resend_cli/repo/tests/lib/output.test.ts +0 -136
- package/temp_resend_cli/repo/tests/lib/prompts.test.ts +0 -185
- package/temp_resend_cli/repo/tests/lib/spinner.test.ts +0 -166
- package/temp_resend_cli/repo/tests/lib/table.test.ts +0 -63
- package/temp_resend_cli/repo/tests/lib/tty.test.ts +0 -89
- package/temp_resend_cli/repo/tests/lib/update-check.test.ts +0 -179
- package/temp_resend_cli/repo/tsconfig.json +0 -14
- package/temp_resend_cli/repo/vitest.config.e2e.ts +0 -8
- package/temp_resend_cli/repo/vitest.config.ts +0 -10
- /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
|
-
}
|