rovecode 0.4.0-beta.2 → 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 +67 -69
- package/THIRD_PARTY_NOTICES.md +0 -44
- package/bin/rovecode.ts +21 -0
- package/package.json +16 -37
- 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 -512
- package/bin/rovecode.js +0 -24
- package/dist/cli/app-dybnr56b.js +0 -2
- package/dist/cli/ask-user-p8hq4xgj.js +0 -2
- package/dist/cli/auth-login-ewpgw5sm.js +0 -2
- package/dist/cli/auth-m8p9grty.js +0 -2
- package/dist/cli/bench-xv3ypwev.js +0 -9
- package/dist/cli/catalog-737wb2s0.js +0 -2
- package/dist/cli/cli-arhg40m0.js +0 -2
- package/dist/cli/client-cf2pxx8q.js +0 -2
- package/dist/cli/commands-3p7e4xxs.js +0 -2
- package/dist/cli/connect-3q93d7cb.js +0 -2
- package/dist/cli/context-cmd-eqxmxhzq.js +0 -2
- package/dist/cli/context-report-hbw9zfes.js +0 -2
- package/dist/cli/count-remote-mby98cd0.js +0 -2
- package/dist/cli/design-122y0axd.js +0 -2
- package/dist/cli/dispatch-b4egzvvh.js +0 -2
- package/dist/cli/doctor-x4jkv72e.js +0 -3
- package/dist/cli/executor-ftvg6tsy.js +0 -2
- package/dist/cli/export-pdgdhkch.js +0 -2
- package/dist/cli/files-cez9a96p.js +0 -2
- package/dist/cli/gauntlet-r3xxaszc.js +0 -2
- package/dist/cli/gauntlet-runner-r515m7kk.js +0 -10
- package/dist/cli/gauntlet-wave3-bnkjk2v2.js +0 -5
- package/dist/cli/gauntlet-wave4-acs9s60q.js +0 -14
- package/dist/cli/hashline-ewg5hbe3.js +0 -2
- package/dist/cli/http-n0kehsk8.js +0 -5
- package/dist/cli/index-z5qt1s76.js +0 -2
- package/dist/cli/install-80mp63kx.js +0 -2
- package/dist/cli/loop-12twjcat.js +0 -2
- package/dist/cli/main-01pv9206.js +0 -4
- package/dist/cli/main-0jys2ccn.js +0 -3
- package/dist/cli/main-1ztz6fkj.js +0 -10
- package/dist/cli/main-23q7cmww.js +0 -9
- package/dist/cli/main-2rzbexn2.js +0 -3
- package/dist/cli/main-2wyax8k9.js +0 -9
- package/dist/cli/main-2yeveeve.js +0 -6
- package/dist/cli/main-2z3dek0b.js +0 -3
- package/dist/cli/main-2zgsknth.js +0 -3
- package/dist/cli/main-45ejth3a.js +0 -4
- package/dist/cli/main-45rn3trk.js +0 -22
- package/dist/cli/main-4p4e2w7x.js +0 -4
- package/dist/cli/main-4y0tnfpa.js +0 -16
- package/dist/cli/main-5py0rkmc.js +0 -4
- package/dist/cli/main-6dtqmbt6.js +0 -7
- package/dist/cli/main-6h9x282m.js +0 -4
- package/dist/cli/main-6vjeds42.js +0 -3
- package/dist/cli/main-78gq4bt9.js +0 -6
- package/dist/cli/main-7jd5vh3x.js +0 -4
- package/dist/cli/main-7kt6r53y.js +0 -4
- package/dist/cli/main-8c1tbazx.js +0 -58
- package/dist/cli/main-9a9rnh47.js +0 -19
- package/dist/cli/main-9ht36z12.js +0 -3
- package/dist/cli/main-a2yfvcy9.js +0 -7
- package/dist/cli/main-a3f51n0x.js +0 -5
- package/dist/cli/main-b8zq261k.js +0 -3
- package/dist/cli/main-bxtvnf6d.js +0 -13
- package/dist/cli/main-edxc3yzt.js +0 -4
- package/dist/cli/main-evgz4mp5.js +0 -21
- package/dist/cli/main-f33fc5je.js +0 -9
- package/dist/cli/main-fvnpq46y.js +0 -12
- package/dist/cli/main-gbbty4d4.js +0 -3
- package/dist/cli/main-gth53dnt.js +0 -25
- package/dist/cli/main-hqbz10aw.js +0 -9
- package/dist/cli/main-hrrvcfan.js +0 -38
- package/dist/cli/main-hzwtsb2m.js +0 -5
- package/dist/cli/main-j7ttv0sd.js +0 -34
- package/dist/cli/main-jak598k9.js +0 -5
- package/dist/cli/main-kba6zeyd.js +0 -6
- package/dist/cli/main-kwwsz6rq.js +0 -3
- package/dist/cli/main-m8vm17zq.js +0 -3
- package/dist/cli/main-mg4f96e1.js +0 -3
- package/dist/cli/main-mg9b20ac.js +0 -18
- package/dist/cli/main-mgb9ccnx.js +0 -3
- package/dist/cli/main-mjt2p7aj.js +0 -3
- package/dist/cli/main-n6qrdbmy.js +0 -3
- package/dist/cli/main-na7wse0x.js +0 -5
- package/dist/cli/main-nqveez48.js +0 -4
- package/dist/cli/main-ntqef02r.js +0 -10
- package/dist/cli/main-nvc3yjay.js +0 -136
- package/dist/cli/main-p0cfn6nr.js +0 -16
- package/dist/cli/main-qj2djy17.js +0 -19
- package/dist/cli/main-qsevpgsv.js +0 -3
- package/dist/cli/main-qvarybsp.js +0 -3
- package/dist/cli/main-rebtt91r.js +0 -5
- package/dist/cli/main-rpg7h8mb.js +0 -3
- package/dist/cli/main-rsy72qmw.js +0 -15
- package/dist/cli/main-rvetps99.js +0 -18
- package/dist/cli/main-s4bb0jav.js +0 -3
- package/dist/cli/main-s9v8k74e.js +0 -3
- package/dist/cli/main-tjvwmscs.js +0 -3
- package/dist/cli/main-tkgarpjj.js +0 -4
- package/dist/cli/main-v8y60bb2.js +0 -3
- package/dist/cli/main-vhrrq337.js +0 -3
- package/dist/cli/main-vp2dfb7s.js +0 -4
- package/dist/cli/main-vqbr22sz.js +0 -8
- package/dist/cli/main-vxnwe5xx.js +0 -18
- package/dist/cli/main-wgph00xf.js +0 -5
- package/dist/cli/main-wk2csfnj.js +0 -5
- package/dist/cli/main-wm997zjx.js +0 -3
- package/dist/cli/main-wpkyraxh.js +0 -3
- package/dist/cli/main-wqt32p5x.js +0 -4
- package/dist/cli/main-x9ct6y1a.js +0 -3
- package/dist/cli/main-xfekqh9m.js +0 -7
- package/dist/cli/main-xt9zc3n6.js +0 -7
- package/dist/cli/main-xx2z3zh5.js +0 -4
- package/dist/cli/main-y5c82rxr.js +0 -3
- package/dist/cli/main-yrjt2sqt.js +0 -14
- package/dist/cli/main-ys6zj3yr.js +0 -3
- package/dist/cli/main-ywbxshqc.js +0 -8
- package/dist/cli/main-z13755t8.js +0 -25
- package/dist/cli/main-zc7pyrbj.js +0 -4
- package/dist/cli/main.js +0 -279
- package/dist/cli/market-cmd-bm5xvn9f.js +0 -5
- package/dist/cli/mcp-login-bthtfpt7.js +0 -2
- package/dist/cli/mcp-market-cmd-mbeshfyd.js +0 -2
- package/dist/cli/notify-54v5z9dz.js +0 -2
- package/dist/cli/oauth-g5gme95c.js +0 -2
- package/dist/cli/output-satndjap.js +0 -16
- package/dist/cli/profiles-sfhpbq3m.js +0 -2
- package/dist/cli/provider-config-hv3xtdt4.js +0 -2
- package/dist/cli/provider-kwzq6g84.js +0 -2
- package/dist/cli/registry-fh0hdnyn.js +0 -2
- package/dist/cli/registry-y1y8e94r.js +0 -2
- package/dist/cli/repl-t4z03mqq.js +0 -11
- package/dist/cli/resume-fqt4chg8.js +0 -2
- package/dist/cli/run-flags-rysbag9t.js +0 -2
- package/dist/cli/runtime-j19fjbsa.js +0 -2
- package/dist/cli/sandbox-config-g4qxd7y5.js +0 -2
- package/dist/cli/server-r0b6bksk.js +0 -5
- package/dist/cli/session-arg-txmn5g4x.js +0 -2
- package/dist/cli/session-ed250d9j.js +0 -2
- package/dist/cli/sessions-cmd-adw7svfn.js +0 -7
- package/dist/cli/settings-y9rzcqx8.js +0 -2
- package/dist/cli/setup-jmbr11j0.js +0 -2
- package/dist/cli/sextant-smoke-tcth0vea.js +0 -5
- package/dist/cli/skills-cmd-zbdy99v6.js +0 -2
- package/dist/cli/smoke-1bg937kx.js +0 -8
- package/dist/cli/start-chat-p01cdks3.js +0 -12
- package/dist/cli/stream-4wmyaypz.js +0 -2
- package/dist/cli/task-eg4s093s.js +0 -2
- package/dist/cli/tasks-12v9rr9k.js +0 -2
- package/dist/cli/thinking-a5ngvqyh.js +0 -2
- package/dist/cli/todo-1wxpcecx.js +0 -2
- package/dist/cli/tools-2ftsya7w.js +0 -2
- package/dist/cli/tools-x1tj4fxm.js +0 -2
- package/dist/cli/trust-cmd-hccxehzb.js +0 -2
- package/dist/cli/update-check-ygt3vd7m.js +0 -2
- package/dist/cli/update-cmd-v23qhr8c.js +0 -2
- package/dist/cli/voice-g1gtck92.js +0 -2
- package/dist/cli/webfetch-0nnrjgb5.js +0 -2
- package/dist/cli/websearch-f0vr2p7d.js +0 -2
- package/dist/cli/workspace-9rq1w4ta.js +0 -2
- package/dist/lib/index.js +0 -62
- package/dist/lib/models-index.json +0 -1
- package/dist/lib/plugins.js +0 -6
- package/dist/lib/providers.js +0 -17
- package/dist/lib/public-api.js +0 -20
- package/dist/rovecode.exe +0 -4
- /package/{dist/cli → src/providers}/models-index.json +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** ported from the user's sextant v0.4.0 prototype, src/app.js lines 16-37 (THEMES, buildTheme, st) + term.js (rgb, mix, hex) */
|
|
2
|
+
/* Palettes and their derived mixes for the sextant surface. Pure: no I/O, no clock. The derived
|
|
3
|
+
values are byte-for-byte the prototype's (same mix() arithmetic); sextant-theme.test.ts pins
|
|
4
|
+
every number for all three palettes. */
|
|
5
|
+
|
|
6
|
+
import { THEME_ORDER, type Style, type Theme, type ThemeName } from "./types.ts";
|
|
7
|
+
|
|
8
|
+
export { THEME_ORDER };
|
|
9
|
+
|
|
10
|
+
/** a palette as authored: "#rrggbb" strings plus the human label */
|
|
11
|
+
export interface Palette {
|
|
12
|
+
label: string;
|
|
13
|
+
bg: string; bg2: string; fg: string; fg2: string; muted: string; dim: string;
|
|
14
|
+
rule: string; rule2: string; accent: string; accent2: string;
|
|
15
|
+
ok: string; err: string; warn: string; info: string; str: string; ty: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const THEMES: Readonly<Record<ThemeName, Palette>> = {
|
|
19
|
+
night: { label: "Gece + nane", bg: "#0b0e12", bg2: "#11161c", fg: "#e6edf3", fg2: "#aab4bf", muted: "#7d8590", dim: "#4b545e", rule: "#2a323b", rule2: "#3a4550", accent: "#3ddbb9", accent2: "#9af2df", ok: "#3fb950", err: "#f0605d", warn: "#e3b341", info: "#79c0ff", str: "#9ee7d6", ty: "#b6c2ce" },
|
|
20
|
+
ember: { label: "Mürekkep + kor", bg: "#0f0c0b", bg2: "#171210", fg: "#f2eae2", fg2: "#c9bcb0", muted: "#8c817a", dim: "#554c46", rule: "#332b27", rule2: "#463a34", accent: "#ff7a45", accent2: "#ffb08a", ok: "#6cc783", err: "#ef5a5a", warn: "#f4b942", info: "#8fb8e8", str: "#ffb38a", ty: "#cdbfb3" },
|
|
21
|
+
contrast: { label: "Saf kontrast", bg: "#000000", bg2: "#0b0b0b", fg: "#ffffff", fg2: "#d4d4d4", muted: "#8a8a8a", dim: "#4c4c4c", rule: "#3a3a3a", rule2: "#4a4a4a", accent: "#ffffff", accent2: "#ffffff", ok: "#4ade80", err: "#f87171", warn: "#fbbf24", info: "#93c5fd", str: "#d4d4d4", ty: "#bdbdbd" },
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** "#rrggbb" → packed 0xRRGGBB */
|
|
25
|
+
export const rgb = (h: string): number => parseInt(h.slice(1), 16);
|
|
26
|
+
|
|
27
|
+
/** per-channel linear blend of two packed colors, rounded (term.js mix — the derived-color arithmetic) */
|
|
28
|
+
export function mix(c1: number, c2: number, t: number): number {
|
|
29
|
+
const r = Math.round(((c1 >> 16) & 255) + ((((c2 >> 16) & 255) - ((c1 >> 16) & 255)) * t));
|
|
30
|
+
const g = Math.round(((c1 >> 8) & 255) + ((((c2 >> 8) & 255) - ((c1 >> 8) & 255)) * t));
|
|
31
|
+
const b = Math.round((c1 & 255) + (((c2 & 255) - (c1 & 255)) * t));
|
|
32
|
+
return (r << 16) | (g << 8) | b;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** packed color → "#rrggbb" */
|
|
36
|
+
export const hex = (c: number): string => "#" + (c >>> 0).toString(16).padStart(6, "0");
|
|
37
|
+
|
|
38
|
+
export function isThemeName(name: string): name is ThemeName {
|
|
39
|
+
return Object.hasOwn(THEMES, name);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** palette → packed ints + derived mixes; an unknown name falls back to "night" (prototype behavior) */
|
|
43
|
+
export function buildTheme(name: string): Theme {
|
|
44
|
+
const n: ThemeName = isThemeName(name) ? name : "night";
|
|
45
|
+
const t = THEMES[n];
|
|
46
|
+
const bg = rgb(t.bg), fg = rgb(t.fg), fg2 = rgb(t.fg2), accent = rgb(t.accent), ok = rgb(t.ok), err = rgb(t.err);
|
|
47
|
+
return {
|
|
48
|
+
name: n,
|
|
49
|
+
label: t.label,
|
|
50
|
+
bg, bg2: rgb(t.bg2), fg, fg2, muted: rgb(t.muted), dim: rgb(t.dim),
|
|
51
|
+
rule: rgb(t.rule), rule2: rgb(t.rule2), accent, accent2: rgb(t.accent2),
|
|
52
|
+
ok, err, warn: rgb(t.warn), info: rgb(t.info), str: rgb(t.str), ty: rgb(t.ty),
|
|
53
|
+
hlBg: mix(bg, accent, 0.12),
|
|
54
|
+
addBg: mix(bg, ok, 0.15),
|
|
55
|
+
delBg: mix(bg, err, 0.15),
|
|
56
|
+
selBg: mix(bg, fg, 0.08),
|
|
57
|
+
accentDim: mix(bg, accent, 0.45),
|
|
58
|
+
okDim: mix(bg, ok, 0.55),
|
|
59
|
+
mixDim: mix(bg, fg2, 0.55),
|
|
60
|
+
frame: mix(bg, fg, 0.28),
|
|
61
|
+
frameDim: mix(bg, fg, 0.17),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** style literal: fg, optional bg (-1 = keep the cell's), attribute bits (ATTR) */
|
|
66
|
+
export const st = (fg: number, bg = -1, a = 0): Style => ({ fg, bg, a });
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/** Sextant tool rows (port #41): RunEvent tool name + args → the compact row's verb/label, the
|
|
2
|
+
* activity it drives and the code-panel target; tool output → the row's trailing detail. Ported
|
|
3
|
+
* from the user's sextant v0.4.0 app.js scenario verbs (read/edit/write/remove/run/search) — here
|
|
4
|
+
* derived from rovecode's real tools (coding/hashline.ts, coding/files.ts, tools/webfetch.ts, tools/task.ts). */
|
|
5
|
+
|
|
6
|
+
import { isAbsolute, relative } from "node:path";
|
|
7
|
+
import type { ActivityState } from "./types.ts";
|
|
8
|
+
|
|
9
|
+
export interface CallDesc {
|
|
10
|
+
/** "read" | "edit" | "write" | "remove" | "run" | "search" | "fetch" | "task" | "other" */
|
|
11
|
+
verb: string;
|
|
12
|
+
label: string;
|
|
13
|
+
/** cwd-relative posix path for file tools, else null */
|
|
14
|
+
path: string | null;
|
|
15
|
+
/** mark the file touched (diamond spinner) + open the tree to it */
|
|
16
|
+
touch: boolean;
|
|
17
|
+
state: ActivityState;
|
|
18
|
+
activity: string;
|
|
19
|
+
/** 1-based highlight range for the code panel (read window / edit anchors) */
|
|
20
|
+
hl: [number, number] | null;
|
|
21
|
+
add: number;
|
|
22
|
+
del: number;
|
|
23
|
+
cmd: string | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CallEnd {
|
|
27
|
+
detail?: string;
|
|
28
|
+
add?: number;
|
|
29
|
+
del?: number;
|
|
30
|
+
/** bash: output lines (exit= header stripped) */
|
|
31
|
+
runLines?: string[];
|
|
32
|
+
/** bash: the `exit=N` header's code (absent when the output carries none) */
|
|
33
|
+
exitCode?: number;
|
|
34
|
+
/** glob/grep: result lines */
|
|
35
|
+
searchLines?: string[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const LABEL_MAX = 48;
|
|
39
|
+
const DETAIL_MAX = 80;
|
|
40
|
+
const SEARCH_LINES_MAX = 500;
|
|
41
|
+
const TEST_CMD = /\b(tests?|vitest|jest|pytest|mocha|spec)\b/i;
|
|
42
|
+
|
|
43
|
+
const rec = (v: unknown): Record<string, unknown> => (v && typeof v === "object" && !Array.isArray(v) ? (v as Record<string, unknown>) : {});
|
|
44
|
+
const str = (v: unknown): string => (typeof v === "string" ? v : "");
|
|
45
|
+
const num = (v: unknown): number | undefined => (typeof v === "number" && Number.isFinite(v) && v > 0 ? Math.floor(v) : undefined);
|
|
46
|
+
|
|
47
|
+
/** Surrogate-safe clip with an ellipsis (code points, one cell each). */
|
|
48
|
+
export function clipText(s: string, max: number): string {
|
|
49
|
+
const cps = [...s];
|
|
50
|
+
return cps.length <= max ? s : cps.slice(0, Math.max(0, max - 1)).join("") + "…";
|
|
51
|
+
}
|
|
52
|
+
/** First non-empty line, whitespace collapsed, clipped. */
|
|
53
|
+
export function firstLine(s: string, max = DETAIL_MAX): string {
|
|
54
|
+
const line = s.split(/\r?\n/).find((l) => l.trim().length > 0) ?? "";
|
|
55
|
+
return clipText(line.replace(/\s+/g, " ").trim(), max);
|
|
56
|
+
}
|
|
57
|
+
function lastLine(s: string, max = DETAIL_MAX): string {
|
|
58
|
+
const lines = s.split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
59
|
+
return clipText((lines[lines.length - 1] ?? "").replace(/\s+/g, " ").trim(), max);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** cwd-relative posix path: absolute paths under cwd become relative, others stay absolute
|
|
63
|
+
* (posix separators either way — never a `..` escape, never derived across drives). */
|
|
64
|
+
export function relPath(cwd: string, p: string): string {
|
|
65
|
+
if (!p) return "";
|
|
66
|
+
let r = p;
|
|
67
|
+
if (isAbsolute(p)) {
|
|
68
|
+
const rel = relative(cwd, p);
|
|
69
|
+
r = rel && !rel.startsWith("..") && !isAbsolute(rel) ? rel : p;
|
|
70
|
+
} else if (WIN_ABS.test(p)) {
|
|
71
|
+
// a drive-letter path on a POSIX host (a session replayed from Windows, a model that writes them):
|
|
72
|
+
// node's path module does not know it is absolute, so relativize by prefix, case-insensitively
|
|
73
|
+
const P = posixly(p), C = posixly(cwd).replace(/\/+$/, "");
|
|
74
|
+
if (C && P.toLowerCase().startsWith(C.toLowerCase() + "/")) r = P.slice(C.length + 1);
|
|
75
|
+
}
|
|
76
|
+
return posixly(r).replace(/^\.\/+/, "");
|
|
77
|
+
}
|
|
78
|
+
const WIN_ABS = /^[A-Za-z]:[\\/]/;
|
|
79
|
+
const posixly = (s: string): string => s.replace(/\\/g, "/");
|
|
80
|
+
export const baseName = (p: string): string => p.slice(p.lastIndexOf("/") + 1) || p;
|
|
81
|
+
|
|
82
|
+
function hostOf(url: string): string {
|
|
83
|
+
try { return new URL(url).host || clipText(url, LABEL_MAX); } catch { return clipText(url, LABEL_MAX) || "url"; }
|
|
84
|
+
}
|
|
85
|
+
const cmdHead = (cmd: string): string => clipText(cmd.replace(/\s+/g, " ").trim(), LABEL_MAX);
|
|
86
|
+
|
|
87
|
+
const file = (verb: string, cwd: string, a: Record<string, unknown>, state: ActivityState, word: string, extra: Partial<CallDesc> = {}): CallDesc => {
|
|
88
|
+
const path = relPath(cwd, str(a.path));
|
|
89
|
+
const base = baseName(path) || "file";
|
|
90
|
+
return { verb, label: base, path: path || null, touch: true, state, activity: `${word} ${base}`, hl: null, add: 0, del: 0, cmd: null, ...extra };
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/** What a starting tool call means for the surface. */
|
|
94
|
+
export function describeCall(tool: string, args: unknown, cwd: string): CallDesc {
|
|
95
|
+
const a = rec(args);
|
|
96
|
+
switch (tool) {
|
|
97
|
+
case "read": {
|
|
98
|
+
const off = num(a.offset), lim = num(a.limit);
|
|
99
|
+
const hl: [number, number] | null = off !== undefined || lim !== undefined ? [off ?? 1, (off ?? 1) + (lim ?? 2000) - 1] : null;
|
|
100
|
+
return file("read", cwd, a, "READING", "reading", { hl });
|
|
101
|
+
}
|
|
102
|
+
case "edit": {
|
|
103
|
+
const edits = Array.isArray(a.edits) ? a.edits : [];
|
|
104
|
+
let add = 0, lo = Infinity, hi = -Infinity;
|
|
105
|
+
for (const e of edits) {
|
|
106
|
+
const r = rec(e);
|
|
107
|
+
const n = Array.isArray(r.newLines) ? r.newLines.length : 0;
|
|
108
|
+
add += n;
|
|
109
|
+
const line = num(r.anchorLine);
|
|
110
|
+
if (line !== undefined) { lo = Math.min(lo, line); hi = Math.max(hi, line + Math.max(0, n - 1)); }
|
|
111
|
+
}
|
|
112
|
+
return file("edit", cwd, a, "EDITING", "editing", { add, del: edits.length, hl: lo <= hi ? [lo, hi] : null });
|
|
113
|
+
}
|
|
114
|
+
case "write": {
|
|
115
|
+
const content = str(a.content);
|
|
116
|
+
return file("write", cwd, a, "EDITING", "writing", { add: content ? content.split(/\r?\n/).length : 0 });
|
|
117
|
+
}
|
|
118
|
+
case "remove": case "rm": case "delete": case "unlink":
|
|
119
|
+
return file("remove", cwd, a, "EDITING", "removing");
|
|
120
|
+
case "bash": case "shell": case "run": {
|
|
121
|
+
const cmd = str(a.command) || str(a.cmd);
|
|
122
|
+
const head = cmdHead(cmd) || "command";
|
|
123
|
+
const testing = TEST_CMD.test(cmd);
|
|
124
|
+
return { verb: "run", label: head, path: null, touch: false, state: testing ? "TESTING" : "RUNNING", activity: testing ? "running tests" : `running ${head}`, hl: null, add: 0, del: 0, cmd };
|
|
125
|
+
}
|
|
126
|
+
case "glob": case "grep": {
|
|
127
|
+
const q = clipText(str(a.pattern), LABEL_MAX) || tool;
|
|
128
|
+
return { verb: "search", label: q, path: null, touch: false, state: "READING", activity: `searching ${q}`, hl: null, add: 0, del: 0, cmd: null };
|
|
129
|
+
}
|
|
130
|
+
case "ls": {
|
|
131
|
+
const p = relPath(cwd, str(a.path)) || ".";
|
|
132
|
+
return { verb: "other", label: p, path: null, touch: false, state: "READING", activity: `listing ${p}`, hl: null, add: 0, del: 0, cmd: null };
|
|
133
|
+
}
|
|
134
|
+
case "web_fetch": {
|
|
135
|
+
const host = hostOf(str(a.url));
|
|
136
|
+
return { verb: "fetch", label: host, path: null, touch: false, state: "READING", activity: `fetching ${host}`, hl: null, add: 0, del: 0, cmd: null };
|
|
137
|
+
}
|
|
138
|
+
case "task": {
|
|
139
|
+
const label = clipText(str(a.label) || str(a.agent) || "task", LABEL_MAX);
|
|
140
|
+
return { verb: "task", label, path: null, touch: false, state: "DELEGATING", activity: `delegating ${label}`, hl: null, add: 0, del: 0, cmd: null };
|
|
141
|
+
}
|
|
142
|
+
case "ask_user":
|
|
143
|
+
return { verb: "other", label: clipText(firstLine(str(a.question), LABEL_MAX) || "question", LABEL_MAX), path: null, touch: false, state: "WAITING", activity: "waiting for you", hl: null, add: 0, del: 0, cmd: null };
|
|
144
|
+
case "todo_write": case "todo_read":
|
|
145
|
+
return { verb: "other", label: "todos", path: null, touch: false, state: "THINKING", activity: "planning", hl: null, add: 0, del: 0, cmd: null };
|
|
146
|
+
default:
|
|
147
|
+
return { verb: "other", label: clipText(tool, LABEL_MAX), path: null, touch: false, state: "RUNNING", activity: `running ${tool}`, hl: null, add: 0, del: 0, cmd: null };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Lines of the read window from the footer `(showing lines X-Y of Z)`, else the anchored-line count. */
|
|
152
|
+
function readLineCount(output: string): number {
|
|
153
|
+
const m = /\(showing lines (\d+)-(\d+) of (\d+)\)/.exec(output);
|
|
154
|
+
if (m) { const a = Number(m[1]), b = Number(m[2]); return b >= a && a > 0 ? b - a + 1 : 0; }
|
|
155
|
+
return output.split(/\r?\n/).filter((l) => /^\d+#/.test(l)).length;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** a rejection's ` at <abs path>:<line>` locator (coding/hashline.ts describeEditFailure): the row's label
|
|
159
|
+
* already names the file and the locator alone can fill the 80-cell detail, so the reason and the
|
|
160
|
+
* "line N now reads …" tail take its place */
|
|
161
|
+
const dropLocator = (s: string): string => s.replace(/ at \S.*?:\d+(?=\s|$)/, "");
|
|
162
|
+
|
|
163
|
+
/** The row's trailing detail (and panel payloads) when a tool call ends. A command's output is
|
|
164
|
+
* parsed whether it passed or failed (a red test run is exactly when the run panel matters);
|
|
165
|
+
* every other failed call reports its first output line — a file tool's without the path locator. */
|
|
166
|
+
export function summarizeEnd(desc: Pick<CallDesc, "verb">, tool: string, ok: boolean, output: string): CallEnd {
|
|
167
|
+
if (desc.verb === "run") {
|
|
168
|
+
const m = /^exit=(-?\d+)\r?\n?/.exec(output);
|
|
169
|
+
const text = m ? output.slice(m[0].length) : output;
|
|
170
|
+
const lines = text.split(/\r?\n/);
|
|
171
|
+
while (lines.length && lines[lines.length - 1]!.trim() === "") lines.pop();
|
|
172
|
+
const last = lastLine(text);
|
|
173
|
+
return { detail: last || (m ? `exit ${m[1]}` : ""), runLines: lines, ...(m ? { exitCode: Number(m[1]) } : {}) };
|
|
174
|
+
}
|
|
175
|
+
if (!ok) return { detail: firstLine(desc.verb === "edit" || desc.verb === "write" ? dropLocator(output) : output) };
|
|
176
|
+
switch (desc.verb) {
|
|
177
|
+
case "read": return { detail: `${readLineCount(output)} lines` };
|
|
178
|
+
case "edit": return {};
|
|
179
|
+
case "write": { const m = /\((\d+) bytes/.exec(output); return m ? { detail: `${m[1]} bytes` } : {}; }
|
|
180
|
+
case "remove": return {};
|
|
181
|
+
case "search": {
|
|
182
|
+
const lines = output.split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
183
|
+
const hits = lines.filter((l) => !l.startsWith("(")).length;
|
|
184
|
+
return { detail: `${hits} ${tool === "glob" ? (hits === 1 ? "file" : "files") : (hits === 1 ? "match" : "matches")}`, searchLines: lines.slice(0, SEARCH_LINES_MAX) };
|
|
185
|
+
}
|
|
186
|
+
case "fetch": return { detail: `${output.length} chars` };
|
|
187
|
+
default: return { detail: firstLine(output) };
|
|
188
|
+
}
|
|
189
|
+
}
|