rovecode 0.3.2 → 0.4.0-beta.2
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/CHANGELOG.md +512 -0
- package/README.md +33 -45
- package/bin/rovecode.js +24 -0
- package/dist/cli/app-dybnr56b.js +2 -0
- package/dist/cli/ask-user-p8hq4xgj.js +2 -0
- package/dist/cli/auth-login-ewpgw5sm.js +2 -0
- package/dist/cli/auth-m8p9grty.js +2 -0
- package/dist/cli/bench-xv3ypwev.js +9 -0
- package/dist/cli/catalog-737wb2s0.js +2 -0
- package/dist/cli/cli-arhg40m0.js +2 -0
- package/dist/cli/client-cf2pxx8q.js +2 -0
- package/dist/cli/commands-3p7e4xxs.js +2 -0
- package/dist/cli/connect-3q93d7cb.js +2 -0
- package/dist/cli/context-cmd-eqxmxhzq.js +2 -0
- package/dist/cli/context-report-hbw9zfes.js +2 -0
- package/dist/cli/count-remote-mby98cd0.js +2 -0
- package/dist/cli/design-122y0axd.js +2 -0
- package/dist/cli/dispatch-b4egzvvh.js +2 -0
- package/dist/cli/doctor-x4jkv72e.js +3 -0
- package/dist/cli/executor-ftvg6tsy.js +2 -0
- package/dist/cli/export-pdgdhkch.js +2 -0
- package/dist/cli/files-cez9a96p.js +2 -0
- package/dist/cli/gauntlet-r3xxaszc.js +2 -0
- package/dist/cli/gauntlet-runner-r515m7kk.js +10 -0
- package/dist/cli/gauntlet-wave3-bnkjk2v2.js +5 -0
- package/dist/cli/gauntlet-wave4-acs9s60q.js +14 -0
- package/dist/cli/hashline-ewg5hbe3.js +2 -0
- package/dist/cli/http-n0kehsk8.js +5 -0
- package/dist/cli/index-z5qt1s76.js +2 -0
- package/dist/cli/install-80mp63kx.js +2 -0
- package/dist/cli/loop-12twjcat.js +2 -0
- package/dist/cli/main-01pv9206.js +4 -0
- package/dist/cli/main-0jys2ccn.js +3 -0
- package/dist/cli/main-1ztz6fkj.js +10 -0
- package/dist/cli/main-23q7cmww.js +9 -0
- package/dist/cli/main-2rzbexn2.js +3 -0
- package/dist/cli/main-2wyax8k9.js +9 -0
- package/dist/cli/main-2yeveeve.js +6 -0
- package/dist/cli/main-2z3dek0b.js +3 -0
- package/dist/cli/main-2zgsknth.js +3 -0
- package/dist/cli/main-45ejth3a.js +4 -0
- package/dist/cli/main-45rn3trk.js +22 -0
- package/dist/cli/main-4p4e2w7x.js +4 -0
- package/dist/cli/main-4y0tnfpa.js +16 -0
- package/dist/cli/main-5py0rkmc.js +4 -0
- package/dist/cli/main-6dtqmbt6.js +7 -0
- package/dist/cli/main-6h9x282m.js +4 -0
- package/dist/cli/main-6vjeds42.js +3 -0
- package/dist/cli/main-78gq4bt9.js +6 -0
- package/dist/cli/main-7jd5vh3x.js +4 -0
- package/dist/cli/main-7kt6r53y.js +4 -0
- package/dist/cli/main-8c1tbazx.js +58 -0
- package/dist/cli/main-9a9rnh47.js +19 -0
- package/dist/cli/main-9ht36z12.js +3 -0
- package/dist/cli/main-a2yfvcy9.js +7 -0
- package/dist/cli/main-a3f51n0x.js +5 -0
- package/dist/cli/main-b8zq261k.js +3 -0
- package/dist/cli/main-bxtvnf6d.js +13 -0
- package/dist/cli/main-edxc3yzt.js +4 -0
- package/dist/cli/main-evgz4mp5.js +21 -0
- package/dist/cli/main-f33fc5je.js +9 -0
- package/dist/cli/main-fvnpq46y.js +12 -0
- package/dist/cli/main-gbbty4d4.js +3 -0
- package/dist/cli/main-gth53dnt.js +25 -0
- package/dist/cli/main-hqbz10aw.js +9 -0
- package/dist/cli/main-hrrvcfan.js +38 -0
- package/dist/cli/main-hzwtsb2m.js +5 -0
- package/dist/cli/main-j7ttv0sd.js +34 -0
- package/dist/cli/main-jak598k9.js +5 -0
- package/dist/cli/main-kba6zeyd.js +6 -0
- package/dist/cli/main-kwwsz6rq.js +3 -0
- package/dist/cli/main-m8vm17zq.js +3 -0
- package/dist/cli/main-mg4f96e1.js +3 -0
- package/dist/cli/main-mg9b20ac.js +18 -0
- package/dist/cli/main-mgb9ccnx.js +3 -0
- package/dist/cli/main-mjt2p7aj.js +3 -0
- package/dist/cli/main-n6qrdbmy.js +3 -0
- package/dist/cli/main-na7wse0x.js +5 -0
- package/dist/cli/main-nqveez48.js +4 -0
- package/dist/cli/main-ntqef02r.js +10 -0
- package/dist/cli/main-nvc3yjay.js +136 -0
- package/dist/cli/main-p0cfn6nr.js +16 -0
- package/dist/cli/main-qj2djy17.js +19 -0
- package/dist/cli/main-qsevpgsv.js +3 -0
- package/dist/cli/main-qvarybsp.js +3 -0
- package/dist/cli/main-rebtt91r.js +5 -0
- package/dist/cli/main-rpg7h8mb.js +3 -0
- package/dist/cli/main-rsy72qmw.js +15 -0
- package/dist/cli/main-rvetps99.js +18 -0
- package/dist/cli/main-s4bb0jav.js +3 -0
- package/dist/cli/main-s9v8k74e.js +3 -0
- package/dist/cli/main-tjvwmscs.js +3 -0
- package/dist/cli/main-tkgarpjj.js +4 -0
- package/dist/cli/main-v8y60bb2.js +3 -0
- package/dist/cli/main-vhrrq337.js +3 -0
- package/dist/cli/main-vp2dfb7s.js +4 -0
- package/dist/cli/main-vqbr22sz.js +8 -0
- package/dist/cli/main-vxnwe5xx.js +18 -0
- package/dist/cli/main-wgph00xf.js +5 -0
- package/dist/cli/main-wk2csfnj.js +5 -0
- package/dist/cli/main-wm997zjx.js +3 -0
- package/dist/cli/main-wpkyraxh.js +3 -0
- package/dist/cli/main-wqt32p5x.js +4 -0
- package/dist/cli/main-x9ct6y1a.js +3 -0
- package/dist/cli/main-xfekqh9m.js +7 -0
- package/dist/cli/main-xt9zc3n6.js +7 -0
- package/dist/cli/main-xx2z3zh5.js +4 -0
- package/dist/cli/main-y5c82rxr.js +3 -0
- package/dist/cli/main-yrjt2sqt.js +14 -0
- package/dist/cli/main-ys6zj3yr.js +3 -0
- package/dist/cli/main-ywbxshqc.js +8 -0
- package/dist/cli/main-z13755t8.js +25 -0
- package/dist/cli/main-zc7pyrbj.js +4 -0
- package/dist/cli/main.js +279 -0
- package/dist/cli/market-cmd-bm5xvn9f.js +5 -0
- package/dist/cli/mcp-login-bthtfpt7.js +2 -0
- package/dist/cli/mcp-market-cmd-mbeshfyd.js +2 -0
- package/dist/cli/notify-54v5z9dz.js +2 -0
- package/dist/cli/oauth-g5gme95c.js +2 -0
- package/dist/cli/output-satndjap.js +16 -0
- package/dist/cli/profiles-sfhpbq3m.js +2 -0
- package/dist/cli/provider-config-hv3xtdt4.js +2 -0
- package/dist/cli/provider-kwzq6g84.js +2 -0
- package/dist/cli/registry-fh0hdnyn.js +2 -0
- package/dist/cli/registry-y1y8e94r.js +2 -0
- package/dist/cli/repl-t4z03mqq.js +11 -0
- package/dist/cli/resume-fqt4chg8.js +2 -0
- package/dist/cli/run-flags-rysbag9t.js +2 -0
- package/dist/cli/runtime-j19fjbsa.js +2 -0
- package/dist/cli/sandbox-config-g4qxd7y5.js +2 -0
- package/dist/cli/server-r0b6bksk.js +5 -0
- package/dist/cli/session-arg-txmn5g4x.js +2 -0
- package/dist/cli/session-ed250d9j.js +2 -0
- package/dist/cli/sessions-cmd-adw7svfn.js +7 -0
- package/dist/cli/settings-y9rzcqx8.js +2 -0
- package/dist/cli/setup-jmbr11j0.js +2 -0
- package/dist/cli/sextant-smoke-tcth0vea.js +5 -0
- package/dist/cli/skills-cmd-zbdy99v6.js +2 -0
- package/dist/cli/smoke-1bg937kx.js +8 -0
- package/dist/cli/start-chat-p01cdks3.js +12 -0
- package/dist/cli/stream-4wmyaypz.js +2 -0
- package/dist/cli/task-eg4s093s.js +2 -0
- package/dist/cli/tasks-12v9rr9k.js +2 -0
- package/dist/cli/thinking-a5ngvqyh.js +2 -0
- package/dist/cli/todo-1wxpcecx.js +2 -0
- package/dist/cli/tools-2ftsya7w.js +2 -0
- package/dist/cli/tools-x1tj4fxm.js +2 -0
- package/dist/cli/trust-cmd-hccxehzb.js +2 -0
- package/dist/cli/update-check-ygt3vd7m.js +2 -0
- package/dist/cli/update-cmd-v23qhr8c.js +2 -0
- package/dist/cli/voice-g1gtck92.js +2 -0
- package/dist/cli/webfetch-0nnrjgb5.js +2 -0
- package/dist/cli/websearch-f0vr2p7d.js +2 -0
- package/dist/cli/workspace-9rq1w4ta.js +2 -0
- package/dist/lib/index.js +62 -0
- package/dist/lib/models-index.json +1 -0
- package/dist/lib/plugins.js +6 -0
- package/dist/lib/providers.js +17 -0
- package/dist/lib/public-api.js +20 -0
- package/dist/rovecode.exe +4 -0
- package/package.json +38 -11
- package/bin/rovecode.ts +0 -21
- package/src/acp/server.ts +0 -374
- package/src/cli/auth-login.ts +0 -122
- package/src/cli/connect.ts +0 -244
- package/src/cli/context-cmd.ts +0 -199
- package/src/cli/dispatch.ts +0 -82
- package/src/cli/doctor.ts +0 -362
- package/src/cli/export.ts +0 -276
- package/src/cli/help.ts +0 -293
- package/src/cli/is-tui-invocation.ts +0 -8
- package/src/cli/main.ts +0 -583
- package/src/cli/market-cmd.ts +0 -658
- package/src/cli/mcp-login.ts +0 -141
- package/src/cli/mcp-market-cmd.ts +0 -302
- package/src/cli/output.ts +0 -382
- package/src/cli/repl.ts +0 -250
- package/src/cli/repomap-root.ts +0 -14
- package/src/cli/resume.ts +0 -57
- package/src/cli/run-flags.ts +0 -43
- package/src/cli/run-limits.ts +0 -78
- package/src/cli/runtime.ts +0 -931
- package/src/cli/session-arg.ts +0 -30
- package/src/cli/sessions-cmd.ts +0 -145
- package/src/cli/setup.ts +0 -153
- package/src/cli/skills-cmd.ts +0 -194
- package/src/cli/start-chat.ts +0 -65
- package/src/cli/trust-cmd.ts +0 -52
- package/src/coding/bash.ts +0 -148
- package/src/coding/checkpoints.ts +0 -327
- package/src/coding/diff.ts +0 -138
- package/src/coding/files.ts +0 -341
- package/src/coding/hashline.ts +0 -274
- package/src/coding/lsp-gate.ts +0 -254
- package/src/coding/lsp-servers.ts +0 -147
- package/src/coding/lsp.ts +0 -283
- package/src/coding/repomap-cache.ts +0 -99
- package/src/coding/repomap-files.ts +0 -192
- package/src/coding/repomap.ts +0 -481
- package/src/core/agents.ts +0 -255
- package/src/core/compaction.ts +0 -259
- package/src/core/config.ts +0 -289
- package/src/core/context-report.ts +0 -228
- package/src/core/context.ts +0 -60
- package/src/core/count-remote.ts +0 -107
- package/src/core/execpolicy-rules.ts +0 -196
- package/src/core/execpolicy.ts +0 -385
- package/src/core/executor.ts +0 -454
- package/src/core/guardrails.ts +0 -400
- package/src/core/hooks.ts +0 -411
- package/src/core/images.ts +0 -230
- package/src/core/intro.ts +0 -266
- package/src/core/loop.ts +0 -567
- package/src/core/modes.ts +0 -372
- package/src/core/orchestrator.ts +0 -245
- package/src/core/proc-group.ts +0 -48
- package/src/core/project-trust.ts +0 -98
- package/src/core/reflection.ts +0 -165
- package/src/core/sandbox-config.ts +0 -186
- package/src/core/session-id.ts +0 -24
- package/src/core/session-images.ts +0 -73
- package/src/core/session-ops.ts +0 -183
- package/src/core/session-text.ts +0 -29
- package/src/core/session.ts +0 -469
- package/src/core/settings.ts +0 -170
- package/src/core/tasks.ts +0 -646
- package/src/core/token-scale.ts +0 -108
- package/src/core/tools.ts +0 -309
- package/src/core/trust.ts +0 -104
- package/src/core/types.ts +0 -330
- package/src/core/update-check.ts +0 -171
- package/src/core/usage.ts +0 -204
- package/src/core/validate.ts +0 -121
- package/src/core/verify-gate.ts +0 -159
- package/src/core/verify.ts +0 -236
- package/src/core/voice.ts +0 -158
- package/src/core/win-job.ts +0 -183
- package/src/core/workspace.ts +0 -184
- package/src/design/audit.ts +0 -797
- package/src/design/direction.ts +0 -190
- package/src/design/rules.ts +0 -157
- package/src/eval/bench.ts +0 -150
- package/src/eval/gauntlet-runner.ts +0 -215
- package/src/eval/gauntlet-support.ts +0 -84
- package/src/eval/gauntlet-wave3.ts +0 -269
- package/src/eval/gauntlet-wave4.ts +0 -217
- package/src/eval/gauntlet.ts +0 -253
- package/src/index.ts +0 -17
- package/src/lanes/agy.ts +0 -95
- package/src/lanes/approval.ts +0 -24
- package/src/lanes/claude.ts +0 -129
- package/src/lanes/codex.ts +0 -127
- package/src/lanes/events.ts +0 -130
- package/src/lanes/job.ts +0 -142
- package/src/lanes/opencode.ts +0 -122
- package/src/lanes/process.ts +0 -184
- package/src/lanes/progress.ts +0 -183
- package/src/lanes/registry.ts +0 -178
- package/src/lanes/runner.ts +0 -124
- package/src/lanes/types.ts +0 -112
- package/src/market/catalogs/mcp-docs.json +0 -111
- package/src/market/catalogs/plugins.json +0 -111
- package/src/market/catalogs/skills.json +0 -478
- package/src/market/clone.ts +0 -72
- package/src/market/context-cost.ts +0 -121
- package/src/market/digest.ts +0 -106
- package/src/market/index.ts +0 -22
- package/src/market/install.ts +0 -578
- package/src/market/manifest.ts +0 -187
- package/src/market/prereq.ts +0 -145
- package/src/market/registry.ts +0 -363
- package/src/market/resolve.ts +0 -111
- package/src/market/types.ts +0 -236
- package/src/market/validate.ts +0 -227
- package/src/mcp/client.ts +0 -449
- package/src/mcp/config.ts +0 -252
- package/src/mcp/local-package.ts +0 -211
- package/src/mcp/market-catalog.ts +0 -84
- package/src/mcp/market-install.ts +0 -289
- package/src/mcp/market.ts +0 -362
- package/src/mcp/oauth.ts +0 -251
- package/src/mcp/prompts-resources.ts +0 -249
- package/src/mcp/shared.ts +0 -149
- package/src/mcp/status.ts +0 -67
- package/src/mcp/tools.ts +0 -275
- package/src/mcp/transport.ts +0 -122
- package/src/mcp/trust.ts +0 -25
- package/src/memory/blocks.ts +0 -278
- package/src/memory/recall.ts +0 -355
- package/src/memory/scope.ts +0 -182
- package/src/memory/store.ts +0 -105
- package/src/memory/tools.ts +0 -99
- package/src/plugins/cli.ts +0 -119
- package/src/plugins/discover.ts +0 -108
- package/src/plugins/index.ts +0 -50
- package/src/plugins/install.ts +0 -184
- package/src/plugins/load.ts +0 -124
- package/src/plugins/manifest.ts +0 -92
- package/src/plugins/state.ts +0 -83
- package/src/providers/auth.ts +0 -408
- package/src/providers/cache.ts +0 -223
- package/src/providers/catalog-local.ts +0 -160
- package/src/providers/catalog.ts +0 -421
- package/src/providers/middleware-context.ts +0 -86
- package/src/providers/middleware.ts +0 -373
- package/src/providers/model-list.ts +0 -23
- package/src/providers/oauth/common.ts +0 -105
- package/src/providers/oauth/device-code.ts +0 -107
- package/src/providers/oauth/github-copilot.ts +0 -146
- package/src/providers/oauth/loopback.ts +0 -158
- package/src/providers/oauth/openai.ts +0 -163
- package/src/providers/oauth/openrouter.ts +0 -89
- package/src/providers/oauth/pkce.ts +0 -45
- package/src/providers/oauth/registry.ts +0 -39
- package/src/providers/oauth/seam.ts +0 -89
- package/src/providers/profile-glm53.ts +0 -111
- package/src/providers/profile-sonnet5-persona.ts +0 -65
- package/src/providers/profile-sonnet5-voice.ts +0 -23
- package/src/providers/profiles.ts +0 -156
- package/src/providers/provider-config.ts +0 -311
- package/src/providers/registry.ts +0 -333
- package/src/providers/responses.ts +0 -209
- package/src/providers/retry.ts +0 -234
- package/src/providers/router.ts +0 -294
- package/src/providers/sse.ts +0 -26
- package/src/providers/stream-errors.ts +0 -117
- package/src/providers/stream.ts +0 -566
- package/src/providers/thinking.ts +0 -189
- package/src/providers/wire-messages.ts +0 -129
- package/src/providers/wire-responses.ts +0 -79
- package/src/providers/wire-select.ts +0 -53
- package/src/server/http.ts +0 -291
- package/src/server/openapi.ts +0 -246
- package/src/sextant/card-hits.ts +0 -102
- package/src/sextant/card-keys.ts +0 -55
- package/src/sextant/context-source.ts +0 -157
- package/src/sextant/crew-cards.ts +0 -350
- package/src/sextant/draw-agents.ts +0 -273
- package/src/sextant/draw-code.ts +0 -388
- package/src/sextant/draw-context.ts +0 -222
- package/src/sextant/draw-frame.ts +0 -164
- package/src/sextant/draw-market.ts +0 -573
- package/src/sextant/draw-messages.ts +0 -386
- package/src/sextant/draw-pet.ts +0 -230
- package/src/sextant/draw-plan.ts +0 -187
- package/src/sextant/draw-tabs.ts +0 -85
- package/src/sextant/draw-util.ts +0 -65
- package/src/sextant/draw-wizard.ts +0 -378
- package/src/sextant/engine.ts +0 -230
- package/src/sextant/frame-hits.ts +0 -25
- package/src/sextant/frame.ts +0 -101
- package/src/sextant/git-status.ts +0 -197
- package/src/sextant/grid.ts +0 -59
- package/src/sextant/input.ts +0 -119
- package/src/sextant/keys.ts +0 -521
- package/src/sextant/layout.ts +0 -86
- package/src/sextant/local-commands.ts +0 -169
- package/src/sextant/market-source.ts +0 -287
- package/src/sextant/mentions.ts +0 -200
- package/src/sextant/message-hits.ts +0 -26
- package/src/sextant/model.ts +0 -387
- package/src/sextant/overlays.ts +0 -456
- package/src/sextant/panel-hits.ts +0 -38
- package/src/sextant/pet.ts +0 -399
- package/src/sextant/screen.ts +0 -324
- package/src/sextant/scroll-hits.ts +0 -66
- package/src/sextant/scrollbar.ts +0 -82
- package/src/sextant/sextant-bridge.ts +0 -174
- package/src/sextant/sextant-cards.ts +0 -142
- package/src/sextant/sextant-diff-base.ts +0 -63
- package/src/sextant/sextant-files.ts +0 -154
- package/src/sextant/sextant-frame-loop.ts +0 -335
- package/src/sextant/sextant-renderer.ts +0 -574
- package/src/sextant/sextant-repo.ts +0 -140
- package/src/sextant/theme.ts +0 -66
- package/src/sextant/tool-rows.ts +0 -189
- package/src/sextant/types.ts +0 -493
- package/src/skills/index.ts +0 -387
- package/src/skills/pack.ts +0 -220
- package/src/skills/spec.ts +0 -162
- package/src/skills/tools.ts +0 -69
- package/src/skills/versioned.ts +0 -227
- package/src/telemetry/otel-export.ts +0 -122
- package/src/telemetry/otel-lanes.ts +0 -89
- package/src/telemetry/otel-logs.ts +0 -131
- package/src/telemetry/otel-metrics.ts +0 -136
- package/src/telemetry/otel.ts +0 -397
- package/src/telemetry/otlp.ts +0 -76
- package/src/tools/ask-user.ts +0 -156
- package/src/tools/bash-bg.ts +0 -94
- package/src/tools/bash-jobs.ts +0 -237
- package/src/tools/design.ts +0 -151
- package/src/tools/evalcell.ts +0 -338
- package/src/tools/html-text.ts +0 -139
- package/src/tools/provider.ts +0 -149
- package/src/tools/task.ts +0 -250
- package/src/tools/todo.ts +0 -320
- package/src/tools/webfetch.ts +0 -332
- package/src/tools/websearch.ts +0 -359
- package/src/tui/agents-cmd.ts +0 -41
- package/src/tui/app.ts +0 -749
- package/src/tui/attach.ts +0 -127
- package/src/tui/boot-notes.ts +0 -41
- package/src/tui/builtin-prompts.ts +0 -59
- package/src/tui/checkpoints-cmd.ts +0 -70
- package/src/tui/clipboard-image.ts +0 -81
- package/src/tui/clipboard.ts +0 -78
- package/src/tui/commands.ts +0 -283
- package/src/tui/config-view.ts +0 -53
- package/src/tui/context-cmds.ts +0 -282
- package/src/tui/cost.ts +0 -108
- package/src/tui/crash-guard.ts +0 -173
- package/src/tui/focus-terminal.ts +0 -34
- package/src/tui/git-cmds.ts +0 -273
- package/src/tui/git-plain.ts +0 -58
- package/src/tui/info-cmd.ts +0 -150
- package/src/tui/input-plain.ts +0 -76
- package/src/tui/mcp-cmd.ts +0 -128
- package/src/tui/memory-note.ts +0 -77
- package/src/tui/modes-cmd.ts +0 -45
- package/src/tui/notify-seq.ts +0 -100
- package/src/tui/notify.ts +0 -318
- package/src/tui/overlays.ts +0 -97
- package/src/tui/pi-renderer.ts +0 -428
- package/src/tui/providers-cmd.ts +0 -377
- package/src/tui/reasoning-view.ts +0 -56
- package/src/tui/renderer.ts +0 -128
- package/src/tui/replay-marker.ts +0 -29
- package/src/tui/session-cmd.ts +0 -148
- package/src/tui/session-manage.ts +0 -95
- package/src/tui/sextant-attach.ts +0 -102
- package/src/tui/sextant-io.ts +0 -202
- package/src/tui/sextant-smoke.ts +0 -110
- package/src/tui/shell-cmd.ts +0 -158
- package/src/tui/smoke.ts +0 -72
- package/src/tui/staged-terminal.ts +0 -50
- package/src/tui/startup.ts +0 -12
- package/src/tui/theme.ts +0 -59
- package/src/tui/todo-label.ts +0 -7
- package/src/tui/trust-card.ts +0 -107
- package/src/tui/tui-commands.ts +0 -87
- package/tsconfig.json +0 -30
- package/vendor/pi-tui/LICENSE +0 -21
- package/vendor/pi-tui/PATCHES.md +0 -12
- package/vendor/pi-tui/PROVENANCE.md +0 -12
- package/vendor/pi-tui/README.upstream.md +0 -854
- package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/vendor/pi-tui/src/alt-screen-search.ts +0 -158
- package/vendor/pi-tui/src/autocomplete.ts +0 -827
- package/vendor/pi-tui/src/components/alt-screen-flash.ts +0 -52
- package/vendor/pi-tui/src/components/box.ts +0 -138
- package/vendor/pi-tui/src/components/cancellable-loader.ts +0 -41
- package/vendor/pi-tui/src/components/editor.ts +0 -2364
- package/vendor/pi-tui/src/components/h-stack.ts +0 -45
- package/vendor/pi-tui/src/components/image.ts +0 -128
- package/vendor/pi-tui/src/components/input.ts +0 -448
- package/vendor/pi-tui/src/components/loader.ts +0 -93
- package/vendor/pi-tui/src/components/markdown.ts +0 -1016
- package/vendor/pi-tui/src/components/scroll-view.ts +0 -217
- package/vendor/pi-tui/src/components/select-list.ts +0 -230
- package/vendor/pi-tui/src/components/settings-list.ts +0 -277
- package/vendor/pi-tui/src/components/spacer.ts +0 -29
- package/vendor/pi-tui/src/components/stack.ts +0 -155
- package/vendor/pi-tui/src/components/text.ts +0 -108
- package/vendor/pi-tui/src/components/truncated-text.ts +0 -66
- package/vendor/pi-tui/src/components/v-stack.ts +0 -34
- package/vendor/pi-tui/src/editor-component.ts +0 -75
- package/vendor/pi-tui/src/fuzzy.ts +0 -138
- package/vendor/pi-tui/src/index.ts +0 -149
- package/vendor/pi-tui/src/keybindings.ts +0 -321
- package/vendor/pi-tui/src/keys.ts +0 -1402
- package/vendor/pi-tui/src/kill-ring.ts +0 -47
- package/vendor/pi-tui/src/latex.ts +0 -1381
- package/vendor/pi-tui/src/layout-node.ts +0 -52
- package/vendor/pi-tui/src/layout.ts +0 -411
- package/vendor/pi-tui/src/native-modifiers.ts +0 -60
- package/vendor/pi-tui/src/native-module-path.ts +0 -32
- package/vendor/pi-tui/src/stdin-buffer.ts +0 -445
- package/vendor/pi-tui/src/terminal-colors.ts +0 -74
- package/vendor/pi-tui/src/terminal-image.ts +0 -701
- package/vendor/pi-tui/src/terminal.ts +0 -554
- package/vendor/pi-tui/src/tui-alt-screen.ts +0 -1379
- package/vendor/pi-tui/src/tui-main-screen.ts +0 -655
- package/vendor/pi-tui/src/tui.ts +0 -1264
- package/vendor/pi-tui/src/undo-stack.ts +0 -29
- package/vendor/pi-tui/src/utils.ts +0 -1327
- package/vendor/pi-tui/src/word-navigation.ts +0 -118
- package/vendor/pi-tui/test/test-themes.ts +0 -39
- package/vendor/pi-tui/test/virtual-terminal.ts +0 -219
- /package/{src/providers → dist/cli}/models-index.json +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Uc as H2,Vc as B2,Wc as YZ}from"./main-bxtvnf6d.js";import{$c as W2,cd as K4}from"./main-4p4e2w7x.js";import{fd as N2}from"./main-hqbz10aw.js";import{kd as P4,ld as U4}from"./main-n6qrdbmy.js";import{md as P2,nd as U2,pd as O2,qd as X4,sd as zZ,td as j4}from"./main-evgz4mp5.js";import{vd as tQ,wd as o0,xd as V4}from"./main-f33fc5je.js";import{yd as V2,zd as q4}from"./main-2zgsknth.js";import{Ed as W4}from"./main-kwwsz6rq.js";import{Gd as eQ,Hd as $2}from"./main-23q7cmww.js";import{Id as Z2,Jd as Q2,Kd as J2}from"./main-45rn3trk.js";import{$d as j2}from"./main-yrjt2sqt.js";import{de as WZ,ee as qZ}from"./main-a2yfvcy9.js";import{fe as J9,ge as k3,ie as Y9,je as x3,me as k9,se as F2,te as x9}from"./main-gth53dnt.js";import{ue as _0,ve as q2,xe as H9}from"./main-2z3dek0b.js";import{Ae as v$,Be as SZ,Ce as H0,Fe as r0,ye as C$,ze as a}from"./main-9a9rnh47.js";import{Te as X2}from"./main-mg9b20ac.js";import{Ue as m0,Ve as K$,We as LQ,Xe as n$,Ye as o$,Ze as NQ,jf as ZZ,kf as QZ,lf as JZ}from"./main-p0cfn6nr.js";import{Bf as C2,Cf as B4,tf as VZ,xf as I2}from"./main-xfekqh9m.js";import{Kf as L2}from"./main-s4bb0jav.js";import{Qf as sQ}from"./main-wqt32p5x.js";import{Vf as K2,Wf as G2,Xf as g$,Yf as V9,Zf as t0,hg as s0,jg as e0,kg as $Z,lg as G4}from"./main-rvetps99.js";import{qg as D2,rg as _2,tg as H4}from"./main-x9ct6y1a.js";import{yg as z2}from"./main-mg4f96e1.js";import{Kg as Y2}from"./main-7jd5vh3x.js";import{sh as X9,uh as rQ,vh as j9}from"./main-xt9zc3n6.js";import{Eh as O$,Fh as FQ}from"./main-mgb9ccnx.js";import{ci as vQ,fi as Q4}from"./main-kba6zeyd.js";import{gi as A0,hi as D9}from"./main-2wyax8k9.js";import{fj as iQ,mj as aQ,qj as nQ}from"./main-1ztz6fkj.js";import{vj as dQ,wj as n9,yj as o9}from"./main-2rzbexn2.js";import{Bj as l$,Ej as x0,zj as lQ}from"./main-v8y60bb2.js";import{Nj as AQ,Wj as t8}from"./main-ywbxshqc.js";import{kk as oQ,lk as z4}from"./main-gbbty4d4.js";import{Ck as gQ,Dk as uQ,Ek as mQ,Fk as pQ,Gk as J4,Hk as cQ,Qk as Y4,mk as bQ,nk as yQ,ok as A$,pk as TQ,qk as F0,rk as G$,sk as OQ,uk as wQ,xk as Z4}from"./main-qj2djy17.js";import{ll as hQ,ml as $4}from"./main-6dtqmbt6.js";import{nl as tZ,pl as n0,rl as sZ}from"./main-rebtt91r.js";import{Bl as MQ,Cl as SQ,Dl as e8,sl as EQ}from"./main-a3f51n0x.js";import{Fl as RQ,Hl as s8}from"./main-5py0rkmc.js";import{Nl as kQ,Ql as xQ,Sl as fQ}from"./main-6h9x282m.js";import{cm as f0,fm as B$,gm as QQ,lm as i$,mm as M8}from"./main-wk2csfnj.js";import{pm as a$,qm as r,vm as ZQ}from"./main-y5c82rxr.js";import{wm as D8,xm as y0}from"./main-ys6zj3yr.js";import{$m as X0,Lm as n}from"./main-2yeveeve.js";import{dn as i0,mn as a0,on as EZ,pn as j0,sn as MZ,tn as k2}from"./main-nqveez48.js";import{un as h$,vn as k0,wn as o}from"./main-qsevpgsv.js";import{randomBytes as U8}from"crypto";function b0($){let Z=$.trim().replace(/\/+$/,"");return Z.endsWith(R$)?Z:Z+R$}function E$($){try{let Z=new URL($.trim());return(Z.protocol==="http:"||Z.protocol==="https:")&&Z.hostname!==""}catch{return!1}}function T9($){let Z=p$($.endpoint),Q=E$($.endpoint),J={...$.headers??{},"content-type":"application/json"},Y=$.fetch??fetch,z=$.timeoutMs??S0,V=new Set,K=new Set,q=(W)=>`${Z}/v1/${W}`,G=async(W,j)=>{if(!Q||K.has(W))return;let H=q(W),B=(N)=>$.warn(`OTLP export to ${H} failed: ${N}`),L=new AbortController;try{let N=await L8(Y(H,{method:"POST",headers:J,body:j,signal:L.signal}),z,L);if(N===h9){B(`timed out after ${z}ms`);return}if(await N.arrayBuffer().catch(()=>{return}),N.ok)return;if(O8.has(N.status)){if(!K.has(W))K.add(W),$.warn(`OTLP collector ${Z} does not accept ${W} (HTTP ${N.status}) \u2014 ${W} export disabled`);return}B(`HTTP ${N.status}`)}catch(N){B(N8(N))}};return{base:Z,usable:Q,url:q,post(W,j){let H=G(W,j);V.add(H),H.then(()=>{V.delete(H)})},async flush(){while(V.size>0)await Promise.all([...V])},disabled:(W)=>K.has(W)}}function W$($){let Z;do Z=U8($).toString("hex");while(/^0+$/.test(Z));return Z}function L8($,Z,Q){return new Promise((J,Y)=>{let z=setTimeout(()=>{Q.abort(),J(h9)},Z);z.ref?.(),$.then((V)=>{clearTimeout(z),J(V)},(V)=>{clearTimeout(z),Y(V)})})}function N8($){if($ instanceof Error)return $.message;if(typeof $==="object"&&$!==null&&typeof $.message==="string")return $.message;return String($)}var S0=5000,R$="/v1/traces",O8,p$=($)=>b0($).slice(0,-R$.length),y9=($,Z)=>`${p$($)}/v1/${Z}`,h9;var c$=o(()=>{O8=new Set([404,405,501]);h9=Symbol("rovecode.otel.timeout")});function y$($,Z){return{resourceSpans:[{resource:{attributes:S$($)},scopeSpans:[{scope:b$(),spans:Z.map((Q)=>({traceId:Q.traceId,spanId:Q.spanId,...Q.parentSpanId?{parentSpanId:Q.parentSpanId}:{},name:Q.name,kind:1,startTimeUnixNano:d(Q.start),endTimeUnixNano:d(Q.end??Q.start),attributes:q$(Q.attrs),...Q.events.length>0?{events:Q.events.map((J)=>({name:J.name,timeUnixNano:d(J.time),attributes:q$(J.attrs)}))}:{},status:Q.status.message!==void 0?{code:Q.status.code,message:Q.status.message}:{code:Q.status.code}}))}]}]}}function d($){let Z=Math.floor($);return(BigInt(Z)*1000000n+BigInt(Math.round(($-Z)*1e6))).toString()}var b=($)=>({stringValue:$}),v=($)=>({intValue:String(Math.trunc($))}),w9=($)=>({doubleValue:$}),M$=($)=>({boolValue:$}),q$=($)=>[...$].map(([Z,Q])=>({key:Z,value:Q})),S$=($)=>q$([["service.name",b($)],["service.version",b(y0.version)]]),b$=()=>({name:"rovecode",version:y0.version});var H$=o(()=>{D8()});function f9($,Z,Q=Date.now){let J=new Map;return $.subscribe((Y)=>{if(Y.kind!=="external")return;if(Y.status==="running"){if(J.has(Y.id))return;let V={traceId:W$(16),spanId:W$(8),name:"rovecode.lane",start:Y.startedAt??Q(),attrs:new Map,events:[],status:{code:0}};V.attrs.set("rovecode.task_id",b(Y.id)),V.attrs.set("rovecode.lane",b(Y.agent)),V.attrs.set("rovecode.depth",v(Y.depth)),J.set(Y.id,V);return}if(!k9(Y.status))return;let z=J.get(Y.id);if(!z)return;J.delete(Y.id),Z(_8(z,Y))})}function _8($,Z){if($.attrs.set("rovecode.status",b(Z.status)),typeof Z.laneExit==="number")$.attrs.set("rovecode.exit_code",v(Z.laneExit));if(Z.laneModel)$.attrs.set("rovecode.lane.model",b(Z.laneModel));let Q=Z.usage;if(Q&&(Q.input!==0||Q.output!==0||(Q.cacheRead??0)!==0||(Q.cacheWrite??0)!==0))$.attrs.set("rovecode.tokens.input",v(Q.input)),$.attrs.set("rovecode.tokens.output",v(Q.output)),$.attrs.set("rovecode.tokens.cacheRead",v(Q.cacheRead??0)),$.attrs.set("rovecode.tokens.cacheWrite",v(Q.cacheWrite??0));if(Z.patchLines!==void 0)$.attrs.set("rovecode.patch_lines",v(Z.patchLines));return $.attrs.set("rovecode.lane.resumable",M$(Z.laneSession!==void 0&&Z.laneSession!=="")),$.end=Z.finishedAt??Date.now(),$.status=Z.status==="failed"?{code:2,message:"lane failed"}:{code:1},$}var v9=o(()=>{x9();c$();H$()});function g9($,Z){return{resourceLogs:[{resource:{attributes:S$($)},scopeLogs:[{scope:b$(),logRecords:Z.map((Q)=>({timeUnixNano:d(Q.time),observedTimeUnixNano:d(Q.time),severityNumber:Q.severityNumber,severityText:Q.severityText,body:{stringValue:Q.body},attributes:q$(Q.attrs),...Q.traceId?{traceId:Q.traceId}:{},...Q.spanId?{spanId:Q.spanId}:{}}))}]}]}}function u9(){let $=[],Z=[],Q=(J,Y,z,V)=>{let K=new Map([["rovecode.tool",b(J.tool)],["rovecode.session_id",b(J.sessionId)],["rovecode.decision",b(Y)]]);if(J.lane)K.set("rovecode.lane",b(J.lane));if(V)K.set("rovecode.call_id",b(V.callId));let q=Y==="deny";Z.push({time:z,severityNumber:q?C8:I8,severityText:q?"WARN":"INFO",body:"rovecode.approval",attrs:K,...V?{traceId:V.traceId,spanId:V.spanId}:{}})};return{request(J){$.push(J)},resolve(J,Y,z,V,K){let q=$.findIndex((W)=>W.tool===J&&(W.fp===null||Y===null||W.fp===Y));if(q<0)return!1;let[G]=$.splice(q,1);return Q(G,z,V,K),!0},pendingFor:(J)=>$.filter((Y)=>Y.tool===J).length,drain(J){for(let Y of $.splice(0))Q(Y,"unanswered",J)},take(){let J=Z;return Z=[],J},get size(){return Z.length}}}function T0($){try{return JSON.stringify($,(Z,Q)=>Q&&typeof Q==="object"&&!Array.isArray(Q)?Object.fromEntries(Object.entries(Q).sort(([J],[Y])=>J<Y?-1:J>Y?1:0)):Q)??null}catch{return null}}var I8=9,C8=13;var m9=o(()=>{H$()});function l9($){let Z=new Map,Q=!1,J=(z,V,K)=>{let q=Z.get(z);if(!q)q={kind:"sum",name:z,unit:V,asDouble:K,series:new Map},Z.set(z,q);if(q.kind!=="sum")throw Error(`metric ${z} is a ${q.kind}`);return q},Y=(z,V,K)=>{let q=Z.get(z);if(!q)q={kind:"histogram",name:z,unit:V,bounds:K,series:new Map},Z.set(z,q);if(q.kind!=="histogram")throw Error(`metric ${z} is a ${q.kind}`);return q};return{startMs:$,get dirty(){return Q},addSum(z,V,K,q,G=!1){if(!(q>=0)||!Number.isFinite(q))return;let W=J(z,V,G),j=c9(K),H=W.series.get(j)??{attrs:new Map(K),value:0};H.value+=q,W.series.set(j,H),Q=!0},recordHistogram(z,V,K,q,G){if(!Number.isFinite(G))return;let W=Y(z,V,K),j=c9(q),H=W.series.get(j)??{attrs:new Map(q),count:0,sum:0,buckets:Array(K.length+1).fill(0)};H.count++,H.sum+=G;let B=0;while(B<K.length&&G>K[B])B++;H.buckets[B]++,W.series.set(j,H),Q=!0},encode(z,V){return Q=!1,F8(z,[...Z.values()],$,V)}}}function F8($,Z,Q,J){let Y=d(Q),z=d(J),V=(q)=>({attributes:q$(q),startTimeUnixNano:Y,timeUnixNano:z}),K=Z.map((q)=>q.kind==="sum"?{name:q.name,unit:q.unit,sum:{dataPoints:[...q.series.values()].map((G)=>({...V(G.attrs),...q.asDouble?{asDouble:G.value}:{asInt:String(Math.trunc(G.value))}})),aggregationTemporality:p9,isMonotonic:!0}}:{name:q.name,unit:q.unit,histogram:{dataPoints:[...q.series.values()].map((G)=>({...V(G.attrs),count:String(G.count),sum:G.sum,bucketCounts:G.buckets.map(String),explicitBounds:[...q.bounds]})),aggregationTemporality:p9}});return{resourceMetrics:[{resource:{attributes:S$($)},scopeMetrics:[{scope:b$(),metrics:K}]}]}}var p9=2,d9,c9=($)=>JSON.stringify([...$].sort(([Z],[Q])=>Z<Q?-1:Z>Q?1:0));var i9=o(()=>{H$();d9=[100,250,500,1000,2500,5000,1e4,30000,60000]});var t9={};k0(t9,{validEndpoint:()=>E$,unixNano:()=>d,signalUrl:()=>y9,parseOtelHeaders:()=>r9,otelOptionsFromEnv:()=>A8,otelDebug:()=>w0,normalizeEndpoint:()=>b0,encodeTraceRequest:()=>y$,createOtelHooks:()=>R8,baseOf:()=>p$,OTLP_TRACES_PATH:()=>R$,DEFAULT_EXPORT_TIMEOUT_MS:()=>S0});function A8($=process.env){let Z=($.ROVECODE_OTEL_ENDPOINT??"").trim();return Z?{endpoint:Z,headers:r9($.ROVECODE_OTEL_HEADERS)}:null}function r9($){let Z={};for(let Q of($??"").split(",")){let J=Q.indexOf("=");if(J<=0)continue;let Y=Q.slice(0,J).trim();if(Y)Z[Y]=Q.slice(J+1).trim()}return Z}function R8($){w0.constructed++;let Z=$.now??E8,Q=$.serviceName??"rovecode",J=$.isLane??((P)=>!1),Y=$.pricing,z=new Map,V=0,K="",q=(P)=>{if($.onWarning){$.onWarning(P);return}V++,K=P},G=T9({endpoint:$.endpoint,headers:$.headers,fetch:$.fetch,timeoutMs:$.timeoutMs,warn:q}),W=l9(Z()),j=u9(),H=[];if(!E$($.endpoint))q(`ROVECODE_OTEL_ENDPOINT ${JSON.stringify($.endpoint)} is not an absolute http(s) URL \u2014 OTel export disabled`);let B=(P)=>P.runId===void 0?void 0:z.get(P.runId),L=(P,U,O)=>{let F={traceId:P.run.traceId,spanId:W$(8),parentSpanId:O.spanId,name:U,start:Z(),attrs:new Map,events:[],status:{code:0}};return P.spans.push(F),F},N=(P,U)=>{if(P.end===void 0)P.end=Z(),P.status=U},D=(P,U,O)=>{P.events.push({name:U,time:Z(),attrs:new Map(O)})},A=(P,U)=>{let O=P.attrs.get(U);return O&&"stringValue"in O?O.stringValue:void 0},h=(P)=>P.lastTurn??P.run,y=(P,U)=>`${h(P).spanId}:${U}`,I=(P,U,O,F=!1)=>{let w=y(P,U),T=P.tools.get(w);if(!T){if(T=L(P,"rovecode.tool",h(P)),T.attrs.set("rovecode.call_id",b(U)),F)T.attrs.set("rovecode.failure_reason",b("loop_guard"));P.tools.set(w,T),P.calls++}if(O!==void 0&&!T.attrs.has("rovecode.tool"))T.attrs.set("rovecode.tool",b(O));return T},S=(P,U,O)=>{if(P.end!==void 0)return;P.attrs.set("rovecode.ok",M$(U)),P.attrs.set("rovecode.output_bytes",v(Buffer.byteLength(O,"utf8"))),N(P,U?h0:d$(`tool ${A(P,"rovecode.tool")??"call"} failed`))},E=(P,U)=>{let O={input:0,output:0,cacheRead:0,cacheWrite:0},F=0;for(let T of U){if(!T.usage)continue;let x={input:T.usage.input,output:T.usage.output,cacheRead:T.usage.cacheRead??0,cacheWrite:T.usage.cacheWrite??0};if(O.input+=x.input,O.output+=x.output,O.cacheRead+=x.cacheRead,O.cacheWrite+=x.cacheWrite,F===null||x.input===0&&x.output===0&&x.cacheRead===0&&x.cacheWrite===0)continue;let z$=T.origin?(Y??=new l$).lookup(T.origin.provider,T.origin.model)?.pricing:void 0,L$=z$?n9(x,z$):void 0;F=L$===void 0?null:F+L$}for(let T of a9)P.attrs.set(`rovecode.tokens.${T}`,v(O[T]));if(F!==null)P.attrs.set("rovecode.cost_usd",w9(F));let w=U.at(-1)?.origin;if(w)P.attrs.set("rovecode.model.provider",b(w.provider)),P.attrs.set("rovecode.model.model",b(w.model));return{u:O,cost:F,served:w}},M=(P)=>P?[["rovecode.model.provider",b(P.provider)],["rovecode.model.model",b(P.model)]]:[],l=(P,U,O)=>{let F=M(U.served);for(let w of a9)W.addSum("rovecode.tokens","{token}",[["rovecode.token.type",b(w)],...F],U.u[w]);if(U.cost!==null)W.addSum("rovecode.cost_usd","USD",F,U.cost,!0);W.recordHistogram("rovecode.request.duration","ms",d9,[...F,["rovecode.stop_reason",b(O)]],(P.end??Z())-P.start)},i=(P)=>{let U=0;for(let O of z.values())for(let F of O.awaiting.keys())if(A(F,"rovecode.tool")===P)U++;return U},$$=(P,U,O)=>{let F=P.awaiting.get(U);if(F===void 0)return;let w=A(U,"rovecode.tool");if(w===void 0||j.pendingFor(w)===0){P.awaiting.delete(U);return}let T=i(w)===1;P.awaiting.delete(U);let x=T?{traceId:U.traceId,spanId:U.spanId,callId:A(U,"rovecode.call_id")??""}:void 0;j.resolve(w,F,O,Z(),x)},Z$=()=>{if(V===0)return;let P=V;throw V=0,Error(P===1?K:`${K} (${P} exports failed)`)},f=()=>{if(W.dirty)G.post("metrics",JSON.stringify(W.encode(Q,Z())))},t=()=>{let P=j.take();if(P.length>0)G.post("logs",JSON.stringify(g9(Q,P)))},Y$=(P,U)=>{let O=Z();for(let F of P.spans)if(F.end===void 0&&F!==P.run)F.end=O;P.run.attrs.set("rovecode.status",b(U)),P.run.attrs.set("rovecode.turns",v(P.spans.filter((F)=>F.name==="rovecode.turn").length)),P.run.attrs.set("rovecode.tool_calls",v(P.calls)),E(P.run,$.messages().slice(P.baseline).filter((F)=>F.role==="assistant")),P.run.end=O,P.run.status=U==="done"||U==="stopped"?h0:d$(U),G.post("traces",JSON.stringify(y$(Q,P.spans))),j.drain(O),f(),t()};return{flush:()=>G.flush(),openRuns:()=>z.size,observeTasks(P){w0.lanesObserved++;let U=f9(P,(O)=>G.post("traces",JSON.stringify(y$(Q,[O]))),Z);return H.push(U),U},recordRetry(P){let U=A$(P.reason).status;W.addSum("rovecode.request.retries","{retry}",[...M(P.model),...U!==void 0?[["rovecode.retry.status",v(U)]]:[]],1)},pre_run(P){if(P.runId===void 0)return;let U={traceId:W$(16),spanId:W$(8),name:"rovecode.run",start:Z(),attrs:new Map,events:[],status:{code:0}};U.attrs.set("rovecode.session_id",b(P.sessionId)),U.attrs.set("rovecode.run_id",b(P.runId));let O=$.messages().length;z.set(P.runId,{run:U,spans:[U],tools:new Map,awaiting:new Map,calls:0,baseline:O,seen:O}),Z$()},on_event(P,U){let O=B(P);if(!O)return;switch(U.type){case"turn_start":{if(O.turn)N(O.turn,O.turn.status);O.turn=O.lastTurn=L(O,"rovecode.turn",O.run),O.turn.attrs.set("rovecode.turn",v(U.turn));break}case"turn_end":{let F=O.turn??O.lastTurn;if(!F)break;F.attrs.set("rovecode.stop_reason",b(U.stopReason));let w=$.messages(),T=E(F,w.slice(O.seen).filter((x)=>x.role==="assistant"));O.seen=w.length,N(F,U.stopReason==="error"?d$("error"):h0),l(F,T,U.stopReason),O.turn=void 0;break}case"tool_execution_start":$$(O,I(O,U.callId,U.tool,!0),"allow");break;case"tool_execution_end":{let F=I(O,U.callId);O.awaiting.delete(F),F.attrs.set("rovecode.duration_ms",v(U.durationMs)),S(F,U.ok,U.output);break}case"tool_call_failed":{let F=O.tools.get(y(O,U.callId));if(F){if(U.reason==="permission_denied")$$(O,F,"deny");else O.awaiting.delete(F);F.attrs.set("rovecode.ok",M$(!1)),F.attrs.set("rovecode.failure_reason",b(U.reason)),N(F,d$(U.reason))}else O.calls++,D(O.turn??O.lastTurn??O.run,"rovecode.tool_call_failed",[["rovecode.call_id",b(U.callId)],["rovecode.failure_reason",b(U.reason)]]);break}case"compaction":D(O.turn??O.run,"rovecode.compaction",[["rovecode.compaction.strategy",b(U.strategy)],...U.trigger?[["rovecode.compaction.trigger",b(U.trigger)]]:[],["rovecode.compaction.tokens_before",v(U.tokensBefore)],["rovecode.compaction.tokens_after",v(U.tokensAfter)]]);break;default:break}},pre_tool(P,U){let O=B(P);if(!O)return;let F=I(O,U.id,U.tool);if(F.end===void 0&&!F.attrs.has("rovecode.ok"))O.awaiting.set(F,T0(U.args))},post_tool(P,U,O){let F=B(P);if(!F)return;let w=I(F,U.id,U.tool);$$(F,w,"allow"),S(w,O.ok,O.output)},approval(P,U){let O=U.revisedArgs,F=U.tool==="task"&&typeof O==="object"&&O!==null?O.agent:void 0,w=T0(U.args),T=w!==null&&[...z.values()].some((x)=>[...x.awaiting].some(([z$,L$])=>L$===w&&A(z$,"rovecode.tool")===U.tool));j.request({tool:U.tool,sessionId:P.sessionId,...J(F)?{lane:F}:{},fp:T?w:null,at:Z()})},post_run(P,U){let O=B(P);if(!O)return;z.delete(P.runId),Y$(O,U.status)},async session_close(){for(let[P,U]of z)z.delete(P),Y$(U,"stopped");for(let P of H.splice(0))P();j.drain(Z()),f(),t(),await G.flush(),Z$()}}}var w0,h0,d$=($)=>({code:2,message:$}),a9,E8=()=>performance.timeOrigin+performance.now();var s9=o(()=>{o9();x0();F0();c$();v9();m9();i9();H$();H$();c$();w0={constructed:0,lanesObserved:0},h0={code:1},a9=["input","output","cacheRead","cacheWrite"]});class JQ{manager;prompts=new Map;resources=new Map;gens=new Map;constructor($){this.manager=$;$.onListChanged((Z,Q)=>{if(Q==="tools")return;(Q==="prompts"?this.prompts:this.resources).delete(Z),this.gens.set(`${Q}:${Z}`,this.gen(Q,Z)+1)})}gen($,Z){return this.gens.get(`${$}:${Z}`)??0}opts($){return{timeout:this.manager.requestTimeoutMs,signal:$}}async promptsOf($,Z){let Q=this.prompts.get($),J=Date.now();if(Q&&J-Q.at<this.manager.ttlMs)return Q.items;let{client:Y,caps:z}=this.manager.connection($),V=this.gen("prompts",$),K=!z.prompts?[]:await i$("prompt",$,async(q)=>{let G=await B$(Z,(W)=>Y.listPrompts(q===void 0?void 0:{cursor:q},this.opts(W)));return{items:G.prompts.map((W)=>({server:$,name:W.name,description:u(W.description),arguments:(W.arguments??[]).map((j)=>({name:j.name,description:u(j.description),required:j.required===!0}))})),nextCursor:G.nextCursor}},Z);if(this.gen("prompts",$)===V)this.prompts.set($,{at:J,items:K});return K}async resourcesOf($,Z){let Q=this.resources.get($),J=Date.now();if(Q&&J-Q.at<this.manager.ttlMs)return Q.index;let{client:Y,caps:z}=this.manager.connection($),V=this.gen("resources",$),K={resources:[],templates:[]};if(z.resources){K.resources=await i$("resource",$,async(q)=>{let G=await B$(Z,(W)=>Y.listResources(q===void 0?void 0:{cursor:q},this.opts(W)));return{items:G.resources.map((W)=>({server:$,uri:W.uri,name:u(W.name),description:u(W.description),...e9(W.mimeType)})),nextCursor:G.nextCursor}},Z);try{K.templates=await i$("resource template",$,async(q)=>{let G=await B$(Z,(W)=>Y.listResourceTemplates(q===void 0?void 0:{cursor:q},this.opts(W)));return{items:G.resourceTemplates.map((W)=>({server:$,uriTemplate:W.uriTemplate,name:u(W.name),description:u(W.description),...e9(W.mimeType)})),nextCursor:G.nextCursor}},Z)}catch(q){if(!QQ(q))throw q}}if(this.gen("resources",$)===V)this.resources.set($,{at:J,index:K});return K}async listPrompts($){let Z=[],Q=[];for(let J of this.manager.connectedNames())try{Z.push(...await this.promptsOf(J,$))}catch(Y){Q.push(`${J}: ${r(Y)}`)}return{prompts:Z,notes:Q}}async listResources($){let Z={resources:[],templates:[]},Q=[];for(let J of this.manager.connectedNames())try{let Y=await this.resourcesOf(J,$);Z.resources.push(...Y.resources),Z.templates.push(...Y.templates)}catch(Y){Q.push(`${J}: ${r(Y)}`)}return{index:Z,notes:Q}}async getPrompt($,Z,Q,J){if(Q!==void 0&&Q!==null&&!a$(Q))return{ok:!1,output:`args for prompt ${$}/${Z} must be a JSON object (got ${Array.isArray(Q)?"array":typeof Q})`};let Y;try{Y=this.manager.connection($)}catch(V){return{ok:!1,output:r(V)}}if(!Y.caps.prompts)return{ok:!1,output:`MCP server "${$}" advertises no prompts`};let z={};for(let[V,K]of Object.entries(Q??{}))z[V]=typeof K==="string"?K:JSON.stringify(K);try{let V=await B$(J,(q)=>Y.client.getPrompt({name:Z,...Object.keys(z).length>0?{arguments:z}:{}},this.opts(q))),K=[];if(u(V.description))K.push(`# ${V.description}`);for(let q of V.messages)K.push(`[${q.role}] ${S8(q.content)}`);return{ok:!0,output:f0(K.join(`
|
|
3
|
+
`),"mcp prompt")}}catch(V){let K="";try{let q=(await this.promptsOf($,J)).map((G)=>G.name);if(!q.includes(Z))K=`. Available prompts: ${q.length>0?q.join(", "):"(none)"}`}catch{}return{ok:!1,output:`mcp prompt ${$}/${Z} failed: ${r(V)}${K}`}}}async readResource($,Z,Q){let J;try{J=this.manager.connection($)}catch(Y){return{ok:!1,output:r(Y)}}if(!J.caps.resources)return{ok:!1,output:`MCP server "${$}" advertises no resources`};try{let z=(await B$(Q,(V)=>J.client.readResource({uri:Z},this.opts(V)))).contents.map((V)=>YQ(V)).join(`
|
|
4
|
+
`);return{ok:!0,output:f0(z,"mcp resource")||`(empty resource ${Z})`}}catch(Y){return{ok:!1,output:`mcp read ${$} ${Z} failed: ${r(Y)}`}}}counts($){let Z={},Q=this.prompts.get($);if(Q)Z.prompts=Q.items.length;let J=this.resources.get($);if(J)Z.resources=J.index.resources.length,Z.templates=J.index.templates.length;return Z}async prefetch($){return await this.manager.listTools(!1,$),[...(await this.listPrompts($)).notes,...(await this.listResources($)).notes]}}function YQ($){if(!a$($))return"";if(typeof $.text==="string")return $.text;if(typeof $.blob==="string"){let Z=$.blob,Q=Math.floor(Z.length*3/4)-(Z.endsWith("==")?2:Z.endsWith("=")?1:0);return`[blob ${u($.uri)} ${u($.mimeType)||"application/octet-stream"} ${Q} bytes, base64 follows]
|
|
5
|
+
${Z}`}return`[resource ${u($.uri)}: no text or blob content]`}function S8($){if(!a$($))return"";switch($.type){case"text":return u($.text);case"resource":return`[embedded resource]
|
|
6
|
+
${YQ($.resource)}`;case"resource_link":return`[resource_link ${u($.uri)}${u($.name)?` ${u($.name)}`:""}]`;case"image":case"audio":return`[${$.type} ${u($.mimeType)}]`;default:return typeof $.type==="string"?`[${$.type} content]`:""}}function zQ($){let Z=$Q.get($);if(!Z)Z=new JQ($),$Q.set($,Z);return Z}var u=($)=>typeof $==="string"?$:"",e9=($)=>typeof $==="string"&&$.length>0?{mimeType:$}:{},$Q;var VQ=o(()=>{ZQ();M8();$Q=new WeakMap});var XQ={};k0(XQ,{createMcpTools:()=>b8});function v0($){let Z=($.split(`
|
|
7
|
+
`,1)[0]??"").trim();return Z.length<=WQ?Z:`${Z.slice(0,WQ-1)}\u2026`}function KQ($){let Z=JSON.stringify($);return Z.length>qQ?`${Z.slice(0,qQ)}\u2026`:Z}function P$($,Z){let Q=$?.[Z];return typeof Q==="string"&&Q.length>0?Q:void 0}function GQ($,Z){let Q=$.connectedNames();return{ok:!1,output:`MCP server "${Z}" is not connected. Connected: ${Q.length>0?Q.join(", "):"(none)"}`}}function b8($){let Z={schema:{name:"mcp_list",description:"List tools on connected MCP servers as 'server/tool \u2014 description'. "+"With {server, tool, schema:true} returns that one tool's full JSON input schema.",args:{type:"object",properties:{server:{type:"string",description:"only list this server"},tool:{type:"string",description:"tool name (for schema lookup)"},schema:{type:"boolean",description:"return the full input schema for server+tool"}},additionalProperties:!1}},kind:"read",sequential:!1,async execute(G,W){let j=G??{},H=typeof j.server==="string"&&j.server.length>0?j.server:void 0,B=typeof j.tool==="string"&&j.tool.length>0?j.tool:void 0;if(j.schema===!0||B!==void 0){if(H===void 0||B===void 0)return{ok:!1,output:'schema lookup needs both server and tool, e.g. {server:"x", tool:"y", schema:true}'};let A=await $.toolSchema(H,B,W.signal);if(A===void 0)return{ok:!1,output:`no schema for "${B}" on "${H}" (unknown tool or server not connected); run mcp_list first`};return{ok:!0,output:`input schema for ${H}/${B}: ${KQ(A)}`,data:A}}let L=await $.listTools(!1,W.signal),N=H===void 0?L:L.filter((A)=>A.server===H);if(N.length===0){let A=$.connectedNames();if(H!==void 0&&!A.includes(H))return{ok:!1,output:`MCP server "${H}" is not connected. Connected: ${A.length>0?A.join(", "):"(none)"}`};return{ok:!0,output:A.length===0?"no MCP servers connected":"no tools advertised by connected MCP servers"}}let D=N.map((A)=>`${A.server}/${A.name} \u2014 ${v0(A.description)}`);return D.push("","call with mcp_call {server, tool, args}; arg schema via mcp_list {server, tool, schema:true}"),{ok:!0,output:D.join(`
|
|
8
|
+
`),data:N}}},Q={schema:{name:"mcp_call",description:"Call a tool on a connected MCP server. Discover names with mcp_list; on argument errors the tool's input schema is included so you can retry.",args:{type:"object",properties:{server:{type:"string",description:"MCP server name"},tool:{type:"string",description:"tool name on that server"},args:{type:"object",description:"arguments matching the tool's input schema"}},required:["server","tool"],additionalProperties:!1}},kind:"custom",interruptible:!0,async execute(G,W){let j=G??{},H=typeof j.server==="string"&&j.server.length>0?j.server:void 0,B=typeof j.tool==="string"&&j.tool.length>0?j.tool:void 0;if(H===void 0||B===void 0)return{ok:!1,output:'mcp_call requires string "server" and "tool" (discover them with mcp_list)'};let L=await $.callTool(H,B,j.args,W.signal,W.onUpdate);if(L.ok)return{ok:!0,output:L.output};let N=L.output;if(!W.signal.aborted){let D=await $.toolSchema(H,B,W.signal);if(D!==void 0)N+=`
|
|
9
|
+
|
|
10
|
+
input schema for ${H}/${B}: ${KQ(D)}`}return{ok:!1,output:N}}},J=zQ($),Y={server:{type:"string",description:"only list this server"}};return[Z,Q,{schema:{name:"mcp_prompts",description:"List prompts on connected MCP servers as 'server/name \u2014 description (args: a, b*)', * = required. Render one with mcp_prompt.",args:{type:"object",properties:Y,additionalProperties:!1}},kind:"read",sequential:!1,async execute(G,W){let j=P$(G,"server"),H,B=[];if(j!==void 0){if(!$.connectedNames().includes(j))return GQ($,j);try{H=await J.promptsOf(j,W.signal)}catch(N){return{ok:!1,output:`failed to list prompts on "${j}": ${r(N)}`}}}else{let N=await J.listPrompts(W.signal);H=N.prompts,B.push(...N.notes)}let L=H.map((N)=>{let D=N.arguments.map((A)=>A.required?`${A.name}*`:A.name).join(", ");return`${N.server}/${N.name} \u2014 ${v0(N.description)}${D?` (args: ${D})`:""}`});if(L.length===0)L.push($.connectedNames().length===0?"no MCP servers connected":`no prompts advertised by ${j===void 0?"connected MCP servers":`"${j}"`}`);else L.push("","render with mcp_prompt {server, name, args}");return{ok:!0,output:[...L,...B.map((N)=>`note: ${N}`)].join(`
|
|
11
|
+
`),data:H}}},{schema:{name:"mcp_prompt",description:"Render a prompt from an MCP server (prompts/get) as '[role] text' lines. Names and args via mcp_prompts.",args:{type:"object",properties:{server:{type:"string",description:"MCP server name"},name:{type:"string",description:"prompt name on that server"},args:{type:"object",description:"prompt arguments (string values)"}},required:["server","name"],additionalProperties:!1}},kind:"read",interruptible:!0,async execute(G,W){let j=P$(G,"server"),H=P$(G,"name");if(j===void 0||H===void 0)return{ok:!1,output:'mcp_prompt requires string "server" and "name" (discover them with mcp_prompts)'};return J.getPrompt(j,H,G?.args,W.signal)}},{schema:{name:"mcp_resources",description:"List resources (and URI templates) on connected MCP servers as 'server uri \u2014 name: description [mime]'. Read one with mcp_read.",args:{type:"object",properties:Y,additionalProperties:!1}},kind:"read",sequential:!1,async execute(G,W){let j=P$(G,"server"),H,B=[];if(j!==void 0){if(!$.connectedNames().includes(j))return GQ($,j);try{H=await J.resourcesOf(j,W.signal)}catch(D){return{ok:!1,output:`failed to list resources on "${j}": ${r(D)}`}}}else{let D=await J.listResources(W.signal);H=D.index,B.push(...D.notes)}let L=(D,A,h)=>`${D||"(unnamed)"}${A?`: ${v0(A)}`:""}${h?` [${h}]`:""}`,N=[...H.resources.map((D)=>`${D.server} ${D.uri} \u2014 ${L(D.name,D.description,D.mimeType)}`),...H.templates.map((D)=>`${D.server} template ${D.uriTemplate} \u2014 ${L(D.name,D.description,D.mimeType)}`)];if(N.length===0)N.push($.connectedNames().length===0?"no MCP servers connected":`no resources advertised by ${j===void 0?"connected MCP servers":`"${j}"`}`);else N.push("","read with mcp_read {server, uri} (fill a template's {variables} first)");return{ok:!0,output:[...N,...B.map((D)=>`note: ${D}`)].join(`
|
|
12
|
+
`),data:H}}},{schema:{name:"mcp_read",description:"Read one MCP resource by uri (resources/read): text as-is, binary as an annotated base64 blob; output capped at 10k chars.",args:{type:"object",properties:{server:{type:"string",description:"MCP server name"},uri:{type:"string",description:"resource uri (from mcp_resources)"}},required:["server","uri"],additionalProperties:!1}},kind:"read",interruptible:!0,async execute(G,W){let j=P$(G,"server"),H=P$(G,"uri");if(j===void 0||H===void 0)return{ok:!1,output:'mcp_read requires string "server" and "uri" (discover them with mcp_resources)'};return J.readResource(j,H,W.signal)}}]}var WQ=60,qQ=1500;var jQ=o(()=>{ZQ();VQ()});import{mkdirSync as y8,readFileSync as T8,renameSync as h8,rmSync as w8,writeFileSync as k8}from"fs";import{dirname as x8,join as f8}from"path";class g0{path;entries=new Map;dirty=!1;constructor($){this.path=f8($,".rovecode","cache","repomap.json");try{let Z=JSON.parse(T8(this.path,"utf8"));if(Z?.version===HQ&&Z.entries&&typeof Z.entries==="object")for(let[Q,J]of Object.entries(Z.entries)){let Y=g8(Q,J);if(Y)this.entries.set(Q,Y)}}catch{}}get($,Z,Q){let J=this.entries.get($);return J&&J.mtimeMs===Z&&J.size===Q?J.tags:void 0}set($,Z,Q,J){this.entries.set($,{mtimeMs:Z,size:Q,tags:J}),this.dirty=!0}save(){if(!this.dirty)return;let $=`${this.path}.${process.pid}.tmp`;try{y8(x8(this.path),{recursive:!0});let Z={};for(let[J,Y]of this.entries){let z=v8(Y);if(z)Z[J]=z}k8($,JSON.stringify({version:HQ,entries:Z})),h8($,this.path),this.dirty=!1}catch{try{w8($,{force:!0})}catch{}}}}var HQ=2,v8=($)=>{let Z=$.tags[0];return{m:$.mtimeMs,s:$.size,rel:Z?.relFname??"",abs:Z?.fname??"",t:$.tags.map((Q)=>[Q.line,Q.name,Q.kind==="def"?0:1])}},g8=($,Z)=>{if(typeof Z?.m!=="number"||typeof Z?.s!=="number"||!Array.isArray(Z?.t))return null;let Q=typeof Z.rel==="string"?Z.rel:"",J=typeof Z.abs==="string"&&Z.abs.length>0?Z.abs:$,Y=[];for(let z of Z.t){if(!Array.isArray(z)||typeof z[0]!=="number"||typeof z[1]!=="string"||z[2]!==0&&z[2]!==1)return null;Y.push({relFname:Q,fname:J,line:z[0],name:z[1],kind:z[2]===0?"def":"ref"})}return{mtimeMs:Z.m,size:Z.s,tags:Y}};var BQ=()=>{};var p0={};k0(p0,{findSrcFilesAsync:()=>o$,findSrcFiles:()=>n$,extractTags:()=>IQ,buildRepoMapChunkAsync:()=>r8,buildRepoMapChunk:()=>o8,RepoMap:()=>r$,MAX_SRC_FILES:()=>K$,MAX_SRC_BYTES:()=>LQ});import{readFileSync as PQ,readdirSync as u8,statSync as m8}from"fs";import{relative as u0,extname as DQ}from"path";import{parse as p8,Lang as c8}from"@ast-grep/napi";function IQ($,Z,Q){let J=m0[DQ($).toLowerCase()];if(J===void 0)return[];let Y=J!==c8.JavaScript,z;try{z=p8(J,Q).root()}catch{return[]}let V=[],K=(q,G)=>{if(!G)return;V.push({relFname:Z,fname:$,line:G.range().start.line,name:G.text(),kind:q})};for(let q of Y?l8:_Q)for(let G of z.findAll({rule:{kind:q}})){if(q==="variable_declarator"&&!i8.has(String(G.field("value")?.kind()??"")))continue;K("def",G.field("name"))}for(let q of z.findAll({rule:{kind:"call_expression"}})){let G=q.field("function");if(!G)continue;K("ref",G.kind()==="member_expression"?G.field("property"):G.kind()==="identifier"?G:null)}for(let q of z.findAll({rule:{kind:"new_expression"}}))K("ref",q.field("constructor"));if(Y){for(let q of z.findAll({rule:{kind:"type_identifier"}}))if(!a8.has(String(q.parent()?.kind()??"")))K("ref",q)}return V}function*n8($,Z,Q){let J=$.length,Y=new Map;if(J===0)return Y;let z=0.85,V=new Map,K=new Map,q=0;for(let H of Z){if(++q%1024===0)yield;let B=V.get(H.src)??new Map;B.set(H.dst,(B.get(H.dst)??0)+H.weight),V.set(H.src,B),K.set(H.src,(K.get(H.src)??0)+H.weight)}let G=[...Q?.values()??[]].reduce((H,B)=>H+B,0),W=new Map($.map((H)=>[H,G>0?(Q?.get(H)??0)/G:1/J])),j=new Map($.map((H)=>[H,1/J]));for(let H=0;H<100;H++){let B=j;j=new Map($.map((D)=>[D,0]));let L=0;for(let D of $)if((K.get(D)??0)===0)L+=z*(B.get(D)??0);for(let D of $){let A=K.get(D)??0;if(A===0)continue;let h=z*(B.get(D)??0);for(let[y,I]of V.get(D))if(j.set(y,(j.get(y)??0)+h*(I/A)),++q%1024===0)yield}let N=0;for(let D of $){let A=(j.get(D)??0)+L*(W.get(D)??0)+(1-z)*(W.get(D)??0);j.set(D,A),N+=Math.abs(A-(B.get(D)??0))}if(N<J*0.000001)break}return j}class r${root;tagsCache=new Map;disk;extractCount=0;constructor($){this.root=$;this.disk=new g0($)}getTags($,Z){let Q;try{Q=m8($)}catch{return[]}let J=Q.mtimeMs,Y=this.tagsCache.get($);if(Y&&Y.mtime===J)return Y.data;let z=this.disk.get($,J,Q.size);if(z)return this.tagsCache.set($,{mtime:J,data:z}),z;this.extractCount++;let V="";try{V=PQ($,"utf8")}catch{return[]}let K=IQ($,Z,V);return this.tagsCache.set($,{mtime:J,data:K}),this.disk.set($,J,Q.size,K),K}saveCache(){this.disk.save()}rankedTags($,Z,Q){let J=this.rankSteps($,Z,Q),Y=J.next();while(!Y.done)Y=J.next();return Y.value}*rankSteps($,Z,Q){let J=0,Y=new Map,z=new Map,V=new Map,K=new Set,q=[...new Set([...$,...Z])].sort(),G=(I)=>u0(this.root,I).replaceAll("\\","/");for(let I of q){yield;let S=G(I);if($.includes(I))K.add(S);for(let E of this.getTags(I,S)){if(++J%1024===0)yield;if(E.kind==="def"){(Y.get(E.name)??Y.set(E.name,new Set).get(E.name)).add(S);let M=`${S}\x00${E.name}`,l=V.get(M)??V.set(M,[]).get(M);if(!l.some((i)=>i.line===E.line))l.push(E)}else z.get(E.name)?.push(S)??z.set(E.name,[S])}}if(z.size===0)for(let[I,S]of Y)z.set(I,[...S]);let W=[],j=[...new Set(q.map(G))].sort();for(let[I,S]of Y){if(z.has(I))continue;for(let E of S)W.push({src:E,dst:E,weight:0.1,ident:I})}for(let[I,S]of Y){if(++J%1024===0)yield;let E=z.get(I);if(!E)continue;let M=1,l=I.includes("_")&&/[a-zA-Z]/.test(I),i=I.includes("-")&&/[a-zA-Z]/.test(I),$$=/[A-Z]/.test(I)&&/[a-z]/.test(I);if(Q.has(I))M*=10;if((l||i||$$)&&I.length>=8)M*=10;if(I.startsWith("_"))M*=0.1;if(S.size>5)M*=0.1;let Z$=new Map;for(let f of E)if(Z$.set(f,(Z$.get(f)??0)+1),++J%1024===0)yield;for(let[f,t]of Z$)for(let Y$ of S){let P=K.has(f)?M*50:M;if(W.push({src:f,dst:Y$,weight:P*Math.sqrt(t),ident:I}),++J%1024===0)yield}}let H=yield*n8(j,W),B=new Map,L=new Map;for(let I of W)if(L.set(I.src,(L.get(I.src)??0)+I.weight),++J%1024===0)yield;for(let I of W){if(++J%1024===0)yield;let S=H.get(I.src)??0,E=`${I.dst}\x00${I.ident}`;B.set(E,(B.get(E)??0)+S*(I.weight/L.get(I.src)))}let N=[...B.entries()].sort(([I,S],[E,M])=>M-S||(E<I?-1:E>I?1:0)),D=[];for(let[I]of N){let[S]=I.split("\x00");if(K.has(S))continue;for(let E of V.get(I)??[])D.push({relFname:S,tag:E})}let A=new Set(D.map((I)=>I.relFname)),h=new Set(Z.map(G)),y=[...H.entries()].sort(([I,S],[E,M])=>M-S||(E<I?-1:E>I?1:0));for(let[I]of y)if(h.delete(I),!A.has(I))D.push({relFname:I}),A.add(I);for(let I of[...h].sort())D.push({relFname:I});return D}rankedTagsMap($,Z,Q,J=new Set){let Y=this.searchTree($,Z,Q,J),z=Y.next();while(!z.done)z=Y.next();return z.value}async rankedTagsMapAsync($,Z,Q,J=new Set,Y){Y?.throwIfAborted();let z=this.searchTree($,Z,Q,J),V=z.next();while(!V.done)await UQ(),Y?.throwIfAborted(),V=z.next();return V.value}async warmTags($,Z){let Q=performance.now();for(let J of $)if(Z?.throwIfAborted(),this.getTags(J,u0(this.root,J).replaceAll("\\","/")),performance.now()-Q>=d8)await UQ(),Q=performance.now()}*searchTree($,Z,Q,J){let z=[...this.specialEntries(),...yield*this.rankSteps($,Z,J)],V=new Set($.map((B)=>u0(this.root,B).replaceAll("\\","/"))),K=z.length,q=0,G=K,W="",j=0,H=Math.min(Math.floor(Q/25),K);while(q<=G){yield;let B=this.toTree(z.slice(0,H),V),L=G$(B),N=Math.abs(L-Q)/Q;if(L<=Q&&L>j){if(W=B,j=L,N<0.15)break}if(L<Q)q=H+1;else G=H-1;H=Math.floor((q+G)/2)}return W}specialEntries(){let $=[];try{$=u8(this.root)}catch{}return $.filter((Z)=>/^(readme.*|package\.json|tsconfig\.json)$/i.test(Z)&&m0[DQ(Z).toLowerCase()]===void 0).sort().map((Z)=>({relFname:Z}))}toTree($,Z){if($.length===0)return"";let Q=[...$].sort((G,W)=>G.relFname<W.relFname?-1:G.relFname>W.relFname?1:(G.tag?1:0)-(W.tag?1:0)||(G.tag&&W.tag?G.tag.line-W.tag.line:0)),J="",Y=null,z=null,V=null,K=()=>{if(Y===null)return;if(V&&z)J+=`
|
|
13
|
+
${Y}:
|
|
14
|
+
${this.renderLines(z,V)}`;else J+=`
|
|
15
|
+
${Y}
|
|
16
|
+
`};for(let G of Q){if(Z.has(G.relFname))continue;if(G.relFname!==Y)K(),Y=G.relFname,z=G.tag?.fname??null,V=G.tag?[]:null;if(V&&G.tag)V.push(G.tag.line)}K();let q=J.split(`
|
|
17
|
+
`);if(q[q.length-1]==="")q.pop();return q.map((G)=>G.slice(0,100)).join(`
|
|
18
|
+
`)+`
|
|
19
|
+
`}renderLines($,Z){let Q;try{Q=PQ($,"utf8").split(`
|
|
20
|
+
`)}catch{return""}let J=[...new Set(Z)].sort((V,K)=>V-K),Y="",z=-2;for(let V of J){if(V>z+1)Y+=`\u22EE
|
|
21
|
+
`;Y+=`\u2502${Q[V]??""}
|
|
22
|
+
`,z=V}return Y}}function o8($,Z,Q){if(Z<=0)return null;let J={capped:!1,viaGit:!1},Y=n$($,J,Q?.maxFiles??K$);if(Y.length===0)return null;let z=J.capped?`
|
|
23
|
+
(repo map truncated: ${Q?.maxFiles??K$}-file cap reached)
|
|
24
|
+
`:"",V=new r$($),K=V.rankedTagsMap([],Y,Math.max(1,Z-G$(z)));if(V.saveCache(),!K.trim())return null;return CQ(K,z)}async function r8($,Z,Q){if(Q?.signal?.throwIfAborted(),Z<=0)return null;let J={capped:!1,viaGit:!1},Y=await o$($,J,Q?.maxFiles??K$,Q?.signal);if(Y.length===0)return null;let z=J.capped?`
|
|
25
|
+
(repo map truncated: ${Q?.maxFiles??K$}-file cap reached)
|
|
26
|
+
`:"",V=new r$($);await V.warmTags(Y,Q?.signal);let K=await V.rankedTagsMapAsync([],Y,Math.max(1,Z-G$(z)),new Set,Q?.signal);if(Q?.signal?.throwIfAborted(),V.saveCache(),!K.trim())return null;return CQ(K,z)}function CQ($,Z){let Q=$+Z;return{name:"repo-map",text:Q,priority:80,tokens:G$(Q)}}var UQ=()=>new Promise(($)=>setImmediate($)),d8=12,_Q,l8,i8,a8;var c0=o(()=>{OQ();BQ();NQ();NQ();_Q=["function_declaration","generator_function_declaration","class_declaration","method_definition","variable_declarator"],l8=[..._Q,"abstract_class_declaration","interface_declaration","type_alias_declaration","enum_declaration","internal_module","function_signature","method_signature","abstract_method_signature"],i8=new Set(["arrow_function","function_expression","generator_function"]),a8=new Set(["class_declaration","abstract_class_declaration","interface_declaration","type_alias_declaration"])});$4();sZ();j9();V4();k2();X0();import{copyFileSync as FZ,existsSync as j$,mkdirSync as x2,readFileSync as f2,writeFileSync as AZ}from"fs";import{join as p}from"path";var B0="memory",RZ=".copied-forward.json",v2=0.9,bZ=["memory","user"];function yZ($){return p($,".rovecode",B0)}function g2($=n()){return p($,B0)}function TZ($,Z){return p($,Z,B0)}function hZ($,Z){return{memory:yZ($),user:g2(Z)}}function u2($,Z){let Q=p($,a[Z]);return!j$(Q)&&!j$(Q+C$)}function wZ($,Z,Q=v$){if(j$(p($,RZ)))return null;let J={from:$,copied:[],skipped:[]},Y=[];for(let z of bZ){let V=p($,a[z]);if(!j$(V))continue;if(!u2(Z[z],z)){J.skipped.push(z);continue}x2(Z[z],{recursive:!0});let K=f2(V,"utf8");if(K.length>Q[z])AZ(p(Z[z],a[z]),SZ(K,Math.floor(Q[z]*v2))),Y.push(z);else FZ(V,p(Z[z],a[z]));if(j$(V+C$))FZ(V+C$,p(Z[z],a[z]+C$));J.copied.push(z)}if(J.copied.length+J.skipped.length===0)return null;if(Y.length>0)J.cut=Y;return AZ(p($,RZ),JSON.stringify({at:new Date().toISOString(),copied:J.copied,skipped:J.skipped,cut:Y})+`
|
|
27
|
+
`),J}function kZ($,Z){if(!$)return null;let Q=(V)=>V.map((K)=>a[K]).join(", ");if($.copied.length===0)return`memory: legacy per-session store ${$.from} not copied \u2014 ${Q($.skipped)} already ${$.skipped.length===1?"has":"have"} content in the scoped store (/memory shows it; the legacy files are still there if you need the text \u2014 this note shows once)`;let J=$.copied.map((V)=>`${a[V]} \u2192 ${Z[V]}`).join(", "),Y=$.cut&&$.cut.length>0?` (${Q($.cut)} cut to fit the block cap \u2014 the legacy file keeps the whole text)`:"",z=$.skipped.length>0?`; ${Q($.skipped)} not copied \u2014 the scoped store already has content`:"";return`memory: copied ${J} forward from the legacy per-session store ${$.from} (left in place; in the prompt from this run on)${Y}${z}`}function xZ($,Z,Q){if($?.copied.includes("memory"))j0(Q,p(Z.memory,a.memory))}function fZ($,Z=n()){let Q=p(yZ($),a.memory),J=j$(Q)&&!EZ(Z,Q)?["memory"]:[];return{...J.length>0?{withhold:J}:{},onCommit:(Y,z)=>{if(Y==="memory")j0(Z,z)}}}function m2($,Z){let Q=[];for(let J of bZ){if($.isWithheld(J))Q.push(MZ($.path(J),"it is not in the prompt and cannot be written to (it came with this repository, and a repo file would be choosing what the model reads); /memory still shows it"));let Y=$.overCap(J);if(Y)Q.push(`memory: ${$.path(J)} holds ${Y.readCut?"more than the read cap":`${Y.chars} chars`} \u2014 over the ${Y.cap}-char cap; the prompt shows the first ${Y.cap} and memory_edit is refused until the file is trimmed`)}return Q}function vZ($){let Z=$.home??n(),Q=hZ($.cwd,Z),J=wZ(TZ($.sessionsDir,$.sessionId),Q);xZ(J,Q,Z);let Y=kZ(J,Q),z=new H0(Q,v$,fZ($.cwd,Z)),V=[...Y?[Y]:[],...m2(z,$.cwd)];return{blocks:z,note:V.length>0?V.join(`
|
|
28
|
+
`):null}}function b4($,Z,Q,J=n()){let Y=hZ($,J),z=wZ(TZ(Z,Q),Y);xZ(z,Y,J);let V=kZ(z,Y);if(z&&z.copied.length>0)return{blocks:new H0(Y,v$,fZ($,J)),note:V};return{note:V}}var gZ="textcall_";function p2($,Z){return`<tool_call>
|
|
29
|
+
${JSON.stringify({name:$,arguments:Z})}
|
|
30
|
+
</tool_call>`}function c2($,Z){return`<tool_response>${JSON.stringify({name:$,content:Z})}</tool_response>`}function d2($){return $.some((Z)=>Z.role==="assistant"&&Z.parts.some((Q)=>Q.kind==="tool_call"&&Q.id.startsWith("textcall_")))}function uZ($,Z,Q){if(!(Q??d2($)))return{messages:$,options:Z};let Y=new Map;for(let q of $)for(let G of q.parts)if(G.kind==="tool_call")Y.set(G.id,G.tool);let z=$.map((q)=>{if(q.role==="assistant"&&q.parts.some((G)=>G.kind==="tool_call")){let G=q.parts.map((W)=>W.kind==="tool_call"?{kind:"text",text:p2(W.tool,W.args)}:W);return{...q,parts:G}}if(q.role==="tool"){let G=q.parts.map((W)=>W.kind==="tool_result"?{kind:"text",text:c2(Y.get(W.callId)??W.callId,W.output)}:W);return{...q,role:"user",parts:G}}return q});if(Z===void 0||Z.tools===void 0)return{messages:z,options:Z};let{tools:V,...K}=Z;return{messages:z,options:K}}import{randomUUID as l2}from"crypto";var i2=["hermes-xml","json-fenced","xml-function"];function P0($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function a2($){let Z="",Q=!1,J=!1;for(let Y=0;Y<$.length;Y++){let z=$[Y]??"";if(Q){if(Z+=z,J)J=!1;else if(z==="\\")J=!0;else if(z==='"')Q=!1;continue}if(z==='"'){Q=!0,Z+=z;continue}if(z===","){let V=Y+1;while(V<$.length&&/\s/.test($[V]??""))V++;let K=$[V];if(K==="}"||K==="]")continue}Z+=z}return Z}function n2($){return $.replace(/"([A-Za-z0-9_.$-]+)'(?=\s*:)/g,'"$1"')}function o2($){let Z=$.trim();if(Z.startsWith("{")||Z.startsWith("["))return Z;return Z.includes(":")?`{${Z}}`:Z}function r2($){let Z=0,Q=0;for(let z of $)if(z==="{")Z++;else if(z==="}")Q++;let J=Q-Z,Y=$;while(J>0&&Y.endsWith("}"))Y=Y.slice(0,-1),J--;return Y}function cZ($){let Z=a2($),Q=n2(Z),J=o2(Q);for(let Y of[$,Z,Q,J,r2(J)])try{return JSON.parse(Y)}catch{}return null}function dZ($,Z){if(!P0($)||typeof $.name!=="string")return null;let Q=P0($.arguments)?$.arguments:P0($.parameters)?$.parameters:null;if(!Q)return null;if(Z&&Object.keys($).some((J)=>!["name","arguments","id"].includes(J)))return null;return{tool:$.name,args:Q}}function U0($){return $.replaceAll(" ","\r").replaceAll(" ",`
|
|
31
|
+
`).replaceAll(""",'"').replaceAll("'","'").replaceAll("<","<").replaceAll(">",">").replaceAll("&","&")}function t2($){let Z=$.replace(/^(?:\r\n|\r|\n)/,"").replace(/(?:\r\n|\r|\n)$/,""),Q=U0(Z);try{return JSON.parse(Q)}catch{return Q}}function s2($){let Z=$.split(`
|
|
32
|
+
`),Q=[],J=[],Y=()=>{if(J.length>0)Q.push({kind:"plain",raw:J.join(`
|
|
33
|
+
`)}),J=[]};for(let z=0;z<Z.length;z++){let V=Z[z]??"",K=/^ {0,3}(`{3,})(\w*)[ \t]+([\s\S]*?)`{3,}\s*$/.exec(V);if(K){Y(),Q.push({kind:"fence",raw:V,info:(K[2]??"").trim(),body:K[3]??"",closed:!0});continue}let q=/^ {0,3}(`{3,})(.*)$/.exec(V);if(!q){J.push(V);continue}let G=(q[1]??"```").length,W=new RegExp(`^ {0,3}\`{${G},}\\s*$`),j=z+1;while(j<Z.length&&!W.test(Z[j]??""))j++;let H=j<Z.length,B=H?j:Z.length-1;Y(),Q.push({kind:"fence",raw:Z.slice(z,B+1).join(`
|
|
34
|
+
`),info:(q[2]??"").trim(),body:Z.slice(z+1,H?j:Z.length).join(`
|
|
35
|
+
`),closed:H}),z=B}return Y(),Q}function e2($){return[...$.matchAll(/(`+)[^`\n]+?\1/g)].map((Z)=>({start:Z.index,end:Z.index+Z[0].length}))}var $3=/<tool_call>([\s\S]*?)<\/tool_call>/g,Z3=/<\s*(?:antml:)?invoke\b\s+name\s*=\s*(?:"([^"]+)"|'([^']+)')\s*>/g,mZ=/<\s*\/\s*(?:antml:)?invoke\s*>/g,Q3=/<\s*(?:antml:)?parameter\b\s+name\s*=\s*(?:"([^"]+)"|'([^']+)')\s*>/g,J3=/<\s*\/\s*(?:antml:)?parameter\s*>/g,Y3=/[ \t]*<\s*\/?\s*(?:antml:)?function_calls\s*>[ \t]*/g;function F$($,Z,Q){return $.lastIndex=Q,$.exec(Z)}function pZ($,Z){let Q=F$(Z3,$,Z);if(!Q)return null;let J=Q.index,Y={start:J,end:J,call:null,nextFrom:J+Q[0].length},z=U0(Q[1]??Q[2]??""),V={},K=J+Q[0].length;for(;;){let q=F$(mZ,$,K);if(!q)return Y;let G=F$(Q3,$,K);if(!G||q.index<G.index){let L=q.index+q[0].length;return{start:J,end:L,call:{tool:z,args:V},nextFrom:L}}let W=U0(G[1]??G[2]??""),j=G.index+G[0].length,H=F$(J3,$,j);if(!H)return Y;let B=F$(mZ,$,j);if(B&&B.index<H.index)return Y;if(Object.hasOwn(V,W))return Y;V[W]=t2($.slice(j,H.index)),K=H.index+H[0].length}}function z3($,Z,Q,J){let Y=e2($),z=(W)=>Y.some((j)=>W>=j.start&&W<j.end),V=[];if(Z.has("hermes-xml"))for(let W of $.matchAll($3)){if(z(W.index))continue;let j=dZ(cZ(W[1]??""),!1);if(j&&J(j.tool))V.push({start:W.index,end:W.index+W[0].length,call:j})}let K=!1;if(Z.has("xml-function")){let W=0;for(let j=pZ($,W);j!==null;j=pZ($,W))if(W=j.nextFrom,j.call&&J(j.call.tool)&&!z(j.start))V.push({start:j.start,end:j.end,call:j.call}),K=!0}V.sort((W,j)=>W.start-j.start);let q=0,G="";for(let W of V){if(W.start<q)continue;G+=$.slice(q,W.start),Q.push(W.call),q=W.end}if(G+=$.slice(q),K)G=G.replace(Y3,"");return G}function V3($,Z){let Q=new Set(Z?.formats??i2),J=Z?.tools===void 0?null:new Set(Z.tools),Y=(K)=>J===null||J.has(K),z=[],V=[];for(let K of s2($))if(K.kind==="fence"){if(K.closed&&Q.has("json-fenced")&&/^json$/i.test(K.info)){let q=dZ(cZ(K.body.trim()),!0);if(q&&Y(q.tool)){z.push(q);continue}}V.push(K.raw)}else V.push(z3(K.raw,Q,z,Y));return{cleanText:V.join(`
|
|
36
|
+
`).trim(),calls:z}}var W3=l2().slice(0,8),q3=0;function lZ($,Z){return async function*(Q,J,Y){let z=Z?.tools??Y?.tools?.map((q)=>q.name),V=z===void 0?Z:{...Z,tools:z},K=uZ(J,Y,Z?.lowerContext);for await(let q of $(Q,K.messages,K.options)){if(q.type!=="turn"||q.turn.parts.some((j)=>j.kind==="tool_call")){yield q;continue}let G=[],W=0;for(let j of q.turn.parts){if(j.kind!=="text"){G.push(j);continue}let{cleanText:H,calls:B}=V3(j.text,V);if(B.length===0){G.push(j);continue}if(W+=B.length,H.length>0)G.push({kind:"text",text:H});for(let L of B)G.push({kind:"tool_call",id:`${gZ}${W3}_${q3++}`,tool:L.tool,args:L.args})}if(W===0){yield q;continue}yield{type:"turn",turn:{...q.turn,parts:G,stopReason:"tool_use"}}}}}function O0($){if($.length===0)return"";return`You are a function calling AI model. You are provided with function signatures within <tools></tools> XML tags. You may call one or more functions to assist with the user query. Don't make assumptions about what values to plug into functions. Here are the available tools: <tools> ${$.map((Q)=>`{"type": "function", "function": {"name": ${JSON.stringify(Q.name)}, "description": ${JSON.stringify(Q.description)}, "parameters": ${JSON.stringify(Q.args)}}}`).join(`
|
|
37
|
+
`)} </tools>
|
|
38
|
+
Use the following pydantic model json schema for each tool call you will make: {"properties": {"name": {"title": "Name", "type": "string"}, "arguments": {"title": "Arguments", "type": "object"}}, "required": ["name", "arguments"], "title": "FunctionCall", "type": "object"}
|
|
39
|
+
For each function call return a json object with function name and arguments within <tool_call></tool_call> XML tags as follows:
|
|
40
|
+
<tool_call>
|
|
41
|
+
{"name": "<function-name>", "arguments": <args-dict>}
|
|
42
|
+
</tool_call>`}x0();import{readFileSync as K3,readdirSync as G3,existsSync as nZ}from"fs";import{join as L0,dirname as X3,resolve as iZ}from"path";var j3=8000,H3=24000,B3=24,aZ="\u2026[truncated]";function P3($){let Z=[{relPath:".rovecode/ROVECODE.md",family:"rovecode",mdc:!1},{relPath:"ROVECODE.md",family:"rovecode",mdc:!1},{relPath:"AGENTS.md",family:"agents",mdc:!1},{relPath:"CLAUDE.md",family:"claude",mdc:!1},{relPath:".claude/CLAUDE.md",family:"claude",mdc:!1},{relPath:"GEMINI.md",family:"gemini",mdc:!1},{relPath:".cursorrules",family:"cursor",mdc:!1}];for(let Q of L3($))Z.push({relPath:`.cursor/rules/${Q}`,family:"cursor",mdc:!0});return Z.push({relPath:".github/copilot-instructions.md",family:"copilot",mdc:!1}),Z}function U3($,Z){let Q=[],J=Z===void 0?null:iZ(Z),Y=iZ($);for(;;){if(Q.push(Y),J!==null&&Y===J)break;if(O3(Y))break;let z=X3(Y);if(z===Y)break;Y=z}return Q}function O3($){try{return nZ(L0($,".git"))}catch{return!1}}function L3($){try{return G3(L0($,".cursor","rules"),{withFileTypes:!0}).filter((Q)=>Q.isFile()&&Q.name.endsWith(".mdc")).map((Q)=>Q.name).sort()}catch{return[]}}function N3($){try{return K3($,"utf8")}catch{return null}}function D3($){try{return nZ($)}catch{return!1}}function _3($){let Z=$.split(`
|
|
43
|
+
`);if((Z[0]??"").trim()!=="---")return $;let Q=-1;for(let J=1;J<Z.length;J++)if((Z[J]??"").trim()==="---"){Q=J;break}if(Q===-1)return $;return Z.slice(Q+1).join(`
|
|
44
|
+
`).replace(/^\n+/,"")}function I3($,Z){let Q=$.slice(0,Z),J=Q.lastIndexOf(`
|
|
45
|
+
`),Y=J>0?Q.slice(0,J):Q;return Y.split(`
|
|
46
|
+
`).filter((V)=>V.trimStart().startsWith("```")).length%2===1?`${Y}${aZ}
|
|
47
|
+
\`\`\``:Y+aZ}function oZ($,Z){let Q=Z?.maxPerFileChars??j3,J=Z?.maxTotalChars??H3,Y=Z?.maxFiles??B3,z=new Set,V=new Set,K=[],q=0,G=U3($,Z?.stopAt);for(let B=0;B<G.length;B++){let L=G[B];for(let N of P3(L)){if(V.has(N.relPath))continue;let D=L0(L,N.relPath);if(K.length>=Y){if(D3(D))q++;continue}let A=N3(D);if(A===null)continue;let h=N.mdc?_3(A):A;if(h.trim()==="")continue;if(V.add(N.relPath),z.has(h))continue;z.add(h);let y=h,I=!1;if(h.length>Q)y=I3(h,Q),I=!0;K.push({displayPath:"../".repeat(B)+N.relPath,family:N.family,content:y,truncated:I})}}let W=[],j=[],H=0;for(let B of K){let L=`
|
|
48
|
+
|
|
49
|
+
## From ${B.displayPath}
|
|
50
|
+
${B.content}`;if(H+L.length<=J)W.push({path:B.displayPath,family:B.family,chars:B.content.length,truncated:B.truncated}),j.push(L),H+=L.length;else W.push({path:B.displayPath,family:B.family,chars:0,truncated:!0})}return{text:j.join(""),sources:W,skippedFiles:q}}OQ();Z4();z4();s8();fQ();sZ();var rZ=2,C3=300,F3=400,eZ="reflection: ",A3=["edit","write"],N0=5,R3=8,E3="Re-read the file, fix the anchors/content, and retry; if it cannot be fixed, say why and stop.",M3=/\n\n\[loop-guard\] [\s\S]*$/,S3=/\n\nlsp-gate \([^)\n]*\): \d+ error\(s\) in [^\n]* \u2014 fix before proceeding:\n([\s\S]*)$/;function $9($=process.env){return $.ROVECODE_REFLECTION!=="0"}function b3($=process.env){let Z=($.ROVECODE_REFLECTION_MAX??"").trim();if(Z==="")return rZ;let Q=Number(Z);return Number.isFinite(Q)&&Q>=0?Math.floor(Q):rZ}function Z9($){let Z=$.max??b3(),Q=$.owns??(()=>!0),J=new Set($.tools??A3),Y=new Map,z=new Set,V=(W)=>W.runId??"",K=()=>({nudges:0,lastKey:null}),q=(W)=>{let j=V(W),H=Y.get(j);if(H===void 0){if(H=K(),Y.set(j,H),Y.size>R3)Y.delete(Y.keys().next().value)}return H},G=()=>{if(z.size===0)return;for(let W of $.steering.drainAll())if(!z.has(W))$.steering.push(W);z.clear()};return{pre_run(W){if(!Q(W))return;G(),Y.set(V(W),K())},post_run(W){if(!Q(W))return;G(),Y.delete(V(W))},post_tool(W,j,H){if(!Q(W)||!J.has(j.tool))return;let B=q(W),L=H.output.replace(M3,""),N=H.ok?y3(L):null;if(H.ok&&N===null){B.lastKey=null;return}if(!H.ok&&T3(L))return;let D=`${j.tool}
|
|
51
|
+
${N??L}`;if(B.lastKey===D)return;if(B.lastKey=D,B.nudges>=Z)return;B.nudges+=1;let A=N!==null?w3(j.tool,N):h3(j.tool,L);$.steering.push(A),z.add(A),$.onNudge?.(A)}}}function y3($){let Z=S3.exec($);if(Z===null)return null;let Q=Z[1].split(`
|
|
52
|
+
`).filter((Y)=>Y.trim().length>0),J=Q.slice(0,N0).join("; ")+(Q.length>N0?` \u2026 and ${Q.length-N0} more`:"");return Q9(J,F3)}function T3($){return $.startsWith(tZ)}function h3($,Z){let Q=Q9(Z.trim(),C3).replace(/[.\s]+$/,"");return`${eZ}the ${$} call failed \u2014 ${Q}. ${E3}`}function w3($,Z){return`${eZ}the ${$} introduced diagnostics \u2014 ${Z.replace(/[.\s]+$/,"")}. Fix them or explain.`}function Q9($,Z){return $.length<=Z?$:$.slice(0,Math.max(0,Z-1))+"\u2026"}W4();o9();x0();K4();q4();k3();x3();function z9($,Z=process.env){if(!$)return;return(Q)=>{if(Q.tool!=="task")return $(Q);let J=Q.revisedArgs??Q.args,Y=Y9(J,Z);if(!Y)return $(Q);return $({...Q,reason:Y,revisedArgs:{lane:Y,...J9(J)?J:{}}})}}V9();V9();var D0="background jobs are not available on this surface";function W9($,Z){let Q=Math.round((($.finishedAt??Z)-$.startedAt)/1000),J=$.exitCode!==void 0?` exit=${$.exitCode}`:"",Y=$.pid!==void 0?` pid=${$.pid}`:"",z=$.dropped>0?` (${$.dropped} chars dropped from the buffer)`:"";return`${$.id} ${$.status}${J}${Y} ${Q}s \u2014 ${$.command}${z}`}var f3={schema:{name:"bash_list",description:"List this session's background shell jobs (started with `bash \u2026 run_in_background: true`): id, status, exit code, pid, elapsed and the command. "+"A finished job stays listed until its output has been read at least once, so nothing you started disappears unseen.",args:{type:"object",properties:{}}},kind:"read",execute($,Z){let Q=g$();if(!Q)return Promise.resolve({ok:!1,output:D0});let J=Q.list();if(J.length===0)return Promise.resolve({ok:!0,output:"no background jobs in this session"});let Y=Date.now();return Promise.resolve({ok:!0,output:J.map((z)=>W9(z,Y)).join(`
|
|
53
|
+
`),data:J})}},v3={schema:{name:"bash_output",description:"Read what a background job has printed SINCE YOUR LAST READ of it (not the whole buffer \u2014 repeated reads show progress, never the same lines twice). "+"Says `more output remains` when the job printed more than one read returns, and says how many characters were dropped if the job outran its buffer. Do not poll in a tight loop: a finished job also posts one note into this conversation by itself.",args:{type:"object",properties:{id:{type:"string",description:"job id from bash_list (e.g. b1)"}},required:["id"]}},kind:"read",execute($,Z){let Q=g$();if(!Q)return Promise.resolve({ok:!1,output:D0});let J=String($.id??"").trim();if(J==="")return Promise.resolve({ok:!1,output:"bash_output needs an id (bash_list shows them)"});let Y=Q.read(J);if(!Y.ok)return Promise.resolve({ok:!1,output:Y.reason});let z=W9(Y.info,Date.now()),V=Y.lost>0?`
|
|
54
|
+
[${Y.lost} characters were dropped from this job's buffer before you read them]`:"",K=Y.more?`
|
|
55
|
+
[more output remains \u2014 read again]`:"",q=Y.text===""?"(nothing new)":Y.text;return Promise.resolve({ok:!0,output:`${z}${V}
|
|
56
|
+
${q}${K}`,data:Y.info})}},g3={schema:{name:"bash_kill",description:"Stop a background job and everything it started (the process TREE, not just the shell \u2014 a killed `npm run dev` must not leave its port bound). "+"Killing an already-finished job is not an error. Its output stays readable afterwards.",args:{type:"object",properties:{id:{type:"string",description:"job id from bash_list (e.g. b1)"}},required:["id"]}},kind:"execute",execute($,Z){let Q=g$();if(!Q)return Promise.resolve({ok:!1,output:D0});let J=String($.id??"").trim();if(J==="")return Promise.resolve({ok:!1,output:"bash_kill needs an id (bash_list shows them)"});let Y=Q.kill(J);if(!Y.ok)return Promise.resolve({ok:!1,output:Y.reason??`could not kill "${J}"`});return Promise.resolve({ok:!0,output:`${J} ${Y.info?.status??"killed"} \u2014 its output is still readable with bash_output ${J}`,data:Y.info})}},q9=[f3,v3,g3];H9();X0();G4();e8();X4();F0();X0();j9();H9();import{readdirSync as u3,readFileSync as m3,statSync as p3}from"fs";import{join as u$,resolve as K9}from"path";var c3=["main",..._0],G9="agents",d3=".rovecode",l3=/^[a-z0-9_-]+$/,i3=/^[A-Za-z0-9_*-]+$/,a3=200;function J$($,Z){return $.length>Z?$.slice(0,Z-1)+"\u2026":$}function n3($){let Z=($??"").trim().replace(/^\[|\]$/g,"").trim();if(Z==="")return["*"];let Q=Z.split(/[\s,]+/).map((Y)=>Y.replace(/^["']|["']$/g,"")).filter((Y)=>Y!==""),J=Q.find((Y)=>!i3.test(Y));if(J!==void 0)return{error:`tools: "${J$(J,40)}" is not a tool name (letters, digits, _ - or *)`};if(Q.includes("*"))return["*"];return[...new Set(Q)]}function o3($){let Z=$.charCodeAt(0)===65279?$.slice(1):$,Q={},J=Z;if(Z.startsWith("---")){if(!Z.endsWith(`
|
|
57
|
+
`))Z+=`
|
|
58
|
+
`;let G=X9(Z);if(!G)return{error:"unterminated frontmatter (no closing ---)"};let W=t3(Z.slice(4,Z.indexOf(`
|
|
59
|
+
---`,3)));if(W!==void 0)return{error:W};Q=G.fm,J=G.body}let Y=(G)=>{let W=Q[G]?.trim();return W?W:void 0},z=Y("mode");if(z!==void 0&&z!=="plan"&&z!=="act")return{error:`mode must be "plan" or "act" (got "${J$(z,40)}")`};let V=Y("model");if(V!==void 0&&/\s/.test(V))return{error:`model must be one selector ("provider/model" or a model id; got "${J$(V,40)}")`};if(Q.tools!==void 0&&Q.tools.trim().replace(/^\[|\]$/g,"").trim()==="")return{error:"tools: empty value (write `tools: *` for every tool, or list names \u2014 `tools:` alone never means all)"};let K=n3(Q.tools);if(!Array.isArray(K))return{error:K.error};let q=Object.keys(Q).filter((G)=>!r3.has(G));return{description:Y("description"),model:V,mode:z,tools:K,body:J.trim(),...q.length>0?{unknown:q}:{}}}var r3=new Set(["description","model","mode","tools"]);function t3($){for(let Z of $.split(/\r?\n/)){let Q=Z.trim();if(Q===""||Q.startsWith("#"))continue;if(/^-(\s|$)/.test(Q))return`frontmatter uses a YAML block list ("${J$(Q,30)}") \u2014 not supported: write \`tools: read, grep\` on one line`;if(Q.indexOf(":")===-1)return`frontmatter line is not \`key: value\` ("${J$(Q,30)}")`}return}function B9($){return(Z)=>{let Q=Z.indexOf("/");if(Q<=0||$===null)return;let J=Z.slice(0,Q);return J===$?void 0:`model "${J$(Z,60)}" names provider "${J}" but this session streams over "${$}" \u2014 a child cannot switch providers; write the bare model id, or "${$}/<model>"`}}function P9($,Z={}){let Q=[],J=new Set(Z.reserved??c3),Y=u$(Z.home??n(),G9),z=u$($,d3,G9),V=Z.project===!1?[["user",Y]]:K9(Y)===K9(z)?[["project",z]]:[["user",Y],["project",z]],K=new Map;for(let[q,G]of V)for(let W of e3(G,q,Q,Z.validateModel)){if(J.has(W.name)){Q.push(`${W.path}: skipped \u2014 "${W.name}" is a reserved agent name${_0.includes(W.name)?` (the ${W.name} external lane keeps it; \`task start ${W.name}\` runs the lane, never this file)`:""}`);continue}let j=K.get(W.name);if(j?.scope===q){Q.push(`${W.path}: agent "${W.name}" already defined by ${j.path} \u2014 first kept`);continue}K.set(W.name,W)}return{agents:[...K.values()].sort((q,G)=>q.name.localeCompare(G.name)),warnings:Q}}function s3($){try{return p3($).isFile()}catch{return!0}}function e3($,Z,Q,J){let Y;try{Y=u3($,{withFileTypes:!0}).filter((V)=>/\.md$/i.test(V.name)&&(V.isFile()||V.isSymbolicLink()&&s3(u$($,V.name)))).map((V)=>V.name).sort()}catch{return[]}let z=[];for(let V of Y){let K=u$($,V),q=V.slice(0,-3).toLowerCase();if(!l3.test(q)){Q.push(`${K}: skipped \u2014 agent name "${q}" must match [a-z0-9_-]+`);continue}let G;try{G=m3(K,"utf8")}catch(H){Q.push(`${K}: skipped \u2014 unreadable (${H instanceof Error?H.message:String(H)})`);continue}let W=o3(G);if("error"in W){Q.push(`${K}: skipped \u2014 ${W.error}`);continue}let j=W.model!==void 0&&J?J(W.model):void 0;if(j!==void 0){Q.push(`${K}: skipped \u2014 ${j}`);continue}if(W.unknown)Q.push(`${K}: loaded \u2014 ignored unknown frontmatter key${W.unknown.length>1?"s":""} ${W.unknown.map((H)=>`"${J$(H,30)}"`).join(", ")} (known: description, model, mode, tools)`);z.push({name:q,description:J$(W.description??`custom agent (${V})`,a3),...W.model!==void 0?{model:W.model}:{},...W.mode!==void 0?{mode:W.mode}:{},tools:W.tools,body:W.body,path:K,scope:Z})}return z}function U9($,Z,Q){let J=Z.includes("*"),Y=new Set(Z);return $.filter((z)=>(J||Y.has(z.schema.name))&&Q.has(z.schema.name))}function O9($){return $.agents.map((Z)=>({name:Z.name,description:Z.description}))}F0();var _9=3,I9=1000,$8=20000,Z8=60000;function Q8($,Z){return new Promise((Q)=>{if(Z?.aborted){Q();return}let J=()=>{clearTimeout(Y),Z?.removeEventListener("abort",J),Q()},Y=setTimeout(J,$);Z?.addEventListener("abort",J,{once:!0})})}function J8($,Z){let Q=$?.trim();if(!Q)return;if(/^\d+(?:\.\d+)?$/.test(Q))return Math.round(Number(Q)*1000);let J=Date.parse(Q);return Number.isNaN(J)?void 0:Math.max(0,J-Z)}function Y8($,Z){let Q=A0($);if(!Q)return;let J=[],Y=J8(Q.retryAfter,Z);if(Y!==void 0)J.push(Y);if(Q.retryAfterMs!==void 0&&/^\d+(?:\.\d+)?$/.test(Q.retryAfterMs.trim()))J.push(Math.round(Number(Q.retryAfterMs)));if(Q.resetAt!==void 0){let z=Date.parse(Q.resetAt);if(!Number.isNaN(z))J.push(Math.max(0,z-Z))}return J.length?Math.max(...J):void 0}function C9($=process.env){return{maxRetries:L9($.ROVECODE_RETRY_MAX,_9,0),baseMs:L9($.ROVECODE_RETRY_BASE_MS,I9,1)}}function L9($,Z,Q){if($===void 0||$.trim()==="")return Z;let J=Number($);return Number.isFinite(J)&&J>=Q?Math.floor(J):Z}var N9=($)=>({parts:[],stopReason:"error",usage:{input:0,output:0},error:$});function I0($,Z){if($===429)return"rate limited";if($===529||$===503)return"overloaded";if($!==void 0&&$>=500)return`server error (HTTP ${$})`;if($!==void 0)return`HTTP ${$}`;if(/^no response from /.test(Z))return"no response";return"connection failed"}var C0=($)=>{let Z=$/1000;return`${Z>=10?Math.round(Z):Math.round(Z*10)/10} s`};function F9($){return`${$.model.provider}: ${I0($.status,$.reason)} \u2014 retrying in ${C0($.delayMs)} (${$.attempt+1}/${$.maxAttempts})`}function A9($){let Z=$.why==="attempts"?`gave up after ${$.attempt} attempt${$.attempt===1?"":"s"}`:$.why==="deadline"?`not retried: the run's time limit is closer than the ${C0($.delayMs??0)} wait`:`not retried: the ${C0($.delayMs??0)} wait would pass the retry budget`,Q=$.status!==void 0&&!/HTTP/.test(I0($.status,$.reason))?` (HTTP ${$.status})`:"",J=D9($.reason);return`${$.model.provider}: ${I0($.status,$.reason)}${Q} \u2014 ${Z}${J?`: ${J}`:""}`}function R9($,Z={}){let Q=Z.maxRetries??_9,J=Z.baseMs??I9,Y=Z.maxDelayMs??$8,z=Z.totalMs??Z8,V=Z.sleep??Q8,K=Z.random??Math.random,q=Z.now??Date.now;return async function*(G,W,j){let H=q();for(let B=1;;B++){let L=null,N="";try{for await(let M of $(G,W,j))if(M.type==="turn")L=M.turn;else{if(M.type==="text_delta")N+=M.text;else if(M.type==="reasoning_delta")N||=" ";yield M}}catch(M){yield{type:"turn",turn:N9(M instanceof Error?M.message:String(M))};return}if(L===null){yield{type:"turn",turn:N9("stream ended without a terminal turn")};return}let A=A0(L)?.status??A$(L.error).status;if(L.stopReason!=="error"||j?.signal?.aborted===!0||!A$(L.error).retryable){yield{type:"turn",turn:L};return}if(N.length>0){let M=N.trim().length>0&&L.parts.length===0?[{kind:"text",text:N}]:L.parts;yield{type:"turn",turn:{...L,parts:M,error:`${L.error??"provider stream failed"} \u2014 the connection dropped after part of the answer had arrived; not retried, a retry would repeat it`}};return}let h={model:G,attempt:B,maxAttempts:Q+1,reason:L.error??"error",...A!==void 0?{status:A}:{}};if(B>Q){if(Q>0)Z.onGiveUp?.({...h,why:"attempts"});yield{type:"turn",turn:L};return}let y=Y8(L,q()),I=Math.min(Y,J*2**(B-1)),S=Math.max(Math.round(K()*I),y??0),E=y!==void 0?{retryAfterMs:y}:{};if(q()-H+S>z){Z.onGiveUp?.({...h,...E,delayMs:S,why:"budget"}),yield{type:"turn",turn:L};return}if(j?.deadlineAt!==void 0&&q()+S>j.deadlineAt){Z.onGiveUp?.({...h,...E,delayMs:S,why:"deadline"}),yield{type:"turn",turn:L};return}if(Z.onRetry?.({...h,delayMs:S,...E}),await V(S,j?.signal),j?.signal?.aborted){yield{type:"turn",turn:L};return}}}}var m$=new Map,E0=new Map,z8=0,R0=null;function V8($){let Z=$.split(`
|
|
60
|
+
`).map((J)=>J.trim()).filter((J)=>J!==""),Q=(Z.find((J)=>/^\w*[Ee]rror:/.test(J))??Z.join(" ")).replace(/\s+/g," ");return Q===""?"unknown worker error":Q.length>200?Q.slice(0,200)+"\u2026":Q}function W8(){if(R0===null)R0=URL.createObjectURL(new Blob([`
|
|
61
|
+
(() => {
|
|
62
|
+
"use strict";
|
|
63
|
+
const MAX_CAPTURE = 1048576;
|
|
64
|
+
const MAX_VALUE = 262144;
|
|
65
|
+
const transpiler = new Bun.Transpiler({ loader: "ts", deadCodeElimination: false });
|
|
66
|
+
let buf = [];
|
|
67
|
+
let bufLen = 0;
|
|
68
|
+
let capped = false;
|
|
69
|
+
const fmt = (v) => (typeof v === "string" ? v : Bun.inspect(v));
|
|
70
|
+
const capture = (...parts) => {
|
|
71
|
+
if (capped) return;
|
|
72
|
+
const line = parts.map(fmt).join(" ") + "\\n";
|
|
73
|
+
bufLen += line.length;
|
|
74
|
+
if (bufLen > MAX_CAPTURE) { capped = true; buf.push("[console capture cap reached]\\n"); return; }
|
|
75
|
+
buf.push(line);
|
|
76
|
+
};
|
|
77
|
+
for (const k of ["log", "info", "warn", "error", "debug", "trace"]) console[k] = capture;
|
|
78
|
+
self.onmessage = async (ev) => {
|
|
79
|
+
const { id, code } = ev.data;
|
|
80
|
+
buf = []; bufLen = 0; capped = false;
|
|
81
|
+
let ok = true; let value = ""; let error = "";
|
|
82
|
+
try {
|
|
83
|
+
// Bare top-level return is illegal in a module, so it fails at TRANSPILE time
|
|
84
|
+
// (BuildMessage), before eval \u2014 retry with the original source async-wrapped.
|
|
85
|
+
// If the wrapped transpile fails too, the code is genuinely broken: rethrow the
|
|
86
|
+
// FIRST error so diagnostics describe the unwrapped source.
|
|
87
|
+
let js; let preWrapped = false;
|
|
88
|
+
try {
|
|
89
|
+
js = transpiler.transformSync(code);
|
|
90
|
+
} catch (e1) {
|
|
91
|
+
try { js = transpiler.transformSync("(async () => {\\n" + code + "\\n})()"); preWrapped = true; }
|
|
92
|
+
catch { throw e1; }
|
|
93
|
+
}
|
|
94
|
+
let v;
|
|
95
|
+
try {
|
|
96
|
+
v = (0, eval)(js);
|
|
97
|
+
} catch (e) {
|
|
98
|
+
// Top-level await is module-legal but a SyntaxError in plain eval; retry
|
|
99
|
+
// wrapped (OMP docs/tools/eval.md:110). Declarations in wrapped paths
|
|
100
|
+
// (either stage) are cell-local.
|
|
101
|
+
if (!preWrapped && e instanceof SyntaxError) v = (0, eval)("(async () => {\\n" + js + "\\n})()");
|
|
102
|
+
else throw e;
|
|
103
|
+
}
|
|
104
|
+
if (v && (typeof v === "object" || typeof v === "function") && typeof v.then === "function") v = await v;
|
|
105
|
+
if (v !== undefined) {
|
|
106
|
+
value = Bun.inspect(v);
|
|
107
|
+
if (value.length > MAX_VALUE) value = value.slice(0, MAX_VALUE) + "...[value capped]";
|
|
108
|
+
}
|
|
109
|
+
} catch (e) {
|
|
110
|
+
ok = false;
|
|
111
|
+
error = e instanceof Error ? e.name + ": " + e.message : String(e);
|
|
112
|
+
}
|
|
113
|
+
postMessage({ id, ok, stdout: buf.join(""), value, error });
|
|
114
|
+
};
|
|
115
|
+
postMessage({ type: "ready" });
|
|
116
|
+
})();
|
|
117
|
+
`],{type:"application/javascript"}));return R0}function q8($){let Z=new Worker(W8()),Q=new Map,J=()=>{},Y=new Promise((V)=>{J=V}),z={worker:Z,pending:Q,ready:Y};return Z.addEventListener("message",(V)=>{let K=V.data;if(K.type==="ready"){J();return}if(typeof K.id!=="number")return;let q=Q.get(K.id);if(q)Q.delete(K.id),q({id:K.id,ok:K.ok===!0,stdout:K.stdout??"",value:K.value??"",error:K.error??""})}),Z.addEventListener("error",(V)=>{let K=V8(V.message||"unknown worker error");E0.set($,K),M0($,z,`worker crashed: ${K}`)}),Z.unref?.(),z}function M0($,Z,Q){if(m$.get($)===Z)m$.delete($);for(let[J,Y]of[...Z.pending])Z.pending.delete(J),Y({id:J,ok:!1,stdout:"",value:"",error:Q});try{Z.worker.terminate()}catch{}}function K8($,Z){let Q=new TextEncoder,J=Q.encode($);if(J.length<=Z)return $;let Y=new TextDecoder("utf-8",{fatal:!1}).decode(J.slice(0,Z)).replace(/\uFFFD+$/,"");return`${Y}
|
|
118
|
+
[output truncated: sent ${Q.encode(Y).length} of ${J.length} bytes]`}function E9($,Z,Q,J){let Y=typeof $==="number"&&Number.isFinite($)?Math.floor($):J;return Math.min(Q,Math.max(Z,Y))}async function G8($,Z,Q,J,Y,z){let V=m$.get($);if(z&&V)M0($,V,"cell reset"),V=void 0;let K="";if(!V){let N=E0.get($);if(N!==void 0)E0.delete($),K=`note: previous cell worker crashed (${N}); state was reset
|
|
119
|
+
`}let q=V??q8($);if(!V)m$.set($,q);let G=++z8,W=new Promise((N)=>{q.pending.set(G,N)}),j,H=new Promise((N)=>{j=setTimeout(()=>N("timeout"),Q)}),B,L=new Promise((N)=>{if(Y.aborted){N("aborted");return}B=()=>N("aborted"),Y.addEventListener("abort",B,{once:!0})});try{let N=await Promise.race([q.ready.then(()=>"ready"),H,L]);if(N==="ready")q.worker.postMessage({id:G,code:Z});let D=N==="ready"?await Promise.race([W,H,L]):N;if(D==="timeout"||D==="aborted")return M0($,q,D),{ok:!1,output:K+(D==="timeout"?`Error: eval cell timed out after ${Q}ms \u2014 worker killed; this session's cell state was reset`:"Error: eval cell aborted \u2014 worker killed; this session's cell state was reset")};let A=[];if(D.stdout!=="")A.push(D.stdout.replace(/\n$/,""));if(D.ok&&D.value!=="")A.push(`=> ${D.value}`);if(!D.ok)A.push(`Error: ${D.error}`);let h=A.length>0?A.join(`
|
|
120
|
+
`):"(no output)";return{ok:D.ok,output:K+K8(h,J)}}finally{if(j!==void 0)clearTimeout(j);if(B!==void 0)Y.removeEventListener("abort",B);q.pending.delete(G)}}var X8={schema:{name:"eval_cell",description:"Execute JavaScript/TypeScript in this session's persistent eval cell (a Bun worker). State survives across calls: `var`, function declarations, and `globalThis.*` assignments persist; top-level `let`/`const` are cell-local. Console output is captured and the final expression's value is returned as `=> value`. Cells using top-level `await` or bare `return` "+"run wrapped in an async function \u2014 persist state via `globalThis` there. No rovecode tool access "+"from inside the cell (v1 scope). Output is truncated to a byte budget. On timeout \u2014 or if a "+"background error crashes the worker between calls \u2014 cell state resets, and the next call "+"says so in a `note:` prefix. NOT a sandbox: gated by the same execute policy as bash.",args:{type:"object",properties:{code:{type:"string",description:"JS/TS source of one cell"},timeout_ms:{type:"integer",description:"kill budget in ms (default 10000, max 120000)"},max_output_bytes:{type:"integer",description:"output byte budget (default 16384, max 65536)"},reset:{type:"boolean",description:"discard this session's cell state before running (OMP reset semantics)"}},required:["code"]}},kind:"execute",sequential:!0,async execute($,Z){let Q=$??{};if(typeof Q.code!=="string"||Q.code.trim()==="")return{ok:!1,output:"Error: eval_cell requires a non-empty string `code` argument"};let J=E9(Q.timeout_ms,50,120000,1e4),Y=E9(Q.max_output_bytes,256,65536,16384);try{return await G8(Z.sessionId,Q.code,J,Y,Z.signal,Q.reset===!0)}catch(z){return{ok:!1,output:`Error: eval cell host failure: ${z instanceof Error?z.message:String(z)}`}}}};function M9($=process.env){return $.ROVECODE_EVAL_CELL==="1"?X8:null}j4();Q4();H4();B4();fQ();J4();Y4();x9();import{existsSync as U$,mkdirSync as O4}from"fs";import{sep as L4,join as e}from"path";import{realpathSync as j8}from"fs";import{homedir as H8}from"os";import{parse as B8,relative as S9,resolve as P8}from"path";function b9($,Z=H8()){let Q=(Y)=>{try{return j8(Y)}catch{return P8(Y)}},J=Q($);return S9(J,B8(J).root)!==""&&S9(J,Q(Z))!==""}t8();import{randomUUID as N4}from"crypto";var D4=32768,d0=null;function _4(){if(!process.env.ROVECODE_OTEL_ENDPOINT)return null;if(d0===null)d0=(s9(),h$(t9));return d0}var l0=null;function T$(){if(l0===null)l0={client:(U4(),h$(P4)),tools:(jQ(),h$(XQ))};return l0}function I4($={}){let Z=$.cwd??process.cwd(),Q=D2(Z,process.env,{home:n()}),J=vQ(Q.rung,{runner:$.spawnRunner,dockerImage:Q.dockerImage,platform:$.platform}).then(()=>{return},(X)=>{throw _2(Q,X)});J.catch(()=>{});let Y={...Q,ready:J},z=new SQ(Z,MQ(Z,$.addDirs??[])),V=e(Z,".rovecode","sessions");O4(V,{recursive:!0});let K=$.sessionId??N4(),q=new hQ(V,K),G=new Map,W=(X)=>{if(process.env.ROVECODE_NO_CHECKPOINTS==="1")return Promise.resolve(null);let _=G.get(X);if(!_)_=O2.init({workspace:Z,sessionId:X}).then((C)=>C,()=>null),G.set(X,_);return _},j=q,H=(X)=>!P2.has(X.kind)?X:{...X,execute:async(_,C)=>{let R=await X.execute(_,C);if(R.ok){let k=await W(C.sessionId),m=j.id===C.sessionId?U2(j.messages()):void 0;await k?.snapshot(X.schema.name,m).catch(()=>{})}return R}},B=new n0,L=n(),N=i0(L),D=Y2(Z,{home:L,state:N}),A=D.warnings.map((X)=>`plugins: ${X}`),h=[],y=(X)=>{A.push(X);for(let _ of h)_(X)},I=D.plugins.filter((X)=>X.status==="active"),S=(X)=>B2(X,z.rootOf(X)??Z),E=H2(Z);if(E!==null)y(E);for(let X of z.notes)y(X);if(z.dirs.length>0)y(z.checkpointNote());B.register(s0,H(YZ(e0,S)),H(YZ($Z,S)),H(t0)),B.register(ZZ,QZ,JZ),B.register(X2,j2({apiKey:process.env.EXA_API_KEY}));let M=new rQ(Z,{extraDirs:I.flatMap((X)=>X.skillsDir?[{dir:X.skillsDir,scope:X.scope==="project"?"project":"global"}]:[])});M.scan(),B.register(...o0(M));let l=vZ({cwd:Z,sessionsDir:V,sessionId:K,home:L}),i=l.blocks;if(l.note!==null)for(let X of l.note.split(`
|
|
121
|
+
`))y(X);B.register(r0(i));let $$=M9();if($$)B.register(H($$));B.register(zZ(V)),B.register(...C2(V));let Z$=(X)=>{if(X.at(-1)?.parts.some((R)=>R.kind==="tool_result"&&R.output.startsWith("todos:")))return null;let C=e(V,q.id);try{return I2(VZ(C).items)}catch{return null}},f=new sQ(Z),t=P9(Z,{validateModel:B9(f.defaultConfig()?.id??null)});for(let X of t.warnings)y(`agents: ${X}`);let Y$=O9(t);B.register(eQ(f),$2(f)),B.register(Q2(),J2());let P;B.register(L2(()=>P));let U=new oQ,O=new RQ({cwd:Z,sessionId:K});O.open(Z);let F=[],w=z2(D.plugins,{cwd:Z,home:L}).then((X)=>{for(let C of X.warnings)y(`plugins: ${C}`);let _=new Set(B.list().map((C)=>C.schema.name));for(let C of X.plugins){if(C.status!=="active")continue;for(let R of C.tools){if(_.has(R.schema.name)){y(`plugins: plugin ${C.name}: tool "${R.schema.name}" is already registered \u2014 refused (a plugin cannot replace a built-in or another plugin's tool)`);continue}_.add(R.schema.name),B.register(R)}if(C.hooks)O.add(C.hooks,`plugin:${C.name}`)}F=X.plugins},(X)=>{y(`plugins: activation failed \u2014 ${X instanceof Error?X.message:String(X)}`)}),T={found:D.plugins,ready:w,get loaded(){return F},warnings:A,onWarning(X){for(let _ of A)X(_);h.push(X)}},x=new Map;for(let X of I)for(let _ of X.mcp){if(x.has(_.name)){y(`plugins: plugin ${X.name}: MCP server "${_.name}" is also declared by another plugin \u2014 first kept`);continue}x.set(_.name,_)}let z$=[];if(U$(e(L,"mcp.json"))||U$(e(Z,".rovecode","mcp.json"))||U$(e(Z,".mcp.json")))for(let X of T$().client.loadMcpConfig(Z,z$,{home:L,trusted:a0(N)})){if(x.has(X.name))y(`mcp: mcp.json server "${X.name}" overrides a plugin's entry of the same name`);x.set(X.name,X)}for(let X of z$)y(`mcp: ${X}`);for(let X of kQ(Z,L))y(`trust: ${X}`);if(Q.note!==void 0)y(`trust: ${Q.note}`);let A2=(X=[])=>{let _=new Map;for(let R of I)for(let k of R.mcp)if(!_.has(k.name))_.set(k.name,k);if(U$(e(L,"mcp.json"))||U$(e(Z,".rovecode","mcp.json"))||U$(e(Z,".mcp.json")))for(let R of T$().client.loadMcpConfig(Z,X,{home:L,trusted:a0(i0(L))}))_.set(R.name,R);return[..._.values()]},KZ=[...x.values()],s=null,t$=Promise.resolve(),GZ=(X)=>T$().tools.createMcpTools(X).map((_)=>({..._,execute:async(C,R)=>{return await t$,_.execute(C,R)}})),XZ=(X,_=B)=>{for(let C of GZ(X))_.register(C)};if(KZ.length>0){let _=new(T$()).client.McpManager(KZ);s=_,t$=new Promise((C)=>{setTimeout(()=>{_.connect().then((R)=>{for(let k of R.failed)y(`mcp: server "${k.name}" did not connect \u2014 ${k.error}`);C()},()=>C())},0)}),XZ(_)}let R2=async()=>{let X=[],_=A2(X);if(s===null){if(_.length===0)return{added:[],removed:[],failed:[],skipped:X};let m=new(T$()).client.McpManager(_);s=m,XZ(m);let D$=await m.connect();return t$=Promise.resolve(),{added:_.map((X$)=>X$.name),removed:[],failed:D$.failed,skipped:X}}let{added:C,removed:R}=await s.sync(_),k=C.length>0?await s.connect():{failed:[]};return{added:C,removed:R,failed:k.failed,skipped:X}},jZ=f.defaultRef(),s$=[],e$=[],$0=(X)=>{if(e$.length===0)s$.push(X);else for(let _ of e$)_(X)},Z0={provider:jZ?.provider??"mock",model:jZ?.model||"default"},HZ=TQ({roles:yQ(Z0),looseFallback:(process.env.ROVECODE_MODEL_DEFAULT??"").trim().length>0,onNote:(X)=>$0(`router: ${X.chain} ${X.from.provider}/${X.from.model} \u2192 ${X.to?`${X.to.provider}/${X.to.model}`:"chain exhausted"} (${X.reason})`)}),BZ=f.stream(),E2=process.env.ROVECODE_NO_TOOL_MIDDLEWARE!=="1"?lZ(BZ):BZ,Q0=$.stream!==void 0?$.stream:HZ.wrap(R9(E2,{...C9(),onRetry:(X)=>$0(F9(X)),onGiveUp:(X)=>$0(A9(X))})),N$=new l$,J0=_4(),Y0=null;if(J0){let X=J0.otelOptionsFromEnv();if(X)Y0=J0.createOtelHooks({...X,pricing:N$,messages:()=>j.messages(),isLane:q2}),O.add(Y0,"otel")}let z0=oZ(Z),PZ=`# Project context${z0.text}`,V0=z0.text?{name:"config",text:PZ,priority:70,tokens:G$(PZ)}:null,Q$=null,M2=()=>{if(Q$!==null)return Q$;let X=null;if(process.env.ROVECODE_NO_REPOMAP!=="1"){let _=Number(process.env.ROVECODE_REPOMAP_TOKENS??"")||1024;try{let{buildRepoMapChunk:C}=(c0(),h$(p0));X=C(Z,_)}catch{X=null}}return Q$=[V0,X].filter((_)=>_!==null),Q$},w$=!1,W0=new AbortController,UZ=null,S2=async()=>{W0.abort(),await UZ},b2=()=>{if(Q$!==null||w$||W0.signal.aborted)return;w$=!0;let X=(R)=>{if(w$=!1,Q$===null)Q$=[V0,R].filter((k)=>k!==null)};if(process.env.ROVECODE_NO_REPOMAP==="1"||!b9(Z)){X(null);return}let _=Number(process.env.ROVECODE_REPOMAP_TOKENS??"")||1024,C;try{let{buildRepoMapChunkAsync:R}=(c0(),h$(p0));C=R(Z,_,{signal:W0.signal})}catch{C=Promise.resolve(null)}UZ=C.then(X,()=>X(null))},OZ=()=>Q$??(w$?[V0].filter((X)=>X!==null):M2()),LZ=(X)=>{let _=tQ(M),C=i.renderForPrompt(),R=s?.serverNames()??[],k=R.length>0?`# MCP
|
|
122
|
+
MCP servers configured for this session: ${R.join(", ")}. mcp_list returns their tools and which are connected; mcp_call {server, tool, args} runs one (argument schema: mcp_list {server, tool, schema:true}). When a task fits one of these servers, use it rather than working around it.`:"";return`You are Rovecode, an interactive coding agent in ${X??Z}. Use read/edit/write/bash tools. Edits require line hashes from read output. Match the length of an answer to the task: a line for a lookup, the full thing for a plan, a design or a review \u2014 never pad, never truncate work that was asked for.${_?`
|
|
123
|
+
|
|
124
|
+
# Skills
|
|
125
|
+
`+_:""}${C?`
|
|
126
|
+
|
|
127
|
+
# Memory
|
|
128
|
+
`+C:""}${k?`
|
|
129
|
+
|
|
130
|
+
`+k:""}${z.promptLine()}`},q0=xQ(Z,void 0,process.env),NZ=(X)=>N$.lookup(X.provider,X.model)?.supportsTools===!1||process.env.ROVECODE_TOOL_MIDDLEWARE==="1",K0=(X,_={})=>{if(X.effort===void 0)X={...X,effort:q0};if(!_.agent)G0=X;let C=N$.lookup(X.provider,X.model);if(X.maxTokens===void 0&&C?.maxOutput)X={...X,maxTokens:Math.min(C.maxOutput,D4)};if(X.reasoning===void 0&&C?.supportsReasoning!==void 0)X={...X,reasoning:C.supportsReasoning};let R=NZ(X),k=aQ(X),m=k===null?iQ:nQ(k,Z),D$=process.env.ROVECODE_DESIGN==="off"?"":Z2(_.cwd??Z),X$=_.agent?.body||[LZ(_.cwd),m,D$].filter((_$)=>_$.length>0).join(`
|
|
131
|
+
|
|
132
|
+
`);return{name:_.agent?.name??"main",model:X,tools:_.agent?[..._.agent.tools]:["*"],..._.agent?.mode!==void 0?{mode:_.agent.mode}:{},systemPrompt:R&&!_.child?`${X$}
|
|
133
|
+
|
|
134
|
+
# Tool calling
|
|
135
|
+
${O0(B.list().map((_$)=>_$.schema))}`:X$,...OZ().length>0?{contextChunks:OZ()}:{}}},y2=`${Z.replace(/[\/]$/,"")}${L4}*`,k$={},DZ=(X,_)=>{let C=X===!0?"auto":X===!1?"ask":X,R=C==="auto",k=k$.maxSeconds??O$(process.env.ROVECODE_MAX_SECONDS),m=k$.maxCostUsd??FQ(process.env.ROVECODE_MAX_COST),D$=(g,c)=>{let I$=N$.lookup(c.provider,c.model);if(!I$?.pricing)return;let f$={input:g.input,output:g.output,cacheRead:g.cacheRead??0,cacheWrite:g.cacheWrite??0};return dQ(f$,lQ(I$,f$.input+f$.cacheRead+f$.cacheWrite))},X$=()=>{try{let g=VZ(e(V,j.id)).items;return g.length===0?null:{open:g.filter((c)=>c.status!=="completed").length,total:g.length}}catch{return null}},_$=process.env.ROVECODE_VERIFY==="1",CZ=(O$(process.env.ROVECODE_VERIFY_TIMEOUT)??mQ/1000)*1000,w2=()=>{let g=($.verifyResolver??gQ)(Z);return{resolution:g,timeoutMs:CZ,run:async(c)=>{let I$=await pQ(g??{commands:[]},Z,{signal:c,timeoutMs:CZ});return uQ(Z,I$),I$}}};return _Z={maxTurns:k$.maxTurns??O$(process.env.ROVECODE_MAX_TURNS)??Number.MAX_SAFE_INTEGER,..._$?{verify:w2()}:{},...k!==void 0?{maxSeconds:k}:{},...m!==void 0?{maxCostUsd:m,priceUsd:D$}:{},finishCheck:process.env.ROVECODE_FINISH_CHECK!=="0",todoState:X$,contextBudgetTokens:(()=>{let g=G0??Z0,c=N$.lookup(g.provider,g.model);return W2({...c?.contextWindow!==void 0?{window:c.contextWindow}:{},...c?.maxOutput!==void 0?{maxOutput:c.maxOutput}:{},...O$(process.env.ROVECODE_CONTEXT_BUDGET)!==void 0?{override:O$(process.env.ROVECODE_CONTEXT_BUDGET)}:{},scale:V2(g).charScale})})(),compactionThreshold:0.8,compactionStrategy:wQ(process.env.ROVECODE_COMPACTION)??"head-summarize",parallelTools:!0,permissionRules:R?[{action:"*",resource:"*",effect:"allow"}]:[{action:"file.read",resource:"*",effect:"allow"},{action:EQ,resource:"*",effect:"prompt"},...z.rules(),{action:"memory.write",resource:"*",effect:"allow"},{action:"tool.skill_view",resource:"*",effect:"allow"},{action:"tool.skills_list",resource:"*",effect:"allow"},{action:"file.write",resource:"*",effect:"prompt"},{action:"shell.exec",resource:"*",effect:"prompt"},{action:"spawn",resource:"*",effect:"prompt"},{action:"tool.mcp_call",resource:"*",effect:"prompt"},{action:"tool.provider_edit",resource:"*",effect:"prompt"},{action:"tool.design_direction",resource:"*",effect:"prompt"},{action:"tool.design_direction",resource:"get",effect:"allow"},{action:"net.fetch",resource:"*",effect:"prompt"},...C==="accept-edits"?[{action:"file.write",resource:y2,effect:"allow"},...z.acceptEditsRules()]:[]],approval:R?void 0:z9(N2(O.approver(_)),$.lanes?.env)}},_Z=null,G0=null,x$=new cQ,T2=(X,_,C)=>{let R=new n0,k=[s0,e0,$Z,t0,ZZ,QZ,JZ,...o0(M),zZ(V)];if(C)k.push(WZ(V$,{parentDepth:C.depth,notify:C.steering,caller:C.taskId,owner:C.signal,agents:Y$,parentDir:C.dir??_,parentTools:()=>new Set(R.list().map((m)=>m.schema.name))}),qZ(V$,{caller:C.taskId}));if(s)k.push(...GZ(s));return R.register(...U9(k,X.tools,C?.parentTools??new Set(B.list().map((m)=>m.schema.name)))),R},h2=(X)=>{let _=new Map([["main",K0(X,{child:!0})]]);for(let C of t.agents)_.set(C.name,K0(C.model!==void 0?bQ(C.model,X.provider):X,{agent:C,child:!0}));return _},V$=new F2({deps:()=>Q0?{defs:h2(G0??Z0),stream:Q0,registryFactory:T2,rootDir:Z,sessionsDir:V,toolPrompt:(X,_)=>NZ(X)?O0(_):"",baseConfig:_Z??DZ(!1),hooks:O}:null,lanes:$.lanes});if(V$.attach(x$),Y0?.observeTasks(V$),$9())O.add(Z9({steering:x$,owns:(X)=>X.sessionId===j.id}),"reflection");B.register(WZ(V$,{parentDepth:0,agents:Y$}),qZ(V$));let IZ=new K2({notify:x$});return G2(IZ),B.register(...q9),{cwd:Z,sessionId:K,store:q,registry:B,skillStore:M,get blockStore(){return i},setBlockStore(X){i=X,B.register(r0(X))},guard:U,planReminder:Z$,get mcp(){return s},reloadMcp:R2,projectContext:z0,router:HZ,roots:z,agents:t,get effort(){return q0},setEffort(X){q0=X},setRunLimits(X){k$=X},drainRouterNotes:()=>s$.splice(0),onRouterNote(X){for(let _ of s$.splice(0))X(_);e$.push(X)},checkpointsFor:W,setSessionStore(X){j=X},sandbox:Y,setAskUser(X){P=X},hooks:O,plugins:T,providers:f,get provider(){return f.defaultConfig()},stream:Q0,get defaultModel(){return f.defaultRef()?.model??process.env.ROVECODE_MODEL??""},noProviderReason:()=>$.stream===void 0&&!f.configured()?C4:null,systemPrompt:LZ,buildDef:K0,buildCfg:DZ,warmRepoMap:b2,stopRepoMapWarmup:S2,steering:x$,tasks:V$,bashJobs:IZ}}var C4=AQ("cli");async function n1($={}){let Z=I4($);try{await Z.sandbox.ready,await Z.hooks.ready,await Z.plugins.ready}catch(Q){throw await Z.mcp?.close().catch(()=>{}),Q}return Z}
|
|
136
|
+
export{b4 as Nc,G9 as Oc,d3 as Pc,D4 as Qc,I4 as Rc,C4 as Sc,n1 as Tc};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Dl as Wq,ul as i}from"./main-a3f51n0x.js";import{wn as t}from"./main-qsevpgsv.js";import{readdirSync as qq,statSync as x}from"fs";import{readdir as zq,stat as g}from"fs/promises";import{join as T,extname as A}from"path";import{execFile as Hq,spawnSync as Jq}from"child_process";import{Lang as P}from"@ast-grep/napi";function y(q){try{let H=Jq("git",["-C",q,"ls-files","-z","--cached","--others","--exclude-standard"],{timeout:5000,maxBuffer:67108864,encoding:"utf8",windowsHide:!0});if(H.error||H.status!==0||typeof H.stdout!=="string")return null;return H.stdout.split("\x00").filter((Z)=>Z.length>0)}catch{return null}}function Qq(q){return new Promise((H)=>{try{Hq("git",["-C",q,"ls-files","-z","--cached","--others","--exclude-standard"],{timeout:5000,maxBuffer:67108864,encoding:"utf8",windowsHide:!0},(Z,O)=>{H(Z||typeof O!=="string"?null:O.split("\x00").filter((j)=>j.length>0))})}catch{H(null)}})}function Vq(q){try{let H=x(q);return H.isFile()&&H.size<=F}catch{return!1}}function Pq(q,H,Z=d){let O=[],j=y(q);if(j){if(H)H.viaGit=!0;let Y=j.filter((J)=>D[A(J).toLowerCase()]!==void 0).filter((J)=>!J.split("/").slice(0,-1).some((z)=>h.has(z)||z.startsWith("."))).sort();for(let J of Y){if(O.length>Z)break;let z=T(q,J);if(Vq(z))O.push(z)}}else{let Y=(J)=>{let z;try{z=qq(J)}catch{return}for(let Q of z.sort()){if(O.length>Z)return;let $=T(J,Q),K;try{K=x($)}catch{continue}if(K.isDirectory()){if(!h.has(Q)&&!Q.startsWith("."))Y($)}else if(D[A(Q).toLowerCase()]!==void 0&&K.size<=F)O.push($)}};Y(q)}if(O.length>Z){if(H)H.capped=!0;O.pop()}return O}async function _(q){try{let H=await g(q);return H.isFile()&&H.size<=F}catch{return!1}}async function bq(q,H,Z=d,O){O?.throwIfAborted();let j=[],Y=await Qq(q);if(O?.throwIfAborted(),Y){if(H)H.viaGit=!0;let J=Y.filter((z)=>D[A(z).toLowerCase()]!==void 0).filter((z)=>!z.split("/").slice(0,-1).some((Q)=>h.has(Q)||Q.startsWith("."))).sort();for(let z of J){if(j.length>Z)break;let Q=T(q,z);if(await _(Q))j.push(Q);O?.throwIfAborted()}}else{let J=async(z)=>{O?.throwIfAborted();let Q;try{Q=await zq(z,{withFileTypes:!0})}catch{return}for(let $ of Q.sort((K,V)=>K.name<V.name?-1:K.name>V.name?1:0)){if(O?.throwIfAborted(),j.length>Z)return;let K=$.name,V=T(z,K),B=$.isDirectory(),M=$.isFile();if($.isSymbolicLink())try{let w=await g(V);B=w.isDirectory(),M=w.isFile()}catch{continue}if(B){if(!h.has(K)&&!K.startsWith("."))await J(V)}else if(M&&D[A(K).toLowerCase()]!==void 0){if(await _(V))j.push(V)}}};await J(q)}if(j.length>Z){if(H)H.capped=!0;j.pop()}return j}var D,h,d=2000,F=262144;var u=t(()=>{D={".ts":P.TypeScript,".mts":P.TypeScript,".cts":P.TypeScript,".tsx":P.Tsx,".js":P.JavaScript,".mjs":P.JavaScript,".cjs":P.JavaScript,".jsx":P.JavaScript},h=new Set(["node_modules",".git",".rovecode","dist","build","out","coverage",".cache"])});Wq();u();import{readdirSync as o,statSync as k,lstatSync as Zq,existsSync as S}from"fs";import{readFile as $q,stat as Oq}from"fs/promises";import{join as E,basename as a}from"path";import{spawnSync as Kq}from"child_process";var m=100,c=100,p=200,I=1000,s=1e4,l=2000,Uq=1048576,jq=8192;function C(q,H){return Number.isFinite(q)&&q>0?Math.min(Math.floor(q),I):H}function f(q,H){if(!H)return q;return i(q,H)}function r(q,H=s){let Z=y(q);if(Z){let J=Z.slice(0,H+1),z=J.length>H;if(z)J.pop();return{rel:J,viaGit:!0,capped:z}}let O=[],j=!1,Y=(J,z)=>{let Q;try{Q=o(J)}catch{return}for(let $ of Q.sort()){if(j)return;if($.startsWith(".")||$==="node_modules")continue;let K=E(J,$),V;try{V=Zq(K)}catch{continue}if(V.isSymbolicLink())continue;if(V.isDirectory())Y(K,`${z}${$}/`);else if(V.isFile()){if(O.length>=H){j=!0;return}O.push(z+$)}}};return Y(q,""),{rel:O,viaGit:!1,capped:j}}function n(q){let H=new Bun.Glob(q);if(!q.includes("/"))return(Z)=>H.match(a(Z));return(Z)=>H.match(Z)}var e=(q)=>`(File enumeration capped at ${q} files; results may be incomplete.)`,L=(q,H)=>q?["",e(H)]:[];function Xq(q){return q.subarray(0,jq).includes(0)}function Yq(q){return q.length>l?q.slice(0,l).replace(/[\uD800-\uDBFF]$/,"")+"...":q}function vq(q,H){try{let Z=Kq("git",["-C",q,"check-ignore","--stdin","-z"],{input:H.join("\x00"),timeout:5000,maxBuffer:16777216,encoding:"utf8",windowsHide:!0});if(Z.error||typeof Z.stdout!=="string")return null;if(Z.status!==0&&Z.status!==1)return null;return new Set(Z.stdout.split("\x00").filter((O)=>O.length>0))}catch{return null}}function Bq(q=s){let H={schema:{name:"glob",description:'Find files by glob pattern (e.g. "**/*.ts", "src/**/*.test.ts"; a pattern without "/" matches file names at any depth). Honors .gitignore in git repos; skips dotfiles and node_modules elsewhere. Returns absolute paths, most recently modified first, at most maxFiles (default 100, cap 1000) with a truncation note when more matched.',args:{type:"object",properties:{pattern:{type:"string",description:"glob pattern to match files against"},path:{type:"string",description:"directory to search (default: session cwd)"},maxFiles:{type:"integer",description:`max paths returned (default ${m}, cap ${I})`}},required:["pattern"]}},kind:"read",sequential:!1,execute(j,Y){let J=j,z=f(Y.cwd,J.path);if(!S(z))return Promise.resolve({ok:!1,output:`directory not found: ${z}`});if(!k(z).isDirectory())return Promise.resolve({ok:!1,output:`glob path must be a directory: ${z}`});let Q=C(J.maxFiles,m),$;try{$=n(J.pattern)}catch(X){return Promise.resolve({ok:!1,output:`invalid glob pattern: ${X instanceof Error?X.message:String(X)}`})}let K=r(z,q),V=[];for(let X of K.rel){if(!$(X))continue;let U=E(z,X);try{V.push({abs:U,mtimeMs:k(U).mtimeMs})}catch{}}let B=Date.now(),M=86400000;V.sort((X,U)=>{let G=B-X.mtimeMs<M,W=B-U.mtimeMs<M;if(G&&W)return U.mtimeMs-X.mtimeMs;if(G)return-1;if(W)return 1;return X.abs.localeCompare(U.abs)});let w=V.length>Q,v=w?V.slice(0,Q):V,N=[];if(v.length===0)N.push("No files found");else if(N.push(...v.map((X)=>X.abs)),w)N.push("",`(Results are truncated: showing first ${Q} results. Consider using a more specific path or pattern.)`);return N.push(...L(K.capped,q)),Promise.resolve({ok:!0,output:N.join(`
|
|
3
|
+
`),data:{count:v.length,truncated:w}})}},Z={schema:{name:"grep",description:'Search file contents with a JS regular expression (e.g. "log.*Error", "function\\s+\\w+"). Optional glob filters files ("*.ts", "src/**/*.tsx"). Honors .gitignore in git repos; skips dotfiles/node_modules elsewhere, plus binary files and files over 1MB. Output is `path:line: text` matches, at most maxMatches (default 100, cap 1000), each line capped at 2000 chars, with truncation notes.',args:{type:"object",properties:{pattern:{type:"string",description:"regex to search for in file contents"},path:{type:"string",description:"directory (or single file) to search (default: session cwd)"},glob:{type:"string",description:'file filter glob, e.g. "*.ts" (names at any depth) or "src/**/*.ts"'},maxMatches:{type:"integer",description:`max matches returned (default ${c}, cap ${I})`}},required:["pattern"]}},kind:"read",sequential:!1,async execute(j,Y){let J=j,z;try{z=new RegExp(J.pattern)}catch(U){return{ok:!1,output:`invalid regex: ${U instanceof Error?U.message:String(U)}`}}let Q=f(Y.cwd,J.path);if(!S(Q))return{ok:!1,output:`path not found: ${Q}`};let $=C(J.maxMatches,c),K=null;if(J.glob)try{K=n(J.glob)}catch(U){return{ok:!1,output:`invalid glob filter: ${U instanceof Error?U.message:String(U)}`}}if(Y.signal.aborted)return{ok:!1,output:"grep aborted"};let V=k(Q).isFile(),B=V?{rel:[a(Q)],viaGit:!1,capped:!1}:r(Q,q),M=V?E(Q,".."):Q,w=B.rel.filter((U)=>K?K(U):!0).sort(),v=[],N=!1;q:for(let U of w){if(Y.signal.aborted)return{ok:!1,output:"grep aborted"};let G=V?Q:E(M,U),W;try{if((await Oq(G)).size>Uq)continue;W=await $q(G)}catch{continue}if(Xq(W))continue;let R=W.toString("utf8").split(/\r?\n/);for(let b=0;b<R.length;b++){if(!z.test(R[b]))continue;if(v.length>=$){N=!0;break q}v.push({abs:G,line:b+1,text:Yq(R[b])})}}if(v.length===0)return{ok:!0,output:["No matches found",...L(B.capped,q)].join(`
|
|
4
|
+
`),data:{matches:0,truncated:!1}};let X=[`Found ${v.length} matches${N?" (more matches available)":""}`];if(X.push(...v.map((U)=>`${U.abs}:${U.line}: ${U.text}`)),N)X.push("","(Results truncated. Consider using a more specific path or pattern.)");return X.push(...L(B.capped,q)),{ok:!0,output:X.join(`
|
|
5
|
+
`),data:{matches:v.length,truncated:N}}}},O={schema:{name:"ls",description:"List a directory (non-recursive). Directories first as `[DIR] name`, files as `name (N bytes)`, alphabetical. Gitignored entries are hidden and counted in git repos; dotfiles and node_modules are hidden elsewhere. At most maxEntries rows (default 200, cap 1000) with a truncation note.",args:{type:"object",properties:{path:{type:"string",description:"directory to list (default: session cwd)"},maxEntries:{type:"integer",description:`max entries returned (default ${p}, cap ${I})`}}}},kind:"read",sequential:!1,execute(j,Y){let J=j,z=f(Y.cwd,J.path);if(!S(z))return Promise.resolve({ok:!1,output:`directory not found: ${z}`});if(!k(z).isDirectory())return Promise.resolve({ok:!1,output:`Path is not a directory: ${z}`});let Q=C(J.maxEntries,p),$=o(z).filter((W)=>W!==".git"),K=vq(z,$),V,B;if(K)V=$.filter((W)=>!K.has(W)),B=$.length-V.length;else V=$.filter((W)=>!W.startsWith(".")&&W!=="node_modules"),B=$.length-V.length;if(V.length===0){let W=B>0?`
|
|
6
|
+
|
|
7
|
+
(${B} ignored)`:"";return Promise.resolve({ok:!0,output:`Directory ${z} is empty.${W}`,data:{entries:0,truncated:!1}})}let M=V.length>q,w=M?V.sort((W,R)=>W.localeCompare(R)).slice(0,q):V,v=[];for(let W of w)try{let R=k(E(z,W));v.push({name:W,isDir:R.isDirectory(),size:R.isDirectory()?0:R.size})}catch{}v.sort((W,R)=>{if(W.isDir&&!R.isDir)return-1;if(!W.isDir&&R.isDir)return 1;return W.name.localeCompare(R.name)});let N=v.length>Q,X=N?v.slice(0,Q):v,U=X.map((W)=>W.isDir?`[DIR] ${W.name}`:`${W.name} (${W.size} bytes)`).join(`
|
|
8
|
+
`),G=`Directory listing for ${z}:
|
|
9
|
+
${U}`;if(N)G+=`
|
|
10
|
+
|
|
11
|
+
(Results truncated: showing first ${Q} of ${v.length} entries.)`;if(B>0)G+=`
|
|
12
|
+
|
|
13
|
+
(${B} ignored)`;if(M)G+=`
|
|
14
|
+
|
|
15
|
+
${e(q)}`;return Promise.resolve({ok:!0,output:G,data:{entries:X.length,truncated:N}})}};return{globTool:H,grepTool:Z,lsTool:O}}var{globTool:Fq,grepTool:yq,lsTool:Sq}=Bq();
|
|
16
|
+
export{D as Ue,d as Ve,F as We,Pq as Xe,bq as Ye,u as Ze,m as _e,c as $e,p as af,I as bf,s as cf,l as df,Uq as ef,C as ff,r as gf,e as hf,Bq as if,Fq as jf,yq as kf,Sq as lf};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{nl as c,rl as IQ}from"./main-rebtt91r.js";import{Jl as RJ,Ll as EJ,Sl as YQ}from"./main-6h9x282m.js";import{wn as f,xn as _Q}from"./main-qsevpgsv.js";function PJ(J,Q){let Z=J.trim(),z=Z.indexOf("/");if(z<=0)return{provider:Q,model:Z};return{provider:Z.slice(0,z),model:Z.slice(z+1)}}function sJ(J,Q){return J.split(",").map((Z)=>Z.trim()).filter(Boolean).map((Z)=>PJ(Z,Q))}function TQ(J,Q=process.env){let Z={};for(let z of t){let X=Q[tJ[z]];if(X&&X.trim().length>0){let G=sJ(X,J.provider);if(G.length>0)Z[z]=G}}return{...Z,default:Z.default??[J]}}function eJ(J){let Q=/^HTTP (\d{3})\b/.exec(J??"");if(Q){let Z=Number(Q[1]);return{status:Z,retryable:Z===429||Z>=500&&Z<600}}if((J??"").startsWith("config: "))return{retryable:!1};return{retryable:!0}}function jJ(J){return e.get(J)}function xQ(J){let Q=new Map;for(let G of t){let W=J.roles[G];if(!W)continue;let B=Array.isArray(W)?W:[W];if(B.length>0)Q.set(G,B)}let Z=Q.get("default");if(!Z)throw Error("router: roles.default must contain at least one ModelRef");let z=(G)=>Q.get(G)??Z,X=(G)=>{let W=null;for(let K of t){let V=Q.get(K);if(!V)continue;let Y=V.findIndex(($)=>JQ($,G));if(Y===0)return{key:K,chain:V,index:0};if(Y>0&&W===null)W={key:K,chain:V,index:Y}}if(W)return W;let B=J.looseFallback===!0?[G,...Z]:[G];return{key:QQ(G),chain:B,index:0}};return{chain:z,resolve(G,W){let K=z(G)[0];if(W!==void 0)return typeof W==="string"?PJ(W,K.provider):W;return K},wrap(G){let W=J.sticky??!0,B=new Map;return async function*(K,V,Y){let{key:$,chain:q,index:j}=X(K),P=W?Math.min(Math.max(j,B.get($)??0),q.length-1):j,N=null;for(let O=P;O<q.length;O++){let R=q[O],w=null,E=!1;try{for await(let S of G(R,V,Y))if(S.type==="turn")w=S.turn;else{if(S.type==="text_delta"||S.type==="reasoning_delta")E=!0;yield S}}catch(S){w=s(S instanceof Error?S.message:String(S))}let b=w??s("stream ended without a terminal turn"),T=Y?.signal?.aborted===!0;if(b.stopReason!=="error"||T||E||!eJ(b.error).retryable||q.length===1){e.set(b,R),yield{type:"turn",turn:b};return}N=b;let h=O+1<q.length?q[O+1]:null;if(W&&h!==null)B.set($,O+1);J.onNote?.({chain:$,from:R,to:h,reason:b.error??"error"})}if(W)B.delete($);let U=q.length-P,M=s(`model chain '${$}' exhausted (${U} candidate${U===1?"":"s"} failed); last: ${N?.error??"unknown error"}`);e.set(M,q[q.length-1]),yield{type:"turn",turn:M}}}}}var t,tJ,e,JQ=(J,Q)=>J.provider===Q.provider&&J.model===Q.model,QQ=(J)=>`${J.provider}/${J.model}`,ZQ=()=>({input:0,output:0}),s=(J)=>({parts:[],stopReason:"error",usage:ZQ(),error:J});var MJ=f(()=>{t=["default","smol","plan","commit","task"];tJ={default:"ROVECODE_MODEL_DEFAULT",smol:"ROVECODE_MODEL_SMOL",plan:"ROVECODE_MODEL_PLAN",commit:"ROVECODE_MODEL_COMMIT",task:"ROVECODE_MODEL_TASK"};e=new WeakMap});function k(J){return Math.ceil(J.length/4)}function DJ(J,Q){let Z=[...J].sort((Y,$)=>$.priority-Y.priority),z=Z.filter((Y)=>Y.name!=="history"),X=[],G=[...z],W=Z.find((Y)=>Y.name==="history"),B=W?.tokens??0;while(G.length>0&&G.reduce((Y,$)=>Y+$.tokens,0)+B>Q){let Y=G.pop();X.push(Y)}let K=G.reduce((Y,$)=>Y+$.tokens,0)+B,V=[...G];if(W)V.push(W);return{chunks:V,dropped:X,totalTokens:K,overBudget:K>Q}}function NJ(J,Q){if(J.reduce((W,B)=>W+B.tokens,0)<=Q*0.8)return{keep:J,summarize:[]};let z=Math.floor(Q/2),X=0,G=J.length;for(let W=J.length-1;W>=0;W--){if(X+=J[W].tokens,X>z){G=W+1;break}G=W}return{keep:J.slice(G),summarize:J.slice(0,G)}}var JJ=()=>{};import{randomUUID as CJ}from"crypto";function mQ(J){let Q=(J??"").trim().toLowerCase();if(Q==="")return;if(LJ.includes(Q))return Q;if(!_J.has(Q))_J.add(Q),console.error(`rovecode: unknown ROVECODE_COMPACTION "${(J??"").trim()}" \u2014 using ${QJ} (known: ${LJ.join(", ")})`);return}function SJ(J,Q,Z){if(Z)return"emergency";return J>Q.contextBudgetTokens*Q.compactionThreshold?"speculative":null}function UJ(J){if(!J||zQ.some((Z)=>Z.test(J)))return!1;let Q=/(?:^|last: )HTTP (\d{3})\b/.exec(J)?.[1];if(Q==="413")return!0;if(Q==="429"||Q?.startsWith("5"))return!1;return XQ.some((Z)=>Z.test(J))}function KQ(J,Q,Z){if(Z==="speculative")return J.contextBudgetTokens;return Math.max(1,Math.floor(Math.min(J.contextBudgetTokens,Q)/2))}function WQ(J,Q){if(J==="keep-window")return"keep-window";if(J==="provider-native"&&Q.native)return"provider-native";if(Q.summarize)return"head-summarize";return Q.trigger==="emergency"?"keep-window":null}function ZJ(J,Q,Z){let z=Q.compactionStrategy??QJ,X=WQ(z,Z);if(!X)return null;let G=($)=>k(Z.tokenText($)),W=J.reduce(($,q)=>$+G(q),0),B=KQ(Q,W,Z.trigger),K={strategy:X,tokensBefore:W,budgetTokens:B,...X!==z?{fallbackFrom:z}:{}};if(X==="provider-native")return{...K,keep:J,drop:[],summaryNeeded:!1};if(X==="keep-window"){let $=Z.trigger==="emergency"?0:Q.compactionKeepTurns??$Q;return{...K,...BQ(J,G,B,$),summaryNeeded:!1}}let V=NJ(J.map(($)=>({id:$.id,tokens:G($),text:Z.tokenText($)})),B),Y=new Set(V.keep.map(($)=>$.id));if(Y.size===0&&J.length>0){let $=J.length-1;while($>0&&J[$].role==="tool")$--;for(let q of J.slice($))Y.add(q.id)}return{...K,keep:J.filter(($)=>Y.has($.id)),drop:J.filter(($)=>!Y.has($.id)),summaryNeeded:!0}}function BQ(J,Q,Z,z){let X=Math.floor(Z/2),G=(Y)=>Y.reduce(($,q)=>$+Q(q),0),W=J.flatMap((Y,$)=>Y.role==="user"?[$]:[]),B=Math.max(0,W.length-1-Math.max(0,z)),K=W.length>0?W[B]:0;while(G(J.slice(K))>X&&B<W.length-1)K=W[++B];let V=W.at(-1);if(V!==void 0&&K===V&&G(J.slice(K))>X){let Y=V+1;while(Y<J.length&&Q(J[V])+G(J.slice(Y))>X){let $=OJ(J,Y+1);if($<=Y||$>=J.length)break;Y=$}return{keep:[J[V],...J.slice(Y)],drop:[...J.slice(0,V),...J.slice(V+1,Y)]}}if(W.length===0)while(G(J.slice(K))>X){let Y=OJ(J,K+1);if(Y<=K||Y>=J.length)break;K=Y}return{keep:J.slice(K),drop:J.slice(0,K)}}function OJ(J,Q){let Z=Q;while(Z<J.length&&J[Z].role==="tool")Z++;return Z}async function $J(J,Q,Z,z){let X=Q.fallbackFrom?{fallbackFrom:Q.fallbackFrom}:{};if(Q.strategy==="provider-native"){let B=null;if(z.native)try{B=await z.native(J,{model:z.model,budgetTokens:Q.budgetTokens,trigger:z.trigger,signal:z.signal})}catch{B=null}if(B)return{history:B,strategy:"provider-native",...X};let K=ZJ(J,{...Z,compactionStrategy:QJ},{...z,native:void 0});if(!K)return null;let V=await $J(J,K,Z,{...z,native:void 0});return V?{...V,fallbackFrom:"provider-native"}:null}if(Q.strategy==="keep-window"){if(Q.drop.length===0)return null;let B=Q.drop.reduce((V,Y)=>V+k(z.tokenText(Y)),0);return{history:[{id:CJ(),role:"system",parts:[{kind:"text",text:`[context compacted (keep-window): ${Q.drop.length} earlier messages, ~${B} tokens, removed from the working context]`}],parentId:Q.keep[0]?.id??null,createdAt:Date.now()},...Q.keep],strategy:"keep-window",...X}}if(!z.summarize)return null;let G=await z.summarize(Q.drop.map((B)=>z.tokenText(B)));return{history:[{id:CJ(),role:"system",parts:[{kind:"text",text:`Summary of earlier conversation:
|
|
3
|
+
${G}`}],parentId:J[0]?.id??null,createdAt:Date.now()},...Q.keep],strategy:"head-summarize",...X}}var LJ,QJ="head-summarize",$Q=2,_J,XQ,zQ;var IJ=f(()=>{JJ();LJ=["head-summarize","keep-window","provider-native"],_J=new Set;XQ=[/prompt is too long/i,/request_too_large/i,/input is too long for requested model/i,/exceeds the context window/i,/maximum context length/i,/context[_ ]length[_ ]exceeded/i,/input token count.*exceeds the maximum/i,/tokens in request more than max tokens allowed/i,/maximum prompt length is \d+/i,/reduce the length of the messages/i,/request entity too large/i,/model_context_window_exceeded/i,/too many tokens/i,/token limit exceeded/i,/exceeds the available context size/i,/greater than the context length/i],zQ=[/rate limit/i,/too many requests/i,/throttling/i,/service unavailable/i]});import{existsSync as GQ,mkdirSync as HQ,readFileSync as bJ,writeFileSync as qQ}from"fs";import{join as L}from"path";function MQ(J,Q){if(Q(L(J,"bun.lock"))||Q(L(J,"bun.lockb")))return{run:"bun run",from:"bun.lock"};if(Q(L(J,"pnpm-lock.yaml")))return{run:"pnpm run",from:"pnpm-lock.yaml"};if(Q(L(J,"yarn.lock")))return{run:"yarn",from:"yarn.lock"};if(Q(L(J,"package-lock.json")))return{run:"npm run",from:"package-lock.json"};return{run:"npm run",from:"no lockfile (npm assumed)"}}function wJ(J,Q={}){let Z=Q.exists??GQ,z=Q.read??(($)=>bJ($,"utf8")),X=EJ(J),G={...X.user,...X.project};if(G.verify===!1)return{source:"none",commands:[],reason:"settings.json verify: false \u2014 the gate is off by choice, nothing is inferred",refused:[]};if(G.verify!==void 0){let $=Array.isArray(G.verify)?G.verify:[G.verify],q=X.project.verify!==void 0?X.projectPath:RJ("user",J);return{source:"settings",commands:$,reason:`${q} verify`,refused:[]}}let W=[],B=[],K=[],V=L(J,"package.json");if(Z(V)){let $={},q=!0;try{let P=JSON.parse(z(V)).scripts;if(P!==void 0&&(typeof P!=="object"||P===null||Array.isArray(P)))K.push('package.json: "scripts" is not an object \u2014 nothing inferred from it'),q=!1;else if(P){for(let[N,U]of Object.entries(P))if(typeof U==="string")$[N]=U}}catch{K.push("package.json is not valid JSON \u2014 nothing inferred from it"),q=!1,$={}}if(q){let j=MQ(J,Z),P=(M)=>$[M].trim(),N=(M)=>`set \`"verify": "${j.run} ${M}"\` in .rovecode/settings.json`,U=(M,O,R,w)=>{if($[M]===void 0)return;let E=P(M);if(AJ.test(E)){K.push(`package.json script "${M}" runs \`${E}\`: a watch mode never exits, so it cannot gate a run`);return}if(!O.test(E)){K.push(`package.json script "${M}" runs \`${E}\`: not a ${R} this gate knows runs unattended and ends (${w}) \u2014 ${N(M)} to run it anyway`);return}W.push(`${j.run} ${M}`),B.push(`package.json script "${M}" (${j.from})`)};if(U("typecheck",PQ,"type-checker","tsc, vue-tsc, svelte-check"),U("lint",jQ,"linter","eslint, biome check, oxlint"),$.check!==void 0){let M=P("check"),O=FQ.exec(M),R=VQ.exec(M);if(O)K.push(`package.json script "check" runs \`${M}\`: it names \`${O[1]}\`, which a check must not do \u2014 ${N("check")} if that is really what you want the gate to run`);else if(AJ.test(M))K.push(`package.json script "check" runs \`${M}\`: a watch mode never exits, so it cannot gate a run`);else if(R)K.push(`package.json script "check" runs \`${M}\`: it runs the test suite (\`${R[1]}\`), which is minutes here rather than seconds; the thorough gate is configured, never inferred \u2014 ${N("check")} if that cost is right for this project`);else if(W.length>0)K.push(`package.json script "check" runs \`${M}\`: a faster script already covers it (${B.map((w)=>w.split(" (")[0]).join(", ")}) \u2014 ${N("check")} to run it instead`);else W.push(`${j.run} check`),B.push(`package.json script "check" (${j.from})`)}if($.test!==void 0){let M=P("test");K.push(`package.json script "test" runs \`${M}\`: a test suite is never inferred, only configured (the fast gate is a type-check; a suite can take minutes and may need services) \u2014 ${N("test")} if it is quick enough here`)}if(W.length===0&&K.length===0)K.push('package.json has no "typecheck", "lint", "check" or "test" script \u2014 name one, or set verify in .rovecode/settings.json')}}if(Z(L(J,"Cargo.toml")))W.push("cargo check"),B.push("Cargo.toml"),K.push("`cargo test` is not inferred: it runs the crate's tests, which may be slow or need services \u2014 set verify to run it");if(Z(L(J,"go.mod")))W.push("go vet ./..."),B.push("go.mod"),K.push("`go test ./...` is not inferred: it runs the module's tests \u2014 set verify to run it");let Y=L(J,"pyproject.toml");if(Z(Y)||Z(L(J,"ruff.toml"))){let $=Z(L(J,"ruff.toml")),q=$;if(!q&&Z(Y))try{q=/^\[tool\.ruff(\.|\])/m.test(z(Y))}catch{}if(q)W.push("ruff check ."),B.push($?"ruff.toml":"pyproject.toml [tool.ruff]");else K.push("pyproject.toml without a [tool.ruff] section: no linter is configured that this gate knows \u2014 set verify (for example `ruff check .` or `pytest -q`) to run one");K.push("`pytest` is not inferred: it runs the project's tests \u2014 set verify to run it")}if(Z(L(J,"Makefile"))||Z(L(J,"makefile")))K.push("a Makefile is here, but make targets are never inferred (a target can do anything) \u2014 set verify to `make check` or the target you mean");if(W.length>0)return{source:"inferred",commands:W,reason:`inferred from ${B.join(", ")}`,refused:K};if(K.length===0)return{source:"none",commands:[],reason:NQ,refused:[]};return{source:"none",commands:[],reason:DQ,refused:K}}function vJ(J){try{let Q=JSON.parse(bJ(L(J,kJ),"utf8"));if(Q===null||typeof Q!=="object"||Array.isArray(Q))return{};let Z={};for(let[z,X]of Object.entries(Q))if(X&&typeof X==="object"&&typeof X.ms==="number"&&typeof X.at==="string")Z[z]=X;return Z}catch{return{}}}function TJ(J,Q,Z,z=new Date){try{let X=vJ(J);X[Q]={ms:Math.max(0,Math.round(Z)),at:z.toISOString()},HQ(L(J,".rovecode"),{recursive:!0}),qQ(L(J,kJ),JSON.stringify(X,null,2)+`
|
|
4
|
+
`)}catch{}}function CQ(J,Q){return vJ(J)[Q]?.ms}function LQ(J){let Q=Math.round(J/1000);if(Q<1)return"under a second";if(Q<120)return`${Q} s`;let Z=Math.floor(Q/60),z=Q%60;return z===0?`${Z} min`:`${Z} min ${z} s`}function iQ(J,Q){return Q.commands.map((Z)=>{let z=CQ(J,Z);return z===void 0?`${Z} (not run here yet)`:`${Z} (${LQ(z)} last time)`}).join(" && ")}var FQ,AJ,VQ,PQ,jQ,DQ="nothing configured and nothing fast and safe to infer \u2014 set verify in .rovecode/settings.json (a command, or a list) to turn the gate on",NQ="no package.json, Cargo.toml, go.mod or pyproject.toml here, so there is no compiler, linter or test runner to run; for a plain HTML/CSS/JS site that is the normal answer, and the gate stays off",dQ="runs after edits made with `edit` or `write`; a run that changed files only through `bash` is not counted, so it is not verified",kJ;var xJ=f(()=>{YQ();FQ=/\b(deploy|publish|release|push|migrate|drop|rm\s+-rf|docker|kubectl|terraform|curl|wget|ssh|scp|rsync)\b/i,AJ=/(^|\s)(--watch(=\S*)?|-w|--watchAll)(\s|$)|\bnodemon\b|\bvitest\s*$/,VQ=/\b(bun test|vitest|jest|mocha|node --test|playwright test|cypress run|ava|tap|uvu)\b/,PQ=/^(bunx |npx |pnpm exec |yarn )?(tsc|vue-tsc|svelte-check)(\s|$)/,jQ=/^(bunx |npx |pnpm exec |yarn )?(eslint|biome (check|lint)|oxlint)(\s|$)/;kJ=L(".rovecode","verify-timing.json")});function rQ(J,Q){try{if(Q.ran>0)TJ(J,Q.command,Q.ms)}catch{}}function yJ(J,Q=OQ){let Z=J.replace(/\r\n?/g,`
|
|
5
|
+
`).split(`
|
|
6
|
+
`);while(Z.length>0&&Z.at(-1).trim()==="")Z.pop();let z=Math.max(0,Z.length-SQ),X=Z.slice(0,z).filter((K)=>/\b(fail|failed|failing|error|not ok|assert(ion)?|exception|panic)\b|\u2717|\u00D7|\u2718/i.test(K)),G=X.length>XJ?[...X.slice(0,XJ),`\u2026 ${X.length-XJ} more lines naming a failure`]:X,W=[...G];if(G.length>0&&z>0)W.push("\u2026");W.push(...Z.slice(z));let B=W.join(`
|
|
7
|
+
`);if(B.length>Q)B=`[\u2026 ${B.length-Q} chars clipped]
|
|
8
|
+
${B.slice(B.length-Q)}`;return B}async function sQ(J,Q,Z={}){let z=Z.exec??UQ,X=Z.clock??Date.now,G=Z.timeoutMs??fJ,W=X(),B=0,K=J.commands[0]??"";for(let V of J.commands){K=V;let Y=new AbortController,$=!1,q=()=>Y.abort();if(Z.signal?.aborted)Y.abort();else Z.signal?.addEventListener("abort",q,{once:!0});let j=setTimeout(()=>{$=!0,Y.abort()},G),P;try{P=await z(V,Q,Y.signal)}catch(N){P={code:-1,text:`could not run the check: ${N instanceof Error?N.message:String(N)}`}}finally{clearTimeout(j),Z.signal?.removeEventListener("abort",q)}if(B++,$)return{command:V,ok:!1,code:P.code,timedOut:!0,ms:X()-W,failure:yJ(P.text),ran:B};if(P.code!==0||Z.signal?.aborted)return{command:V,ok:!1,code:P.code,timedOut:!1,ms:X()-W,failure:yJ(P.text),ran:B}}return{command:K,ok:!0,code:0,timedOut:!1,ms:X()-W,failure:"",ran:B}}function hJ(J,Q=fJ){return["<verify-check>","You stopped, but the work does not pass \u2014 this is a check by the harness, not a message from the user.",J.timedOut?`The project's check did not finish within ${Math.round(Q/1000)}s and was stopped: \`${J.command}\``:`The project's check failed (exit ${J.code}) after your changes: \`${J.command}\``,J.failure.trim()===""?"(the check produced no output)":`Failing part of its output:
|
|
9
|
+
`+J.failure,"Fix what your changes broke and run the check yourself, or say plainly why it cannot be made to pass. This check runs once per run; your next reply ends it either way.","</verify-check>"].join(`
|
|
10
|
+
`)}function gJ(J){let Q=J.refused&&J.refused.length>0?` \xB7 ${J.refused.length} check${J.refused.length===1?"":"s"} refused (${J.refused.join("; ")})`:"",Z="command"in J?J.command.length>60?`${J.command.slice(0,59)}\u2026`:J.command:"";switch(J.state){case"unconfigured":return`not verified: ${J.reason??"no check configured"}${Q}`;case"passed":return`check passed (${Z})${Q}`;case"timeout":return`check timed out after ${J.seconds}s (${Z})${Q}`;case"failed":return`check failed (${Z}): ${(J.failure.split(`
|
|
11
|
+
`).filter((z)=>z.trim()!=="").at(-1)??"").slice(0,120)}${Q}`}}function mJ(J){if(J.ok)return`passed in ${(J.ms/1000).toFixed(1)}s`;if(J.timedOut)return`timed out after ${(J.ms/1000).toFixed(0)}s`;let Q=J.failure.split(`
|
|
12
|
+
`).filter((Z)=>Z.trim()!=="").at(-1)??"";return`exit ${J.code}${Q?` \u2014 ${Q.slice(0,120)}`:""}`}var oQ=(J)=>{let Q=wJ(J);return{commands:Q.commands,refused:Q.refused,source:Q.source,reason:Q.reason}},fJ=120000,OQ=3000,SQ=40,XJ=20,UQ=async(J,Q,Z)=>{let{getExecutor:z}=await import("./executor-ftvg6tsy.js");return z().run(J,Q,Z)};var uJ=f(()=>{xJ()});import{randomUUID as v}from"crypto";class AQ{queue=[];push(J){this.queue.push(J)}drainAll(){let J=this.queue;return this.queue=[],J}drainOne(){return this.queue.shift()}get size(){return this.queue.length}}function RQ(J,Q){return{calls:J.filter((z)=>z.kind==="tool_call"),truncated:Q==="length"}}async function*KZ(J,Q,Z,z,X,G,W=0,B){let K=new AbortController,V=()=>K.abort();if(X.signal?.aborted)K.abort();else X.signal?.addEventListener("abort",V,{once:!0});let Y=X.hooks?.observer?.({cwd:X.cwd??process.cwd(),sessionId:X.store.id});try{for await(let $ of EQ(J,Q,Z,z,X,G,W,B,K)){if(Y)await Y.observe($);yield $}}finally{if(X.signal?.removeEventListener("abort",V),K.abort(),Y)await Y.close()}}async function*EQ(J,Q,Z,z,X,G,W,B,K){let V=v();yield{type:"run_start",runId:V,sessionId:X.store.id,goal:Q};let Y=J.model??{provider:"mock",model:"default"},$=[...X.store.messages()],q=$.length,j={id:v(),role:"user",parts:[{kind:"text",text:Q}],parentId:$.at(-1)?.id??null,createdAt:Date.now()};X.store.append(j),$.push(j);let P=[],N=(I)=>{P.push(I)},U=function*(){yield*P.splice(0,P.length)};X.guard?.onTurn();let M=null,O=0,R=X.clock??Date.now,w=R(),E=0,b=0,T=!1,h=-1,S;for(let I=1;I<=z.maxTurns;I++){if(K.signal.aborted){yield{type:"run_end",status:"stopped",summary:"run aborted"};return}if(z.maxSeconds!==void 0&&(R()-w)/1000>=z.maxSeconds){yield{type:"run_end",status:"budget",summary:`wall clock (${z.maxSeconds}s) reached after ${I-1} turn${I===2?"":"s"}`};return}if(z.maxCostUsd!==void 0&&E>=z.maxCostUsd){let H=b>0?`; ${b} turn${b===1?"":"s"} unpriced`:"";yield{type:"run_end",status:"budget",summary:`cost cap ($${z.maxCostUsd.toFixed(2)}) reached after ${I-1} turn${I===2?"":"s"} \u2014 $${E.toFixed(4)} spent${H}`};return}for(let H of G.drainAll()){let F={id:v(),role:"user",parts:[{kind:"text",text:H}],parentId:$.at(-1)?.id??null,createdAt:Date.now()};X.store.append(F),$.push(F),yield{type:"steer",text:H}}yield{type:"turn_start",turn:I};let KJ=$.reduce((H,F)=>H+k(p(F.parts)),0),d=SJ(KJ,z,M!==null),WJ=M;if(M=null,d){let H={trigger:d,tokenText:(D)=>p(D.parts),summarize:X.summarize,native:X.compactNative,model:Y,signal:K.signal},F=ZJ($,z,H),A=F?await $J($,F,z,H):null;if(A){$.length=0,$.push(...A.history);let D={type:"compaction",strategy:A.strategy,trigger:d,tokensBefore:KJ,tokensAfter:$.reduce((C,_)=>C+k(p(_.parts)),0)};X.store.appendEvent(D),yield D}else if(WJ!==null){yield{type:"run_end",status:"error",summary:WJ};return}}let BJ=typeof J.systemPrompt==="function"?J.systemPrompt(Z):J.systemPrompt,dJ=$.reduce((H,F)=>H+k(p(F.parts)),0),iJ=[{name:"system",text:BJ,priority:100,tokens:k(BJ)},...J.contextChunks??[],{name:"history",text:"",priority:50,tokens:dJ}],g=DJ(iJ,z.contextBudgetTokens);if(g.dropped.length>0){let H=g.dropped.reduce((F,A)=>F+A.tokens,0);yield{type:"compaction",strategy:"context-drop",tokensBefore:g.totalTokens+H,tokensAfter:g.totalTokens}}let YJ=g.chunks.filter((H)=>H.name!=="history"),aJ=YJ.length>0,nJ=YJ.map((H)=>H.text).join(`
|
|
13
|
+
|
|
14
|
+
`),i=v(),m,oJ={id:"sys",role:"system",parts:[{kind:"text",text:nJ}],parentId:null,createdAt:0};try{let H=X.planReminder?.($)??null,F=H===null?$:[...$,{id:`reminder-${I}`,role:"user",parts:[{kind:"text",text:H}],parentId:$.at(-1)?.id??null,createdAt:Date.now()}],A=kQ(X.stream,Y,aJ?[oJ,...F]:F,X.tools,K.signal,z.maxSeconds!==void 0?w+z.maxSeconds*1000:void 0),D="";for(;;){let C=await A.next();if(C.done){m=C.value;break}if(C.value.type==="text_delta")yield{type:"message_update",messageId:i,delta:C.value.text};else D+=C.value.text,yield{type:"reasoning_update",messageId:i,tokens:k(D)}}}catch(H){m={parts:[],stopReason:"error",usage:{input:0,output:0},error:H instanceof Error?H.message:String(H)}}yield*U();let{parts:x,stopReason:u,usage:y}=m,a=K.signal.aborted||u==="aborted",n={id:i,role:"assistant",parts:x,parentId:$.at(-1)?.id??null,createdAt:Date.now(),origin:m.origin??Y,usage:y};if(z.maxCostUsd!==void 0&&(y.input>0||y.output>0||(y.cacheRead??0)>0||(y.cacheWrite??0)>0)){let H=z.priceUsd?.(y,n.origin??Y);if(H===void 0)b++;else E+=H}if(!a||x.length>0)X.store.append(n),$.push(n);if(yield{type:"turn_end",turn:I,stopReason:a?"aborted":u},a){for(let H of x)if(H.kind==="tool_call")zJ(X.store,$,H.id,{ok:!1,output:c});yield{type:"run_end",status:"stopped",summary:"run aborted"};return}if(u==="error"){let H=m.error??"provider stream failed",F=cJ(x),A=F?`${F}
|
|
15
|
+
error: ${H}`:`error: ${H}`;if(UJ(H)&&O===0&&I<z.maxTurns){O++,M=A;continue}yield{type:"run_end",status:"error",summary:A};return}let{calls:l,truncated:rJ}=RQ(x,u);if(rJ){for(let F of l)yield{type:"tool_call_failed",callId:F.id,reason:"truncated",detail:"response hit length limit; tool calls not executed"},zJ(X.store,$,F.id,{ok:!1,output:"response hit length limit; tool calls not executed"});continue}if(l.length===0){let H=B?B.drainAll():[];if(H.length>0){X.guard?.onTurn();for(let D of H){let C={id:v(),role:"user",parts:[{kind:"text",text:D}],parentId:$.at(-1)?.id??null,createdAt:Date.now()};X.store.append(C),$.push(C),yield{type:"steer",text:D}}continue}let F=bQ($.slice(q),z.todoState?.()??null,T);if(z.finishCheck!==!1&&!T&&(F.failed.length>0||F.unansweredAsk)){T=!0;let D=wQ(F),C={id:v(),role:"user",parts:[{kind:"text",text:D}],parentId:$.at(-1)?.id??null,createdAt:Date.now()};X.store.append(C),$.push(C),yield{type:"steer",text:D};continue}if(z.verify!==void 0&&F.writes>0){let D=z.verify,C=D.resolution?.refused&&D.resolution.refused.length>0?{refused:D.resolution.refused}:{};if(D.resolution===null||D.resolution.commands.length===0)F.verify={state:"unconfigured",...D.resolution?.reason?{reason:D.resolution.reason}:{},...C};else if(F.writes===h&&S!==void 0)F.verify=S;else{yield{type:"verify",command:D.resolution.commands.join(" && "),state:"running"};let _=await D.run(K.signal);if(K.signal.aborted){yield{type:"run_end",status:"stopped",summary:"run aborted"};return}h=F.writes;let r=_.ok?{state:"passed",command:_.command,ms:_.ms,...C}:_.timedOut?{state:"timeout",command:_.command,seconds:Math.round(D.timeoutMs/1000),...C}:{state:"failed",command:_.command,code:_.code,failure:_.failure,...C};if(S=r,yield{type:"verify",command:_.command,state:r.state,ms:_.ms,detail:mJ(_)},!_.ok&&!T){T=!0;let FJ=hJ(_,D.timeoutMs),VJ={id:v(),role:"user",parts:[{kind:"text",text:FJ}],parentId:$.at(-1)?.id??null,createdAt:Date.now()};X.store.append(VJ),$.push(VJ),yield{type:"steer",text:FJ};continue}F.verify=r}}let A=F.failed.length>0||F.unansweredAsk||(F.todosOpen??0)>0||F.nudged||F.verify!==void 0;yield{type:"run_end",status:"done",summary:cJ(x),...A?{outstanding:F}:{}};return}let GJ={sessionId:X.store.id,cwd:X.cwd??process.cwd(),signal:K.signal,runId:V,spawn:void 0,permissions:{effect:"allow"}},HJ=X.childRunner;if(HJ)GJ.spawn=async(H)=>{let F=await HJ(H.agent,H.goal,H.vars,W+1);return{agent:H.agent,ok:F.ok,summary:F.summary,usage:F.usage}};let qJ=new Map,o=!1;try{let H=X.registry.dispatchBatch(l,GJ,X.hooks,z.permissionRules,z.approval,N,z.parallelTools,X.guard),F=!1;H.then(()=>{F=!0},()=>{F=!0});while(!F&&!K.signal.aborted)if(await Promise.race([H,lJ(5)]),P.length>0)yield*U();if(!F&&K.signal.aborted)await Promise.race([H,lJ(250)]);if(F)qJ=await H,o=!0;if(P.length>0)yield*U()}finally{if(!o)K.abort();for(let H of l)zJ(X.store,$,H.id,qJ.get(H.id)??{ok:!1,output:o?"missing result":c})}if(K.signal.aborted){yield{type:"run_end",status:"stopped",summary:"run aborted"};return}}yield{type:"run_end",status:"budget",summary:`max turns (${z.maxTurns}) reached`}}function bQ(J,Q,Z){let z=new Map;for(let $ of J)if($.role==="tool"){for(let q of $.parts)if(q.kind==="tool_result")z.set(q.callId,{ok:q.ok,output:q.output})}let X=($,q)=>`${$.tool}: ${(q.split(`
|
|
16
|
+
`)[0]??"").slice(0,160)}`,G=($)=>{let q=$.args,j=q?.path??q?.file_path;return typeof j==="string"?j:null},W=0,B=[],K=new Map;for(let $ of J){if($.role!=="assistant")continue;let q=$.parts.filter((j)=>j.kind==="tool_call");if(q.length===0)continue;B=q;for(let j of q){if(j.tool!=="edit"&&j.tool!=="write")continue;let P=z.get(j.id),N=G(j)??j.id;if(P?.ok===!0)W++,K.delete(N);else if(P&&!pJ(P.output))K.set(N,X(j,P.output))}}let V=[...K.values()],Y=!1;for(let $ of B){let q=z.get($.id);if(q===void 0||q.ok)continue;if($.tool==="ask_user"){Y=!0;continue}if(pJ(q.output))continue;let j=X($,q.output);if(!V.includes(j))V.push(j)}return{failed:V,unansweredAsk:Y,writes:W,...Q&&Q.total>0?{todosOpen:Q.open,todosTotal:Q.total}:{},nudged:Z}}function pJ(J){return J.startsWith("Permission denied")||J.includes("loop guard: blocked")||J.startsWith(c)}function wQ(J){let Q=["<finish-check>","You stopped, but this run is not in a finished state \u2014 this is a check by the harness, not a message from the user."];for(let Z of J.failed)Q.push(`- a tool call failed and nothing after it recovered from that: ${Z}`);if(J.unansweredAsk)Q.push("- your question to the user was not answered (there is no one to answer it in this run); decide with your best judgment instead of waiting");if((J.todosOpen??0)>0)Q.push(`- your own todo list still has ${J.todosOpen} of ${J.todosTotal} items open`);return Q.push("Either continue and finish the work now, or say plainly what is left undone and why it is not needed. This check runs once per run; your next reply ends it either way.","</finish-check>"),Q.join(`
|
|
17
|
+
`)}function WZ(J){let Q=[];if(J.failed.length>0)Q.push(`${J.failed.length} failed tool call${J.failed.length===1?"":"s"} not recovered (${[...new Set(J.failed.map((Z)=>Z.split(":")[0]))].join(", ")})`);if(J.unansweredAsk)Q.push("its question to you went unanswered");if((J.todosOpen??0)>0)Q.push(`${J.todosOpen} of ${J.todosTotal} items still open`);if(J.verify!==void 0)Q.push(gJ(J.verify));return Q.length>0?Q.join(" \xB7 "):null}function BZ(J){return J.failed.length===0&&!J.unansweredAsk&&(J.todosOpen??0)===0&&J.verify?.state==="passed"?"info":"warn"}function zJ(J,Q,Z,z){let X={id:v(),role:"tool",parts:[{kind:"tool_result",callId:Z,ok:z.ok,output:z.output}],parentId:Q.at(-1)?.id??null,createdAt:Date.now()};J.append(X),Q.push(X)}async function*kQ(J,Q,Z,z,X,G){let W={parts:[],stopReason:"end_turn",usage:{input:0,output:0}};for await(let B of J(Q,Z,{tools:z,signal:X,...G!==void 0?{deadlineAt:G}:{}}))if(B.type==="text_delta"||B.type==="reasoning_delta")yield B;else if(B.type==="turn")W={parts:B.turn.parts,stopReason:B.turn.stopReason,usage:B.turn.usage,error:B.turn.error,origin:jJ(B.turn)};return W}function cJ(J){return J.filter((Q)=>Q.kind==="text").map((Q)=>Q.text).join("")}function p(J){return J.map((Q)=>Q.kind==="text"?Q.text:Q.kind==="tool_call"?`${Q.tool} ${JSON.stringify(Q.args)}`:Q.kind==="tool_result"?Q.output:"").join(`
|
|
18
|
+
`)}var lJ=(J)=>new Promise((Q)=>setTimeout(Q,J));var vQ=f(()=>{IQ();MJ();JJ();IJ();uJ()});
|
|
19
|
+
export{PJ as mk,TQ as nk,eJ as ok,xQ as pk,MJ as qk,k as rk,JJ as sk,QJ as tk,mQ as uk,ZJ as vk,$J as wk,IJ as xk,wJ as yk,dQ as zk,iQ as Ak,xJ as Bk,oQ as Ck,rQ as Dk,fJ as Ek,sQ as Fk,uJ as Gk,AQ as Hk,RQ as Ik,KZ as Jk,bQ as Kk,wQ as Lk,WZ as Mk,BZ as Nk,cJ as Ok,p as Pk,vQ as Qk};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var{defineProperty:e,getOwnPropertyNames:g,getOwnPropertyDescriptor:h}=Object,i=Object.prototype.hasOwnProperty;function j(a){return this[a]}var m=(a)=>{var b=(f??=new WeakMap).get(a),c;if(b)return b;if(b=e({},"__esModule",{value:!0}),a&&typeof a==="object"||typeof a==="function"){for(var d of g(a))if(!i.call(b,d))e(b,d,{get:j.bind(a,d),enumerable:!(c=h(a,d))||c.enumerable})}return f.set(a,b),b},f;var k=(a)=>a;function l(a,b){this[a]=k.bind(null,b)}var n=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:!0,configurable:!0,set:l.bind(b,c)})};var o=(a,b)=>()=>(a&&(b=a(a=0)),b);var p=import.meta.require;
|
|
3
|
+
export{m as un,n as vn,o as wn,p as xn};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Ul as O,Vl as Q}from"./main-vhrrq337.js";Q();import{existsSync as R}from"fs";var W=new Set(["--resume","--key","--out","--output","--pet","--effort","--protocol","--key-env","--model","--scope","--max-turns","--max-seconds","--max-cost","--add-dir"]),Y=/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|kt|rb|php|c|h|cpp|cs|swift|sh|ps1|bat|md|mdx|txt|json|jsonc|yaml|yml|toml|ini|env|html|css|scss|svg|csv|sql|lock)$/i;function k(j,b=R){if(j.length===0||/\s/.test(j))return!1;if(/^(\.\.?[\\/]|[\\/]|[A-Za-z]:[\\/])/.test(j))return!0;if(Y.test(j))return!0;try{return b(j)}catch{return!1}}function G(j){let b=j.slice(2),B=(z)=>z.startsWith("-"),q=b.findIndex((z,N)=>!B(z)&&!(N>0&&W.has(b[N-1]))),P=b.includes("--help")||b.includes("-h"),D=b.indexOf("--pet"),C=D!==-1?b[D+1]:void 0,J=C!==void 0&&!B(C)?C:void 0,K=b.indexOf("--effort"),M=O(K!==-1?b[K+1]:void 0);return{cmd:P&&q===-1?"help":q===-1?"":b[q],plain:b.includes("--plain"),yolo:b.includes("--yolo"),acceptEdits:b.includes("--accept-edits"),...M!==void 0?{effort:M}:{},classic:b.includes("--classic"),...J!==void 0?{pet:J}:{},rest:q===-1?[]:b.slice(q+1).filter((z)=>!B(z))}}
|
|
3
|
+
export{W as Hh,k as Ih,G as Jh};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{Dl as h,sl as M,ul as g,wl as p,xl as m,yl as v}from"./main-a3f51n0x.js";import{Gl as _,Hl as d}from"./main-5py0rkmc.js";import{wn as O}from"./main-qsevpgsv.js";function E(q){if(q===null)return"null";if(Array.isArray(q))return"array";let z=typeof q;if(z==="number")return Number.isInteger(q)?"integer":"number";return z==="object"||z==="boolean"||z==="string"?z:z}function N(q,z){if(Array.isArray(q))return q.some((Y)=>N(Y,z));if(typeof q!=="string")return!0;let V=E(z);if(q==="number")return V==="number"||V==="integer";if(q==="integer")return V==="integer";if(q==="object")return F(z);return V===q}function P(q,z){return q===""?String(z):`${q}.${z}`}function L(q,z,V,Y){if(!F(q))return;let Q=q;if(Q.type!==void 0&&!N(Q.type,z)){let J=Array.isArray(Q.type)?Q.type.join(" or "):String(Q.type);Y.push({path:V,message:`expected ${J}, got ${E(z)}`});return}if(Array.isArray(Q.enum)&&Q.enum.length>0&&!Q.enum.includes(z)){Y.push({path:V,message:`expected one of ${Q.enum.map((J)=>JSON.stringify(J)).join(" | ")}, got ${JSON.stringify(z)}`});return}if(Array.isArray(z)&&Q.items!==void 0){z.forEach((J,K)=>L(Q.items,J,P(V,K),Y));return}if(F(z)){if(Array.isArray(Q.required)){for(let J of Q.required)if(typeof J==="string"&&(!(J in z)||z[J]===void 0))Y.push({path:P(V,J),message:"is required but was not provided"})}if(F(Q.properties)){for(let[J,K]of Object.entries(Q.properties))if(J in z&&z[J]!==void 0)L(K,z[J],P(V,J),Y)}}}function R(q,z){let V=[],Y=F(q)&&q.type===void 0&&(q.properties!==void 0||q.required!==void 0)?{...q,type:"object"}:q;return L(Y,z,"",V),V}function T(q,z,V=5){let Y=z.slice(0,V).map((J)=>J.path===""?J.message:`${J.path} ${J.message}`),Q=z.length>Y.length?` (+${z.length-Y.length} more)`:"";return`Invalid arguments for ${q}: ${Y.join("; ")}${Q}`}var F=(q)=>typeof q==="object"&&q!==null&&!Array.isArray(q);var b=()=>{};function w(q,z,V){let Y={effect:"deny",reason:`no rule allows ${z}`};for(let Q of q)if(f(Q.action,z)&&f(Q.resource,V))Y=Q.effect==="allow"?{effect:"allow"}:Q.effect==="deny"?{effect:"deny",reason:`denied by rule ${Q.action} ${Q.resource}`}:{effect:"prompt",prompt:`permission required for ${z} ${V}`};return Y}function f(q,z){if(q==="*")return!0;return new RegExp("^"+q.split("*").map(n).join(".*")+"$").test(z)}function n(q){return q.replace(/[.+^${}()|[\]\\]/g,"\\$&")}class i{tools=new Map;approvalCache=new Map;register(...q){for(let z of q)this.tools.set(z.schema.name,z)}list(){return[...this.tools.values()]}async dispatch(q,z,V,Y,Q,J,K){let j=Date.now(),U=this.tools.get(q.tool);if(!U)return J({type:"tool_call_failed",callId:q.id,reason:"not_found",detail:`unknown tool ${q.tool}`}),{ok:!1,output:`Error: unknown tool '${q.tool}'`};let $=q.args;if(V?.reviseToolArgs)$=await V.reviseToolArgs(q.tool,$);let B=R(U.schema.args,$);if(B.length>0){let Z=T(q.tool,B);return J({type:"tool_call_failed",callId:q.id,reason:"invalid_args",detail:Z}),{ok:!1,output:Z}}let S;if(K){let Z=K.checkCall(q.tool,$);if(Z.action==="stub"){let H=Z.note??"call blocked by loop guard: identical call repeated too often";return J({type:"tool_execution_start",callId:q.id,tool:q.tool,args:$}),J({type:"tool_execution_end",callId:q.id,ok:!1,output:H,durationMs:0}),{ok:!1,output:H}}if(Z.action==="warn")S=Z.note}let W=r(U,$,z.cwd),G=w(Y,k(U),W),X;if(G.effect!=="deny"&&u(U)&&Y.some((Z)=>f(Z.action,M))&&p(z.cwd,W)){let Z=m(W),H=w(Y,M,Z);if(H.effect==="deny")G={effect:"deny",reason:`${W} is outside the workspace ${z.cwd} (${H.reason})`};else if(H.effect==="prompt")G={effect:"prompt",prompt:v(W,z.cwd,Y)},X=Z}if(G.effect==="deny")return J({type:"tool_call_failed",callId:q.id,reason:"permission_denied",detail:G.reason}),{ok:!1,output:`Permission denied: ${G.reason}`};let C=await V?.run?.("pre_tool",x(z),{id:q.id,tool:q.tool,args:_($)});if(C)return J({type:"tool_call_failed",callId:q.id,reason:"permission_denied",detail:C.deny}),{ok:!1,output:`Permission denied by hook: ${C.deny}`};if(G.effect==="prompt"){let Z=X!==void 0?`${M}|${X}`:s(k(U),W,U.schema.name,$);if(!this.approvalCache.get(Z)){if(!Q)return J({type:"tool_call_failed",callId:q.id,reason:"permission_denied",detail:"approval required but no approver connected"}),{ok:!1,output:"Permission denied: approval required, no approver available"};let I=await Q({tool:q.tool,args:$,revisedArgs:$,reason:G.prompt,...X!==void 0?{external:X}:{}});if(I==="deny")return J({type:"tool_call_failed",callId:q.id,reason:"permission_denied",detail:"user denied"}),{ok:!1,output:"Permission denied by user"};if(I==="always")this.approvalCache.set(Z,I)}}if(z.signal.aborted)return{ok:!1,output:y};J({type:"tool_execution_start",callId:q.id,tool:q.tool,args:$});let D;try{D=await U.execute($,{...z,onUpdate:(Z)=>J({type:"tool_execution_update",callId:q.id,note:Z})})}catch(Z){D={ok:!1,output:`Error: ${Z instanceof Error?Z.message:String(Z)}`}}if(K){let Z=K.checkResult(q.tool,$,D.output,D.ok);if(Z.deduped)D={...D,output:Z.output}}if(S)D={...D,output:`${D.output}
|
|
3
|
+
|
|
4
|
+
[loop-guard] ${S}`};let A=await V?.run?.("post_tool",x(z),{id:q.id,tool:q.tool,args:_($)},{...D});if(A?.output!==void 0)D={...D,output:A.output};if(J({type:"tool_execution_end",callId:q.id,ok:D.ok,output:D.output,durationMs:Date.now()-j}),V?.onToolResult)await V.onToolResult(q.tool,$,D).catch(()=>{});return D}async dispatchBatch(q,z,V,Y,Q,J,K,j){let U=new Map,$=async(B)=>{U.set(B.id,await this.dispatch(B,z,V,Y,Q,J,j))};if(!K||q.some((B)=>this.tools.get(B.tool)?.sequential!==!1))for(let B of q){if(z.signal.aborted){U.set(B.id,{ok:!1,output:y});continue}await $(B)}else await Promise.all(q.map($));return U}}function k(q){switch(q.kind){case"read":return"file.read";case"write":return"file.write";case"execute":return"shell.exec";case"spawn":return"spawn";case"memory":return"memory.write";case"network":return"net.fetch";default:return`tool.${q.schema.name}`}}function u(q){let z=q.schema.args.properties;return typeof z==="object"&&z!==null&&"path"in z}function r(q,z,V){if(typeof q.resource==="function")return q.resource(z);let Y=q.schema.args.properties,Q=(K)=>typeof Y==="object"&&Y!==null&&(K in Y),J=z&&typeof z==="object"?z:void 0;if(Q("path")){let K=J?.path;if(K===void 0||K===null||K==="")return V;return g(V,String(K))}if(J&&Q("command")&&"command"in J)return String(J.command);if(J&&Q("url")&&"url"in J)return c(String(J.url));return q.schema.name}function c(q){try{let z=new URL(q).hostname;return(z.endsWith(".")?z.slice(0,-1):z).toLowerCase()||q}catch{return q}}function s(q,z,V,Y){let Q=q+"|"+z;return z===V?Q+"|"+JSON.stringify(Y):Q}var y="Tool execution aborted",x=(q)=>({cwd:q.cwd,sessionId:q.sessionId,...q.runId!==void 0?{runId:q.runId}:{}});var o=O(()=>{b();d();h()});
|
|
5
|
+
export{y as nl,w as ol,i as pl,r as ql,o as rl};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{od as v,qd as I,rd as E,td as j}from"./main-evgz4mp5.js";import{cl as O,dl as q,fl as A,jl as U,ll as C,ml as g}from"./main-6dtqmbt6.js";import{wn as H}from"./main-qsevpgsv.js";import{basename as R}from"path";function _(G){return G.trim().length>0&&G!=="."&&G!==".."&&!/[\\/]/.test(G)&&R(G)===G}function B(G){if(_(G))return;if(G.trim().length===0)return"session id is empty";return`session id ${JSON.stringify(G)} is not a plain directory name (no / or \\, not . or ..)`}var D=()=>{};import{randomUUID as k}from"crypto";import{copyFileSync as b,cpSync as x,existsSync as z,mkdirSync as T,readdirSync as f,rmSync as p,statSync as w}from"fs";import{join as Z}from"path";function JG(G){return Z(G,".rovecode","sessions")}function S(G,J){let L=G.find((V)=>V.id===J);return L?[L]:G.filter((V)=>V.id.startsWith(J))}function u(G,J){let L=J.slice(0,4).map((V)=>V.id.slice(0,8)).join(", ");return`"${G}" matches ${J.length} sessions: ${L}${J.length>4?", \u2026":""} \u2014 be more specific`}function LG(G,J){let L=J.trim();if(L==="")return{ok:!1,error:"a session id or prefix is required"};let V=B(L);if(V!==void 0)return{ok:!1,error:V};let W=S(U(G,{includeHollow:!0}),L);if(W.length===1)return{ok:!0,id:W[0].id,summary:W[0]};if(W.length>1)return{ok:!1,error:u(L,W)};return{ok:!1,error:`no session matching "${L}"`}}function y(G){let J=/^(.+) \(fork #(\d+)\)$/.exec(G);return J?`${J[1]} (fork #${Number(J[2])+1})`:`${G} (fork #1)`}function QG(G,J,L){new C(G,J).patchMeta({title:L})}function M(G){let J=0,L;try{L=f(G)}catch{return 0}for(let V of L){let W=Z(G,V);try{let $=w(W);J+=$.isDirectory()?M(W):$.size}catch{}}return J}function VG(G,J,L={}){let V=Z(G,J.id),W=Z(V,O),$=L.maxBytes??h,Y=z(W)?M(W):0;if(Y>$)throw Error(`session ${J.id.slice(0,8)} carries ${N(Y)} of attachments, over the fork limit of ${N($)} \u2014 nothing copied; \`rovecode export ${J.id.slice(0,8)}\` writes the transcript without them`);let P=k(),X=Z(G,P);T(X,{recursive:!0});for(let F of["entries.jsonl","meta.json"])if(z(Z(V,F)))b(Z(V,F),Z(X,F));if(z(W))x(W,Z(X,O),{recursive:!0});let Q=J.title??J.preview,K=y(Q===""?"(empty session)":Q);return new C(G,P).patchMeta({createdAt:Date.now(),title:K,forkedFrom:J.id}),{id:P,from:J.id,title:K}}function WG(G,J,L){let V=[];for(let W of[Z(J,L),v(G,L)]){if(!z(W))continue;p(W,{recursive:!0,force:!0}),V.push(W)}return{removed:V}}function ZG(G,J,L=10){let V=J.trim();if(V==="")return[];let W=U(G),$=new Map;for(let Q of W)if(Q.title!==void 0)$.set(Q.id,Q.title);let Y=V.toLowerCase(),P=[];for(let Q of W)if(Q.title!==void 0&&Q.title.toLowerCase().includes(Y))P.push({sessionId:Q.id,title:Q.title,entryId:"",timestamp:Q.updatedAt,preview:Q.preview});for(let Q of new E(G).search(V,L)){let K=$.get(Q.sessionId);P.push({sessionId:Q.sessionId,...K!==void 0?{title:K}:{},entryId:Q.entryId,timestamp:Q.timestamp,preview:Q.preview})}let X=new Set;return P.filter((Q)=>{let K=`${Q.sessionId.length}:${Q.sessionId}:${Q.entryId}`;if(X.has(K))return!1;return X.add(K),!0}).slice(0,L)}var h=268435456,N=(G)=>`${(G/1048576).toFixed(1)} MB`;var l=H(()=>{I();j();D();q();g();A()});
|
|
3
|
+
export{B as jb,D as kb,JG as lb,S as mb,u as nb,LG as ob,QG as pb,VG as qb,WG as rb,ZG as sb,l as tb};
|