ashlr-plugin 1.36.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +39 -0
  3. package/.claude-plugin/plugin.json +36 -0
  4. package/.codex/agents/README.md +9 -0
  5. package/.codex/agents/ashlr-explorer.md +36 -0
  6. package/.codex/agents/ashlr-worker.md +38 -0
  7. package/.codex-plugin/plugin.json +45 -0
  8. package/.mcp.json +14 -0
  9. package/LICENSE +21 -0
  10. package/README.md +311 -0
  11. package/agents/ashlr-code.md +69 -0
  12. package/agents/ashlr-explore.md +44 -0
  13. package/agents/ashlr-plan.md +54 -0
  14. package/bench/fixtures/notebook-large.ipynb +660 -0
  15. package/bench/fixtures/notebook-small.ipynb +39 -0
  16. package/bench/fixtures/tasklist-closed.json +62 -0
  17. package/bench/fixtures/tasklist-large-mixed.json +27 -0
  18. package/bench/fixtures/tasklist-sprint-open.json +79 -0
  19. package/bench/fixtures/websearch-bun-runtime.json +32 -0
  20. package/bench/fixtures/websearch-react-hooks-patterns.json +32 -0
  21. package/bench/fixtures/websearch-typescript-generics.json +38 -0
  22. package/bench/refs/node-sdk/.refrev +1 -0
  23. package/bench/refs/node-sdk/README.md +17 -0
  24. package/bench/refs/node-sdk/src/agent/agent.ts +163 -0
  25. package/bench/refs/node-sdk/src/agent/create-agent-ui-stream.ts +83 -0
  26. package/bench/refs/node-sdk/src/agent/tool-loop-agent.ts +238 -0
  27. package/bench/refs/node-sdk/src/embed/embed-many.ts +409 -0
  28. package/bench/refs/node-sdk/src/embed/embed-result.ts +50 -0
  29. package/bench/refs/node-sdk/src/embed/embed.ts +257 -0
  30. package/bench/refs/node-sdk/src/error/invalid-argument-error.ts +34 -0
  31. package/bench/refs/node-sdk/src/error/invalid-tool-input-error.ts +33 -0
  32. package/bench/refs/node-sdk/src/error/no-object-generated-error.ts +70 -0
  33. package/bench/refs/node-sdk/src/generate-image/generate-image-result.ts +42 -0
  34. package/bench/refs/node-sdk/src/generate-image/generate-image.ts +362 -0
  35. package/bench/refs/node-sdk/src/generate-object/generate-object-result.ts +67 -0
  36. package/bench/refs/node-sdk/src/generate-object/generate-object.ts +501 -0
  37. package/bench/refs/node-sdk/src/generate-object/inject-json-instruction.ts +30 -0
  38. package/bench/refs/node-sdk/src/generate-object/output-strategy.ts +415 -0
  39. package/bench/refs/node-sdk/src/generate-object/repair-text.ts +12 -0
  40. package/bench/refs/node-sdk/src/generate-object/stream-object.ts +960 -0
  41. package/bench/refs/node-sdk/src/generate-speech/generate-speech.ts +191 -0
  42. package/bench/refs/node-sdk/src/generate-text/generate-text.ts +1484 -0
  43. package/bench/refs/node-sdk/src/generate-text/stream-text.ts +2708 -0
  44. package/bench/refs/node-sdk/src/generate-text/tool-call.ts +59 -0
  45. package/bench/refs/node-sdk/src/generate-text/tool-result.ts +36 -0
  46. package/bench/refs/node-sdk/src/telemetry/create-telemetry-dispatcher.ts +146 -0
  47. package/bench/refs/node-sdk/src/telemetry/telemetry-registry.ts +15 -0
  48. package/bench/refs/node-sdk/src/telemetry/telemetry.ts +223 -0
  49. package/bench/refs/node-sdk/src/util/async-iterable-stream.ts +94 -0
  50. package/bench/refs/node-sdk/src/util/consume-stream.ts +31 -0
  51. package/bench/refs/node-sdk/src/util/create-stitchable-stream.ts +112 -0
  52. package/bench/refs/node-sdk/src/util/download/download.ts +74 -0
  53. package/bench/refs/node-sdk/src/util/error-handler.ts +1 -0
  54. package/bench/refs/node-sdk/src/util/fix-json.ts +401 -0
  55. package/bench/refs/node-sdk/src/util/merge-objects.ts +79 -0
  56. package/bench/refs/python-lib/.refrev +1 -0
  57. package/bench/refs/python-lib/README.md +18 -0
  58. package/bench/refs/python-lib/pandas/core/_numba/executor.py +249 -0
  59. package/bench/refs/python-lib/pandas/core/_numba/extensions.py +586 -0
  60. package/bench/refs/python-lib/pandas/core/_numba/kernels/mean_.py +198 -0
  61. package/bench/refs/python-lib/pandas/core/_numba/kernels/min_max_.py +178 -0
  62. package/bench/refs/python-lib/pandas/core/_numba/kernels/sum_.py +255 -0
  63. package/bench/refs/python-lib/pandas/core/_numba/kernels/var_.py +251 -0
  64. package/bench/refs/python-lib/pandas/core/accessor.py +520 -0
  65. package/bench/refs/python-lib/pandas/core/api.py +138 -0
  66. package/bench/refs/python-lib/pandas/core/array_algos/masked_accumulations.py +97 -0
  67. package/bench/refs/python-lib/pandas/core/array_algos/masked_reductions.py +252 -0
  68. package/bench/refs/python-lib/pandas/core/array_algos/putmask.py +150 -0
  69. package/bench/refs/python-lib/pandas/core/array_algos/quantile.py +232 -0
  70. package/bench/refs/python-lib/pandas/core/array_algos/replace.py +159 -0
  71. package/bench/refs/python-lib/pandas/core/array_algos/take.py +609 -0
  72. package/bench/refs/python-lib/pandas/core/arraylike.py +534 -0
  73. package/bench/refs/python-lib/pandas/core/arrays/_arrow_string_mixins.py +434 -0
  74. package/bench/refs/python-lib/pandas/core/arrays/_mixins.py +630 -0
  75. package/bench/refs/python-lib/pandas/core/arrays/_ranges.py +276 -0
  76. package/bench/refs/python-lib/pandas/core/arrays/_utils.py +77 -0
  77. package/bench/refs/python-lib/pandas/core/arrays/arrow/accessors.py +521 -0
  78. package/bench/refs/python-lib/pandas/core/arrays/arrow/extension_types.py +174 -0
  79. package/bench/refs/python-lib/pandas/core/arrays/boolean.py +454 -0
  80. package/bench/refs/python-lib/pandas/core/arrays/floating.py +192 -0
  81. package/bench/refs/python-lib/pandas/core/arrays/integer.py +296 -0
  82. package/bench/refs/python-lib/pandas/core/arrays/masked.py +2140 -0
  83. package/bench/refs/python-lib/pandas/core/arrays/numeric.py +305 -0
  84. package/bench/refs/python-lib/pandas/core/arrays/numpy_.py +701 -0
  85. package/bench/refs/python-lib/pandas/core/arrays/period.py +1586 -0
  86. package/bench/refs/python-lib/pandas/core/arrays/sparse/accessor.py +505 -0
  87. package/bench/refs/python-lib/pandas/core/arrays/sparse/scipy_sparse.py +208 -0
  88. package/bench/refs/rust-project/.refrev +1 -0
  89. package/bench/refs/rust-project/README.md +17 -0
  90. package/bench/refs/rust-project/tokio/src/doc/os.rs +68 -0
  91. package/bench/refs/rust-project/tokio/src/fs/dir_builder.rs +129 -0
  92. package/bench/refs/rust-project/tokio/src/fs/file.rs +1113 -0
  93. package/bench/refs/rust-project/tokio/src/fs/mocks.rs +176 -0
  94. package/bench/refs/rust-project/tokio/src/fs/mod.rs +324 -0
  95. package/bench/refs/rust-project/tokio/src/fs/open_options.rs +856 -0
  96. package/bench/refs/rust-project/tokio/src/fs/read.rs +80 -0
  97. package/bench/refs/rust-project/tokio/src/fs/read_dir.rs +357 -0
  98. package/bench/refs/rust-project/tokio/src/fs/write.rs +99 -0
  99. package/bench/refs/rust-project/tokio/src/future/maybe_done.rs +123 -0
  100. package/bench/refs/rust-project/tokio/src/future/try_join.rs +82 -0
  101. package/bench/refs/rust-project/tokio/src/io/async_buf_read.rs +117 -0
  102. package/bench/refs/rust-project/tokio/src/io/async_read.rs +133 -0
  103. package/bench/refs/rust-project/tokio/src/io/async_seek.rs +96 -0
  104. package/bench/refs/rust-project/tokio/src/io/async_write.rs +402 -0
  105. package/bench/refs/rust-project/tokio/src/io/blocking.rs +339 -0
  106. package/bench/refs/rust-project/tokio/src/io/interest.rs +345 -0
  107. package/bench/refs/rust-project/tokio/src/io/join.rs +130 -0
  108. package/bench/refs/rust-project/tokio/src/io/mod.rs +308 -0
  109. package/bench/refs/rust-project/tokio/src/io/poll_evented.rs +319 -0
  110. package/bench/refs/rust-project/tokio/src/io/read_buf.rs +344 -0
  111. package/bench/refs/rust-project/tokio/src/io/ready.rs +322 -0
  112. package/bench/refs/rust-project/tokio/src/io/split.rs +166 -0
  113. package/bench/refs/rust-project/tokio/src/io/stderr.rs +148 -0
  114. package/bench/refs/rust-project/tokio/src/io/stdin.rs +98 -0
  115. package/bench/refs/rust-project/tokio/src/io/stdio_common.rs +222 -0
  116. package/bench/refs/rust-project/tokio/src/io/stdout.rs +197 -0
  117. package/bench/refs/rust-project/tokio/src/io/util/buf_reader.rs +311 -0
  118. package/bench/refs/rust-project/tokio/src/io/util/buf_stream.rs +207 -0
  119. package/bench/refs/rust-project/tokio/src/io/util/buf_writer.rs +310 -0
  120. package/bench/refs/rust-project/tokio/src/io/util/chain.rs +144 -0
  121. package/commands/_spawn-patterns.json +32 -0
  122. package/commands/ashlr-allow.md +21 -0
  123. package/commands/ashlr-benchmark.md +53 -0
  124. package/commands/ashlr-brief.md +97 -0
  125. package/commands/ashlr-budget.md +76 -0
  126. package/commands/ashlr-compact.md +54 -0
  127. package/commands/ashlr-dashboard.md +37 -0
  128. package/commands/ashlr-doctor.md +56 -0
  129. package/commands/ashlr-eco-mode.md +92 -0
  130. package/commands/ashlr-genome-init.md +24 -0
  131. package/commands/ashlr-genome-keygen.md +36 -0
  132. package/commands/ashlr-genome-loop.md +118 -0
  133. package/commands/ashlr-genome-push.md +36 -0
  134. package/commands/ashlr-genome-rewrap.md +48 -0
  135. package/commands/ashlr-genome-team-init.md +67 -0
  136. package/commands/ashlr-handoff.md +23 -0
  137. package/commands/ashlr-help.md +86 -0
  138. package/commands/ashlr-hook-timings.md +30 -0
  139. package/commands/ashlr-leaderboard.md +50 -0
  140. package/commands/ashlr-ollama-setup.md +39 -0
  141. package/commands/ashlr-orchestrate-status.md +72 -0
  142. package/commands/ashlr-orchestrate.md +83 -0
  143. package/commands/ashlr-parallelize.md +63 -0
  144. package/commands/ashlr-report-crash.md +33 -0
  145. package/commands/ashlr-resume.md +72 -0
  146. package/commands/ashlr-savings.md +24 -0
  147. package/commands/ashlr-settings.md +50 -0
  148. package/commands/ashlr-spawn.md +61 -0
  149. package/commands/ashlr-start.md +60 -0
  150. package/commands/ashlr-status.md +64 -0
  151. package/commands/ashlr-team-invite.md +47 -0
  152. package/commands/ashlr-tier.md +122 -0
  153. package/commands/ashlr-tour.md +60 -0
  154. package/commands/ashlr-update.md +155 -0
  155. package/commands/ashlr-upgrade.md +96 -0
  156. package/commands/goal.md +58 -0
  157. package/commands/loop.md +40 -0
  158. package/docs/CNAME +1 -0
  159. package/docs/PRO_TIER.md +104 -0
  160. package/docs/README.md +21 -0
  161. package/docs/architecture.md +415 -0
  162. package/docs/ashlr-pipe.md +161 -0
  163. package/docs/assets/logo.svg +19 -0
  164. package/docs/assets/og.png +0 -0
  165. package/docs/assets/og.svg +41 -0
  166. package/docs/benchmarks-v2.json +355 -0
  167. package/docs/benchmarks.json +102 -0
  168. package/docs/benchmarks.md +211 -0
  169. package/docs/billing.md +185 -0
  170. package/docs/cloud-genome.md +155 -0
  171. package/docs/competitive-wozcode.md +92 -0
  172. package/docs/deploy.md +325 -0
  173. package/docs/email-templates.md +113 -0
  174. package/docs/embed-tuning.md +103 -0
  175. package/docs/genome.md +120 -0
  176. package/docs/github-oauth-onboarding.md +127 -0
  177. package/docs/hero-video-script.md +129 -0
  178. package/docs/index.html +2262 -0
  179. package/docs/install-prompt.md +78 -0
  180. package/docs/install-windows.md +132 -0
  181. package/docs/install.ps1 +171 -0
  182. package/docs/install.sh +146 -0
  183. package/docs/launch/README.md +114 -0
  184. package/docs/launch/hn.md +49 -0
  185. package/docs/launch/reddit.md +45 -0
  186. package/docs/launch/x.md +65 -0
  187. package/docs/launch-post.md +112 -0
  188. package/docs/legal.md +78 -0
  189. package/docs/llm-providers.md +99 -0
  190. package/docs/multi-host-mcp.md +217 -0
  191. package/docs/multi-turn-architecture.md +108 -0
  192. package/docs/operations/deployment.md +108 -0
  193. package/docs/operations/error-monitoring.md +70 -0
  194. package/docs/operations/weekly-digest.md +70 -0
  195. package/docs/operations.md +494 -0
  196. package/docs/platform-support.md +133 -0
  197. package/docs/policy-packs.md +188 -0
  198. package/docs/press-kit/fact-sheet.md +78 -0
  199. package/docs/press-kit/founder-bio.md +3 -0
  200. package/docs/press-kit/logo.svg +33 -0
  201. package/docs/press-kit/screenshots.md +146 -0
  202. package/docs/pricing.md +251 -0
  203. package/docs/pro-backend-architecture.md +523 -0
  204. package/docs/producthunt.md +52 -0
  205. package/docs/router-migration.md +110 -0
  206. package/docs/session-log-schema.md +68 -0
  207. package/docs/social.md +95 -0
  208. package/docs/team-genome.md +528 -0
  209. package/docs/telemetry.md +194 -0
  210. package/docs/test-isolation.md +100 -0
  211. package/docs/upgrade.md +159 -0
  212. package/hooks/_hook-errors.ts +87 -0
  213. package/hooks/_hook-perf-emit.ts +113 -0
  214. package/hooks/_hook-timing-ledger.ts +1133 -0
  215. package/hooks/_nudge-throttle.ts +127 -0
  216. package/hooks/_recent-blocks.ts +127 -0
  217. package/hooks/audit-upload.ts +86 -0
  218. package/hooks/codex-hooks.json +171 -0
  219. package/hooks/commit-attribution.ts +179 -0
  220. package/hooks/edit-batching-nudge.ts +154 -0
  221. package/hooks/genome-scribe-hook.ts +219 -0
  222. package/hooks/hooks.json +294 -0
  223. package/hooks/orient-nudge-hook.ts +242 -0
  224. package/hooks/policy-enforce.ts +214 -0
  225. package/hooks/post-tool-use-embedding.ts +93 -0
  226. package/hooks/post-tool-use-genome.sh +37 -0
  227. package/hooks/post-tool-use-genome.ts +69 -0
  228. package/hooks/posttooluse-correlate.ts +122 -0
  229. package/hooks/posttooluse-dedupe-output.ts +241 -0
  230. package/hooks/posttooluse-genome-refresh.ts +223 -0
  231. package/hooks/posttooluse-native-nudge.ts +205 -0
  232. package/hooks/posttooluse-stale-result.ts +277 -0
  233. package/hooks/pretooluse-bash.ts +63 -0
  234. package/hooks/pretooluse-budget-guard.ts +318 -0
  235. package/hooks/pretooluse-common.ts +985 -0
  236. package/hooks/pretooluse-eco-router.ts +196 -0
  237. package/hooks/pretooluse-edit.sh +93 -0
  238. package/hooks/pretooluse-edit.ts +197 -0
  239. package/hooks/pretooluse-glob.ts +70 -0
  240. package/hooks/pretooluse-grep.sh +85 -0
  241. package/hooks/pretooluse-grep.ts +96 -0
  242. package/hooks/pretooluse-notebookedit.ts +121 -0
  243. package/hooks/pretooluse-read.sh +118 -0
  244. package/hooks/pretooluse-read.ts +118 -0
  245. package/hooks/pretooluse-task.ts +130 -0
  246. package/hooks/pretooluse-webfetch.ts +66 -0
  247. package/hooks/pretooluse-websearch.ts +85 -0
  248. package/hooks/pretooluse-write.ts +128 -0
  249. package/hooks/pulse-emit.ts +197 -0
  250. package/hooks/session-end-consolidate.sh +35 -0
  251. package/hooks/session-end-consolidate.ts +188 -0
  252. package/hooks/session-end-stats-gc.ts +80 -0
  253. package/hooks/session-log-append.sh +94 -0
  254. package/hooks/session-log-append.ts +116 -0
  255. package/hooks/session-start.ts +993 -0
  256. package/hooks/sessionend-hook-health-nudge.ts +451 -0
  257. package/hooks/sessionend-savings-nudge.ts +318 -0
  258. package/hooks/sessionend-status-line-nudge.ts +296 -0
  259. package/hooks/sessionstart-brief.ts +140 -0
  260. package/hooks/sessionstart-cost-refactor.ts +95 -0
  261. package/hooks/sessionstart-efficient.ts +110 -0
  262. package/hooks/sessionstart-genome-author.ts +93 -0
  263. package/hooks/sessionstart-lean-tools.ts +98 -0
  264. package/hooks/sessionstart-search.ts +97 -0
  265. package/hooks/stop-accounting.ts +152 -0
  266. package/hooks/subagent-stop-rollup.ts +162 -0
  267. package/hooks/userpromptsubmit-brief-trigger.ts +156 -0
  268. package/package.json +56 -0
  269. package/ports/README.md +108 -0
  270. package/ports/cursor/mcp.json +11 -0
  271. package/ports/goose/recipe.yaml +26 -0
  272. package/scripts/ashlr-mcp.ts +40 -0
  273. package/scripts/auto-update.ts +177 -0
  274. package/scripts/baseline-scan.ts +831 -0
  275. package/scripts/bench-orchestrate.ts +377 -0
  276. package/scripts/benchmark-refs.ts +292 -0
  277. package/scripts/bootstrap.mjs +100 -0
  278. package/scripts/brief-eval.ts +234 -0
  279. package/scripts/bump-version.ts +82 -0
  280. package/scripts/bun-resolve.d.mts +11 -0
  281. package/scripts/bun-resolve.mjs +59 -0
  282. package/scripts/calibrate-grep.ts +467 -0
  283. package/scripts/capture-grep-workload.ts +260 -0
  284. package/scripts/check-tier.ts +61 -0
  285. package/scripts/check-version-sync.ts +97 -0
  286. package/scripts/cli-orchestrate-status.ts +386 -0
  287. package/scripts/cli-orchestrate.ts +303 -0
  288. package/scripts/cli.ts +478 -0
  289. package/scripts/cloud-smoke-test.ts +313 -0
  290. package/scripts/coach-report.ts +373 -0
  291. package/scripts/context-db-migrate.ts +137 -0
  292. package/scripts/context-status.ts +43 -0
  293. package/scripts/demo-run.ts +255 -0
  294. package/scripts/deploy-smoke.sh +140 -0
  295. package/scripts/doctor.ts +992 -0
  296. package/scripts/embed-file-worker.ts +104 -0
  297. package/scripts/embed-tune.ts +308 -0
  298. package/scripts/errors-report.ts +428 -0
  299. package/scripts/find-test-leak.ts +69 -0
  300. package/scripts/generate-badge.ts +357 -0
  301. package/scripts/genome-auto-consolidate.ts +533 -0
  302. package/scripts/genome-auto-propose.ts +578 -0
  303. package/scripts/genome-cloud-pull.ts +363 -0
  304. package/scripts/genome-cloud-push.ts +382 -0
  305. package/scripts/genome-cloud-sync.ts +587 -0
  306. package/scripts/genome-commit-watcher.ts +295 -0
  307. package/scripts/genome-init.ts +986 -0
  308. package/scripts/genome-key.ts +233 -0
  309. package/scripts/genome-keygen.ts +168 -0
  310. package/scripts/genome-link.ts +59 -0
  311. package/scripts/genome-refresh-worker.ts +364 -0
  312. package/scripts/genome-rewrap.ts +90 -0
  313. package/scripts/genome-synthesizer.ts +679 -0
  314. package/scripts/genome-team-init.ts +312 -0
  315. package/scripts/handoff-pack.ts +438 -0
  316. package/scripts/hook-bootstrap.mjs +75 -0
  317. package/scripts/hook-timing-reader.ts +371 -0
  318. package/scripts/hook-timings-report.ts +554 -0
  319. package/scripts/install-genome-hooks.ts +196 -0
  320. package/scripts/install-onnx-model.ts +154 -0
  321. package/scripts/install-permissions.ts +276 -0
  322. package/scripts/install-status-line.ts +150 -0
  323. package/scripts/mcp-entrypoint.sh +78 -0
  324. package/scripts/mcp-entrypoint.ts +130 -0
  325. package/scripts/mdx-angle-bracket-lint.ts +152 -0
  326. package/scripts/measure-cold-start.ts +126 -0
  327. package/scripts/migrate-stats-to-sqlite.ts +86 -0
  328. package/scripts/ollama-setup.ts +498 -0
  329. package/scripts/onboarding-wizard.ts +1691 -0
  330. package/scripts/orchestrate-emit-telemetry.ts +177 -0
  331. package/scripts/orchestrate-expand.ts +517 -0
  332. package/scripts/orchestrate-run.ts +744 -0
  333. package/scripts/print-legend.ts +50 -0
  334. package/scripts/product-metadata.ts +38 -0
  335. package/scripts/prune-old-memories.ts +208 -0
  336. package/scripts/publish.sh +88 -0
  337. package/scripts/read-calibration.ts +122 -0
  338. package/scripts/report-crash.ts +226 -0
  339. package/scripts/run-benchmark.ts +750 -0
  340. package/scripts/run-root-tests.ts +28 -0
  341. package/scripts/savings-dashboard.ts +1258 -0
  342. package/scripts/savings-report-extras.ts +447 -0
  343. package/scripts/savings-status-line.ts +873 -0
  344. package/scripts/session-event-emit.ts +266 -0
  345. package/scripts/session-greet.ts +686 -0
  346. package/scripts/session-log-report.ts +551 -0
  347. package/scripts/session-resume.ts +614 -0
  348. package/scripts/set-hook-mode.ts +83 -0
  349. package/scripts/smoke-cross-platform.ts +117 -0
  350. package/scripts/smoke-realtime.ts +257 -0
  351. package/scripts/smoke-tools.ts +21 -0
  352. package/scripts/stats-cloud-pull.ts +213 -0
  353. package/scripts/stats-cloud-sync.ts +261 -0
  354. package/scripts/telemetry-flush.ts +160 -0
  355. package/scripts/telemetry-status.ts +266 -0
  356. package/scripts/timing-budget.ts +35 -0
  357. package/scripts/ui-animation.ts +120 -0
  358. package/scripts/ui.ts +431 -0
  359. package/scripts/upgrade-flow.ts +775 -0
  360. package/scripts/weekly-digest.ts +394 -0
  361. package/servers/_accounting.ts +78 -0
  362. package/servers/_ask-router.ts +84 -0
  363. package/servers/_ast-chunker.ts +434 -0
  364. package/servers/_ast-helpers.ts +183 -0
  365. package/servers/_ast-languages.ts +153 -0
  366. package/servers/_ast-refactor/_shared.ts +221 -0
  367. package/servers/_ast-refactor/cross-file-rename.ts +560 -0
  368. package/servers/_ast-refactor/extract-function.ts +357 -0
  369. package/servers/_ast-refactor/file-local-rename.ts +172 -0
  370. package/servers/_ast-refactor.ts +41 -0
  371. package/servers/_ast-skeleton.ts +107 -0
  372. package/servers/_bash-summarizers-registry.ts +1096 -0
  373. package/servers/_crash-dump.ts +210 -0
  374. package/servers/_cwd-clamp.ts +342 -0
  375. package/servers/_edit-log.ts +28 -0
  376. package/servers/_edit-match.ts +236 -0
  377. package/servers/_edit-validate.ts +196 -0
  378. package/servers/_embed-calibration.ts +123 -0
  379. package/servers/_embedding-cache.ts +401 -0
  380. package/servers/_embedding-model.ts +329 -0
  381. package/servers/_events.ts +113 -0
  382. package/servers/_genome-cache.ts +154 -0
  383. package/servers/_genome-commits.ts +172 -0
  384. package/servers/_genome-crypto-v2.ts +242 -0
  385. package/servers/_genome-crypto.ts +259 -0
  386. package/servers/_genome-discoveries.ts +140 -0
  387. package/servers/_genome-embed-populator.ts +216 -0
  388. package/servers/_genome-freshness.ts +134 -0
  389. package/servers/_genome-issues.ts +171 -0
  390. package/servers/_genome-live.ts +263 -0
  391. package/servers/_genome-prs.ts +188 -0
  392. package/servers/_genome-search.ts +479 -0
  393. package/servers/_genome-sync.ts +297 -0
  394. package/servers/_history-tracker.ts +279 -0
  395. package/servers/_http-helpers.ts +151 -0
  396. package/servers/_identity-hash.ts +151 -0
  397. package/servers/_llm-providers/anthropic.ts +132 -0
  398. package/servers/_llm-providers/cloud.ts +195 -0
  399. package/servers/_llm-providers/index.ts +350 -0
  400. package/servers/_llm-providers/local.ts +127 -0
  401. package/servers/_llm-providers/onnx.ts +393 -0
  402. package/servers/_llm-providers/types.ts +27 -0
  403. package/servers/_manifest-v2.ts +447 -0
  404. package/servers/_mcp-host.ts +93 -0
  405. package/servers/_nudge-events.ts +451 -0
  406. package/servers/_orchestrate-executor.ts +316 -0
  407. package/servers/_prefetch.ts +435 -0
  408. package/servers/_pricing.ts +256 -0
  409. package/servers/_pro.ts +381 -0
  410. package/servers/_read-cache.ts +44 -0
  411. package/servers/_router-handlers.ts +46 -0
  412. package/servers/_router.ts +55 -0
  413. package/servers/_run-with-timeout.ts +173 -0
  414. package/servers/_savings-render.ts +214 -0
  415. package/servers/_stats-sqlite.ts +640 -0
  416. package/servers/_stats.ts +1183 -0
  417. package/servers/_status-line-cells.ts +469 -0
  418. package/servers/_streaks.ts +162 -0
  419. package/servers/_summarize.ts +208 -0
  420. package/servers/_task-graph-render.ts +217 -0
  421. package/servers/_task-graph.ts +545 -0
  422. package/servers/_telemetry.ts +719 -0
  423. package/servers/_test-parsers.ts +530 -0
  424. package/servers/_test-watch.ts +626 -0
  425. package/servers/_text-helpers.ts +37 -0
  426. package/servers/_token-measure.ts +160 -0
  427. package/servers/_tool-base.ts +248 -0
  428. package/servers/_weekly-digest.ts +391 -0
  429. package/servers/ask-server-handlers.ts +49 -0
  430. package/servers/ask-server.ts +174 -0
  431. package/servers/bash-server-handlers.ts +138 -0
  432. package/servers/bash-server.ts +1136 -0
  433. package/servers/bench.ts +186 -0
  434. package/servers/diff-semantic-server-handlers.ts +39 -0
  435. package/servers/diff-semantic-server.ts +566 -0
  436. package/servers/diff-server-handlers.ts +317 -0
  437. package/servers/diff-server.ts +20 -0
  438. package/servers/edit-server-handlers.ts +31 -0
  439. package/servers/edit-server.ts +209 -0
  440. package/servers/edit-structural-server-handlers.ts +322 -0
  441. package/servers/efficiency-server-handlers.ts +161 -0
  442. package/servers/efficiency-server.ts +1135 -0
  443. package/servers/flush-server-handlers.ts +21 -0
  444. package/servers/flush-server.ts +19 -0
  445. package/servers/genome-server-handlers.ts +118 -0
  446. package/servers/genome-server.ts +397 -0
  447. package/servers/github-server-handlers.ts +187 -0
  448. package/servers/github-server.ts +856 -0
  449. package/servers/glob-server-handlers.ts +233 -0
  450. package/servers/glob-server.ts +20 -0
  451. package/servers/grep-server-handlers.ts +61 -0
  452. package/servers/grep-server.ts +564 -0
  453. package/servers/http-server-handlers.ts +36 -0
  454. package/servers/http-server.ts +149 -0
  455. package/servers/logs-server-handlers.ts +42 -0
  456. package/servers/logs-server.ts +359 -0
  457. package/servers/ls-server-handlers.ts +166 -0
  458. package/servers/ls-server.ts +20 -0
  459. package/servers/multi-edit-server-handlers.ts +51 -0
  460. package/servers/multi-edit-server.ts +422 -0
  461. package/servers/notebook-edit-server-handlers.ts +34 -0
  462. package/servers/notebook-edit-server.ts +181 -0
  463. package/servers/orient-server-handlers.ts +52 -0
  464. package/servers/orient-server.ts +436 -0
  465. package/servers/pipe-server-handlers.ts +68 -0
  466. package/servers/pipe-server.ts +300 -0
  467. package/servers/read-server-handlers.ts +42 -0
  468. package/servers/read-server.ts +206 -0
  469. package/servers/rename-file-server-handlers.ts +67 -0
  470. package/servers/rename-file-server.ts +699 -0
  471. package/servers/savings-server-handlers.ts +27 -0
  472. package/servers/savings-server.ts +54 -0
  473. package/servers/search-replace-regex-server-handlers.ts +96 -0
  474. package/servers/search-replace-regex-server.ts +751 -0
  475. package/servers/sql-server-handlers.ts +58 -0
  476. package/servers/sql-server.ts +505 -0
  477. package/servers/task-server-handlers.ts +358 -0
  478. package/servers/task-server.ts +24 -0
  479. package/servers/test-server-handlers.ts +351 -0
  480. package/servers/test-server.ts +20 -0
  481. package/servers/tree-server-handlers.ts +503 -0
  482. package/servers/tree-server.ts +20 -0
  483. package/servers/webfetch-server-handlers.ts +166 -0
  484. package/servers/webfetch-server.ts +20 -0
  485. package/servers/websearch-server-handlers.ts +215 -0
  486. package/servers/websearch-server.ts +19 -0
  487. package/servers/write-server-handlers.ts +27 -0
  488. package/servers/write-server.ts +97 -0
  489. package/skills/ashlr-brief/SKILL.md +80 -0
  490. package/skills/ashlr-codex-doctor/SKILL.md +21 -0
  491. package/skills/ashlr-codex-efficient-tools/SKILL.md +17 -0
  492. package/skills/ashlr-codex-genome-refresh/SKILL.md +20 -0
  493. package/skills/ashlr-codex-parallel-explore/SKILL.md +20 -0
  494. package/skills/ashlr-codex-savings/SKILL.md +17 -0
  495. package/skills/ashlr-cost-refactor/SKILL.md +50 -0
  496. package/skills/ashlr-efficient/SKILL.md +64 -0
  497. package/skills/ashlr-genome-author/SKILL.md +43 -0
  498. package/skills/ashlr-lean-tools/SKILL.md +43 -0
  499. package/skills/ashlr-search/SKILL.md +46 -0
