rovecode 0.4.0-beta.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -72
- package/THIRD_PARTY_NOTICES.md +0 -44
- package/bin/rovecode.ts +21 -0
- package/package.json +16 -38
- package/src/account/keys.ts +97 -0
- package/src/account/login.ts +158 -0
- package/src/account/provision.ts +47 -0
- package/src/account/store.ts +63 -0
- package/src/acp/server.ts +373 -0
- package/src/cli/account-cmd.ts +116 -0
- package/src/cli/connect.ts +244 -0
- package/src/cli/context-cmd.ts +199 -0
- package/src/cli/dispatch.ts +109 -0
- package/src/cli/doctor.ts +324 -0
- package/src/cli/export.ts +278 -0
- package/src/cli/help.ts +240 -0
- package/src/cli/is-tui-invocation.ts +8 -0
- package/src/cli/main.ts +599 -0
- package/src/cli/market-cmd.ts +658 -0
- package/src/cli/mcp-market-cmd.ts +299 -0
- package/src/cli/output.ts +382 -0
- package/src/cli/repl.ts +172 -0
- package/src/cli/resume.ts +32 -0
- package/src/cli/run-limits.ts +78 -0
- package/src/cli/runtime.ts +792 -0
- package/src/cli/setup.ts +187 -0
- package/src/cli/update-cmd.ts +78 -0
- package/src/cli/workflow-cmd.ts +100 -0
- package/src/coding/checkpoints.ts +270 -0
- package/src/coding/diff.ts +136 -0
- package/src/coding/files.ts +339 -0
- package/src/coding/hashline.ts +319 -0
- package/src/coding/lsp.ts +406 -0
- package/src/coding/repomap-cache.ts +99 -0
- package/src/coding/repomap-files.ts +110 -0
- package/src/coding/repomap.ts +392 -0
- package/src/core/compaction.ts +399 -0
- package/src/core/config.ts +289 -0
- package/src/core/context-report.ts +228 -0
- package/src/core/context.ts +60 -0
- package/src/core/count-remote.ts +107 -0
- package/src/core/execpolicy-rules.ts +196 -0
- package/src/core/execpolicy.ts +385 -0
- package/src/core/executor.ts +397 -0
- package/src/core/guardrails.ts +400 -0
- package/src/core/hooks.ts +398 -0
- package/src/core/images.ts +230 -0
- package/src/core/intro.ts +236 -0
- package/src/core/loop.ts +621 -0
- package/src/core/modes.ts +372 -0
- package/src/core/orchestrator.ts +207 -0
- package/src/core/reflection.ts +165 -0
- package/src/core/sandbox-config.ts +167 -0
- package/src/core/session-images.ts +73 -0
- package/src/core/session.ts +398 -0
- package/src/core/settings.ts +98 -0
- package/src/core/stuck-detector.ts +273 -0
- package/src/core/tasks.ts +374 -0
- package/src/core/token-scale.ts +108 -0
- package/src/core/tool-output-budget.ts +166 -0
- package/src/core/tools.ts +288 -0
- package/src/core/types.ts +330 -0
- package/src/core/update-check.ts +171 -0
- package/src/core/update.ts +158 -0
- package/src/core/usage.ts +204 -0
- package/src/core/validate.ts +121 -0
- package/src/core/verify-gate.ts +159 -0
- package/src/core/verify.ts +237 -0
- package/src/core/voice.ts +158 -0
- package/src/core/win-job.ts +183 -0
- package/src/design/audit.ts +797 -0
- package/src/design/direction.ts +190 -0
- package/src/design/rules.ts +157 -0
- package/src/eval/bench.ts +150 -0
- package/src/eval/gauntlet-runner.ts +218 -0
- package/src/eval/gauntlet.ts +226 -0
- package/src/eval/grader.ts +186 -0
- package/src/eval/record.ts +202 -0
- package/src/eval/redact.ts +141 -0
- package/src/eval/replay.ts +147 -0
- package/src/eval/trajectory.ts +373 -0
- package/src/index.ts +17 -0
- package/src/market/catalogs/mcp-docs.json +111 -0
- package/src/market/catalogs/plugins.json +111 -0
- package/src/market/catalogs/skills.json +478 -0
- package/src/market/clone.ts +72 -0
- package/src/market/context-cost.ts +121 -0
- package/src/market/digest.ts +106 -0
- package/src/market/index.ts +22 -0
- package/src/market/install.ts +578 -0
- package/src/market/manifest.ts +187 -0
- package/src/market/prereq.ts +145 -0
- package/src/market/registry.ts +363 -0
- package/src/market/resolve.ts +111 -0
- package/src/market/types.ts +236 -0
- package/src/market/validate.ts +227 -0
- package/src/mcp/client.ts +431 -0
- package/src/mcp/config.ts +239 -0
- package/src/mcp/local-package.ts +211 -0
- package/src/mcp/market-catalog.ts +84 -0
- package/src/mcp/market-install.ts +289 -0
- package/src/mcp/market.ts +0 -0
- package/src/mcp/tools.ts +131 -0
- package/src/mcp/trust.ts +49 -0
- package/src/memory/blocks.ts +175 -0
- package/src/memory/recall.ts +355 -0
- package/src/memory/store.ts +105 -0
- package/src/memory/tools.ts +99 -0
- package/src/plugins/cli.ts +123 -0
- package/src/plugins/discover.ts +108 -0
- package/src/plugins/index.ts +50 -0
- package/src/plugins/init.ts +140 -0
- package/src/plugins/install.ts +184 -0
- package/src/plugins/load.ts +149 -0
- package/src/plugins/manifest.ts +106 -0
- package/src/plugins/state.ts +83 -0
- package/src/providers/auth.ts +293 -0
- package/src/providers/cache.ts +223 -0
- package/src/providers/catalog-local.ts +160 -0
- package/src/providers/catalog.ts +408 -0
- package/src/providers/middleware-context.ts +86 -0
- package/src/providers/middleware.ts +373 -0
- package/src/providers/profile-glm53.ts +111 -0
- package/src/providers/profile-sonnet5-persona.ts +65 -0
- package/src/providers/profile-sonnet5-voice.ts +23 -0
- package/src/providers/profiles.ts +156 -0
- package/src/providers/provider-config.ts +311 -0
- package/src/providers/registry.ts +302 -0
- package/src/providers/response-validation.ts +80 -0
- package/src/providers/retry.ts +234 -0
- package/src/providers/router.ts +294 -0
- package/src/providers/sse.ts +26 -0
- package/src/providers/stream-errors.ts +117 -0
- package/src/providers/stream.ts +569 -0
- package/src/providers/thinking.ts +189 -0
- package/src/providers/wire-messages.ts +129 -0
- package/src/sdk/client.ts +225 -0
- package/src/sdk/index.ts +3 -0
- package/src/server/dashboard.ts +144 -0
- package/src/server/http.ts +343 -0
- package/src/server/openapi.ts +246 -0
- package/src/sextant/card-hits.ts +102 -0
- package/src/sextant/card-keys.ts +55 -0
- package/src/sextant/context-source.ts +157 -0
- package/src/sextant/draw-agents.ts +273 -0
- package/src/sextant/draw-code.ts +388 -0
- package/src/sextant/draw-context.ts +222 -0
- package/src/sextant/draw-frame.ts +164 -0
- package/src/sextant/draw-market.ts +573 -0
- package/src/sextant/draw-messages.ts +386 -0
- package/src/sextant/draw-pet.ts +230 -0
- package/src/sextant/draw-plan.ts +159 -0
- package/src/sextant/draw-tabs.ts +85 -0
- package/src/sextant/draw-util.ts +65 -0
- package/src/sextant/engine.ts +230 -0
- package/src/sextant/frame-hits.ts +25 -0
- package/src/sextant/frame.ts +101 -0
- package/src/sextant/git-status.ts +197 -0
- package/src/sextant/grid.ts +59 -0
- package/src/sextant/input.ts +119 -0
- package/src/sextant/keys.ts +488 -0
- package/src/sextant/layout.ts +86 -0
- package/src/sextant/local-commands.ts +156 -0
- package/src/sextant/market-source.ts +287 -0
- package/src/sextant/mentions.ts +141 -0
- package/src/sextant/message-hits.ts +26 -0
- package/src/sextant/model.ts +387 -0
- package/src/sextant/overlays.ts +451 -0
- package/src/sextant/panel-hits.ts +38 -0
- package/src/sextant/pet.ts +399 -0
- package/src/sextant/screen.ts +324 -0
- package/src/sextant/scroll-hits.ts +66 -0
- package/src/sextant/scrollbar.ts +82 -0
- package/src/sextant/selection.ts +123 -0
- package/src/sextant/sextant-bridge.ts +174 -0
- package/src/sextant/sextant-cards.ts +142 -0
- package/src/sextant/sextant-diff-base.ts +63 -0
- package/src/sextant/sextant-files.ts +154 -0
- package/src/sextant/sextant-frame-loop.ts +314 -0
- package/src/sextant/sextant-renderer.ts +478 -0
- package/src/sextant/sextant-repo.ts +131 -0
- package/src/sextant/theme.ts +66 -0
- package/src/sextant/tool-rows.ts +189 -0
- package/src/sextant/types.ts +473 -0
- package/src/skills/index.ts +306 -0
- package/src/skills/tools.ts +69 -0
- package/src/skills/versioned.ts +227 -0
- package/src/telemetry/otel.ts +353 -0
- package/src/telemetry/otlp.ts +68 -0
- package/src/tools/ask-user.ts +156 -0
- package/src/tools/design.ts +151 -0
- package/src/tools/evalcell.ts +338 -0
- package/src/tools/html-text.ts +139 -0
- package/src/tools/provider.ts +149 -0
- package/src/tools/task.ts +216 -0
- package/src/tools/todo.ts +320 -0
- package/src/tools/webfetch.ts +331 -0
- package/src/tui/app.ts +608 -0
- package/src/tui/attach.ts +127 -0
- package/src/tui/checkpoints-cmd.ts +70 -0
- package/src/tui/clipboard-image.ts +81 -0
- package/src/tui/commands.ts +277 -0
- package/src/tui/cost.ts +108 -0
- package/src/tui/info-cmd.ts +144 -0
- package/src/tui/mcp-cmd.ts +128 -0
- package/src/tui/modes-cmd.ts +45 -0
- package/src/tui/overlays.ts +97 -0
- package/src/tui/pi-renderer.ts +424 -0
- package/src/tui/providers-cmd.ts +366 -0
- package/src/tui/renderer.ts +101 -0
- package/src/tui/replay-marker.ts +29 -0
- package/src/tui/session-cmd.ts +146 -0
- package/src/tui/sextant-attach.ts +68 -0
- package/src/tui/sextant-io.ts +184 -0
- package/src/tui/sextant-smoke.ts +110 -0
- package/src/tui/smoke.ts +72 -0
- package/src/tui/theme.ts +59 -0
- package/src/tui/todo-label.ts +7 -0
- package/src/workflow/engine.ts +266 -0
- package/tsconfig.json +30 -0
- package/vendor/pi-tui/LICENSE +21 -0
- package/vendor/pi-tui/PATCHES.md +12 -0
- package/vendor/pi-tui/PROVENANCE.md +12 -0
- package/vendor/pi-tui/README.upstream.md +854 -0
- 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 +158 -0
- package/vendor/pi-tui/src/autocomplete.ts +827 -0
- package/vendor/pi-tui/src/components/alt-screen-flash.ts +52 -0
- package/vendor/pi-tui/src/components/box.ts +138 -0
- package/vendor/pi-tui/src/components/cancellable-loader.ts +41 -0
- package/vendor/pi-tui/src/components/editor.ts +2364 -0
- package/vendor/pi-tui/src/components/h-stack.ts +45 -0
- package/vendor/pi-tui/src/components/image.ts +128 -0
- package/vendor/pi-tui/src/components/input.ts +448 -0
- package/vendor/pi-tui/src/components/loader.ts +93 -0
- package/vendor/pi-tui/src/components/markdown.ts +1016 -0
- package/vendor/pi-tui/src/components/scroll-view.ts +217 -0
- package/vendor/pi-tui/src/components/select-list.ts +230 -0
- package/vendor/pi-tui/src/components/settings-list.ts +277 -0
- package/vendor/pi-tui/src/components/spacer.ts +29 -0
- package/vendor/pi-tui/src/components/stack.ts +155 -0
- package/vendor/pi-tui/src/components/text.ts +108 -0
- package/vendor/pi-tui/src/components/truncated-text.ts +66 -0
- package/vendor/pi-tui/src/components/v-stack.ts +34 -0
- package/vendor/pi-tui/src/editor-component.ts +75 -0
- package/vendor/pi-tui/src/fuzzy.ts +138 -0
- package/vendor/pi-tui/src/index.ts +149 -0
- package/vendor/pi-tui/src/keybindings.ts +321 -0
- package/vendor/pi-tui/src/keys.ts +1402 -0
- package/vendor/pi-tui/src/kill-ring.ts +47 -0
- package/vendor/pi-tui/src/latex.ts +1381 -0
- package/vendor/pi-tui/src/layout-node.ts +52 -0
- package/vendor/pi-tui/src/layout.ts +411 -0
- package/vendor/pi-tui/src/native-modifiers.ts +60 -0
- package/vendor/pi-tui/src/native-module-path.ts +32 -0
- package/vendor/pi-tui/src/stdin-buffer.ts +445 -0
- package/vendor/pi-tui/src/terminal-colors.ts +74 -0
- package/vendor/pi-tui/src/terminal-image.ts +701 -0
- package/vendor/pi-tui/src/terminal.ts +554 -0
- package/vendor/pi-tui/src/tui-alt-screen.ts +1379 -0
- package/vendor/pi-tui/src/tui-main-screen.ts +655 -0
- package/vendor/pi-tui/src/tui.ts +1264 -0
- package/vendor/pi-tui/src/undo-stack.ts +29 -0
- package/vendor/pi-tui/src/utils.ts +1327 -0
- package/vendor/pi-tui/src/word-navigation.ts +118 -0
- package/vendor/pi-tui/test/test-themes.ts +39 -0
- package/vendor/pi-tui/test/virtual-terminal.ts +219 -0
- package/CHANGELOG.md +0 -527
- package/bin/rovecode.js +0 -24
- package/dist/cli/app-j6gn14w3.js +0 -2
- package/dist/cli/ask-user-cwstt8fz.js +0 -2
- package/dist/cli/auth-login-9bbp9915.js +0 -2
- package/dist/cli/auth-m8p9grty.js +0 -2
- package/dist/cli/bench-16zqdms5.js +0 -9
- package/dist/cli/catalog-1xchffa4.js +0 -2
- package/dist/cli/cli-1n1zb64f.js +0 -2
- package/dist/cli/client-2t9gjkck.js +0 -2
- package/dist/cli/commands-exafvm2b.js +0 -2
- package/dist/cli/connect-6zde0kn3.js +0 -2
- package/dist/cli/context-cmd-5t43wgqt.js +0 -2
- package/dist/cli/context-report-kt01pw8y.js +0 -2
- package/dist/cli/count-remote-ap7x3vh6.js +0 -2
- package/dist/cli/design-ne5zszyh.js +0 -2
- package/dist/cli/dispatch-2r5myxye.js +0 -2
- package/dist/cli/doctor-ws4fh4tn.js +0 -3
- package/dist/cli/executor-bdrjn634.js +0 -2
- package/dist/cli/export-1mxb9g5p.js +0 -2
- package/dist/cli/files-g104xghh.js +0 -2
- package/dist/cli/gauntlet-07xrjpj7.js +0 -2
- package/dist/cli/gauntlet-runner-xvy64436.js +0 -10
- package/dist/cli/gauntlet-wave3-jm91yt5w.js +0 -5
- package/dist/cli/gauntlet-wave4-r13py7p1.js +0 -14
- package/dist/cli/hashline-znvrat11.js +0 -2
- package/dist/cli/http-xafw6fsh.js +0 -143
- package/dist/cli/index-1sgjm25y.js +0 -2
- package/dist/cli/init-g2m0tn4m.js +0 -51
- package/dist/cli/install-avaqjjqq.js +0 -2
- package/dist/cli/loop-mmpfft01.js +0 -2
- package/dist/cli/main-0904f6ps.js +0 -5
- package/dist/cli/main-0ab9fc26.js +0 -9
- package/dist/cli/main-0jys2ccn.js +0 -3
- package/dist/cli/main-0mtcdbs7.js +0 -3
- package/dist/cli/main-0z1w2zsg.js +0 -3
- package/dist/cli/main-1dchs7xv.js +0 -18
- package/dist/cli/main-1ereejm1.js +0 -3
- package/dist/cli/main-1k1kw6b5.js +0 -3
- package/dist/cli/main-27y4sm2k.js +0 -38
- package/dist/cli/main-2wwjex5j.js +0 -58
- package/dist/cli/main-2yeveeve.js +0 -6
- package/dist/cli/main-2yfck9b5.js +0 -3
- package/dist/cli/main-2zmzgkwh.js +0 -3
- package/dist/cli/main-351pz3z7.js +0 -7
- package/dist/cli/main-3gjqfh7a.js +0 -6
- package/dist/cli/main-3nf3kgve.js +0 -3
- package/dist/cli/main-3pjrb2hd.js +0 -3
- package/dist/cli/main-3rxcvgna.js +0 -19
- package/dist/cli/main-4b3jgy66.js +0 -19
- package/dist/cli/main-4wndhjdc.js +0 -7
- package/dist/cli/main-4xcmvxnk.js +0 -3
- package/dist/cli/main-5tbz0wbz.js +0 -4
- package/dist/cli/main-5ywnwthm.js +0 -3
- package/dist/cli/main-6b62vkz0.js +0 -14
- package/dist/cli/main-6dnk69vp.js +0 -3
- package/dist/cli/main-6genrmhs.js +0 -136
- package/dist/cli/main-73g7eff4.js +0 -15
- package/dist/cli/main-7c5thhjd.js +0 -5
- package/dist/cli/main-7rn6bqje.js +0 -3
- package/dist/cli/main-80haw7qk.js +0 -4
- package/dist/cli/main-875s60s2.js +0 -4
- package/dist/cli/main-8kjxbpw4.js +0 -8
- package/dist/cli/main-90ds1z4e.js +0 -10
- package/dist/cli/main-9etavkew.js +0 -3
- package/dist/cli/main-a9njrkk1.js +0 -3
- package/dist/cli/main-aecrjq2d.js +0 -12
- package/dist/cli/main-ck9asesq.js +0 -9
- package/dist/cli/main-cta9racd.js +0 -4
- package/dist/cli/main-ddv7j2ag.js +0 -3
- package/dist/cli/main-dfreez27.js +0 -10
- package/dist/cli/main-f7rw7des.js +0 -3
- package/dist/cli/main-ggcn7rd7.js +0 -5
- package/dist/cli/main-gzkmycnv.js +0 -3
- package/dist/cli/main-hq51jg8v.js +0 -18
- package/dist/cli/main-jft389w9.js +0 -8
- package/dist/cli/main-k1eqkg83.js +0 -3
- package/dist/cli/main-k2y8a2aw.js +0 -9
- package/dist/cli/main-kcpbykxz.js +0 -4
- package/dist/cli/main-kd488vje.js +0 -22
- package/dist/cli/main-kh32yvgk.js +0 -5
- package/dist/cli/main-kqxnqjnv.js +0 -25
- package/dist/cli/main-kyn0xnsg.js +0 -3
- package/dist/cli/main-m1kk6fp5.js +0 -21
- package/dist/cli/main-mv40pcr2.js +0 -4
- package/dist/cli/main-n0t3973w.js +0 -3
- package/dist/cli/main-nqveez48.js +0 -4
- package/dist/cli/main-pknhvrmj.js +0 -3
- package/dist/cli/main-pn1w7a7j.js +0 -3
- package/dist/cli/main-prxxs70n.js +0 -4
- package/dist/cli/main-q3vsesf9.js +0 -3
- package/dist/cli/main-qsevpgsv.js +0 -3
- package/dist/cli/main-rdgdw24b.js +0 -25
- package/dist/cli/main-rfth4tbm.js +0 -16
- package/dist/cli/main-rg0wn0xf.js +0 -5
- package/dist/cli/main-sdmxhtv8.js +0 -4
- package/dist/cli/main-skbp13js.js +0 -18
- package/dist/cli/main-t4xnd213.js +0 -7
- package/dist/cli/main-vqak588n.js +0 -4
- package/dist/cli/main-w2n1303f.js +0 -9
- package/dist/cli/main-wbrdspr2.js +0 -5
- package/dist/cli/main-wsrg79c1.js +0 -7
- package/dist/cli/main-x4r0fne4.js +0 -5
- package/dist/cli/main-xea2f3tn.js +0 -6
- package/dist/cli/main-xg704a3c.js +0 -3
- package/dist/cli/main-xvnrabfp.js +0 -16
- package/dist/cli/main-xy53xf0r.js +0 -4
- package/dist/cli/main-y1fqy60y.js +0 -3
- package/dist/cli/main-yn8cd281.js +0 -34
- package/dist/cli/main-yr0ksc0h.js +0 -4
- package/dist/cli/main-z2ex2vyf.js +0 -4
- package/dist/cli/main-z3aayzvq.js +0 -3
- package/dist/cli/main-zaqh35jg.js +0 -3
- package/dist/cli/main-zc2e8e46.js +0 -4
- package/dist/cli/main-zzrfw6cf.js +0 -13
- package/dist/cli/main.js +0 -280
- package/dist/cli/market-cmd-e14kmx9n.js +0 -5
- package/dist/cli/mcp-login-wq7ktdek.js +0 -2
- package/dist/cli/mcp-market-cmd-9mg3jecy.js +0 -2
- package/dist/cli/notify-b7qc0cjb.js +0 -2
- package/dist/cli/oauth-z8whcgfx.js +0 -2
- package/dist/cli/output-b3ewj3ps.js +0 -16
- package/dist/cli/profiles-6mr5he5e.js +0 -2
- package/dist/cli/provider-config-g7j42q8x.js +0 -2
- package/dist/cli/provider-jr1y8vvm.js +0 -2
- package/dist/cli/registry-s8yk86g0.js +0 -2
- package/dist/cli/registry-t6p8d4mn.js +0 -2
- package/dist/cli/repl-bajwe1mh.js +0 -11
- package/dist/cli/resume-rwn9nz7y.js +0 -2
- package/dist/cli/run-flags-nah7ndpt.js +0 -2
- package/dist/cli/runtime-n7gafzhb.js +0 -2
- package/dist/cli/sandbox-config-emdy18x4.js +0 -2
- package/dist/cli/server-b0nvs2bn.js +0 -5
- package/dist/cli/session-arg-y75wd4kj.js +0 -2
- package/dist/cli/session-j62evmjq.js +0 -2
- package/dist/cli/sessions-cmd-tsnwz0ns.js +0 -7
- package/dist/cli/settings-df10wfez.js +0 -2
- package/dist/cli/setup-jzvv72fg.js +0 -2
- package/dist/cli/sextant-smoke-37m81ke6.js +0 -5
- package/dist/cli/skills-cmd-gjxnxnhx.js +0 -2
- package/dist/cli/smoke-p7748apt.js +0 -8
- package/dist/cli/start-chat-s4st3mm0.js +0 -12
- package/dist/cli/stream-gmeyewds.js +0 -2
- package/dist/cli/task-gh0kkp3n.js +0 -2
- package/dist/cli/tasks-z1kfpe8e.js +0 -2
- package/dist/cli/thinking-0eqkrz6t.js +0 -2
- package/dist/cli/todo-5brcrt9m.js +0 -2
- package/dist/cli/tools-7pzm0vj9.js +0 -2
- package/dist/cli/tools-s635p6s8.js +0 -2
- package/dist/cli/trust-cmd-cjav8zgm.js +0 -2
- package/dist/cli/update-check-pt31bm2f.js +0 -2
- package/dist/cli/update-cmd-tk131s9t.js +0 -2
- package/dist/cli/voice-56nabd8d.js +0 -2
- package/dist/cli/webfetch-xd8q596m.js +0 -2
- package/dist/cli/websearch-5hkf98k1.js +0 -2
- package/dist/cli/workflow-cmd-cy3cvzjp.js +0 -4
- package/dist/cli/workspace-q10g5z3e.js +0 -2
- package/dist/lib/index.js +0 -62
- package/dist/lib/models-index.json +0 -1
- package/dist/lib/plugins.js +0 -55
- package/dist/lib/providers.js +0 -17
- package/dist/lib/public-api.js +0 -20
- package/dist/lib/sdk.js +0 -360
- /package/{dist/cli → src/providers}/models-index.json +0 -0
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{A as wZ,E as u4,H as b8,y as N4,z as mZ}from"./main-hq51jg8v.js";import{J as p7,K as J9,Q as Q9,R as X9}from"./main-2wwjex5j.js";import{T as d0,W as c0,Y as X8}from"./main-yr0ksc0h.js";import{$ as p0,_ as l0,aa as x0,ba as i0,ca as a0,ea as n0,ha as Q8}from"./main-xy53xf0r.js";import{ia as g0,ka as u0,la as m0,qa as J8}from"./main-7c5thhjd.js";import{ra as KZ,sa as t0,ta as e0,ua as Z4,va as GZ}from"./main-zc2e8e46.js";import{wa as t}from"./main-4xcmvxnk.js";import{Aa as I0,Ca as N0,Da as A0}from"./main-wbrdspr2.js";import{$a as OZ,Ga as S7,Ha as v4,Ia as g4,Ja as C7,Ka as k7,La as c4,Ma as o4,Na as f7,Oa as w7,Pa as h7,Qa as s4,Ra as r4,Sa as T4,Wa as v7,Xa as M4,Ya as g7,Za as b4,_a as u7,ab as m7,bb as l7,cb as hZ}from"./main-27y4sm2k.js";import{fc as lZ,gc as t4,hc as iZ,jc as J7,kc as Q7,lc as X7,mc as e4}from"./main-1ereejm1.js";import{Cc as v0,Ec as SZ,Fc as $8}from"./main-vqak588n.js";import{$c as h4,Nc as _7,Oc as T7,Pc as UZ,Qc as n4,Rc as d4,Uc as M7,Xc as b7,Yc as w4,Zc as y7}from"./main-aecrjq2d.js";import{ld as D7,md as V4,nd as K4,pd as R7}from"./main-6genrmhs.js";import{Sd as f0,Td as w0,Vd as h0,Wd as Z8}from"./main-pn1w7a7j.js";import{Me as FZ,Ne as A7,Oe as k4,Te as f4}from"./main-rdgdw24b.js";import{gf as I7,lf as rZ,mf as N7,nf as $9}from"./main-dfreez27.js";import{tf as E7}from"./main-4b3jgy66.js";import{jg as r,mg as C4,og as XZ,sg as W0}from"./main-t4xnd213.js";import{Hg as U0,Ig as D0,Kg as E0}from"./main-cta9racd.js";import{qh as sZ,th as y4,uh as S4}from"./main-y1fqy60y.js";import{zh as L4}from"./main-2yfck9b5.js";import{Th as Z9,Uh as n}from"./main-0z1w2zsg.js";import{Zh as z7,_h as H7}from"./main-ddv7j2ag.js";import{Ei as U7}from"./main-k2y8a2aw.js";import{Xi as P0,cj as S}from"./main-sdmxhtv8.js";import{rj as L7}from"./main-1k1kw6b5.js";import{$j as BZ,ck as L0}from"./main-xg704a3c.js";import{kk as m,lk as G7,ok as O4,pk as P4,qk as cZ,rk as j7,sk as LZ,uk as TZ}from"./main-8kjxbpw4.js";import{hl as q7,kl as O7,ll as P7,ml as i4,ol as a4}from"./main-3rxcvgna.js";import{Bl as M8,El as $7,Jl as qZ,Ll as W7,Ml as x4,sl as E4,ul as I4}from"./main-4wndhjdc.js";import{dm as fZ,fm as H4,gm as W4,im as oZ,jm as jZ,lm as F7,mm as F4}from"./main-prxxs70n.js";import{nm as WZ,om as K7,pm as _4}from"./main-n0t3973w.js";import{Dm as k0,Fm as e7}from"./main-7rn6bqje.js";import{$m as e,Lm as w,Um as YZ,Wm as O0}from"./main-2yeveeve.js";import{pn as r0,tn as G8}from"./main-nqveez48.js";import{un as DZ,vn as gZ,wn as uZ,xn as V7}from"./main-qsevpgsv.js";var l4={};gZ(l4,{todoLabel:()=>g8,groupedHelp:()=>m4,cmdTodos:()=>v8,cmdTasks:()=>u8,cmdStatus:()=>C8,cmdSkills:()=>f8,cmdMemory:()=>w8,cmdHelp:()=>S8,cmdExport:()=>h8,cmdCost:()=>k8,HELP_GROUP_ORDER:()=>vZ});import{join as y8}from"path";function S8(Z){Z.renderer.addSystemNote(m4(Z.commands.builtin)+w4(Z.commands.custom))}function m4(Z){let Q=new Map;for(let Y of Z){let $=Y.group!==void 0&&vZ.includes(Y.group)?Y.group:"more",X=Q.get($)??[];X.push(Y),Q.set($,X)}return[...vZ,"more"].filter((Y)=>Q.has(Y)).map((Y)=>`${Y}
|
|
3
|
-
`+Q.get(Y).map(($)=>` /${$.name} \u2014 ${$.description}`).join(`
|
|
4
|
-
`)).join(`
|
|
5
|
-
`)}function C8(Z){let Q=Z.rt.projectContext,J=Q.sources.map(($)=>$.chars===0?`${$.path} (dropped)`:$.truncated?`${$.path} (truncated)`:$.path);if(Q.skippedFiles>0)J.push(`+${Q.skippedFiles} skipped (file cap)`);let Y=Z.state;Z.renderer.addSystemNote(`provider=${Y.provider} model=${Y.model} turns=${Y.turns} tokens=${Y.tokensIn}in/${Y.tokensOut}out
|
|
6
|
-
sandbox: ${y4(Z.rt.sandbox)}
|
|
7
|
-
config: ${J.length>0?J.join(", "):"(none)"}`)}function k8(Z,Q){if(Q==="refresh"){Z.catalog.refresh().then((J)=>Z.renderer.addSystemNote(J?"model catalog refreshed from models.dev":"catalog refresh failed \u2014 using the offline snapshot",J?"info":"warn"));return}Z.renderer.addSystemNote(mZ(Z.store().messages(),Z.catalog,{provider:Z.state.provider,model:Z.state.model}))}function f8(Z){let Q=Z.rt.skillStore.list().map((J)=>`${J.name} \u2014 ${J.description}`);Z.renderer.addSystemNote(Q.length?Q.join(`
|
|
8
|
-
`):"(no skills installed)")}function w8(Z,Q=""){let J=v4(Z.blocks(),Q);Z.renderer.addSystemNote(J.text,J.tone)}function h8(Z,Q){try{let J=Q.split(/\s+/).filter(Boolean),Y=u4(Z.sessionsDir,Z.store().id,{json:J.includes("--json"),force:J.includes("--force"),out:J.filter(($)=>!$.startsWith("-")).join(" ")||void 0,cwd:Z.rt.cwd});Z.renderer.addSystemNote(`exported ${Y.format} \u2192 ${Y.path}`)}catch(J){Z.renderer.addSystemNote(J instanceof Error?J.message:String(J),"error")}}function v8(Z){let{items:Q,note:J}=r(y8(Z.sessionsDir,Z.store().id));if(J)Z.renderer.addSystemNote(J,"warn");Z.renderer.addSystemNote(Q.length>0?C4(Q):"(no todos \u2014 the agent maintains the list with todo_write)")}function g8(Z){return XZ(r(Z).items)||void 0}function u8(Z,Q){let J=Q.split(/\s+/).filter(Boolean),Y=Z.rt.tasks;if(J.length===0){Z.renderer.addSystemNote(k4(Y.list()));return}if(J[0]!=="cancel"||J.length!==2){Z.renderer.addSystemNote("usage: /tasks [cancel <id>|cancel all]","warn");return}let $=J[1];if($==="all"){let V=Y.cancelAll();Z.renderer.addSystemNote(V===0?"no queued or running tasks to cancel":`cancelling ${V} task${V===1?"":"s"}`);return}let X=Y.status($);if(!X){Z.renderer.addSystemNote(`unknown task '${$}' \u2014 list with /tasks`,"warn");return}if(FZ(X.status)){Z.renderer.addSystemNote(`task ${$} already ${X.status}`);return}Y.cancel($),Z.renderer.addSystemNote(`cancelling task ${$} (${X.label})`)}var vZ;var p4=uZ(()=>{b8();S4();f4();W0();h4();g4();wZ();vZ=["start here","session","model & provider","modes & safety","files & history","info"]});var Z7={};gZ(Z7,{usageOf:()=>p8,resolveBootSession:()=>x8,replayTranscript:()=>l8,cmdSessions:()=>pZ,cmdRewind:()=>i8,cmdNew:()=>a8});import{randomUUID as m8}from"crypto";function l8(Z,Q){Z.clearTranscript();for(let J of Q.path()){if(!("role"in J)){let $=s4(J);if($!==null)Z.addSystemNote($);continue}let Y=i4(J.parts);if(J.role==="user"&&c4(Z,Y))continue;if(J.role==="user"){let $=OZ(Y,J.parts);if($)Z.addUser($)}else if(J.role==="assistant"){if(Y){let $=Z.beginAssistant();$.append(Y),$.done()}for(let $ of J.parts)if($.kind==="tool_call")Z.toolStart($.id,$.tool,JSON.stringify($.args).slice(0,120))}else if(J.role==="tool"){for(let $ of J.parts)if($.kind==="tool_result")Z.toolEnd($.callId,$.ok,$.output.slice(0,160).replace(/\n/g," \u23CE "),0)}else if(J.role==="system"&&Y)Z.addSystemNote(n4(J,Y))}}function p8(Z){let Q=0,J=0;for(let Y of Z.messages())Q+=Y.usage?.input??0,J+=Y.usage?.output??0;return{tokensIn:Q,tokensOut:J}}function x8(Z,Q){if(Q===void 0)return{id:Q};let J=lZ(qZ(Z,{includeHollow:!0}),Q);if(J.length===1)return{id:J[0].id};if(J.length>1)return{id:void 0,warn:`"${Q}" matches ${J.length} sessions \u2014 started fresh; use /resume to pick one`};return{id:Q}}async function i8(Z){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let Q=Z.store().turnPoints();if(Q.length===0){Z.renderer.addSystemNote("nothing to rewind \u2014 no turns yet");return}let J=[...Q].reverse().map((X)=>({value:X.entryId,label:`#${X.index} ${X.text}`,description:X.branches>0?`\u25C6 ${X.branches} other branch${X.branches>1?"es":""}`:void 0})),Y=await Z.renderer.pickOne(J,"rewind to a turn (Enter = edit & resubmit, Esc = cancel)");if(!Y){Z.replayHistory();return}let $=Q.find((X)=>X.entryId===Y);if(!$)return;if($.parentId===null)Z.switchSession(m8(),!1),Z.renderer.addSystemNote("rewound to the start \u2014 fresh session, previous one kept");else{if(!Z.store().branch($.parentId)){Z.renderer.addSystemNote("rewind failed: turn not found","error");return}Z.replayHistory(),Z.renderer.addSystemNote(`rewound to before turn #${$.index} \u2014 edit and resubmit (branch kept)`)}Z.renderer.prefillEditor($.fullText),Z.pushStatus()}async function pZ(Z,Q){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let J=qZ(Z.sessionsDir);if(Q){let X=lZ(qZ(Z.sessionsDir,{includeHollow:!0}),Q);if(X.length===1)Z.switchSession(X[0].id);else if(X.length>1)Z.renderer.addSystemNote(t4(Q,X),"warn");else Z.renderer.addSystemNote(`no session matching "${Q}"`,"warn");return}let Y=J.slice(0,20).map((X)=>({value:X.id,label:X.title??(X.preview||"(empty session)"),description:`${new Date(X.updatedAt).toLocaleString()} \xB7 ${X.entryCount} entries \xB7 ${X.id.slice(0,8)}${X.id===Z.store().id?" \xB7 current":""}`}));if(Y.length===0){Z.renderer.addSystemNote("no sessions found");return}let $=await Z.renderer.pickOne(Y,"resume a session (Esc = cancel)");if($&&$!==Z.store().id)Z.switchSession($);else if(!$)Z.replayHistory()}function a8(Z){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let Q=Z.store();if(Q.branch(Q.messages()[0]?.id??""))Z.replayHistory(),Z.refreshUsage(),Z.pushStatus(),Z.renderer.addSystemNote("branched to session start");else Z.renderer.addSystemNote("nothing to branch \u2014 no turns yet")}var xZ=uZ(()=>{a4();x4();e4();hZ();d4();r4();o4()});var Y7={};gZ(Y7,{cmdSessionsVerb:()=>o8});import{randomUUID as n8}from"crypto";async function o8(Z,Q){let[J,...Y]=Q.split(/\s+/).filter(Boolean);if(J===void 0)return pZ(Z);if(Z.busy()){Z.renderer.addSystemNote(d8,"warn");return}switch(J){case"rename":return s8(Z,Y.join(" "));case"delete":return r8(Z,Y[0]);case"fork":return t8(Z,Y[0]);case"search":return e8(Z,Y.join(" "));default:Z.renderer.addSystemNote(`unknown /sessions verb "${J}" \u2014 ${c8}`,"warn")}}function s8(Z,Q){let J=$7(Q);if(J===void 0){Z.renderer.addSystemNote("usage: /sessions rename <title\u2026>","warn");return}let Y=Z.store();Y.patchMeta({title:J}),Z.renderer.addSystemNote(`session ${Y.id.slice(0,8)} titled "${J}"`)}async function r8(Z,Q){if(Q===void 0){Z.renderer.addSystemNote("usage: /sessions delete <id|prefix>","warn");return}let J=iZ(Z.sessionsDir,Q);if(!J.ok){Z.renderer.addSystemNote(J.error,"warn");return}let Y=J.summary,$=J.id===Z.store().id,X=Y.title??(Y.preview||"(empty session)");if(await Z.renderer.askApproval("sessions delete",`${Y.id.slice(0,8)} \xB7 ${X} \xB7 ${Y.entryCount} entries${$?" \xB7 the current session":""}`,"removes the session directory (entries, meta, attachments, todos) and its checkpoints shadow repo \u2014 not undoable")==="deny"){Z.renderer.addSystemNote("delete cancelled \u2014 nothing removed","warn");return}if($)Z.switchSession(n8(),!1),Z.renderer.addSystemNote("deleting the active session \u2014 switched to a fresh one first");let{removed:G}=Q7(Z.cwd,Z.sessionsDir,J.id);Z.renderer.addSystemNote(`deleted session ${J.id.slice(0,8)} (${G.length} path${G.length===1?"":"s"} removed)`)}function t8(Z,Q){let J=iZ(Z.sessionsDir,Q??Z.store().id);if(!J.ok){Z.renderer.addSystemNote(J.error,"warn");return}let Y;try{Y=J7(Z.sessionsDir,J.summary)}catch($){Z.renderer.addSystemNote($ instanceof Error?$.message:String($),"warn");return}Z.switchSession(Y.id),Z.renderer.addSystemNote(`forked ${Y.from.slice(0,8)} \u2192 ${Y.id.slice(0,8)} "${Y.title}"`)}async function e8(Z,Q){let J=Q.trim();if(J===""){Z.renderer.addSystemNote("usage: /sessions search <terms\u2026>","warn");return}let Y=X7(Z.sessionsDir,J,10);if(Y.length===0){Z.renderer.addSystemNote(`no matches for "${J}"`);return}let $=Z.store().id,X=Y.map((K,I)=>({value:String(I),label:K.preview||K.title||"(empty session)",description:`${K.title!==void 0?`${K.title} \xB7 `:""}${K.sessionId.slice(0,8)}${K.sessionId===$?" \xB7 current":""} \xB7 ${new Date(K.timestamp).toLocaleString()}`})),V=await Z.renderer.pickOne(X,"search hits (Enter = resume, Esc = cancel)");if(V===null){Z.replayHistory();return}let G=Y[Number(V)];if(G===void 0)return;if(G.sessionId===$){Z.renderer.addSystemNote("that hit is in the current session");return}Z.switchSession(G.sessionId)}var d8="finish or interrupt the run first (Esc)",c8="/sessions rename <title\u2026> | delete <id|prefix> | fork [<id|prefix>] | search <terms\u2026>";var B7=uZ(()=>{e4();xZ()});a4();S4();x4();g4();o4();L0();$9();f4();d4();var s7=["files","conversation","both"];async function z0(Z){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let Q=await Z.checkpointsFor(Z.sessionId());if(!Q){Z.renderer.addSystemNote("checkpoints unavailable (git missing or ROVECODE_NO_CHECKPOINTS=1)","warn");return}let J=Q.list();if(J.length===0){Z.renderer.addSystemNote("no checkpoints yet \u2014 snapshots land after each mutating tool call");return}let Y=[...J].reverse().slice(0,20).map((X,V)=>({value:X.hash,label:`#${J.length-V} ${X.label} \xB7 ${X.hash.slice(0,8)}`,description:`${new Date(X.createdAt).toLocaleString()}${X.entryId?" \xB7 conversation anchor":""}`})),$=await Z.renderer.pickOne(Y,"checkpoints (Enter = show restore hint, Esc = close)");if(Z.replayAndRefresh(),$)Z.renderer.addSystemNote(`restore with: /restore ${$.slice(0,8)} [files|conversation|both]`)}async function H0(Z,Q){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let[J,Y]=Q.split(/\s+/);if(!J){Z.renderer.addSystemNote("usage: /restore <checkpoint> [files|conversation|both] \u2014 list with /checkpoints","warn");return}let $=Y||"files";if(!s7.includes($)){Z.renderer.addSystemNote(`unknown restore mode "${Y}" (files|conversation|both)`,"warn");return}let X=await Z.checkpointsFor(Z.sessionId());if(!X){Z.renderer.addSystemNote("checkpoints unavailable (git missing or ROVECODE_NO_CHECKPOINTS=1)","warn");return}let V=[...new Map(X.list().filter((z)=>z.hash.startsWith(J)).map((z)=>[z.hash,z])).values()];if(V.length!==1){Z.renderer.addSystemNote(V.length===0?`no checkpoint matching "${J}"`:`"${J}" matches ${V.length} checkpoints \u2014 be more specific`,"warn");return}let G=await X.restore(V[0].hash,$);if(!G.ok){Z.renderer.addSystemNote(`restore failed: ${G.error}`,"error");return}let K="";if($==="conversation"||$==="both")if(G.entryId&&Z.branchTo(G.entryId))Z.replayAndRefresh(),K=" \xB7 conversation branched to the checkpoint's turn";else K=" \xB7 conversation anchor unavailable in this session tree (files unaffected by that)";let I=$==="conversation"?"":"workspace rolled back";Z.renderer.addSystemNote(`restored ${G.checkpoint.hash.slice(0,8)} (${$}) \u2014 ${I}${K}; snapshots keep history`)}W0();function F0(Z){return XZ(r(Z).items)||void 0}hZ();e();TZ();L0();function r7(Z){if(Z===void 0)return"";return Z>=1e6?`${(Z/1e6).toFixed(1)}M ctx`:Z>=1000?`${Math.round(Z/1000)}k ctx`:`${Z} ctx`}function t7(Z){if(Z?.inputPerMTok===void 0&&Z?.outputPerMTok===void 0)return"";let Q=(J)=>J===void 0?"?":`$${J}`;return`${Q(Z?.inputPerMTok)}/${Q(Z?.outputPerMTok)}`}function q0(Z){if(Z===void 0)return"";return[r7(Z.contextWindow),t7(Z.pricing),Z.supportsReasoning?"reasoning":"",Z.supportsTools===!1?"no tools":""].filter(Boolean).join(" \xB7 ")}var VZ={name:"model",description:"Switch the model I use: /model <provider/model | model> [--save]",group:"model & provider"};async function R0(Z){let Q=Z.list().filter(S).map((Y)=>Y.id);return(await Promise.all(Q.map(async(Y)=>({id:Y,r:await Z.models(Y,{background:!0})})))).flatMap(({id:Y,r:$})=>$.ok?$.models.map((X)=>`${Y}/${X}`):[])}var _0={name:"connect",description:"Connect a model: /connect (guided, same as /setup) \xB7 /connect <id> [<url>] [--model <id>] [--key-env NAME] [--no-key] [--project] [--no-test]",group:"start here"},T0=[{name:"models",description:"Pick a model from a list: /models [provider] [--save]",group:"model & provider"},{name:"provider",description:"Endpoints I can talk to: /provider list \xB7 add <id> <url> [--protocol \u2026] [--key-env \u2026] [--model \u2026] [--no-key] [--project] \xB7 remove <id> \xB7 use <provider/model> \xB7 test <id> [model] \xB7 key <id> <secret>",group:"model & provider"}],M0="Done. Tell me what you want done \u2014 try: explain this repo",f=!1,D=(Z,Q,J)=>{Z.renderer.addSystemNote(Q,J)};function ZZ(Z,Q){Z.modes.setModel({provider:Q.provider,model:Q.model});let J=Z.modes.modelFor();Z.state.model=J.model,Z.state.provider=J.provider,Z.pushStatus()}function MZ(Z,Q){let J=Q.split(/\s+/).filter((z)=>z.length>0),Y=J.includes("--save"),$=J.filter((z)=>z!=="--save").join(" ");if($.length===0)return bZ(Z,Y?"--save":"");let X=Z.rt.providers.resolveSelector($,Z.state.provider);if("error"in X){D(Z,`${X.error} \u2014 add one with /provider add <id> <baseUrl>`,"warn");return}let V=X.provider!==Z.state.provider;ZZ(Z,X);let G="";if(Y){f=!0;try{let z=Z.rt.providers.setDefault(`${X.provider}/${X.model}`);G="error"in z?` (not saved: ${z.error})`:" (saved as default)"}finally{f=!1}}let K=Z.rt.providers.get(X.provider),I=K!==void 0&&!S(K)?`
|
|
9
|
-
${Z.rt.providers.keyHint(K)}`:"";D(Z,`model \u2192 ${V?`${X.provider}/`:""}${X.model}${G}${Z.modes.separate?` (${Z.modes.mode} mode)`:""}${I}`,I.length>0?"warn":void 0)}async function bZ(Z,Q){let J=Q.split(/\s+/).filter((U)=>U.length>0),Y=J.includes("--save"),$=J.filter((U)=>!U.startsWith("-"))[0],X=Z.rt.providers,V=$!==void 0?[$]:X.list().filter(S).map((U)=>U.id);if(V.length===0){D(Z,`no provider is configured yet. ${m("/connect")}`,"warn");return}D(Z,V.length===1?`fetching ${V[0]} models\u2026`:`fetching models from ${V.length} providers\u2026`);let G=await Promise.all(V.map(async(U)=>({id:U,r:await X.models(U,{background:!0})}))),K=[],I=[],z=Z.catalog??new BZ,E=(U,O)=>{let h=Z.state.provider===U&&Z.state.model===O,W=[h?"current":"",q0(z.lookup(U,O))].filter(Boolean).join(" \xB7 ");return{value:`${U}/${O}`,label:`${h?"* ":" "}${U}/${O}`,...W?{description:W}:{}}};for(let{id:U,r:O}of G){if(!O.ok){I.push(`${U}: ${O.error}`);continue}if(O.models.length===0){I.push(`${U}: the endpoint listed no models (no /models route?) \u2014 /model ${U}/<model> still works`);continue}for(let h of O.models)K.push(E(U,h))}for(let U of I)D(Z,U,"warn");let H=`${Z.state.provider}/${Z.state.model}`;if(Z.state.model&&V.includes(Z.state.provider)&&!K.some((U)=>U.value===H))K.unshift(E(Z.state.provider,Z.state.model));if(K.length===0)return;K.sort((U,O)=>Number(O.label.startsWith("*"))-Number(U.label.startsWith("*")));let A=await Z.renderer.pickOne(K,`pick a model \xB7 ${K.length} from ${V.length} provider${V.length===1?"":"s"}`);if(A===null||!Y&&A===`${Z.state.provider}/${Z.state.model}`)return;MZ(Z,Y?`${A} --save`:A)}async function b0(Z,Q){let J=Q.split(/\s+/).filter((V)=>V.length>0),[Y,...$]=J,X=Z.rt.providers;switch(Y){case void 0:case"list":D(Z,E0(X,{all:$.includes("--all")}));return;case"add":{let V=D0($);if("error"in V){D(Z,V.error,"warn");return}let G=X.add(V.spec,V.scope);if("error"in G){D(Z,G.error,"warn");return}let K=S(G)?"":`
|
|
10
|
-
key: /provider key ${G.id} <secret> \xB7 or set ${G.keyEnv} (live, no restart)`;D(Z,`added ${G.id} (${G.protocol}, ${G.baseUrl}) [${V.scope}]${K}
|
|
11
|
-
use it: /model ${G.id}/${G.defaultModel??"<model>"}`);return}case"remove":{if($[0]===void 0)break;let V=X.remove($[0]);if("error"in V){D(Z,V.error,"warn");return}D(Z,V.removed.length>0?`removed ${$[0]} (${V.removed.join(", ")} providers.json)`:`${$[0]} was not in any providers.json`);return}case"use":{if($[0]===void 0)break;f=!0;let V;try{V=X.setDefault($[0])}finally{f=!1}if("error"in V){D(Z,V.error,"warn");return}ZZ(Z,V);let G=X.get(V.provider),K=G!==void 0&&!S(G)?`
|
|
12
|
-
${X.keyHint(G)}`:"";D(Z,`default \u2192 ${V.provider}/${V.model} (saved; this session switched)${K}`,K.length>0?"warn":void 0);return}case"test":{if($[0]===void 0)break;D(Z,`testing ${$[0]}${$[1]!==void 0?`/${$[1]}`:""}\u2026`);let V=await X.probe($[0],$[1]);D(Z,`${$[0]}/${V.model}: ${V.detail}`,V.ok?void 0:"warn");return}case"key":{let[V,G]=$;if(V===void 0||G===void 0)break;let K=X.get(V);if(K===void 0){D(Z,`unknown provider "${V}" \u2014 /provider add ${V} <baseUrl> first`,"warn");return}YZ(V,G,K.keyEnv),X.refresh(),D(Z,`stored ${K.keyEnv} for ${V} (${O0(G)}) \u2014 live now`);return}default:break}D(Z,`usage: /provider list [--all] \xB7 /provider ${U0} \xB7 remove <id> \xB7 use <provider/model> \xB7 test <id> [model] \xB7 key <id> <secret>`,"warn")}var l=null;async function yZ(Z){let Q=Z.rt.providers;l?.(),l=null;let J=t.map((z)=>({value:z.key,label:z.label})),Y=await Z.renderer.pickOne(J,"\u25C6 connect a model \u2014 which provider? (Esc = cancel)");if(Y===null){D(Z,"setup cancelled \u2014 nothing changed. /setup whenever you like");return}let $=t.find((z)=>z.key===Y);if($===void 0)return;let X=async(z)=>{return(await Z.renderer.askQuestion({question:z,options:[],allowFreeText:!0}).catch(()=>null))?.text?.trim()??null},V;if($.url!==void 0){let z=(await X("Short name for it? (letters, digits, - _ .)")??"").toLowerCase();if(!P0.test(z)){D(Z,`setup stopped \u2014 "${z}" won't work as an id. ${m("/setup, and pick a name like myproxy")}`,"warn");return}let E=await X(`Base URL for ${z}? (e.g. https://host/v1)`)??"";if(!/^https?:\/\//.test(E)){D(Z,`setup stopped \u2014 "${E}" is not an http(s) URL. ${m("/setup")}`,"warn");return}let A=(await Z.renderer.askQuestion({question:"Does it need an API key?",options:["yes","no \u2014 it is a local server"],allowFreeText:!1}).catch(()=>null))?.choice===1,U=Q.add({id:z,baseUrl:E,protocol:$.url,...A?{noKey:!0}:{}},"user");if("error"in U){D(Z,`setup stopped \u2014 ${U.error}`,"warn");return}V=z,D(Z,`\u25C6 ${V} registered (${$.url} protocol, ${E}).`)}else{V=$.id??"";let z=Q.get(V);if(z===void 0){D(Z,`setup stopped \u2014 ${V} is missing from the built-in table`,"warn");return}if($.local===!0&&z.noKey!==!0){let E=Q.add({id:V,baseUrl:z.baseUrl,protocol:z.protocol,noKey:!0,...z.defaultModel!==void 0?{defaultModel:z.defaultModel}:{}},"user");if("error"in E){D(Z,`setup stopped \u2014 ${E.error}`,"warn");return}D(Z,`\u25C6 ${V} marked as a local server (${z.baseUrl}, no key).`)}}let G=Q.get(V);if(G===void 0)return;let K=G.defaultModel;if(K===void 0){let z=await Z.renderer.askQuestion({question:`Which model id on ${V}?`,options:[],allowFreeText:!0}).catch(()=>null);if(K=z?.text?.trim()||z?.label,K===void 0||K.length===0){D(Z,`\u25C6 ${V} is set up but has no model yet. ${m(`/models ${V}, then /model ${V}/<model> --save`)}`);return}}else D(Z,`\u25C6 model \u2192 ${V}/${K} (change it any time: /model ${V}/<other> --save)`);let I=async()=>{D(Z,`\u25C6 testing ${V}/${K} \u2026`);let z=await Q.probe(V,K);if(z.ok)D(Z,` ${z.detail}`);else D(Z,` that didn't work: ${z.detail}
|
|
13
|
-
${m(`check the key and the URL, then /provider test ${V} ${K}`)}`,"warn");f=!0;let E;try{E=Q.setDefault(`${V}/${K}`,"user")}finally{f=!1}if("error"in E){D(Z,` ${E.error}`,"warn");return}ZZ(Z,E),D(Z,`\u25C6 default \u2192 ${E.provider}/${E.model} \u2014 this session switched too.
|
|
14
|
-
${M0}`)};if(S(G)){await I();return}D(Z,[`\u25C6 I need the key for ${V}. Paste it hidden in another terminal:`,` rovecode auth set ${V}`,` or here (this line only, redacted in the note): /provider key ${V} <secret>`,` or set ${G.keyEnv} in your environment.`," I'll notice as soon as it lands and finish the setup."].join(`
|
|
15
|
-
`)),y0(Q,V,I)}function y0(Z,Q,J){let Y=setInterval(()=>{Z.snapshot()},1000);Y.unref?.();let $=Z.onChange(()=>{let V=Z.get(Q);if(V===void 0||!S(V))return;X(),J()}),X=()=>{if(clearInterval(Y),$(),l===X)l=null};l=X}async function S0(Z,Q){let J=Q.split(/\s+/).filter((G)=>G.length>0);if(J.length===0){await yZ(Z);return}let Y=N0(J);if("error"in Y){D(Z,`${Y.error.replace("usage: rovecode connect","usage: /connect")}`,"warn");return}if(Y.key==="prompt"||Y.key==="stdin"){D(Z,`there is no hidden prompt in here \u2014 a key on this line would sit in the transcript.
|
|
16
|
-
${m(`rovecode auth set ${Y.id} in another terminal, or /provider key ${Y.id} <secret>`)}`,"warn");return}let $=Z.rt.providers;l?.(),l=null;let X=(G)=>{if(G===I0||G===2)return;let K=$.defaultRef();if(K!==null&&K.provider===Y.id&&K.model.length>0)ZZ(Z,K)},V=async()=>{f=!0;try{return await A0(Y,{registry:$,tty:!1,out:(G)=>D(Z,G),done:M0,where:"tui",deferKey:(G)=>{D(Z,[`\u25C6 I need the key for ${Y.id}. Paste it hidden in another terminal:`,` rovecode auth set ${Y.id}`,` or here (this line only, redacted in the note): /provider key ${Y.id} <secret>`,` or set ${G.keyEnv} in your environment.`," I'll notice as soon as it lands and finish the job."].join(`
|
|
17
|
-
`)),y0($,Y.id,async()=>{X(await V())})}})}finally{f=!1}};X(await V())}function C0(Z){let Q=Z.rt.providers.defaultSelector(),J=Z.rt.noProviderReason()===null;return Z.rt.providers.onChange(()=>{let Y=Z.rt.providers.defaultSelector();if(Y!==Q){Q=Y;let X=Z.rt.providers.defaultRef();if(X!==null&&X.model.length>0&&!f)ZZ(Z,X),D(Z,`default model changed \u2192 ${X.provider}/${X.model}`)}let $=Z.rt.noProviderReason()===null;if($&&!J)D(Z,"provider configured \u2014 ready for the next prompt");J=$})}$8();Q8();e7();Z8();J8();X8();e();var Y8=["search","info","add","remove","list","show","trust","untrust"],o0={name:"mcp",choices:Y8,choicesThen:"complete",description:"Find and install an MCP server: /mcp [query] [--project] \u2014 the curated shelf, then the registry \xB7 /mcp trust approves this repo's MCP files",group:"modes & safety"};async function B8(Z,Q){let J=h0(Z.cwd);if(J.length===0){Z.renderer.addSystemNote("mcp: no project MCP files here (.rovecode/mcp.json, .mcp.json)");return}let Y=new Proxy({},{get:()=>"set"});for(let $ of J){if(f0(Q,$)==="trusted"){Z.renderer.addSystemNote(`mcp: ${$} is already trusted as it is now`);continue}let X=[],V=k0($,X,Y).map(n0).concat(X.map((I)=>`! ${I}`));if(await Z.renderer.askApproval("mcp trust",$,V.join(`
|
|
18
|
-
`)||"(no servers in it)")==="deny"){Z.renderer.addSystemNote(`mcp: ${$} stays untrusted \u2014 nothing in it loads`);continue}let K=w0(Q,$);Z.renderer.addSystemNote(K.ok?`mcp: trusted ${$} \u2014 restart me to connect; an edit asks again`:`mcp: ${K.reason}`,K.ok?"info":"warn")}}var V8=(Z,Q)=>Z.length>Q?Z.slice(0,Q-1)+"\u2026":Z;function K8(Z){let Q=Z.source==="curated"?"curated":`registry \xB7 ${Z.publisher??"?"}`;return{value:Z.key,label:Z.title??Z.key,description:`${Q}${Z.status?` \xB7 ${Z.status}`:""} \xB7 ${V8(Z.description,60)}`}}async function s0(Z,Q){let{renderer:J}=Z,Y=Q.split(/\s+/).filter(Boolean),$=Y.includes("--project")?"project":"user",X=Y.filter((N)=>!N.startsWith("--")).join(" "),V=Z.home??w();if(Y[0]==="trust"){await B8(Z,V);return}let G={home:V,...Z.market},K=await v0(X,G);for(let N of K.notes)J.addSystemNote(`mcp: ${N}`,"warn");if(K.entries.length===0){J.addSystemNote(`mcp: nothing matches "${X}" \u2014 the registry matches on the server's name`,"warn");return}let I=await J.pickOne(K.entries.map(K8),X?`mcp market \xB7 ${X}`:"mcp market");if(I===null)return;let z=K.entries.find((N)=>N.key===I);if(!z)return;let E=0;if(z.installs.length>1){let N=await J.pickOne(z.installs.map((c,R)=>({value:String(R),label:c.kind==="stdio"?`run ${SZ(c)}`:`connect ${c.url}`})),`${z.title??z.key} \xB7 how`);if(N===null)return;E=Number(N)}let H=z.installs[E],A=H!==void 0?g0(H):void 0,U=!1;if(A!==void 0&&$==="user"){let N=await J.pickOne([{value:"local",label:"install once \u2014 node starts it in ~0.4 s",description:`runs npm install now: ${A.spec}'s code lands under ~/.rovecode/mcp (typically 20\u201330 MB, one time); no network needed to start`},{value:"npx",label:"run through npx at every start \u2014 as today",description:"~2 s per start, re-resolves the package and asks the npm registry each time; nothing installed now"}],`${z.title??z.key} \xB7 how to start it`);if(N===null)return;U=N==="local"}let O=l0(z,{scope:$,cwd:Z.cwd,home:V,pick:E,...U?{local:!0}:{}});if("error"in O){J.addSystemNote(`mcp: ${O.error}`,"warn");return}if(await J.askApproval("mcp add",`${O.name} \u2190 ${O.local?`node ${O.local.pkg.spec} (installed once)`:SZ(O.install)}`,i0(O,"env").join(`
|
|
19
|
-
`))==="deny"){J.addSystemNote("mcp: nothing written");return}let W,M;if(O.local){J.addSystemNote(`mcp: npm install ${O.local.pkg.spec} \u2192 ${O.local.prefix} \u2026`);let N=await u0(O.local.pkg,O.local.prefix,Z.spawn?{spawn:Z.spawn}:{});if(!N.ok){J.addSystemNote(`mcp: ${N.error} \u2014 nothing written`,"error");return}W=m0(N.pkg,O.local.pkg.rest),M={name:N.pkg.name,version:N.pkg.version,prefix:O.local.prefix,bin:N.pkg.bin,missing:N.pkg.missing,...N.pkg.integrity!==void 0?{integrity:N.pkg.integrity}:{},...N.pkg.resolved!==void 0?{resolved:N.pkg.resolved}:{}}}let b,p=p0(O,{},W);try{b=a0(O.file,O.name,p,$==="project"?{trustHome:V}:{}).trusted}catch(N){J.addSystemNote(`mcp: ${N instanceof Error?N.message:String(N)}`,"error");return}if(J.addSystemNote(`mcp: added "${O.name}" \u2192 ${O.file}${b===!0?" (trusted as written)":""} \u2014 restart me to connect (servers are read once per process)`),M){if(d0(c0({kind:"mcp",id:z.key,source:z.source,...z.version!==void 0?{version:z.version}:{}},{scope:$,target:O.file,package:M,installedBy:"mcp add"}),{cwd:Z.cwd,home:V}),J.addSystemNote(`mcp: installed ${M.name} ${M.version} once \u2192 ${O.local.prefix}${M.integrity!==void 0?" (integrity recorded in installed.json)":""}`),M.missing?.length)J.addSystemNote(`mcp: record incomplete: ${M.missing.join("; ")}`,"warn")}if(b===!1)J.addSystemNote("mcp: that file already held servers you have not approved, so it is NOT trusted yet \u2014 /mcp trust shows them","warn");let d=x0(O,p);if(d.length)J.addSystemNote(`mcp: set ${d.join(", ")} in your environment before the restart \u2014 or run \`rovecode mcp add ${z.key}\` on a shell, which asks for them masked`,"warn");if(O.pending.length)J.addSystemNote(`mcp: fill in ${O.pending.join(", ")} in that file's args before use`,"warn")}import{relative as j8}from"path";G8();e();var z8="/trust \u2014 review this repo's gated files and approve them \xB7 /trust show \u2014 review only \xB7 /trust untrust \u2014 withdraw",H8=["show","untrust"],$4={name:"trust",choices:H8,choicesThen:"submit",description:"Review what this repo's config would run and approve it: /trust \xB7 /trust show \xB7 /trust untrust",group:"modes & safety"},J4="\x00keep-untrusted",Q4="\x00trust-all",W8="restart rovecode to apply \u2014 an edit to any of these files asks again";function F8(Z,Q){let J=[{value:J4,label:"keep them untrusted",description:"nothing from these files is used; you will be asked again next launch"}];for(let Y of Z)J.push({value:Y.file,label:`approve ${CZ(Y.file,Q)}`,description:Y.carries.join(" \xB7 ")});if(Z.length>1)J.push({value:Q4,label:`approve all ${Z.length} files`,description:Z.map((Y)=>CZ(Y.file,Q)).join(", ")});return J}var CZ=(Z,Q)=>{let J=j8(Q,Z);return J===""||J.startsWith("..")?Z:J};function q8(Z,Q){let J=Q.length===1?"1 file":`${Q.length} files`;return`${Z}: ${J} would make rovecode run something and ${Q.length===1?"is":"are"} not trusted on this machine \u2014 the lines above say what each one carries. Enter on the first item changes nothing (Esc the same).`}async function X4(Z,Q=""){let{renderer:J}=Z,Y=Z.home??w(),$=Q.trim().split(/\s+/).filter(Boolean)[0]??"";if($!==""&&$!=="show"&&$!=="untrust"){J.addSystemNote(`unknown /trust verb "${$}" \u2014 ${z8}`,"warn");return}let X=KZ(Z.cwd,Y);if($==="untrust"){for(let V of Z4(Y,X))J.addSystemNote(V);return}if(Y4(Z,X),$==="show"||X.length===0)return;if(GZ(X).length===0){J.addSystemNote("every gated file here is already trusted \u2014 nothing to approve");return}await O8(Z,Y)}function Y4(Z,Q){for(let J of t0([...Q]))Z.renderer.addSystemNote(J,J.startsWith("\xB7 UNTRUSTED")?"warn":"info")}async function O8(Z,Q){let{renderer:J}=Z,Y=0;for(;;){let $=GZ(KZ(Z.cwd,Q));if($.length===0)break;let X=await J.pickOne(F8($,Z.cwd),q8(Z.cwd,$));if(X===null||X===J4){J.addSystemNote(`${$.length} file${$.length===1?"":"s"} left untrusted \u2014 ${$.map((K)=>CZ(K.file,Z.cwd)).join(", ")} contribute nothing this session`,"warn");break}if(X===Q4){for(let K of e0(Q,$))J.addSystemNote(K);Y+=$.length;break}let V=$.find((K)=>K.file===X);if(V===void 0)break;let G=r0(Q,V.file);if(!G.ok){J.addSystemNote(G.reason,"warn");break}if(J.addSystemNote(`trusted ${V.file} (${G.digest.slice(0,12)}\u2026)`),Y++,$.length===1)break;Y4(Z,GZ(KZ(Z.cwd,Q)))}if(Y>0)Z.renderer.addSystemNote(W8)}function B4(Z,Q){return`reasoning \xB7 ${Z} tokens${Q?" \u2026":" \xB7 collapsed"}`}class kZ{renderer;open=null;constructor(Z){this.renderer=Z}onEvent(Z){if(Z.type==="reasoning_update"){if(this.open&&this.open.id!==Z.messageId)this.settle();if(!this.open)this.open={id:Z.messageId,view:this.renderer.beginReasoning?.()??null,tokens:0};this.open.tokens=Math.max(this.open.tokens,Z.tokens),this.open.view?.set?.(`\u2234 ${B4(this.open.tokens,!0)}`)}else if(Z.type==="message_update"||Z.type==="turn_end"||Z.type==="run_end")this.settle()}settle(){let Z=this.open;if(!Z)return;if(this.open=null,Z.view)Z.view.done();else this.renderer.addSystemNote(`\u2234 ${B4(Z.tokens,!1)}`)}get openTokens(){return this.open?.tokens??0}}var P8="main \u2014 built-in: the starting run's model and system prompt, every child tool (default for `task start`)";function L8(Z){let Q=Z.tools.includes("*")?"all child tools":Z.tools.join(", ");return`${Z.name} \u2014 ${Z.description} (${Z.scope}: ${Z.path}; model ${Z.model??"inherited"}; mode ${Z.mode??"act"}; tools ${Q})`}function U8(Z){let Q=[P8,...Z.agents.map(L8)],J=Z.agents.length===0?`
|
|
20
|
-
(no custom definitions \u2014 add ${K4}/${V4}/<name>.md: frontmatter description: / model: / mode: plan|act / tools: <allow-list>, body = system prompt)`:"",Y=Z.warnings.length>0?`
|
|
21
|
-
skipped:
|
|
22
|
-
`+Z.warnings.map(($)=>` ${$}`).join(`
|
|
23
|
-
`):"";return Q.join(`
|
|
24
|
-
`)+J+Y}function G4(Z){Z.renderer.addSystemNote(U8(Z.agents),Z.agents.warnings.length>0?"warn":"info")}F4();e();import{existsSync as j4}from"fs";var D8=["permission","effort","bell","notify","notify_when","notify_command","verify","lsp"],z4=(Z)=>{let Q=typeof Z==="string"?Z:JSON.stringify(Z);return Q.length>80?`${Q.slice(0,79)}\u2026`:Q};function E8(Z,Q,J=process.env,Y=w(),$){let X=fZ("user",Z),V=fZ("project",Z),G=H4(Z,Y),K=W4(Z),I=[];I.push(`settings \u2014 user: ${X}${j4(X)?"":" (absent)"} \xB7 project: ${V}${j4(V)?"":" (absent)"}`),I.push(`permission: ${jZ(Z,$,J)}${G.dropped.length>0?` \xB7 the project file's ${G.dropped.join(", ")} ${G.dropped.length===1?"is":"are"} ignored until you trust that file (rovecode trust show)`:""}`);let z=D8.filter((H)=>K[H]!==void 0&&H!=="permission");if(z.length===0)I.push("(no settings.json key is set \u2014 every knob is at its default)");for(let H of z){let A=G.project[H]!==void 0?"project":"user";I.push(`${H} = ${z4(K[H])} [${A}]`)}let E=Object.keys(J).filter((H)=>H.startsWith("ROVECODE_")&&J[H]!=="").sort();if(E.length>0)if(Q)for(let H of E)I.push(`${H} = ${/KEY|TOKEN|SECRET/i.test(H)?"(set \u2014 value not shown)":z4(J[H])} [env]`);else I.push(`env: ${E.length} ROVECODE_* variable${E.length===1?"":"s"} set (/config all names them)`);return I.join(`
|
|
25
|
-
`)}function q4(Z,Q){Z.renderer.addSystemNote(E8(Z.cwd,Q.trim()==="all",process.env,w(),Z.permissionFlag))}TZ();function U4({renderer:Z,rt:Q,yolo:J,modelRef:Y,mode:$,version:X,width:V,sessionId:G,bootWarn:K,commandWarnings:I}){let z=Q.stream&&Q.noProviderReason()===null?Y:null;if(G!==void 0)Z.addSystemNote(P4(G,Q.cwd,J));else{let H={skills:Q.skillStore.list().length,plugins:Q.plugins.found.filter((A)=>A.status==="active").length,mcp:Q.mcp?.serverNames().length??0};Z.addSystemNote(O4({connected:z,cwd:Q.cwd,yolo:J,mode:$,version:X,loaded:H,width:V}))}if(K)Z.addSystemNote(K);for(let H of I)Z.addSystemNote(H,"warn");for(let H of Q.providers.warnings())Z.addSystemNote(`providers: ${H}`,"warn");Q.hooks.onWarning((H)=>Z.addSystemNote(`hooks: ${H}`,"warn")),Q.plugins.onWarning((H)=>Z.addSystemNote(H,"warn"));let E=L4(Q.plugins.found);if(E!==null)Z.addSystemNote(E);Q.onRouterNote((H)=>Z.addSystemNote(H,"warn"))}function zZ(Z,Q){if(!Q)return Z;return new Promise((J,Y)=>{let $=()=>{Y(Q.reason??Error("startup cancelled"))};Q.addEventListener("abort",$,{once:!0});let X=()=>Q.removeEventListener("abort",$);if(Q.aborted)X(),$();Z.then(()=>{X(),J()},(V)=>{X(),Y(V)})})}TZ();Z9();e();import{appendFileSync as I8,mkdirSync as N8}from"fs";import{join as A8}from"path";function R8(Z,Q=0){let J=($,X=2)=>String($).padStart(X,"0"),Y=`${Z.getFullYear()}${J(Z.getMonth()+1)}${J(Z.getDate())}-${J(Z.getHours())}${J(Z.getMinutes())}${J(Z.getSeconds())}`;return Q===0?`crash-${Y}.log`:`crash-${Y}-${Q}.log`}function HZ(Z){if(Z instanceof Error){let Q=Z.cause!==void 0?`
|
|
26
|
-
caused by: ${HZ(Z.cause)}`:"";return`${Z.name}: ${Z.message}
|
|
27
|
-
${Z.stack??"(no stack)"}${Q}`}if(typeof Z==="object"&&Z!==null)try{return`non-Error value thrown: ${JSON.stringify(Z)}`}catch{return`non-Error value thrown: ${String(Z)}`}return`non-Error value thrown: ${String(Z)}`}function _8(Z){let Q=Z instanceof Error?Z.message:typeof Z==="string"?Z:"";if(/\(ResolveMessage \{\}\)|getAddrInfo|EAI_AGAIN|ENOTFOUND|ECONNRESET|ECONNREFUSED|ECONNABORTED|ETIMEDOUT|EHOSTUNREACH|ENETUNREACH/.test(Q))return!0;if(typeof Z==="object"&&Z!==null){let{name:J,code:Y}=Z;if(String(J).includes("Resolve")||/^(EAI_AGAIN|ENOTFOUND|ECONNRESET|ECONNREFUSED|ECONNABORTED|ETIMEDOUT|EHOSTUNREACH|ENETUNREACH)$/.test(String(Y)))return!0}return!1}function T8(Z,Q,J,Y){return[`rovecode crash \u2014 ${Z}`,`when: ${J.toISOString()}`,`version: ${Y??"unknown"}`,`platform: ${process.platform} ${process.arch}`,`cwd: ${process.cwd()}`,"",HZ(Q),""].join(`
|
|
28
|
-
`)}function D4(Z){let Q=Z.process??process,J=Z.now??(()=>new Date),Y=Z.stderr??((H)=>{try{process.stderr.write(H+`
|
|
29
|
-
`)}catch{}}),$=Z.writeFile??((H,A)=>{I8(H,A,"utf8")}),X=!1,V=()=>{if(X)return;X=!0;try{Z.restore()}catch{}},G=(H,A)=>{let U=J();try{N8(Z.logDir,{recursive:!0});let O=A8(Z.logDir,R8(U));return $(O,T8(H,A,U,Z.version)),O}catch{return null}},K=(H)=>(A)=>{if(_8(A)){let O=G(`transient network error (recovered, ${H})`,A);if(O!==null)Y(`rovecode: a network call failed and was left behind (${HZ(A).split(`
|
|
30
|
-
`)[0]}) \u2014 details: ${O}`);return}V();let U=G(H,A);Y(`rovecode crashed (${H}). ${U!==null?`Details: ${U}`:"The crash log could not be written."}`),Y(HZ(A)),Q.exit(1)},I=K("uncaught exception"),z=K("unhandled rejection"),E=()=>{V()};return Q.on("uncaughtException",I),Q.on("unhandledRejection",z),Q.on("exit",E),()=>{Q.off("uncaughtException",I),Q.off("unhandledRejection",z),Q.off("exit",E)}}r4();J9();h4();wZ();M8();var A4=["theme","open","diff","focus","agents","notices","context"];function R4(Z){return{cwd:Z.cwd,sessionsDir:Z.sessionsDir,store:()=>({id:Z.store().id}),tasks:Z.tasks,model:Z.model,contextWindow:()=>{let Q=Z.model();return Z.catalog.lookup(Q.provider,Q.model)?.contextWindow},usage:()=>N4(Z.store().messages(),Z.catalog,Z.model()),contextInputs:()=>({messages:Z.store().messages(),lookup:(Q)=>{let J=Z.catalog.lookup(Q.provider,Q.model);if(!J)return;return{...J.contextWindow!==void 0?{contextWindow:J.contextWindow}:{},...J.pricing?{pricing:J.pricing}:{},...J.tier?{tier:J.tier}:{}}},runtime:Z.runtime?.()??null}),reloadMcp:async()=>{return await Z.runtime?.()?.reloadMcp?.()??{added:[],removed:[],failed:[],skipped:[]}},staged:()=>Z.store().stagedAttachments.map((Q)=>Q.name??"image"),attachImage:(Q)=>{let J=Z.store(),Y=E4(Q);if("error"in Y)return;let $=J.stagedAttachments;if(I4($.length+1)!==void 0)return;J.stageAttachments([...$,Y])},...Z.wizard!==void 0?{wizardProviders:()=>Z.wizard.providers(),wizardRegister:(Q,J,Y)=>Z.wizard.register(Q,J,Y),wizardStoreKey:(Q,J)=>Z.wizard.storeKey(Q,J),wizardModels:(Q)=>Z.wizard.models(Q),wizardActivateModels:(Q,J,Y)=>Z.wizard.activateModels(Q,J,Y),wizardTest:(Q,J)=>Z.wizard.test(Q,J)}:{},...Z.petName!==void 0?{petName:Z.petName}:{}}}_4();F4();_4();hZ();var $Z=[{name:"help",description:"This list, by topic",group:"start here"},_0,{name:"exit",description:"Quit (alias /quit; Ctrl+C does the same)",group:"start here"},{name:"new",description:"Start over in this session (branch back to the beginning)",group:"session"},{name:"sessions",description:"Pick an earlier session to continue \u2014 or manage them: /sessions rename <title\u2026> | delete <id> | fork [<id>] | search <terms\u2026>",group:"session",choices:["rename","delete","fork","search"],choicesThen:"complete"},{name:"resume",description:"Continue a session by id: /resume <id>",group:"session"},{name:"rewind",description:"Go back to an earlier turn and edit it (alias: /tree)",group:"session"},{name:"tree",description:"Alias of /rewind",group:"session"},{name:"export",description:"Save this session as markdown: /export [--json] [path] [--force]",group:"session"},VZ,...T0,{name:"yolo",description:"Toggle ask first / auto (never asks)",group:"modes & safety"},{name:"mouse",description:"Terminal mouse: /mouse off hands the drag to the terminal so you can select and copy text; on (default) keeps clicks, focus and scrollbars. Shift+drag selects without turning it off",group:"modes & safety",choices:["on","off","toggle"]},{name:"accept-edits",description:"Stop asking for writes inside this folder; shell, subagents and writes outside it still ask",group:"modes & safety"},{name:"effort",description:"How hard I think before answering: /effort auto | off | low | medium | high [--save [--project]] \u2014 the note says what the current model actually receives; --save makes it the default",group:"model & provider",choices:WZ},{name:"plan",description:"Plan mode: I only read and plan, nothing changes",group:"modes & safety"},{name:"act",description:"Act mode: I can edit and run again",group:"modes & safety"},{name:"checkpoints",description:"Snapshots I took before each change (shadow git)",group:"files & history"},{name:"restore",description:"Go back to a snapshot: /restore <ref> [files|conversation|both]",group:"files & history"},{name:"commit",description:"Commit the staged changes with a model-drafted conventional message (COMMIT role): /commit [message] \u2014 `git commit -m` runs through the bash tool's approval card",group:"files & history"},{name:"undo",description:"Undo the agent's last change: restore the previous checkpoint's files (a drifted workspace goes back to the last checkpoint; confirmation card; the conversation is untouched)",group:"files & history"},{...M4,group:"files & history"},{...b4,group:"files & history"},$4,{name:"agents",description:"My subagent definitions: /agents list (the bare /agents is the crew board)",group:"start here",choices:["list"]},{name:"config",description:"The settings this session actually loaded: /config [all] \u2014 files, set keys, ROVECODE_* env",group:"start here",choices:["all"]},o0,{name:"status",description:"Provider, model, turns, tokens, sandbox",group:"info"},{name:"update",description:"Update this installation in the background: /update [--check] [--channel beta|latest] \u2014 npm or source checkout; a restart runs the new version",group:"info"},{name:"cost",description:"Tokens, cache hits and the USD estimate (/cost refresh updates prices)",group:"info"},{name:"todos",description:"My step list for the current task",group:"info"},{name:"tasks",description:"Background subagents: /tasks [cancel <id>|cancel all]",group:"info"},{name:"skills",description:"Installed skills",group:"info"},{name:"memory",description:"What I remember across turns: /memory \xB7 /memory --user \xB7 /memory [--user] <text> to add a line",group:"info"},...T4];wZ();import{join as PZ}from"path";var aZ=null;function g(){if(aZ===null)aZ=(p4(),DZ(l4));return aZ}var nZ=null;function a(){if(nZ===null)nZ=(xZ(),DZ(Z7));return nZ}var dZ=null;function Y9(){if(dZ===null)dZ=(B7(),DZ(Y7));return dZ}async function jJ(Z={}){let Q=process.env.ROVECODE_TRACE_BOOT==="1"?Number(process.env._ROVECODE_BOOT_T0)||Date.now():-1,J=Q>=0?(B)=>process.stderr.write(`[boot] +${Date.now()-Q}ms ${B}
|
|
31
|
-
`):(B)=>{};J("runTui entered"),Z.startup?.signal?.throwIfAborted(),Z.startup?.status("loading workspace");let Y={id:Z.sessionId,warn:Z.bootNote},$=(()=>{try{J("createRuntime start");let B=R7({cwd:Z.cwd,stream:Z.stream,sessionId:Y.id,spawnRunner:Z.spawnRunner,platform:Z.platform,...Z.addDirs!==void 0?{addDirs:Z.addDirs}:{}});return J("createRuntime done"),B}catch(B){if(B instanceof sZ&&Z.exitOnClose!==!1)console.error(`error: ${B.message}`),process.exit(2);throw B}})(),X=Z.renderer??new((X9(),DZ(Q9))).PiTuiRenderer({cwd:$.cwd});J("renderer created"),$.setAskUser((B,F)=>X.askQuestion(B,F));let V=PZ($.cwd,".rovecode","sessions"),G=new BZ({fetchFn:fetch,cacheDir:PZ($.cwd,".rovecode","cache")}),K=$.store,I=$.blockStore,z=$.steering;$.tasks.subscribe((B)=>{if(FZ(B.status))X.addSystemNote(A7(B),B.status==="failed"?"warn":"info")});let E=I7($.cwd),H=new N7(E,{provider:$.provider?.id??"mock",model:Z.model??process.env.ROVECODE_MODEL??$.defaultModel??""});H.restore(rZ(K.messages())??H.mode);let A=$.plugins.found.flatMap((B)=>B.status==="active"&&B.commandsDir?[{dir:B.commandsDir,scope:B.scope}]:[]),U=M7($.cwd,{reserved:[...$Z.map((B)=>B.name),"quit",...A4],extraDirs:A});if(Z.effort!==void 0)$.setEffort(Z.effort);let O=Z.permission??(Z.yolo===!0?"auto":Z.acceptEdits===!0?"accept-edits":void 0),h=jZ($.cwd,O,{ROVECODE_PERMISSION:process.env.ROVECODE_PERMISSION,ROVECODE_YOLO:process.env.ROVECODE_YOLO,ROVECODE_ACCEPT_EDITS:process.env.ROVECODE_ACCEPT_EDITS}),W={yolo:h==="auto",acceptEdits:h==="accept-edits",provider:H.modelFor().provider,model:H.modelFor().model,mode:H.mode,turns:0,tokensIn:0,tokensOut:0,busy:!1},M=null,b=null,p=!1,d=()=>{},N=new Promise((B)=>{d=B}),c=()=>{let B=F0(PZ(V,K.id));return{provider:W.provider,model:W.model,yolo:W.yolo,mode:W.mode,permission:W.yolo?"auto":W.acceptEdits?"accept-edits":"ask",effort:$.effort,turns:W.turns,tokensIn:W.tokensIn,tokensOut:W.tokensOut,...B!==void 0?{todos:B}:{}}},R=()=>X.setStatus(c()),tZ,EZ=null,IZ=(B=!0)=>{if(p)return;p=!0,EZ?.(),EZ=null,UZ(H,K),b?.abort();let F=M?.return(void 0).then(()=>{return},()=>{return})??Promise.resolve(),P=$.stopRepoMapWarmup();$.tasks.cancelAll();let j=$.mcp?.close().catch(()=>{});tZ?.(),X.stop(),(async()=>{if(await Promise.all([F,P,j]),await $.hooks.close().catch(()=>{}),await X.drain?.()?.catch(()=>{}),d(),B&&Z.exitOnClose!==!1)process.exit(0)})()},x=()=>{let B=a().usageOf(K);W.tokensIn=B.tokensIn,W.tokensOut=B.tokensOut},o=()=>a().replayTranscript(X,K),NZ={renderer:X,cwd:$.cwd,store:()=>K,modelRef:()=>H.modelFor()},eZ=(B,F=!0)=>{UZ(H,K);let P=K.stagedAttachments;K=new W7(V,B);let j=D7($.cwd,V,B);if(j.blocks)I=j.blocks;if(j.note!==null)for(let T of j.note.split(`
|
|
32
|
-
`))X.addSystemNote(T);$.setBlockStore(I),$.setSessionStore(K),H.restore(rZ(K.messages())??E.defaultMode??"act");let L=H.modelFor();if(W.mode=H.mode,W.model=L.model,W.provider=L.provider,W.turns=0,o(),x(),R(),F)X.addSystemNote(`session ${B.slice(0,8)} (${K.messages().length} messages)`);l7(NZ,P)},Z0={renderer:X,busy:()=>W.busy,sessionId:()=>K.id,checkpointsFor:(B)=>$.checkpointsFor(B),branchTo:(B)=>K.branch(B),replayAndRefresh:()=>{o(),x(),R()}},s={renderer:X,cwd:$.cwd,sessionsDir:V,busy:()=>W.busy,store:()=>K,switchSession:eZ,replayHistory:o,refreshUsage:x,pushStatus:R},v={renderer:X,rt:$,sessionsDir:V,catalog:G,state:W,store:()=>K,blocks:()=>I,commands:{builtin:$Z,custom:U.commands}},x7={renderer:X,modes:H,state:W,pushStatus:R,submit:(B)=>RZ(B)},i7={renderer:X,cwd:$.cwd,busy:()=>W.busy,store:()=>K,modes:H,state:W,defaultMode:E.defaultMode??"act",buildCfg:()=>$.buildCfg(AZ(),QZ()),bindAbort:(B)=>{b=B},switchSession:eZ,replayHistory:o,refreshUsage:x,pushStatus:R,submit:(B)=>RZ(B)},i=()=>({rt:$,modes:H,state:W,renderer:X,pushStatus:R,catalog:G}),$0=(B)=>{let F=B.split(/\s+/).filter((L)=>L.length>0);if(!F.includes("--save"))return"this session only \u2014 add --save to make it the default (--project pins it to this repo)";let P=F.includes("--project")?"project":"user",j=W.yolo?"auto":W.acceptEdits?"accept-edits":"ask";try{let L=oZ("permission",j,P,$.cwd);return`saved: ${j} is the default now (${L})`}catch(L){return`could not save it: ${L instanceof Error?L.message:String(L)}`}},J0=(B)=>{let F=G.lookup(W.provider,W.model),P={provider:W.provider,model:W.model,effort:B,...F?.supportsReasoning!==void 0?{reasoning:F.supportsReasoning}:{}};return L7(P,$.providers.get(W.provider)?.protocol??"openai",{shape:U7(P)})},JZ=!0,a7=(B)=>{let[F,...P]=B.slice(1).split(/\s+/),j=P.join(" ").trim();switch(F){case"exit":case"quit":return IZ(),!0;case"help":return g().cmdHelp(v),!0;case"update":return X.addSystemNote("update: checking\u2026"),import("./update-cmd-tk131s9t.js").then(({updateFlow:L})=>L(j.length>0?j.split(/\s+/):[],{version:n.version,entry:import.meta.path,log:(T)=>X.addSystemNote(`update: ${T}`,/failed|error/i.test(T)?"warn":void 0)})).catch((L)=>X.addSystemNote(`update failed: ${L instanceof Error?L.message:String(L)}`,"warn")),!0;case"mouse":{let L=(j.length>0?j:"toggle").toLowerCase();if(L!=="on"&&L!=="off"&&L!=="toggle")return X.addSystemNote('usage: /mouse on | off | toggle \u2014 "off" hands the drag to the terminal so you can select and copy text',"warn"),!0;if(!X.setMouse)return X.addSystemNote("this view never captures the mouse \u2014 select and copy with the terminal as usual"),!0;return JZ=L==="toggle"?!JZ:L==="on",X.setMouse(JZ),X.addSystemNote(JZ?"mouse on \u2014 clicks, panel focus and scrollbar dragging are back":"mouse off \u2014 drag to select and copy text in any panel; /mouse on brings the clicks back (Shift+drag also works while the mouse is on)"),!0}case"effort":{let L=j.split(/\s+/).filter((_)=>_.length>0),T=L.includes("--save"),k=L.filter((_)=>_!=="--save").join(" ").trim();if(k.length===0){if(!T)return X.addSystemNote(cZ($.effort,J0($.effort))),!0;return X.addSystemNote("usage: /effort auto | off | low | medium | high [--save [--project]]","warn"),!0}let y=K7(k);if(y===void 0)return X.addSystemNote(`"${k}" is not a level \u2014 ${WZ.join(" \xB7 ")} [--save]`,"warn"),!0;if($.setEffort(y),X.addSystemNote(cZ(y,J0(y))),T)try{let _=oZ("effort",y,L.includes("--project")?"project":"user",$.cwd);X.addSystemNote(`saved: effort ${y} is the default now (${_})`)}catch(_){X.addSystemNote(`could not save it: ${_ instanceof Error?_.message:String(_)}`,"warn")}return R(),!0}case"accept-edits":return W.acceptEdits=!W.acceptEdits,X.addSystemNote(W.yolo?`${LZ(W.acceptEdits)} (auto mode is on, so nothing asks either way \u2014 /yolo turns it off)`:LZ(W.acceptEdits)),X.addSystemNote($0(j)),R(),!0;case"yolo":return W.yolo=!W.yolo,X.addSystemNote(j7(W.yolo)),X.addSystemNote($0(j)),R(),!0;case"model":return MZ(i(),j),!0;case"models":return bZ(i(),j),!0;case"provider":return b0(i(),j),!0;case"setup":return yZ(i()),!0;case"connect":return S0(i(),j),!0;case"plan":case"act":return _7(H,F,W,X,R),!0;case"checkpoints":return z0(Z0),!0;case"restore":return H0(Z0,j),!0;case"commit":return f7(Q0,B.slice(1+(F??"").length)),!0;case"undo":return w7(Q0),!0;case"status":return g().cmdStatus(v),!0;case"cost":return g().cmdCost(v,j),!0;case"skills":return g().cmdSkills(v),!0;case"memory":return g().cmdMemory(v,j),!0;case"todos":return g().cmdTodos(v),!0;case"tasks":return g().cmdTasks(v,j),!0;case"new":return a().cmdNew(s),!0;case"rewind":case"tree":return a().cmdRewind(s),!0;case"sessions":return Y9().cmdSessionsVerb(s,j),!0;case"compact":case"clear":case"init":case"copy":return v7(i7,F??"",j),!0;case"trust":return X4({renderer:X,cwd:$.cwd},j),!0;case"agents":return G4({renderer:X,agents:$.agents}),!0;case"config":return q4({renderer:X,cwd:$.cwd},j),!0;case"resume":if(j)a().cmdSessions(s,j);else a().cmdSessions(s);return!0;case"export":return g().cmdExport(v,j),!0;case"attach":return g7(NZ,j),!0;case"paste":return u7(NZ),!0;case"mcp":return s0({renderer:X,cwd:$.cwd},j),!0;default:if(!y7(x7,U.commands,F??"",B.slice(1+(F??"").length)))X.addSystemNote(`unknown command: /${F} (try /help)`,"warn");return!0}},AZ=()=>W.yolo?"auto":W.acceptEdits?"accept-edits":"ask",QZ=()=>W.yolo?void 0:async(B)=>{let F=B.tool==="edit"||B.tool==="write";if(F&&W.acceptEdits)return"once";let P;if(F)try{P=p7(B.tool,B.revisedArgs,$.cwd).text||void 0}catch{P=void 0}let j=await X.askApproval(B.tool,JSON.stringify(B.revisedArgs).slice(0,140),P);if(j!=="all-edits")return j;return W.acceptEdits=!0,X.addSystemNote(LZ(!0)),R(),"once"},n7={renderer:X,rt:$,store:()=>K,level:AZ,approve:QZ,busy:()=>W.busy,setBusy:(B)=>{W.busy=B,R()},bindAbort:(B)=>{b=B}},Q0={renderer:X,rt:$,store:()=>K,approve:QZ,yolo:()=>W.yolo,busy:()=>W.busy,setBusy:(B)=>{W.busy=B,R()},bindAbort:(B)=>{b=B}},d7=async(B)=>{let F=$.stream,P=$.noProviderReason();if(!F||P!==null){X.addSystemNote(P!==null?G7("tui"):"no provider stream","error");return}W.busy=!0,X.setBusy(!0,"thinking\u2026"),R();let j=AZ(),L=$.buildCfg(j,QZ()),T=H.modelFor(),k=$.buildDef({provider:T.provider,model:T.model});T7(H,L,k);let y=new Map,_=new kZ(X),u=null;b=new AbortController,$.tasks.bindRun(b.signal,{label:B}),M=q7(k,B,{},L,{stream:F,registry:$.registry,store:K,tools:$.registry.list().map((q)=>q.schema),guard:$.guard,planReminder:$.planReminder,signal:b.signal,cwd:$.cwd,hooks:$.hooks},z);try{for await(let q of M)if(X.onEvent?.(q),_.onEvent(q),q.type==="turn_start")E7(),W.turns++,R();else if(q.type==="message_update"){let C=y.get(q.messageId);if(!C)C=X.beginAssistant(),y.set(q.messageId,C),u?.done(),u=C;C.append(q.delta)}else if(q.type==="tool_execution_start")X.toolStart(q.callId,q.tool,JSON.stringify(q.args).slice(0,120));else if(q.type==="tool_execution_update")X.toolUpdate(q.callId,q.note);else if(q.type==="tool_execution_end")X.toolEnd(q.callId,q.ok,q.output.slice(0,160).replace(/\n/g," \u23CE "),q.durationMs);else if(q.type==="tool_call_failed")X.toolEnd(q.callId,!1,`${q.reason}: ${q.detail}`.slice(0,160),0);else if(q.type==="compaction")X.addSystemNote(h7(q));else if(q.type==="steer")X.addSystemNote("\u21AA steering applied");else if(q.type==="verify")X.addSystemNote(q.state==="running"?`\u29D7 verify: ${q.command.slice(0,120)}`:`verify ${q.state}: ${q.detail??""}`,q.state==="running"||q.state==="passed"?"info":"warn");else if(q.type==="run_end"){if(u?.done(),q.status==="error")X.addSystemNote(q.summary,"error");else if(q.status!=="done")X.addSystemNote(`run ${q.status}: ${q.summary}`,"warn");else if(q.outstanding){let C=O7(q.outstanding);if(C!==null)X.addSystemNote(`done \xB7 ${C}`,P7(q.outstanding))}if(y.size===0&&q.status==="done"&&q.summary){let C=X.beginAssistant();C.append(q.summary),C.done()}}}finally{M=null,b=null,W.busy=!1,x();for(let q of $.drainRouterNotes())X.addSystemNote(q,"warn");X.setBusy(!1),R()}},RZ=(B)=>{if(!B.trim()){let F=K.stagedAttachments.length;return X.addSystemNote(F===0?"nothing to send \u2014 the message is empty":`type a message to send with the attached image${F===1?"":"s"}`,"warn"),Promise.resolve()}if(X.addUser(OZ(B,K.stagedAttachments)),UZ(H,K),W.busy)return z.push(B),X.addSystemNote(`queued as steering (applies before the next model turn)${m7(K)}`),Promise.resolve();return d7(B)},X0=async(B)=>{if(Z.startup?.finish(),IZ(!1),await N,B instanceof sZ&&Z.exitOnClose!==!1)console.error(`error: ${B.message}`),process.exit(2);throw B},Y0=async()=>{try{await zZ($.sandbox.ready,Z.startup?.signal)}catch(B){await X0(B)}};if(Z.startup)Z.startup.status("checking sandbox"),await Y0(),Z.startup.status("preparing interface");J("renderer.attach"),X.attach?.(R4({cwd:$.cwd,sessionsDir:V,store:()=>K,tasks:$.tasks,model:()=>H.modelFor(),catalog:G,runtime:()=>$,petName:Z.pet,wizard:{providers:()=>{let B=[],F=new Set,P=[...$.providers.list()].sort((j,L)=>Number(S(L))-Number(S(j)));for(let j of P){if(F.has(j.id)||j.id==="custom")continue;F.add(j.id),B.push({key:j.id,label:j.id==="kaesra"?"kaesra \u2014 the default host":j.id,...S(j)?{configured:!0}:{},...j.noKey===!0?{local:!0}:{}})}for(let j of t)if(j.url!==void 0)B.push({key:j.key,label:j.label,url:j.url});return B},register:(B,F,P)=>{let j=$.providers.add({id:B,baseUrl:F,protocol:P},"user");return"error"in j?{ok:!1,error:j.error}:{ok:!0}},storeKey:(B,F)=>{try{let P=$.providers.get(B),j=P?.id??B;if(P===void 0)return{ok:!1,error:`unknown provider "${B}"`};return YZ(P.id,F,P.keyEnv),$.providers.refresh(),{ok:!0}}catch(P){return{ok:!1,error:P instanceof Error?P.message:String(P)}}},models:async(B)=>{let F=B,P=$.providers.get(F),j=new Set(P?.models??[]),L=P?.defaultModel,T=[],k=(_)=>{T.push({id:_,...j.has(_)?{active:!0}:{},..._===L?{defaultModel:!0,note:"default"}:{}})},y=await $.providers.models(F);if(y.ok){for(let _ of y.models)if(!T.some((u)=>u.id===_))k(_)}for(let _ of j)if(!T.some((u)=>u.id===_))k(_);return T},activateModels:(B,F,P)=>{let j=B;if($.providers.get(j)===void 0)return{ok:!1,error:"no provider behind this row"};let L=$.providers.setModels(j,F,"user");if("error"in L)return{ok:!1,error:L.error};if(P!==void 0){let T=$.providers.setDefault(`${j}/${P}`,"user");if(!("error"in T))H.setModel({provider:T.provider,model:T.model}),W.provider=H.modelFor().provider,W.model=H.modelFor().model,R()}return{ok:!0,...L}},test:async(B,F)=>{let P=B;if($.providers.get(P)===void 0)return{ok:!1,detail:"no provider behind this row"};let j=await $.providers.probe(P,F);if(!j.ok)return{ok:!1,detail:j.detail};let L=$.providers.setDefault(`${P}/${F}`,"user");if("error"in L)return{ok:!1,detail:L.error};return H.setModel({provider:L.provider,model:L.model}),W.provider=H.modelFor().provider,W.model=H.modelFor().model,R(),{ok:!0,detail:`${j.detail} \u2014 default \u2192 ${P}/${F}`}}}}));let _Z=[],c7=()=>{R0($.providers).then((B)=>{_Z.splice(0,_Z.length,...B)}).catch(()=>{})};X.setCommands([...$Z.map((B)=>B.name===VZ.name?{...B,choices:()=>_Z}:B),...b7(U.commands)]),setTimeout(c7,0);let o7=process.listeners("warning");process.removeAllListeners("warning");let B0=(B)=>{let F=B.message.split(`
|
|
33
|
-
`)[0]??B.message;X.addSystemNote(`node: ${B.name==="Warning"?"":`${B.name}: `}${F}`,"warn")};process.on("warning",B0),tZ=()=>{process.off("warning",B0);for(let B of o7)process.on("warning",B)};let V0=!1,K0=()=>{if(V0)return;if(V0=!0,Y.id!==void 0)o(),x();U4({renderer:X,rt:$,yolo:W.yolo,modelRef:W,mode:W.mode,version:n.version,width:process.stdout.columns??80,sessionId:Y.id!==void 0?K.id:void 0,bootWarn:Y.warn,commandWarnings:U.warnings}),R()},G0=!1,j0=()=>{if(G0)return;Z.startup?.signal?.throwIfAborted(),G0=!0,J("complete first frame ready; releasing intro"),Z.startup?.finish()};J("renderer.start");try{let B=X.start({onSubmit:(F)=>{if(F.startsWith("/"))a7(F);else if(S7({renderer:X,blocks:()=>I},F))return;else if(C7(F)!==null)k7(n7,F);else RZ(F)},onInterrupt:()=>{b?.abort(),M?.return(void 0),X.addSystemNote("run interrupted","warn")},onExit:()=>IZ()},{beforeFirstRender:K0,onReveal:j0,...Z.startup?{animate:!1,beforeReveal:()=>{return J("first frame prepared; waiting for intro"),zZ(Z.startup?.animationDone??Promise.resolve(),Z.startup?.signal)}}:{}});if(K0(),$.warmRepoMap(),B)await zZ(B,Z.startup?.signal);j0()}catch(B){await X0(B)}if(p){await N;return}if(J("interface ready"),EZ=D4({restore:()=>X.restoreTerminal?.(),logDir:PZ(w(),"logs"),version:n.version}),Y.id===void 0)z7(n.version).then((B)=>{let F=H7(B);if(F!==null)X.addSystemNote(F);if(B.newer&&F7($.cwd,process.env))X.addSystemNote("auto-update: a newer release is out \u2014 updating in the background\u2026"),import("./update-cmd-tk131s9t.js").then(({updateFlow:P})=>P([],{version:n.version,entry:import.meta.path,log:(j)=>X.addSystemNote(`update: ${j}`,/failed|error/i.test(j)?"warn":void 0)})).catch(()=>{})}).catch(()=>{});if(C0(i()),!Z.startup)await Y0();await N}
|
|
34
|
-
export{$Z as w,jJ as x};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{wn as X}from"./main-qsevpgsv.js";import{existsSync as Y,mkdirSync as Z,readFileSync as $,writeFileSync as x}from"fs";import{dirname as T,join as K}from"path";function L(z,q,B){return z==="project"?K(q,".rovecode","installed.json"):K(B,"installed.json")}function V(z){try{let q=new URL(z);if(q.username||q.password)return q.username="",q.password="",q.toString();return z}catch{return z.replace(/^([a-z+]+:\/\/)?[^/@\s]*:[^/@\s]+@/i,"$1")}}function H(z,q,B){let C=L(z,q,B);if(!Y(C))return[];try{let D=JSON.parse($(C,"utf8"));if(typeof D!=="object"||D===null)return[];let G=D.installs;if(!Array.isArray(G))return[];return G.filter(_)}catch{return[]}}function _(z){if(typeof z!=="object"||z===null)return!1;let q=z;return typeof q.id==="string"&&(q.kind==="mcp"||q.kind==="skill"||q.kind==="plugin")&&(q.scope==="user"||q.scope==="project")&&typeof q.target==="string"}function Q(z,q,B){let C=L(z,B.cwd,B.home),D=B.stillInstalled?q.filter(B.stillInstalled):q;try{Z(T(C),{recursive:!0}),x(C,JSON.stringify({version:U,installs:D},null,2)+`
|
|
3
|
-
`)}catch{}}function O(z,q){let B=H(z.scope,q.cwd,q.home).filter((C)=>!J(C,z));Q(z.scope,[...B,z],q)}function P(z,q,B,C){let D=H(B,C.cwd,C.home),G=D.filter((W)=>!J(W,{kind:z,id:q}));if(G.length!==D.length)Q(B,G,C)}function R(z,q,B,C){return H(q,B,C).find((D)=>J(D,z))}function F(z,q){let B={kind:z.kind,id:z.id,source:z.source,scope:q.scope,installedAt:(q.now?q.now():new Date).toISOString(),installedBy:q.installedBy??"market",target:q.target};if(z.version!==void 0)B.catalogVersion=z.version;if(q.digest)B.digest=q.digest;if(q.package){let{missing:C,...D}=q.package;B.package={...D,...C!==void 0&&C.length>0?{missing:C}:{}}}if(q.git)B.git={source:V(q.git.source),...q.git.sha!==void 0?{sha:q.git.sha}:{},...q.git.ref!==void 0?{ref:q.git.ref}:{},...q.git.resolvedBy!==void 0?{resolvedBy:q.git.resolvedBy}:{}};return B}function y(z){if(z===void 0)return"origin unknown \u2014 installed before rovecode kept a record, or by hand";let q=z.installedAt.slice(0,10);if(z.git){let B=z.git.ref!==void 0?` (${z.git.resolvedBy==="commit"?"commit":"branch/tag"} ${z.git.ref})`:"";return`${z.git.source}${B}${z.git.sha?` @ ${z.git.sha.slice(0,12)}`:""} \xB7 ${q}`}return`${z.source} \xB7 ${q}`}var U=1,J=(z,q)=>z.kind===q.kind&&z.id===q.id;var A=()=>{};
|
|
4
|
-
export{H as S,O as T,P as U,R as V,F as W,y as X,A as Y};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{cc as D,dc as J,hc as F,mc as K}from"./main-1ereejm1.js";J();K();var G=(j)=>{return process.stderr.write(`error: ${j}
|
|
3
|
-
`),process.exit(2)};function L(j,k,C=G){if(k===void 0)return C(`${j} needs a session id or prefix`);let q=D(k);return q===void 0?k:C(`${j}: ${q}`)}function Q(j,k,C,q=G){let H=L(j,C,q),z=F(k,H);if(z.ok)return z.id;return q(z.error.startsWith("no session matching")?`${j}: ${z.error} in ${k} (rovecode sessions lists them)`:`${j}: ${z.error}`)}
|
|
4
|
-
export{L as u,Q as v};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
function D(b){if(b===void 0)return;let q=Number(b.trim());return Number.isInteger(q)&&q>0?q:void 0}function M(b){if(b===void 0)return;let q=Number(b.trim().replace(/^\$/,""));return Number.isFinite(q)&&q>0?q:void 0}var E=new Set(["off","none","0","false"]),J=(b,q)=>{let B=b.indexOf(q);return B===-1?void 0:b[B+1]};function N(b,q,B={}){let y={},z=J(b,"--max-cost");if(z!==void 0||b.includes("--max-cost")){if(z===void 0||!E.has(z.trim().toLowerCase())){let j=M(z);if(j===void 0)return{error:`--max-cost wants a positive amount in dollars (or "off"), not "${z??""}"`};y.maxCostUsd=j}}else{let j=q.ROVECODE_MAX_COST;if(j!==void 0&&!E.has(j.trim().toLowerCase())){let L=M(j);if(L!==void 0)y.maxCostUsd=L}}let G=J(b,"--max-turns");if(G!==void 0||b.includes("--max-turns")){let j=D(G);if(j===void 0)return{error:`--max-turns wants a positive whole number, not "${G??""}"`};y.maxTurns=j}else{let j=D(q.ROVECODE_MAX_TURNS);if(j!==void 0)y.maxTurns=j}let A=J(b,"--max-seconds");if(A!==void 0||b.includes("--max-seconds")){if(A!==void 0&&E.has(A.trim().toLowerCase()))return y;let j=D(A);if(j===void 0)return{error:`--max-seconds wants a positive whole number of seconds (or "off"), not "${A??""}"`};return y.maxSeconds=j,y}let H=q.ROVECODE_MAX_SECONDS;if(H!==void 0&&E.has(H.trim().toLowerCase()))return y;let K=D(H)??B.defaultSeconds;if(K!==void 0)y.maxSeconds=K;return y}
|
|
3
|
-
export{D as Qh,M as Rh,N as Sh};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{Cc as j,Dc as g,Fc as x}from"./main-vqak588n.js";import{wn as D}from"./main-qsevpgsv.js";function i(z){let H=z.trim();if(H.length===0||H.length>U.str)return null;let J=/^(mcp|skill|plugin):(.+)$/.exec(H);if(J)return{kind:J[1],id:J[2].trim()};return{id:H}}function s(z){let H=[z.kind.padEnd(6),z.title];if(z.version)H.push(z.version);return H.push(`\xB7 ${z.publisher}`),`${H.join(" ")} \u2014 ${z.description}`}var U,r=(z)=>`${z.kind}:${z.id}`;var R=D(()=>{U={body:2097152,items:200,str:300,desc:500,list:32,env:24,docs:24576}});import{existsSync as f,readFileSync as M}from"fs";import{join as F}from"path";function V(z,H=U.str){if(typeof z!=="string")return;let J=z.trim();return J.length===0?void 0:J.slice(0,H)}function u(z,H){if(typeof z!=="number"||!Number.isFinite(z)||z<0)return;let J=Math.floor(z);return J>H?void 0:J}function _(z,H=U.list,J=U.str){if(!Array.isArray(z))return[];let Q=[];for(let W of z.slice(0,H)){let Y=V(W,J);if(Y!==void 0)Q.push(Y)}return Q}function q(z){let H=V(z);if(H===void 0)return;try{let J=new URL(H);return J.protocol==="https:"||J.protocol==="http:"?H:void 0}catch{return}}function y(z){if(!Array.isArray(z))return[];let H=[];for(let J of z.slice(0,U.env)){if(!E(J))continue;let Q=V(J.name,64);if(Q===void 0||!I.test(Q))continue;let W={name:Q,required:J.required===!0,secret:J.secret===!0},Y=V(J.description,U.desc);if(Y!==void 0)W.description=Y;let $=V(J.default);if($!==void 0)W.default=$;H.push(W)}return H}function w(z){return z.split(/[\/]/).includes("..")||z.startsWith("/")||z.startsWith("\\")||/^[A-Za-z]:/.test(z)}function c(z,H,J,Q){let W=E(H.install)?H.install:H;if(z==="plugin"){let Z=V(W.source,512);if(Z===void 0)return J.push(`plugins catalog: "${Q}" has no install source \u2014 skipped`),null;let K=W.git===!0||/^(?:https?:\/\/|git@|ssh:\/\/|git:\/\/)|\.git$/i.test(Z);if(K&&q(Z)===void 0&&!/^(?:git@|ssh:\/\/|git:\/\/)/.test(Z))return J.push(`plugins catalog: "${Q}" install source is not a usable URL \u2014 skipped`),null;let P=V(W.subfolder,200);if(P!==void 0&&w(P))return J.push(`plugins catalog: "${Q}" subfolder escapes the clone (${P}) \u2014 skipped`),null;return{kind:"plugin",source:Z,git:K,...P!==void 0?{subfolder:P}:{}}}let Y=[];if(Array.isArray(W.files))for(let Z of W.files.slice(0,U.list)){if(!E(Z))continue;let K=V(Z.path,200),P=typeof Z.text==="string"?Z.text:void 0;if(K===void 0||P===void 0)continue;if(K.startsWith("/")||K.startsWith("\\")||/^[A-Za-z]:/.test(K)||K.split(/[\\/]/).includes(".."))return J.push(`skills catalog: "${Q}" wants to write outside its folder (${K}) \u2014 skipped`),null;if(P.length>U.body)return J.push(`skills catalog: "${Q}" file ${K} is over the size cap \u2014 skipped`),null;Y.push({path:K,text:P})}let $=E(W.source)?W.source:void 0,X=$?q($.git)??(typeof $.git==="string"&&/^(?:git@|ssh:\/\/)/.test($.git)?V($.git,512):void 0):void 0;if(X!==void 0){let Z=V($.subfolder,200);if(Z!==void 0&&(Z.split(/[\\/]/).includes("..")||Z.startsWith("/")))return J.push(`skills catalog: "${Q}" subfolder escapes the clone (${Z}) \u2014 skipped`),null;return{kind:"skill",source:{git:X,...Z!==void 0?{subfolder:Z}:{}},...Y.length?{files:Y}:{}}}if(Y.length===0)return J.push(`skills catalog: "${Q}" has neither a git source nor files \u2014 skipped`),null;return{kind:"skill",files:Y}}function p(z,H){if(Buffer.byteLength(z,"utf8")<=H)return z;let J=0,Q=z.length;while(J<Q){let $=Math.ceil((J+Q)/2);if(Buffer.byteLength(z.slice(0,$),"utf8")<=H)J=$;else Q=$-1}let W=z.slice(0,J),Y=W.charCodeAt(W.length-1);return Y>=55296&&Y<=56319?W.slice(0,-1):W}function T(z,H,J,Q){if(!E(z))return;let W=q(z.source);if(W===void 0){H.push(`${J}: documentation source is not an http(s) URL \u2014 docs dropped, the row stays`);return}if(z.format!=="markdown"){H.push(`${J}: documentation format ${JSON.stringify(z.format)} is not "markdown" \u2014 docs dropped, the row stays`);return}let Y=typeof z.body==="string"&&z.body.trim().length>0?p(z.body,U.docs):void 0;if(Y===void 0){H.push(`${J}: documentation body is empty \u2014 docs dropped, the row stays`);return}let $=u(z.bytes,1073741824),X=Buffer.byteLength(Y,"utf8"),Z=$===void 0||$<X?X:$,K=z.truncated===!0||Z>X;return{source:W,format:"markdown",bytes:Z,truncated:K,...Q?{body:Y}:{}}}function m(z,H,J,Q=!0){if(!E(H))return null;let W=V(H.id??H.name,64);if(W===void 0||!l.test(W))return J.push(`${z}s catalog: a row has no usable id \u2014 skipped`),null;let Y=V(H.description,U.desc);if(Y===void 0)return J.push(`${z}s catalog: "${W}" has no description \u2014 skipped`),null;let $=c(z,H,J,W);if($===null)return null;let X={id:W,kind:z,title:V(H.title,U.str)??W,publisher:V(H.publisher,U.str)??"unknown",description:Y,source:"catalog",tags:_(H.tags,U.list,40).map((v)=>v.toLowerCase()),env:y(H.env),install:$},Z=V(H.version,64);if(Z!==void 0)X.version=Z;let K=q(H.repository);if(K!==void 0)X.repository=K;let P=q(H.homepage);if(P!==void 0)X.homepage=P;let G=V(H.status,64);if(G!==void 0)X.status=G;let N=V(H.license,120);if(N!==void 0)X.license=N;let B=_(H.planNote,8,U.desc);if(B.length)X.planNote=B;let O=_(H.contributes,12,32);if(O.length)X.contributes=O;let C=T(H.docs,J,W,Q);if(C)X.docs=C;return X}function b(z){let H=z.installs.find((Q)=>Q.kind==="stdio"),J={id:z.key,kind:"mcp",title:z.title??z.key,publisher:z.publisher??"unknown",description:z.description,source:z.source==="curated"?"curated":"registry",tags:[],env:H?.kind==="stdio"?H.env.map((Q)=>({...Q})):[],install:{kind:"mcp",entry:z}};if(z.version!==void 0)J.version=z.version;if(z.repository!==void 0)J.repository=z.repository;if(z.homepage!==void 0)J.homepage=z.homepage;if(z.status!==void 0)J.status=z.status;return J}function a(z,H){let J=H.readFile??((Q)=>f(Q)?M(Q,"utf8"):null);try{return J(z)}catch{return null}}function L(z,H,J){let Q=a(z.mcpDocsFile??k,z);if(Q===null||Q.length>U.body)return{};let W;try{W=JSON.parse(Q)}catch{return H.push("mcp documentation sidecar is not valid JSON \u2014 MCP rows keep their docs off"),{}}let Y=E(W)&&E(W.docs)?W.docs:E(W)&&!Array.isArray(W)?W:null;if(Y===null)return{};let $={};for(let[X,Z]of Object.entries(Y).slice(0,U.items)){let K=T(Z,H,`mcp:${X}`,J);if(K)$[X]=K}return $}function S(z,H){let J=H.catalogFiles?.[z]??h[z],Q=[],W=H.readFile??((G)=>f(G)?M(G,"utf8"):null),Y;try{Y=W(J)}catch(G){return{items:[],status:{ok:!1,reason:`${z}s catalog unreadable: ${G instanceof Error?G.message:String(G)}`},notes:Q}}let $=H.withDocs===!0;if(Y===null)return{items:[],status:{ok:!0,from:"curated"},notes:Q};if(Y.length>U.body)return{items:[],status:{ok:!1,reason:`${z}s catalog is over ${U.body} bytes`},notes:Q};let X;try{X=JSON.parse(Y)}catch{return{items:[],status:{ok:!1,reason:`${z}s catalog is not valid JSON`},notes:Q}}let Z=E(X)&&Array.isArray(X.items)?X.items:Array.isArray(X)?X:null;if(Z===null)return{items:[],status:{ok:!1,reason:`${z}s catalog has no "items" array`},notes:Q};let K=[],P=new Set;for(let G of Z.slice(0,U.items)){let N=m(z,G,Q,$);if(N===null)continue;if(P.has(N.id)){Q.push(`${z}s catalog: "${N.id}" appears twice \u2014 first kept`);continue}P.add(N.id),K.push(N)}return{items:K,status:{ok:!0,from:"curated"},notes:Q}}function o(z,H){if(H.length===0)return!0;let J=`${z.id} ${z.title} ${z.description} ${z.tags.join(" ")}`.toLowerCase();return H.every((Q)=>J.includes(Q))}async function d(z,H={}){let J=z.trim().toLowerCase().split(/\s+/).filter(Boolean),Q={},W=[],Y=[];for(let X of["skill","plugin"]){let Z=S(X,H);Q[`${X}s`]=Z.status,W.push(...Z.notes);for(let K of Z.items)if(o(K,J))Y.push(K)}let $={...H.mcp,...H.offline===!0?{offline:!0}:{}};try{let X=await j(z,$),Z=L(H,W,H.withDocs===!0);for(let P of X.entries){let G=b(P),N=Z[P.key];if(N)G.docs=N;Y.push(G)}let K=X.entries.every((P)=>P.source==="curated");if(Q["mcp:curated"]={ok:!0,from:"curated"},Q["mcp:registry"]=z.trim().length<2?{ok:!0,from:"skipped",why:"a search term of two characters or more asks the registry; the curated shelf answers an empty one"}:$.offline===!0?{ok:!0,from:"skipped",why:"offline: the network was not tried"}:X.fromCache?{ok:!0,from:"cache",ageMs:0}:{ok:!0,from:"live"},W.push(...X.notes),X.notes.some((P)=>/registry/i.test(P)&&/(fail|not answer|error|timed out)/i.test(P)))Q["mcp:registry"]={ok:!1,reason:X.notes.find((P)=>/registry/i.test(P))}}catch(X){Q["mcp:curated"]={ok:!1,reason:X instanceof Error?X.message:String(X)},Q["mcp:registry"]={ok:!1,reason:X instanceof Error?X.message:String(X)}}return{items:Y,sources:Q,notes:W}}async function Qz(z,H,J={}){let Q=[];if(z==="skill"||z==="plugin"){let Z=S(z,{...J,withDocs:!0});Q.push(...Z.notes);let K=Z.items.find((P)=>P.id===H);return{...K?{item:K}:{},notes:Q}}let W={...J.mcp,...J.offline===!0?{offline:!0}:{}},Y=await g(H,W);if(Q.push(...Y.notes),!Y.entry)return{notes:Q};let $=b(Y.entry),X=L(J,Q,!0)[Y.entry.key];if(X)$.docs=X;return{item:$,notes:Q}}async function Wz(z={}){return d("",z)}var A,h,k,E=(z)=>typeof z==="object"&&z!==null&&!Array.isArray(z),l,I;var n=D(()=>{x();R();A=new URL("./catalogs/",import.meta.url).pathname.replace(/^\/([A-Za-z]:)/,"$1"),h={skill:F(A,"skills.json"),plugin:F(A,"plugins.json")},k=F(A,"mcp-docs.json"),l=/^[a-z0-9][a-z0-9._-]{0,63}$/,I=/^[A-Za-z_][A-Za-z0-9_]*$/});
|
|
3
|
-
export{U as nc,i as oc,r as pc,s as qc,R as rc,A as sc,h as tc,k as uc,p as vc,m as wc,b as xc,d as yc,Qz as zc,Wz as Ac,n as Bc};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{cm as D,dm as E,em as K,mm as j}from"./main-prxxs70n.js";import{Dm as M,Fm as b,ym as L}from"./main-7rn6bqje.js";import{nn as V,pn as Y,qn as A,tn as _}from"./main-nqveez48.js";b();j();_();import{existsSync as W,readFileSync as N}from"fs";import{join as I}from"path";var X=(z,H=100)=>{let q=typeof z==="string"?z:JSON.stringify(z);return q.length>H?`${q.slice(0,H-1)}\u2026`:q};function g(z,H){let q=[],Q=E("project",z);if(W(Q)){let G=K(Q),J=D.filter((U)=>G[U]!==void 0&&!(U==="verify"&&G.verify===!1)).map((U)=>`${U}: ${X(G[U])}`);if(J.length>0)q.push({file:Q,kind:"settings",status:V(H,Q),carries:J})}for(let G of["hooks.ts","hooks.js"]){let J=I(z,".rovecode",G);if(W(J))q.push({file:J,kind:"hooks",status:V(H,J),carries:[`code imported in-process at boot (${P(J)} lines) \u2014 read it before approving`]})}let Z=I(z,".rovecode","sandbox.json");if(W(Z)){let G=[];try{let J=JSON.parse(N(Z,"utf8"));if(J&&typeof J==="object"){if(J.rung!==void 0)G.push(`rung: ${X(J.rung)}`);if(J.dockerImage!==void 0)G.push(`dockerImage: ${X(J.dockerImage)}`)}if(G.length===0)G.push("no rung or image \u2014 nothing gated")}catch{G.push("not valid JSON \u2014 a boot refuses it either way")}q.push({file:Z,kind:"sandbox",status:V(H,Z),carries:G})}let $=I(z,".rovecode","memory","MEMORY.md");if(W($)){let G=V(H,$);if(G!=="trusted")q.push({file:$,kind:"memory",status:G,carries:[`${P($)} lines of text placed in front of the model in every run \u2014 read it before approving`]})}let O=L(z);for(let G of[O.harvest,O.project]){if(!W(G))continue;let J=[],B=M(G,J,process.env,{allowPlaceholders:!0}).map((R)=>`${R.name}: ${R.transport==="stdio"?X([R.command,...R.args??[]].filter(Boolean).join(" ")):X(R.url??"")}`);for(let R of J)B.push(`! ${R}`);if(B.length===0)B.push("no servers");q.push({file:G,kind:"mcp",status:V(H,G),carries:B})}return q}function P(z){try{return N(z,"utf8").split(`
|
|
3
|
-
`).length}catch{return 0}}var C={settings:"settings \u2014 commands this repo asks us to run",hooks:"hooks \u2014 code this repo asks us to import",sandbox:"sandbox \u2014 the executor this repo asks us to use",mcp:"MCP servers this repo asks us to start",memory:"memory \u2014 text this repo asks us to put in the prompt"};function x(z){if(z.length===0)return["no gated project files here (.rovecode/settings.json with verify/lsp/notify_command, hooks.ts, sandbox.json, mcp.json, .mcp.json) \u2014 nothing to trust"];let H=[];for(let q of z){H.push(`${q.status==="trusted"?"\u2713 trusted ":"\xB7 UNTRUSTED"} ${q.file} (${C[q.kind]})`);for(let Q of q.carries)H.push(` ${Q}`)}return H}function y(z,H){return H.map((q)=>{let Q=Y(z,q.file);return Q.ok?`trusted ${q.file} (${Q.digest.slice(0,12)}\u2026)`:Q.reason})}function S(z,H){let q=H.filter((Q)=>A(z,Q.file));return q.length?q.map((Q)=>`untrusted ${Q.file}`):["nothing was trusted here"]}function f(z){return z.filter((H)=>H.status!=="trusted")}
|
|
4
|
-
export{g as ra,x as sa,y as ta,S as ua,f as va};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{gm as b,mm as e}from"./main-prxxs70n.js";e();import{existsSync as k}from"fs";import{extname as HH,isAbsolute as JH,join as v,resolve as D}from"path";import{readFileSync as o}from"fs";import{extname as s}from"path";import{pathToFileURL as T}from"url";var L="ROVECODE_LSP",M=["typescript-language-server","--stdio"],S=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"],i=new Map(S.map((J)=>[J,M])),WH=`${S.join(",")}=${M.join(" ")}`,p={".ts":"typescript",".mts":"typescript",".cts":"typescript",".tsx":"typescriptreact",".js":"javascript",".mjs":"javascript",".cjs":"javascript",".jsx":"javascriptreact",".py":"python",".pyi":"python",".go":"go",".rs":"rust",".rb":"ruby",".java":"java",".kt":"kotlin",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cxx":"cpp",".hpp":"cpp",".hh":"cpp",".cs":"csharp",".php":"php",".swift":"swift",".scala":"scala",".lua":"lua",".pl":"perl",".r":"r",".dart":"dart",".ex":"elixir",".exs":"elixir",".erl":"erlang",".fs":"fsharp",".clj":"clojure",".hs":"haskell",".sh":"shellscript",".bash":"shellscript",".ps1":"powershell",".sql":"sql",".html":"html",".htm":"html",".css":"css",".scss":"scss",".less":"less",".json":"json",".yaml":"yaml",".yml":"yaml",".xml":"xml",".md":"markdown",".tex":"latex",".vue":"vue",".toml":"toml"};function _(J){let H=J.toLowerCase(),Q=H.startsWith(".")?H.slice(1):H;return p[H]??(Q===""?"plaintext":Q)}function l(J){let H=J.trim().toLowerCase().replace(/^\./,"");return/^[a-z0-9_+-]+$/.test(H)?`.${H}`:null}function n(J){let H=[],Q="",$=!1,W=!1;for(let B of J){if(B==='"'){$=!$,W=!0;continue}if(!$&&/\s/.test(B)){if(W)H.push(Q);Q="",W=!1;continue}Q+=B,W=!0}if($)return null;if(W)H.push(Q);return H}function F(J){let H={table:new Map,off:!1,problems:[]},Q=J.trim();if(Q==="")return H;if(Q.toLowerCase()==="off")return H.off=!0,H;for(let $ of Q.split(";")){let W=$.trim();if(W==="")continue;let B=W.indexOf("=");if(B<0){H.problems.push(`entry "${W}" has no "=" (ext[,ext]=argv, ext=off, or the bare value off)`);continue}let C=[];for(let Z of W.slice(0,B).split(",")){let z=l(Z);if(z===null){H.problems.push(`entry "${W}": "${Z.trim()}" is not a file extension (letters, digits, _ + -)`);continue}if(H.table.has(z)||C.includes(z)){H.problems.push(`entry "${W}": ${z} is listed twice`);continue}C.push(z)}let K=W.slice(B+1).trim(),Y=null;if(K.toLowerCase()!=="off"){let Z=n(K);if(Z===null){H.problems.push(`entry "${W}": unbalanced double quote in the argv`);continue}if(Z.length===0){H.problems.push(`entry "${W}": empty argv (ext=argv, or ext=off to disable)`);continue}Y=Z}for(let Z of C)H.table.set(Z,Y)}return H}function P(J){let{problems:H}=F(J);return H.length===0?null:H.join("; ")}function N(J={}){let H=(J.env??process.env).ROVECODE_LSP;if(H!==void 0)return{value:H,source:"env"};if(J.settings!==void 0)return{value:J.settings,source:"settings"};return{value:"",source:"default"}}function A(J={}){let H=F(N(J).value);if(H.off)return new Map;let Q=new Map;for(let[$,W]of i)Q.set($,[...W]);for(let[$,W]of H.table)if(W===null)Q.delete($);else Q.set($,W);return Q}function t(J){let H=Buffer.from(JSON.stringify(J),"utf8");return Buffer.concat([Buffer.from(`Content-Length: ${H.byteLength}\r
|
|
3
|
-
\r
|
|
4
|
-
`,"latin1"),H])}class E{buf=Buffer.alloc(0);push(J){this.buf=Buffer.concat([this.buf,Buffer.from(J)]);let H=[];for(;;){let Q=this.buf.indexOf(`\r
|
|
5
|
-
\r
|
|
6
|
-
`);if(Q<0)return H;let $=this.buf.subarray(0,Q).toString("latin1"),W=Number(/Content-Length:\s*(\d+)/i.exec($)?.[1]),B=Q+4;if(!Number.isFinite(W)||W<0){this.buf=this.buf.subarray(B);continue}if(this.buf.byteLength<B+W)return H;let C=this.buf.subarray(B,B+W).toString("utf8");this.buf=this.buf.subarray(B+W);try{H.push(JSON.parse(C))}catch{}}}}class R{opts;proc=null;parser=new E;nextId=1;pending=new Map;versions=new Map;diags=new Map;gen=new Map;pubVer=new Map;waiters=new Map;stateVal="idle";initPromise=null;constructor(J){this.opts={cmd:J.cmd,root:J.root,initTimeoutMs:J.initTimeoutMs??8000,settleMs:Math.min(J.settleMs??1500,2000),debounceMs:J.debounceMs??150}}get state(){return this.stateVal}get exited(){return this.proc?.exited??null}async touch(J){if(this.stateVal==="dead")return[];if(this.initPromise??=this.start().catch((Y)=>{throw this.becomeDead(),Y}),await this.initPromise,this.stateVal!=="ready")return[];let H=T(J).href,Q=o(J,"utf8"),$=this.gen.get(H)??0,W=this.versions.get(H),B=W===void 0?0:W+1;if(this.versions.set(H,B),W===void 0){let Y=_(s(J));this.notify("textDocument/didOpen",{textDocument:{uri:H,languageId:Y,version:B,text:Q}})}else this.notify("textDocument/didChange",{textDocument:{uri:H,version:B},contentChanges:[{text:Q}]});let C=Date.now()+this.opts.settleMs;if(!await this.waitPublish(H,$,C,B))return[];let K=this.gen.get(H)??0;while(Date.now()+this.opts.debounceMs<=C){if(!await this.waitPublish(H,K,Math.min(C,Date.now()+this.opts.debounceMs),B))break;K=this.gen.get(H)??0}return this.diags.get(H)??[]}kill(){this.becomeDead()}async start(){this.stateVal="starting",this.proc=Bun.spawn(this.opts.cmd,{cwd:this.opts.root,stdin:"pipe",stdout:"pipe",stderr:"ignore"}),this.proc.unref(),this.pump(),this.proc.exited.then(()=>this.becomeDead());let J=await this.request("initialize",{processId:process.pid,rootUri:T(this.opts.root).href,capabilities:{textDocument:{synchronization:{didOpen:!0,didChange:!0},publishDiagnostics:{versionSupport:!1}}},workspaceFolders:null},this.opts.initTimeoutMs);if(J.error)throw Error(`lsp initialize failed: ${J.error.message}`);this.notify("initialized",{}),this.stateVal="ready"}async pump(){let J=this.proc;if(!J)return;try{for await(let H of J.stdout)for(let Q of this.parser.push(H))try{this.dispatch(Q)}catch{}}catch{}}dispatch(J){if(!J||typeof J!=="object")return;let H=J;if(typeof H.id==="number"&&H.method===void 0){let Q=this.pending.get(H.id);if(Q)this.pending.delete(H.id),Q(H);return}if(H.method==="textDocument/publishDiagnostics"){let Q=H.params;if(!Q||typeof Q!=="object"||typeof Q.uri!=="string")return;if(this.diags.set(Q.uri,Array.isArray(Q.diagnostics)?Q.diagnostics:[]),typeof Q.version==="number")this.pubVer.set(Q.uri,Q.version);else this.pubVer.delete(Q.uri);this.gen.set(Q.uri,(this.gen.get(Q.uri)??0)+1);for(let $ of[...this.waiters.get(Q.uri)??[]])$();return}if(typeof H.id==="number")this.send({jsonrpc:"2.0",id:H.id,result:null})}request(J,H,Q){let $=this.nextId++;return this.send({jsonrpc:"2.0",id:$,method:J,params:H}),new Promise((W,B)=>{let C=setTimeout(()=>{this.pending.delete($),B(Error(`lsp request ${J} timed out after ${Q}ms`))},Q);this.pending.set($,(K)=>{clearTimeout(C),W(K)})})}notify(J,H){this.send({jsonrpc:"2.0",method:J,params:H})}send(J){let H=this.proc?.stdin;if(!H||this.stateVal==="dead")return;try{H.write(t(J)),H.flush()}catch{this.becomeDead()}}waitPublish(J,H,Q,$){let W=()=>{if((this.gen.get(J)??0)<=H)return!1;let B=this.pubVer.get(J);return B===void 0||B===$};if(W())return Promise.resolve(!0);if(this.stateVal==="dead"||Q<=Date.now())return Promise.resolve(!1);return new Promise((B)=>{let C=this.waiters.get(J)??new Set;this.waiters.set(J,C);let K=()=>{clearTimeout(Z),C.delete(Y),B(W())},Y=()=>{if(W()||this.stateVal==="dead")K()},Z=setTimeout(K,Q-Date.now());C.add(Y)})}becomeDead(){if(this.stateVal==="dead")return;this.stateVal="dead";for(let[J,H]of[...this.pending])this.pending.delete(J),H({jsonrpc:"2.0",id:J,error:{code:-1,message:"lsp server dead"}});for(let J of this.waiters.values())for(let H of[...J])H();try{this.proc?.kill()}catch{}try{this.proc?.ref()}catch{}}}var G=20;function m(J,H,Q="typescript-language-server"){let $=H.filter((C)=>C.severity===1);if($.length===0)return"";let W=$.slice(0,G).map((C)=>`ERROR [${C.range.start.line+1}:${C.range.start.character+1}] ${C.message}`),B=$.length>G?`
|
|
7
|
-
... and ${$.length-G} more`:"";return`
|
|
8
|
-
|
|
9
|
-
lsp-gate (${Q}): ${$.length} error(s) in ${J} \u2014 fix before proceeding:
|
|
10
|
-
${W.join(`
|
|
11
|
-
`)}${B}`}var c=M.join("\x00");function h(J){try{let H=b(J).lsp;return typeof H==="string"?H:void 0}catch{return}}function f(J){let H=J.split(/[\\/]/).pop()??"",$=(H.replace(/\.[^.]+$/,"")||H).replace(/[^A-Za-z0-9._-]/g,"");return $===""?"lsp":$}function g(J,H,Q){let $=J[0];if($===void 0||$==="")return null;let W=/[\\/]/.test($)?k(D(H,$))?D(H,$):null:Q($);return W===null?null:[W,...J.slice(1)]}function u(J,H){return H.servers??A({env:H.env??process.env,settings:H.settingsValue??h(J)})}function w(J={}){let H=J.root??process.cwd(),Q=Math.min(J.hardDeadlineMs??2000,2000),$=J.which??((Z)=>Bun.which(Z)),W={...J.settleMs!==void 0?{settleMs:J.settleMs}:{},...J.initTimeoutMs!==void 0?{initTimeoutMs:J.initTimeoutMs}:{},...J.debounceMs!==void 0?{debounceMs:J.debounceMs}:{}},B,C=new Map,K=null,Y=(Z)=>{let z=Z.join("\x00"),O=z===c,I=O&&J.serverName!==void 0?J.serverName:f(Z[0]??""),j=C.get(z);if(j===void 0){let q=O&&J.cmd!==void 0?J.cmd:g(O&&J.serverName!==void 0?[J.serverName,...Z.slice(1)]:Z,H,$);if(j=q===null?null:new R({cmd:q,root:H,...W}),C.set(z,j),j!==null)K=j}return{client:j,label:I}};return{get client(){return K},clients(){return[...C.values()].filter((Z)=>Z!==null)},async note(Z){B??=u(H,J);let z=B.get(HH(Z).toLowerCase());if(z===void 0)return"";let{client:O,label:I}=Y(z);if(O===null||O.state==="dead")return"";let j=O,q=await new Promise((U)=>{let V=setTimeout(()=>U(null),Q);j.touch(Z).then((d)=>{clearTimeout(V),U(d)},()=>{clearTimeout(V),U(null)})});return q===null?"":m(Z,q,I)},dispose(){for(let Z of C.values())Z?.kill()}}}function y(J,H=(W)=>Bun.which(W),Q="typescript-language-server",$={}){let W=[];if($.servers===void 0){let K=N({env:$.env??process.env,settings:$.settingsValue??h(J)}),Y=P(K.value);if(Y!==null)W.push(`lsp: the \`lsp\` table (${K.source==="env"?L:".rovecode/settings.json lsp"}) has a problem \u2014 ${Y}; that entry is ignored, the rest of the table applies`)}let B=u(J,$),C=new Map;for(let[K,Y]of B){let Z=Y.join("\x00"),z=C.get(Z);if(z)z.exts.push(K);else C.set(Z,{argv:Y,exts:[K]})}for(let[K,{argv:Y,exts:Z}]of C){if(K===c){if(!k(v(J,"tsconfig.json")))continue;if(H(Q)!==null)continue;W.push(`lsp: ${Q} is not on PATH \u2014 edits and writes are NOT type-checked, and the model gets no diagnostics after them (npm i -g typescript-language-server typescript)`);continue}if(g(Y,J,H)!==null)continue;let z=Y[0]??"",O=/[\\/]/.test(z)?`is not at ${D(J,z)}`:"is not on PATH";W.push(`lsp: ${z} (${Z.sort().join(", ")}) ${O} \u2014 edits to those files are NOT checked (the \`lsp\` setting names it; fix the path or install it)`)}return W}function a(J,H=($)=>Bun.which($),Q="typescript-language-server"){let $=y(J,H,Q);return $.length===0?null:$.map((W,B)=>B===0?W:` ${W.replace(/^lsp: /,"")}`).join(`
|
|
12
|
-
`)}var QH=4,X=new Map;function x(J,H,Q){let $=D(H??process.cwd()),W=X.get($);if(W!==void 0)X.delete($);else if(W=w({...Q,root:$}),X.size>=QH)for(let[B,C]of X){X.delete(B),C.dispose();break}return X.set($,W),W.note(J)}function r(J,H=x){if(J.kind!=="write")return J;return{...J,async execute(Q,$){let W=await J.execute(Q,$),B=Q.path;if(!W.ok||typeof B!=="string")return W;let C=JH(B)?B:v($.cwd,B);if(!k(C))return W;let K=await H(C);return K===""?W:{...W,output:W.output+K}}}}
|
|
13
|
-
export{a as sd,x as td,r as ud};
|