@@ -0,0 +1,534 @@
1
+ """
2
+ Methods that can be shared by many array-like classes or subclasses:
3
+ Series
4
+ Index
5
+ ExtensionArray
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import operator
11
+ from typing import Any
12
+
13
+ import numpy as np
14
+
15
+ from pandas._libs import lib
16
+ from pandas._libs.ops_dispatch import maybe_dispatch_ufunc_to_dunder_op
17
+
18
+ from pandas.core.dtypes.cast import maybe_unbox_numpy_scalar
19
+ from pandas.core.dtypes.generic import ABCNDFrame
20
+
21
+ from pandas.core import roperator
22
+ from pandas.core.construction import extract_array
23
+ from pandas.core.ops.common import unpack_zerodim_and_defer
24
+
25
+ REDUCTION_ALIASES = {
26
+ "maximum": "max",
27
+ "minimum": "min",
28
+ "add": "sum",
29
+ "multiply": "prod",
30
+ }
31
+
32
+
33
+ class OpsMixin:
34
+ # -------------------------------------------------------------
35
+ # Comparisons
36
+
37
+ def _cmp_method(self, other, op):
38
+ return NotImplemented
39
+
40
+ @unpack_zerodim_and_defer("__eq__")
41
+ def __eq__(self, other):
42
+ return self._cmp_method(other, operator.eq)
43
+
44
+ @unpack_zerodim_and_defer("__ne__")
45
+ def __ne__(self, other):
46
+ return self._cmp_method(other, operator.ne)
47
+
48
+ @unpack_zerodim_and_defer("__lt__")
49
+ def __lt__(self, other):
50
+ return self._cmp_method(other, operator.lt)
51
+
52
+ @unpack_zerodim_and_defer("__le__")
53
+ def __le__(self, other):
54
+ return self._cmp_method(other, operator.le)
55
+
56
+ @unpack_zerodim_and_defer("__gt__")
57
+ def __gt__(self, other):
58
+ return self._cmp_method(other, operator.gt)
59
+
60
+ @unpack_zerodim_and_defer("__ge__")
61
+ def __ge__(self, other):
62
+ return self._cmp_method(other, operator.ge)
63
+
64
+ # -------------------------------------------------------------
65
+ # Logical Methods
66
+
67
+ def _logical_method(self, other, op):
68
+ return NotImplemented
69
+
70
+ @unpack_zerodim_and_defer("__and__")
71
+ def __and__(self, other):
72
+ return self._logical_method(other, operator.and_)
73
+
74
+ @unpack_zerodim_and_defer("__rand__")
75
+ def __rand__(self, other):
76
+ return self._logical_method(other, roperator.rand_)
77
+
78
+ @unpack_zerodim_and_defer("__or__")
79
+ def __or__(self, other):
80
+ return self._logical_method(other, operator.or_)
81
+
82
+ @unpack_zerodim_and_defer("__ror__")
83
+ def __ror__(self, other):
84
+ return self._logical_method(other, roperator.ror_)
85
+
86
+ @unpack_zerodim_and_defer("__xor__")
87
+ def __xor__(self, other):
88
+ return self._logical_method(other, operator.xor)
89
+
90
+ @unpack_zerodim_and_defer("__rxor__")
91
+ def __rxor__(self, other):
92
+ return self._logical_method(other, roperator.rxor)
93
+
94
+ # -------------------------------------------------------------
95
+ # Arithmetic Methods
96
+
97
+ def _arith_method(self, other, op):
98
+ return NotImplemented
99
+
100
+ @unpack_zerodim_and_defer("__add__")
101
+ def __add__(self, other):
102
+ """
103
+ Get Addition of DataFrame and other, column-wise.
104
+
105
+ Equivalent to ``DataFrame.add(other)``.
106
+
107
+ Parameters
108
+ ----------
109
+ other : scalar, sequence, Series, dict or DataFrame
110
+ Object to be added to the DataFrame.
111
+
112
+ Returns
113
+ -------
114
+ DataFrame
115
+ The result of adding ``other`` to DataFrame.
116
+
117
+ See Also
118
+ --------
119
+ DataFrame.add : Add a DataFrame and another object, with option for index-
120
+ or column-oriented addition.
121
+
122
+ Examples
123
+ --------
124
+ >>> df = pd.DataFrame(
125
+ ... {"height": [1.5, 2.6], "weight": [500, 800]}, index=["elk", "moose"]
126
+ ... )
127
+ >>> df
128
+ height weight
129
+ elk 1.5 500
130
+ moose 2.6 800
131
+
132
+ Adding a scalar affects all rows and columns.
133
+
134
+ >>> df[["height", "weight"]] + 1.5
135
+ height weight
136
+ elk 3.0 501.5
137
+ moose 4.1 801.5
138
+
139
+ Each element of a list is added to a column of the DataFrame, in order.
140
+
141
+ >>> df[["height", "weight"]] + [0.5, 1.5]
142
+ height weight
143
+ elk 2.0 501.5
144
+ moose 3.1 801.5
145
+
146
+ Keys of a dictionary are aligned to the DataFrame, based on column names;
147
+ each value in the dictionary is added to the corresponding column.
148
+
149
+ >>> df[["height", "weight"]] + {"height": 0.5, "weight": 1.5}
150
+ height weight
151
+ elk 2.0 501.5
152
+ moose 3.1 801.5
153
+
154
+ When `other` is a :class:`Series`, the index of `other` is aligned with the
155
+ columns of the DataFrame.
156
+
157
+ >>> s1 = pd.Series([0.5, 1.5], index=["weight", "height"])
158
+ >>> df[["height", "weight"]] + s1
159
+ height weight
160
+ elk 3.0 500.5
161
+ moose 4.1 800.5
162
+
163
+ Even when the index of `other` is the same as the index of the DataFrame,
164
+ the :class:`Series` will not be reoriented. If index-wise alignment is desired,
165
+ :meth:`DataFrame.add` should be used with `axis='index'`.
166
+
167
+ >>> s2 = pd.Series([0.5, 1.5], index=["elk", "moose"])
168
+ >>> df[["height", "weight"]] + s2
169
+ elk height moose weight
170
+ elk NaN NaN NaN NaN
171
+ moose NaN NaN NaN NaN
172
+
173
+ >>> df[["height", "weight"]].add(s2, axis="index")
174
+ height weight
175
+ elk 2.0 500.5
176
+ moose 4.1 801.5
177
+
178
+ When `other` is a :class:`DataFrame`, both columns names and the
179
+ index are aligned.
180
+
181
+ >>> other = pd.DataFrame(
182
+ ... {"height": [0.2, 0.4, 0.6]}, index=["elk", "moose", "deer"]
183
+ ... )
184
+ >>> df[["height", "weight"]] + other
185
+ height weight
186
+ deer NaN NaN
187
+ elk 1.7 NaN
188
+ moose 3.0 NaN
189
+ """
190
+ return self._arith_method(other, operator.add)
191
+
192
+ @unpack_zerodim_and_defer("__radd__")
193
+ def __radd__(self, other):
194
+ return self._arith_method(other, roperator.radd)
195
+
196
+ @unpack_zerodim_and_defer("__sub__")
197
+ def __sub__(self, other):
198
+ return self._arith_method(other, operator.sub)
199
+
200
+ @unpack_zerodim_and_defer("__rsub__")
201
+ def __rsub__(self, other):
202
+ return self._arith_method(other, roperator.rsub)
203
+
204
+ @unpack_zerodim_and_defer("__mul__")
205
+ def __mul__(self, other):
206
+ return self._arith_method(other, operator.mul)
207
+
208
+ @unpack_zerodim_and_defer("__rmul__")
209
+ def __rmul__(self, other):
210
+ return self._arith_method(other, roperator.rmul)
211
+
212
+ @unpack_zerodim_and_defer("__truediv__")
213
+ def __truediv__(self, other):
214
+ return self._arith_method(other, operator.truediv)
215
+
216
+ @unpack_zerodim_and_defer("__rtruediv__")
217
+ def __rtruediv__(self, other):
218
+ return self._arith_method(other, roperator.rtruediv)
219
+
220
+ @unpack_zerodim_and_defer("__floordiv__")
221
+ def __floordiv__(self, other):
222
+ return self._arith_method(other, operator.floordiv)
223
+
224
+ @unpack_zerodim_and_defer("__rfloordiv")
225
+ def __rfloordiv__(self, other):
226
+ return self._arith_method(other, roperator.rfloordiv)
227
+
228
+ @unpack_zerodim_and_defer("__mod__")
229
+ def __mod__(self, other):
230
+ return self._arith_method(other, operator.mod)
231
+
232
+ @unpack_zerodim_and_defer("__rmod__")
233
+ def __rmod__(self, other):
234
+ return self._arith_method(other, roperator.rmod)
235
+
236
+ @unpack_zerodim_and_defer("__divmod__")
237
+ def __divmod__(self, other):
238
+ return self._arith_method(other, divmod)
239
+
240
+ @unpack_zerodim_and_defer("__rdivmod__")
241
+ def __rdivmod__(self, other):
242
+ return self._arith_method(other, roperator.rdivmod)
243
+
244
+ @unpack_zerodim_and_defer("__pow__")
245
+ def __pow__(self, other):
246
+ return self._arith_method(other, operator.pow)
247
+
248
+ @unpack_zerodim_and_defer("__rpow__")
249
+ def __rpow__(self, other):
250
+ return self._arith_method(other, roperator.rpow)
251
+
252
+
253
+ # -----------------------------------------------------------------------------
254
+ # Helpers to implement __array_ufunc__
255
+
256
+
257
+ def array_ufunc(self, ufunc: np.ufunc, method: str, *inputs: Any, **kwargs: Any):
258
+ """
259
+ Compatibility with numpy ufuncs.
260
+
261
+ See also
262
+ --------
263
+ numpy.org/doc/stable/reference/arrays.classes.html#numpy.class.__array_ufunc__
264
+ """
265
+ from pandas.core.frame import (
266
+ DataFrame,
267
+ Series,
268
+ )
269
+ from pandas.core.generic import NDFrame
270
+ from pandas.core.internals import BlockManager
271
+
272
+ cls = type(self)
273
+
274
+ kwargs = _standardize_out_kwarg(**kwargs)
275
+
276
+ # for binary ops, use our custom dunder methods
277
+ result = maybe_dispatch_ufunc_to_dunder_op(self, ufunc, method, *inputs, **kwargs)
278
+ if result is not NotImplemented:
279
+ return result
280
+
281
+ # Determine if we should defer.
282
+ no_defer = (
283
+ np.ndarray.__array_ufunc__,
284
+ cls.__array_ufunc__,
285
+ )
286
+
287
+ for item in inputs:
288
+ higher_priority = (
289
+ hasattr(item, "__array_priority__")
290
+ and item.__array_priority__ > self.__array_priority__
291
+ )
292
+ has_array_ufunc = (
293
+ hasattr(item, "__array_ufunc__")
294
+ and type(item).__array_ufunc__ not in no_defer
295
+ and not isinstance(item, self._HANDLED_TYPES)
296
+ )
297
+ if higher_priority or has_array_ufunc:
298
+ return NotImplemented
299
+
300
+ # align all the inputs.
301
+ types = tuple(type(x) for x in inputs)
302
+ alignable = [
303
+ x for x, t in zip(inputs, types, strict=True) if issubclass(t, NDFrame)
304
+ ]
305
+
306
+ if len(alignable) > 1:
307
+ # This triggers alignment.
308
+ # At the moment, there aren't any ufuncs with more than two inputs
309
+ # so this ends up just being x1.index | x2.index, but we write
310
+ # it to handle *args.
311
+ set_types = set(types)
312
+ if len(set_types) > 1 and {DataFrame, Series}.issubset(set_types):
313
+ # We currently don't handle ufunc(DataFrame, Series)
314
+ # well. Previously this raised an internal ValueError. We might
315
+ # support it someday, so raise a NotImplementedError.
316
+ raise NotImplementedError(
317
+ f"Cannot apply ufunc {ufunc} to mixed DataFrame and Series inputs."
318
+ )
319
+ axes = self.axes
320
+ for obj in alignable[1:]:
321
+ # this relies on the fact that we aren't handling mixed
322
+ # series / frame ufuncs.
323
+ for i, (ax1, ax2) in enumerate(zip(axes, obj.axes, strict=True)):
324
+ axes[i] = ax1.union(ax2)
325
+
326
+ reconstruct_axes = dict(zip(self._AXIS_ORDERS, axes, strict=True))
327
+ inputs = tuple(
328
+ x.reindex(**reconstruct_axes) if issubclass(t, NDFrame) else x
329
+ for x, t in zip(inputs, types, strict=True)
330
+ )
331
+ else:
332
+ reconstruct_axes = dict(zip(self._AXIS_ORDERS, self.axes, strict=True))
333
+
334
+ if self.ndim == 1:
335
+ names = {x.name for x in inputs if hasattr(x, "name")}
336
+ name = names.pop() if len(names) == 1 else None
337
+ reconstruct_kwargs = {"name": name}
338
+ else:
339
+ reconstruct_kwargs = {}
340
+
341
+ def reconstruct(result):
342
+ if ufunc.nout > 1:
343
+ # np.modf, np.frexp, np.divmod
344
+ return tuple(_reconstruct(x) for x in result)
345
+
346
+ return _reconstruct(result)
347
+
348
+ def _reconstruct(result):
349
+ if lib.is_scalar(result):
350
+ return result
351
+
352
+ if result.ndim != self.ndim:
353
+ if method == "outer":
354
+ raise NotImplementedError
355
+ return result
356
+ if isinstance(result, BlockManager):
357
+ # we went through BlockManager.apply e.g. np.sqrt
358
+ result = self._constructor_from_mgr(result, axes=result.axes)
359
+ else:
360
+ # we converted an array, lost our axes
361
+ result = self._constructor(
362
+ result, **reconstruct_axes, **reconstruct_kwargs, copy=False
363
+ )
364
+ # TODO: When we support multiple values in __finalize__, this
365
+ # should pass alignable to `__finalize__` instead of self.
366
+ # Then `np.add(a, b)` would consider attrs from both a and b
367
+ # when a and b are NDFrames.
368
+ if len(alignable) == 1:
369
+ result = result.__finalize__(self)
370
+ return result
371
+
372
+ if "out" in kwargs:
373
+ # e.g. test_multiindex_get_loc
374
+ result = dispatch_ufunc_with_out(self, ufunc, method, *inputs, **kwargs)
375
+ return reconstruct(result)
376
+
377
+ if method == "reduce":
378
+ # e.g. test.series.test_ufunc.test_reduce
379
+ result = dispatch_reduction_ufunc(self, ufunc, method, *inputs, **kwargs)
380
+ if result is not NotImplemented:
381
+ return result
382
+
383
+ # We still get here with kwargs `axis` for e.g. np.maximum.accumulate
384
+ # and `dtype` and `keepdims` for np.ptp
385
+
386
+ if self.ndim > 1 and (len(inputs) > 1 or ufunc.nout > 1):
387
+ # Just give up on preserving types in the complex case.
388
+ # In theory we could preserve them for them.
389
+ # * nout>1 is doable if BlockManager.apply took nout and
390
+ # returned a Tuple[BlockManager].
391
+ # * len(inputs) > 1 is doable when we know that we have
392
+ # aligned blocks / dtypes.
393
+
394
+ # e.g. my_ufunc, modf, logaddexp, heaviside, subtract, add
395
+ inputs = tuple(np.asarray(x) for x in inputs)
396
+ # Note: we can't use default_array_ufunc here bc reindexing means
397
+ # that `self` may not be among `inputs`
398
+ result = getattr(ufunc, method)(*inputs, **kwargs)
399
+ elif self.ndim == 1:
400
+ # ufunc(series, ...)
401
+ inputs = tuple(extract_array(x, extract_numpy=True) for x in inputs)
402
+ result = getattr(ufunc, method)(*inputs, **kwargs)
403
+ # ufunc(dataframe)
404
+ elif method == "__call__" and not kwargs:
405
+ # for np.<ufunc>(..) calls
406
+ # kwargs cannot necessarily be handled block-by-block, so only
407
+ # take this path if there are no kwargs
408
+ mgr = inputs[0]._mgr # pyright: ignore[reportGeneralTypeIssues]
409
+ result = mgr.apply(getattr(ufunc, method))
410
+ else:
411
+ # otherwise specific ufunc methods (eg np.<ufunc>.accumulate(..))
412
+ # Those can have an axis keyword and thus can't be called block-by-block
413
+ result = default_array_ufunc(inputs[0], ufunc, method, *inputs, **kwargs) # pyright: ignore[reportGeneralTypeIssues]
414
+ # e.g. np.negative (only one reached), with "where" and "out" in kwargs
415
+
416
+ result = reconstruct(result)
417
+ return result
418
+
419
+
420
+ def _standardize_out_kwarg(**kwargs) -> dict:
421
+ """
422
+ If kwargs contain "out1" and "out2", replace that with a tuple "out"
423
+
424
+ np.divmod, np.modf, np.frexp can have either `out=(out1, out2)` or
425
+ `out1=out1, out2=out2)`
426
+ """
427
+ if "out" not in kwargs and "out1" in kwargs and "out2" in kwargs:
428
+ out1 = kwargs.pop("out1")
429
+ out2 = kwargs.pop("out2")
430
+ out = (out1, out2)
431
+ kwargs["out"] = out
432
+ return kwargs
433
+
434
+
435
+ def dispatch_ufunc_with_out(self, ufunc: np.ufunc, method: str, *inputs, **kwargs):
436
+ """
437
+ If we have an `out` keyword, then call the ufunc without `out` and then
438
+ set the result into the given `out`.
439
+ """
440
+
441
+ # Note: we assume _standardize_out_kwarg has already been called.
442
+ out = kwargs.pop("out")
443
+ where = kwargs.pop("where", None)
444
+
445
+ result = getattr(ufunc, method)(*inputs, **kwargs)
446
+
447
+ if result is NotImplemented:
448
+ return NotImplemented
449
+
450
+ if isinstance(result, tuple):
451
+ # i.e. np.divmod, np.modf, np.frexp
452
+ if not isinstance(out, tuple) or len(out) != len(result):
453
+ raise NotImplementedError
454
+
455
+ for arr, res in zip(out, result, strict=True):
456
+ _assign_where(arr, res, where)
457
+
458
+ return out
459
+
460
+ if isinstance(out, tuple):
461
+ if len(out) == 1:
462
+ out = out[0]
463
+ else:
464
+ raise NotImplementedError
465
+
466
+ _assign_where(out, result, where)
467
+ return out
468
+
469
+
470
+ def _assign_where(out, result, where) -> None:
471
+ """
472
+ Set a ufunc result into 'out', masking with a 'where' argument if necessary.
473
+ """
474
+ if where is None:
475
+ # no 'where' arg passed to ufunc
476
+ out[:] = result
477
+ else:
478
+ np.putmask(out, where, result)
479
+
480
+
481
+ def default_array_ufunc(self, ufunc: np.ufunc, method: str, *inputs, **kwargs):
482
+ """
483
+ Fallback to the behavior we would get if we did not define __array_ufunc__.
484
+
485
+ Notes
486
+ -----
487
+ We are assuming that `self` is among `inputs`.
488
+ """
489
+ if not any(x is self for x in inputs):
490
+ raise NotImplementedError
491
+
492
+ new_inputs = [x if x is not self else np.asarray(x) for x in inputs]
493
+
494
+ return getattr(ufunc, method)(*new_inputs, **kwargs)
495
+
496
+
497
+ def dispatch_reduction_ufunc(self, ufunc: np.ufunc, method: str, *inputs, **kwargs):
498
+ """
499
+ Dispatch ufunc reductions to self's reduction methods.
500
+ """
501
+ assert method == "reduce"
502
+
503
+ if len(inputs) != 1 or inputs[0] is not self:
504
+ return NotImplemented
505
+
506
+ if ufunc.__name__ not in REDUCTION_ALIASES:
507
+ return NotImplemented
508
+
509
+ method_name = REDUCTION_ALIASES[ufunc.__name__]
510
+
511
+ # NB: we are assuming that min/max represent minimum/maximum methods,
512
+ # which would not be accurate for e.g. Timestamp.min
513
+ if not hasattr(self, method_name):
514
+ return NotImplemented
515
+
516
+ if self.ndim > 1:
517
+ if isinstance(self, ABCNDFrame):
518
+ # TODO: test cases where this doesn't hold, i.e. 2D DTA/TDA
519
+ kwargs["numeric_only"] = False
520
+
521
+ if "axis" not in kwargs:
522
+ # For DataFrame reductions we don't want the default axis=0
523
+ # Note: np.min is not a ufunc, but uses array_function_dispatch,
524
+ # so calls DataFrame.min (without ever getting here) with the np.min
525
+ # default of axis=None, which DataFrame.min catches and changes to axis=0.
526
+ # np.minimum.reduce(df) gets here bc axis is not in kwargs,
527
+ # so we set axis=0 to match the behavior of np.minimum.reduce(df.values)
528
+ kwargs["axis"] = 0
529
+
530
+ # By default, numpy's reductions do not skip NaNs, so we have to
531
+ # pass skipna=False
532
+ result = getattr(self, method_name)(skipna=False, **kwargs)
533
+ result = maybe_unbox_numpy_scalar(result)
534
+ return result