one-code-extension 0.4.1 → 0.6.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 +16 -5
- package/agents/general-purpose.md +2 -2
- package/docs/guide/README.md +2 -1
- package/docs/guide/bring-your-claude-code-setup.md +60 -9
- package/docs/guide/configuration.md +48 -14
- package/docs/guide/differences-from-claude-code.md +40 -28
- package/docs/guide/doctor.md +20 -13
- package/docs/guide/hooks.md +18 -3
- package/docs/guide/installation.md +26 -4
- package/docs/guide/permissions-modes-and-auto-mode.md +225 -49
- package/docs/guide/providers-and-models.md +137 -54
- package/docs/guide/reference.md +27 -15
- package/docs/guide/sessions-and-context.md +69 -16
- package/docs/guide/skills-plugins-and-mcp.md +57 -20
- package/docs/guide/subagents-and-workflows.md +95 -29
- package/docs/guide/tasks-and-background-work.md +101 -26
- package/docs/guide/terminal-interface.md +24 -12
- package/docs/guide/tools.md +46 -5
- package/docs/guide/troubleshooting.md +13 -9
- package/docs/guide/windows.md +58 -31
- package/extensions/artifacts/gallery.ts +227 -0
- package/extensions/artifacts/index.ts +288 -0
- package/extensions/artifacts/store.ts +570 -0
- package/extensions/artifacts/viewer.ts +199 -0
- package/extensions/ask-user/description.ts +67 -0
- package/extensions/ask-user/dialogs.ts +80 -0
- package/extensions/ask-user/index.ts +37 -33
- package/extensions/ask-user/questions.ts +32 -7
- package/extensions/ask-user/widget.ts +45 -25
- package/extensions/auto-mode/actions.ts +6 -0
- package/extensions/auto-mode/cache.ts +88 -0
- package/extensions/auto-mode/classifier-prompt.ts +5 -4
- package/extensions/auto-mode/classifier.ts +290 -65
- package/extensions/auto-mode/config.ts +72 -20
- package/extensions/auto-mode/decision-log.ts +2 -0
- package/extensions/auto-mode/defaults.ts +1 -1
- package/extensions/auto-mode/denials.ts +124 -0
- package/extensions/auto-mode/git-checkout-programs.ts +187 -0
- package/extensions/auto-mode/git-status-meta.ts +159 -0
- package/extensions/auto-mode/history.ts +189 -0
- package/extensions/auto-mode/instructions.ts +58 -52
- package/extensions/auto-mode/model-select.ts +159 -134
- package/extensions/auto-mode/paths.ts +57 -5
- package/extensions/auto-mode/pause.ts +57 -2
- package/extensions/auto-mode/prompt.ts +37 -21
- package/extensions/auto-mode/read-only-options.ts +724 -0
- package/extensions/auto-mode/resolved-paths-meta.ts +133 -0
- package/extensions/auto-mode/rules.ts +18 -1
- package/extensions/auto-mode/safety-floor.ts +361 -18
- package/extensions/auto-mode/setup-run.ts +20 -14
- package/extensions/auto-mode/shell-analysis.ts +764 -490
- package/extensions/auto-mode/shell-parse.ts +885 -0
- package/extensions/auto-mode/system-note.ts +33 -0
- package/extensions/auto-mode/transcript.ts +80 -51
- package/extensions/background/cron.ts +642 -0
- package/extensions/background/index.ts +614 -248
- package/extensions/background/loop-fire.ts +173 -0
- package/extensions/background/loop-preamble.ts +59 -0
- package/extensions/background/loop-skill.ts +163 -0
- package/extensions/background/monitor-batch.ts +53 -0
- package/extensions/background/noop-fold.ts +128 -0
- package/extensions/background/switch-guard.ts +56 -0
- package/extensions/background/wakeup.ts +178 -55
- package/extensions/bash/background.ts +53 -17
- package/extensions/bash/child.ts +7 -0
- package/extensions/bash/description.ts +188 -0
- package/extensions/bash/guards.ts +15 -67
- package/extensions/bash/index.ts +66 -35
- package/extensions/branding/compaction-keep.ts +63 -0
- package/extensions/branding/declined.ts +22 -0
- package/extensions/branding/index.ts +133 -9
- package/extensions/branding/prompt-editor.ts +53 -6
- package/extensions/branding/queued-edit.ts +31 -0
- package/extensions/branding/replaced-builtins.ts +68 -0
- package/extensions/branding/startup.ts +33 -71
- package/extensions/btw/index.ts +250 -78
- package/extensions/btw/panel.ts +228 -100
- package/extensions/btw/prompt.ts +41 -4
- package/extensions/cache-marks/index.ts +42 -0
- package/extensions/claude-compat/index.ts +7 -11
- package/extensions/claude-context/index.ts +436 -63
- package/extensions/compaction/cut.ts +157 -0
- package/extensions/compaction/index.ts +219 -75
- package/extensions/compaction/kept-thinking.ts +62 -0
- package/extensions/compaction/prompt.ts +15 -12
- package/extensions/context-budget/budget.ts +16 -2
- package/extensions/context-budget/index.ts +35 -15
- package/extensions/context-management/index.ts +36 -28
- package/extensions/doctor/build.ts +59 -8
- package/extensions/doctor/builtins.ts +84 -0
- package/extensions/doctor/cli.ts +7 -1
- package/extensions/doctor/compat.ts +88 -23
- package/extensions/doctor/dependencies.ts +41 -5
- package/extensions/doctor/fix-prompt.ts +9 -2
- package/extensions/doctor/index.ts +102 -58
- package/extensions/doctor/models.ts +102 -63
- package/extensions/doctor/presets.ts +42 -27
- package/extensions/doctor/report.ts +19 -2
- package/extensions/doctor/viewer.ts +49 -27
- package/extensions/effort/index.ts +141 -25
- package/extensions/effort/settings.ts +21 -0
- package/extensions/effort/slider.ts +24 -20
- package/extensions/exit/index.ts +32 -1
- package/extensions/file-tracker/index.ts +420 -42
- package/extensions/file-tracker/replay.ts +137 -24
- package/extensions/file-tracker/restore.ts +66 -0
- package/extensions/file-tracker/results.ts +66 -0
- package/extensions/file-tracker/shell-reads.ts +211 -0
- package/extensions/file-tracker/tracker.ts +45 -15
- package/extensions/footer/footer-line.ts +45 -24
- package/extensions/footer/index.ts +47 -2
- package/extensions/footer/pr.ts +34 -5
- package/extensions/hooks/compaction.ts +7 -0
- package/extensions/hooks/executor.ts +32 -30
- package/extensions/hooks/index.ts +209 -58
- package/extensions/hooks/matcher.ts +3 -0
- package/extensions/hooks/prompt-context.ts +59 -0
- package/extensions/hooks/protocol.ts +41 -3
- package/extensions/hooks/settings.ts +50 -19
- package/extensions/hooks/subagent-bridge.ts +2 -0
- package/extensions/hooks/trust.ts +26 -12
- package/extensions/idle-compact/index.ts +119 -0
- package/extensions/idle-compact/policy.ts +143 -0
- package/extensions/init/index.ts +11 -10
- package/extensions/init/prompt.ts +25 -32
- package/extensions/interrupted/index.ts +13 -1
- package/extensions/kept-thinking/index.ts +27 -0
- package/extensions/ledger/index.ts +46 -0
- package/extensions/ledger/wire.ts +154 -0
- package/extensions/lib/agent-cron.ts +146 -0
- package/extensions/lib/agent-loader.ts +18 -3
- package/extensions/lib/agent-view.ts +85 -0
- package/extensions/lib/anthropic-auth.ts +98 -0
- package/extensions/lib/anthropic-payload.ts +82 -1
- package/extensions/lib/anthropic-server-call.ts +230 -0
- package/extensions/lib/anthropic-server-tools.ts +485 -0
- package/extensions/lib/app-launch.mjs +94 -0
- package/extensions/lib/argument-hints.ts +190 -0
- package/extensions/lib/atomic-write.ts +6 -2
- package/extensions/lib/auto-memory.ts +75 -0
- package/extensions/lib/bash-parser.ts +84 -0
- package/extensions/lib/btw-fork.ts +93 -0
- package/extensions/lib/child-extensions.ts +52 -0
- package/extensions/lib/child-writes.ts +45 -0
- package/extensions/lib/claude-context.ts +515 -100
- package/extensions/lib/claude-external-includes.ts +68 -0
- package/extensions/lib/claude-id.ts +22 -0
- package/extensions/lib/claude-rules.ts +323 -0
- package/extensions/lib/claude-settings.ts +76 -4
- package/extensions/lib/compaction-boundary.ts +36 -0
- package/extensions/lib/compaction-keep.mjs +83 -0
- package/extensions/lib/config-mode.ts +112 -0
- package/extensions/lib/consent-dialogs.ts +63 -0
- package/extensions/lib/consent-preview.ts +5 -1
- package/extensions/lib/consent-stores.ts +48 -0
- package/extensions/lib/context-facts.ts +97 -0
- package/extensions/lib/covered-messages.ts +23 -0
- package/extensions/lib/deferred.ts +359 -25
- package/extensions/lib/dock-rows.ts +60 -0
- package/extensions/lib/empty-tool-result.ts +27 -0
- package/extensions/lib/environment-block.ts +76 -0
- package/extensions/lib/fetch-timeout.ts +24 -6
- package/extensions/{system-prompt → lib}/git-status.ts +51 -13
- package/extensions/lib/git.ts +75 -13
- package/extensions/lib/grammars/LICENSE-tree-sitter-bash +21 -0
- package/extensions/lib/grammars/README.md +2 -0
- package/extensions/lib/grammars/tree-sitter-bash.wasm +0 -0
- package/extensions/lib/guide-docs.ts +45 -0
- package/extensions/lib/headless-output.ts +46 -0
- package/extensions/lib/hook-gate.ts +7 -7
- package/extensions/lib/interrupt.ts +20 -4
- package/extensions/lib/key-input.ts +455 -0
- package/extensions/lib/keys.ts +14 -1
- package/extensions/lib/ledger/fold-memo.ts +49 -0
- package/extensions/lib/ledger/fold.ts +265 -0
- package/extensions/lib/ledger/layout.ts +72 -0
- package/extensions/lib/ledger/plan.ts +102 -0
- package/extensions/lib/ledger/records.ts +276 -0
- package/extensions/lib/ledger/state.ts +47 -0
- package/extensions/lib/ledger/validate.ts +141 -0
- package/extensions/lib/ledger/wire.ts +632 -0
- package/extensions/lib/local-command.ts +71 -19
- package/extensions/lib/mcp-overrides.ts +1 -1
- package/extensions/lib/mcp-share.ts +46 -0
- package/extensions/lib/memory-content.ts +146 -0
- package/extensions/lib/memory-index.ts +18 -0
- package/extensions/lib/memory.ts +134 -123
- package/extensions/lib/model-catalog/huggingface.json +178 -0
- package/extensions/lib/model-catalog/models-dev.json +18533 -0
- package/extensions/lib/model-catalog/openrouter.json +5050 -0
- package/extensions/lib/model-catalog-data.ts +513 -0
- package/extensions/lib/model-catalog.ts +462 -0
- package/extensions/lib/model-choice-warnings.ts +137 -0
- package/extensions/lib/model-pairings.ts +152 -0
- package/extensions/{auto-mode → lib}/model-picker.ts +26 -43
- package/extensions/lib/model-policy.ts +112 -15
- package/extensions/lib/model-tier.ts +283 -355
- package/extensions/lib/model-unusable.ts +1 -1
- package/extensions/lib/newer-model.ts +100 -0
- package/extensions/lib/notices.ts +87 -0
- package/extensions/lib/notifications.ts +357 -73
- package/extensions/lib/one-code-settings.ts +74 -8
- package/extensions/lib/open-browser.ts +63 -0
- package/extensions/lib/openrouter-generation.ts +94 -0
- package/extensions/lib/operation-deadline.ts +30 -0
- package/extensions/lib/original-command.ts +4 -4
- package/extensions/lib/package-version.ts +1 -1
- package/extensions/lib/panel-focus.ts +134 -0
- package/extensions/lib/paths.ts +17 -2
- package/extensions/lib/permission-gate.ts +72 -6
- package/extensions/lib/persisted-output.ts +60 -8
- package/extensions/lib/pi-ai-estimate.ts +19 -3
- package/extensions/lib/pi-version.ts +38 -2
- package/extensions/lib/plan-mode-channels.ts +42 -5
- package/extensions/lib/plugins.ts +26 -17
- package/extensions/lib/powershell-parse-script.ts +208 -0
- package/extensions/lib/powershell-parser.ts +344 -0
- package/extensions/lib/previous-mark.ts +101 -0
- package/extensions/lib/process-state.ts +48 -0
- package/extensions/lib/process-tree.ts +132 -8
- package/extensions/lib/prompt-options.ts +82 -0
- package/extensions/lib/queued-delivery.ts +44 -0
- package/extensions/lib/reminders.ts +370 -358
- package/extensions/lib/replaced-builtins.mjs +199 -0
- package/extensions/lib/replay-call.ts +70 -0
- package/extensions/lib/request-replay.ts +547 -0
- package/extensions/lib/scratchpad.ts +81 -14
- package/extensions/lib/send-now-channel.ts +7 -0
- package/extensions/lib/session-model-tier.ts +51 -0
- package/extensions/lib/session-work.ts +64 -0
- package/extensions/lib/settings-channels.ts +4 -4
- package/extensions/lib/shell-exit-semantics.ts +170 -0
- package/extensions/lib/shell-quote.ts +11 -0
- package/extensions/lib/shell-result.ts +70 -0
- package/extensions/lib/shell-spawn.ts +70 -6
- package/extensions/lib/shell-tool.ts +75 -25
- package/extensions/lib/side-call-cache.ts +124 -0
- package/extensions/lib/side-call-run.ts +96 -0
- package/extensions/lib/side-call-usage.ts +38 -0
- package/extensions/lib/side-call.ts +24 -1
- package/extensions/lib/single-flight.ts +18 -0
- package/extensions/lib/skill-body.ts +42 -0
- package/extensions/lib/skill-scan.ts +63 -24
- package/extensions/lib/spill-file.ts +140 -0
- package/extensions/lib/subagent-handback.ts +112 -0
- package/extensions/lib/system-role.ts +156 -0
- package/extensions/lib/terminal-text.ts +114 -0
- package/extensions/lib/text-width.ts +47 -16
- package/extensions/lib/timer-ops.ts +20 -0
- package/extensions/lib/tool-additions.ts +129 -0
- package/extensions/lib/tool-call-corruption.ts +134 -0
- package/extensions/lib/tool-path.ts +66 -0
- package/extensions/lib/tool-variants.ts +69 -0
- package/extensions/lib/tui-render.ts +255 -27
- package/extensions/lib/turn-budget-layout.ts +159 -0
- package/extensions/lib/update-check.mjs +15 -2
- package/extensions/lib/usage-bus.ts +1 -1
- package/extensions/lib/user-denial.ts +38 -0
- package/extensions/lib/workspace-channel.ts +16 -0
- package/extensions/lib/worktree-channel.ts +31 -3
- package/extensions/lib/worktree-isolation.ts +40 -10
- package/extensions/lsp/client.ts +8 -9
- package/extensions/lsp/index.ts +76 -12
- package/extensions/lsp/keep-alive.ts +1 -1
- package/extensions/lsp/trust.ts +119 -0
- package/extensions/lsp/watcher.ts +1 -1
- package/extensions/mcp/announce.ts +90 -43
- package/extensions/mcp/client.ts +161 -48
- package/extensions/mcp/config.ts +132 -8
- package/extensions/mcp/discovery.ts +19 -0
- package/extensions/mcp/index.ts +220 -121
- package/extensions/mcp/oauth/browser.ts +38 -17
- package/extensions/mcp/oauth/flow.ts +25 -17
- package/extensions/mcp/oauth/provider.ts +14 -8
- package/extensions/mcp/oauth/store.ts +34 -16
- package/extensions/mcp/panel/keys.ts +12 -11
- package/extensions/mcp/panel/render.ts +9 -6
- package/extensions/mcp/schema.ts +104 -5
- package/extensions/mcp/trust.ts +164 -73
- package/extensions/memory/entries.ts +23 -14
- package/extensions/memory/index.ts +134 -28
- package/extensions/memory/open-external.ts +33 -18
- package/extensions/memory/panel.ts +135 -26
- package/extensions/model-default/index.ts +86 -19
- package/extensions/newer-model/index.ts +31 -0
- package/extensions/notebook/description.ts +18 -0
- package/extensions/notebook/index.ts +6 -5
- package/extensions/notebook/notebook.ts +1 -1
- package/extensions/permissions/index.ts +1426 -398
- package/extensions/permissions/matcher.ts +425 -74
- package/extensions/permissions/modes.ts +11 -4
- package/extensions/permissions/panel/host.ts +130 -0
- package/extensions/permissions/panel/keys.ts +48 -0
- package/extensions/permissions/panel/render.ts +450 -0
- package/extensions/permissions/panel/state.ts +550 -0
- package/extensions/permissions/powershell-cmdlets.ts +198 -0
- package/extensions/permissions/powershell-paths.ts +197 -0
- package/extensions/permissions/powershell-rules.ts +207 -280
- package/extensions/permissions/powershell-tree.ts +557 -0
- package/extensions/permissions/project-trust.ts +27 -11
- package/extensions/permissions/protected-paths.ts +14 -2
- package/extensions/permissions/session-grant.ts +6 -0
- package/extensions/permissions/settings.ts +166 -31
- package/extensions/permissions/subagent-gate.ts +25 -0
- package/extensions/permissions/workspace.ts +78 -0
- package/extensions/plan-mode/index.ts +276 -92
- package/extensions/plan-mode/reminder.ts +89 -21
- package/extensions/plan-mode/run-state.ts +26 -0
- package/extensions/plan-mode/texts.ts +177 -0
- package/extensions/plan-mode/viewer.ts +92 -27
- package/extensions/plugins/counts.ts +3 -3
- package/extensions/plugins/index.ts +64 -46
- package/extensions/plugins/install/install.ts +16 -0
- package/extensions/plugins/marketplace/sync.ts +9 -3
- package/extensions/plugins/marketplace/types.ts +3 -1
- package/extensions/plugins/panel/keys.ts +21 -24
- package/extensions/plugins/panel/render.ts +12 -6
- package/extensions/plugins/shell-expand.ts +107 -0
- package/extensions/plugins/template.ts +32 -15
- package/extensions/powershell/child.ts +7 -0
- package/extensions/powershell/description.ts +38 -6
- package/extensions/powershell/guards.ts +1 -1
- package/extensions/powershell/index.ts +14 -7
- package/extensions/recap/index.ts +73 -71
- package/extensions/recap/prompt.ts +2 -2
- package/extensions/recap/scheduler.ts +3 -5
- package/extensions/search-tools/grep-merge.ts +39 -0
- package/extensions/search-tools/index.ts +0 -0
- package/extensions/send-now/chord.ts +62 -0
- package/extensions/send-now/index.ts +133 -0
- package/extensions/session-title/index.ts +3 -0
- package/extensions/session-title/title.ts +4 -1
- package/extensions/skill/announce.ts +30 -0
- package/extensions/skill/code-review.ts +97 -0
- package/extensions/skill/index.ts +469 -132
- package/extensions/skill/invoke.ts +118 -75
- package/extensions/skill/listing.ts +133 -9
- package/extensions/skill/panel/keys.ts +15 -16
- package/extensions/skill/panel/render.ts +5 -2
- package/extensions/skill/panel/state.ts +12 -1
- package/extensions/subagents/agent-args.ts +39 -0
- package/extensions/subagents/agent-description.ts +132 -0
- package/extensions/subagents/agents.ts +146 -31
- package/extensions/subagents/default-model.ts +2 -3
- package/extensions/subagents/delegation-steer.ts +4 -4
- package/extensions/subagents/fork-cache.ts +82 -0
- package/extensions/subagents/guide-agent.ts +189 -0
- package/extensions/subagents/hand-back-review.ts +3 -0
- package/extensions/subagents/index.ts +1594 -852
- package/extensions/subagents/live-runs.ts +26 -6
- package/extensions/subagents/model-select.ts +38 -25
- package/extensions/subagents/outcome.ts +5 -2
- package/extensions/subagents/panel-keys.ts +73 -31
- package/extensions/subagents/panel-render.ts +120 -96
- package/extensions/subagents/panel-widget.ts +60 -89
- package/extensions/subagents/parent-mode.ts +50 -0
- package/extensions/subagents/pending-claim.ts +18 -1
- package/extensions/subagents/runner.ts +135 -80
- package/extensions/subagents/runs.ts +44 -5
- package/extensions/subagents/send-to-main-tool.ts +1 -1
- package/extensions/subagents/session-turns.ts +32 -8
- package/extensions/subagents/shell-panel.ts +36 -178
- package/extensions/subagents/tasks-dialog.ts +170 -0
- package/extensions/subagents/viewport-mirror.ts +95 -0
- package/extensions/subagents/worktree.ts +57 -13
- package/extensions/system-prompt/environment.ts +19 -19
- package/extensions/system-prompt/idle-turn.ts +65 -0
- package/extensions/system-prompt/index.ts +165 -47
- package/extensions/system-prompt/template.ts +34 -51
- package/extensions/system-prompt/tiers/common.ts +23 -64
- package/extensions/system-prompt/tiers/frontier.ts +32 -11
- package/extensions/system-prompt/tiers/low.ts +67 -45
- package/extensions/system-prompt/tiers/mid.ts +96 -38
- package/extensions/system-reminder/index.ts +204 -70
- package/extensions/tasks/descriptions.ts +190 -0
- package/extensions/tasks/index.ts +120 -41
- package/extensions/tasks/store.ts +83 -16
- package/extensions/tool-call-corruption/child.ts +7 -0
- package/extensions/tool-call-corruption/index.ts +237 -0
- package/extensions/tool-search/index.ts +366 -144
- package/extensions/tool-style/index.ts +68 -10
- package/extensions/tool-style/write-description.ts +40 -0
- package/extensions/tool-style/write-render.ts +237 -0
- package/extensions/turn-duration/index.ts +7 -3
- package/extensions/turn-duration/line.ts +47 -4
- package/extensions/web/backends.ts +6 -9
- package/extensions/web/description.ts +50 -0
- package/extensions/web/index.ts +118 -53
- package/extensions/web/native-call.ts +15 -0
- package/extensions/web/native-results.ts +41 -0
- package/extensions/web-fetch/description.ts +42 -0
- package/extensions/web-fetch/extract.ts +53 -6
- package/extensions/web-fetch/index.ts +125 -76
- package/extensions/web-fetch/page-content.ts +19 -0
- package/extensions/web-fetch/response.ts +49 -0
- package/extensions/web-fetch/summarize.ts +9 -10
- package/extensions/workflow/agent-session.ts +108 -18
- package/extensions/workflow/args.ts +24 -0
- package/extensions/workflow/description.ts +67 -0
- package/extensions/workflow/globals.ts +17 -3
- package/extensions/workflow/index.ts +157 -162
- package/extensions/workflow/records.ts +1 -0
- package/extensions/workflow/run-manager.ts +33 -6
- package/extensions/workflow/saved-workflows.ts +3 -2
- package/extensions/workflow/types.ts +22 -1
- package/extensions/workflow/viewer.ts +54 -24
- package/extensions/workflow/widget.ts +20 -0
- package/extensions/worktree/descriptions.ts +91 -0
- package/extensions/worktree/guards.ts +316 -54
- package/extensions/worktree/index.ts +162 -44
- package/extensions/worktree/powershell-guards.ts +167 -0
- package/extensions/worktree/rewrite.ts +14 -16
- package/package.json +21 -7
- package/skills/artifact-design/SKILL.md +85 -0
- package/skills/code-review/SKILL.md +20 -20
- package/skills/code-review/cells/arguments-and-flags.md +19 -0
- package/skills/code-review/cells/high-3x5-recall-verify.md +137 -0
- package/skills/code-review/cells/high-8-inline.md +122 -0
- package/skills/code-review/cells/low-1-pass-max4.md +27 -0
- package/skills/code-review/cells/low-1-pass-min-files-4.md +28 -0
- package/skills/code-review/cells/max-5x5-verify-sweep.md +162 -0
- package/skills/code-review/cells/medium-3x5-verify.md +132 -0
- package/skills/code-review/cells/minimal-prompt.md +32 -0
- package/skills/code-review/cells/xhigh-10-inline-sweep.md +149 -0
- package/skills/code-review/cells/xhigh-5x5-verify-sweep.md +162 -0
- package/skills/fewer-permission-prompts/SKILL.md +1 -1
- package/skills/loop/SKILL.md +11 -0
- package/skills/security-review/SKILL.md +2 -5
- package/skills/simplify/SKILL.md +7 -5
- package/skills/workflow-authoring/SKILL.md +143 -0
- package/themes/onecode-light.json +1 -1
- package/themes/onecode.json +1 -1
- package/types/app.d.ts +58 -0
- package/types/community-packages.d.ts +26 -1
- package/extensions/auto-mode/recoverability.ts +0 -229
- package/extensions/lib/capability-index.ts +0 -466
- package/extensions/lib/model-facts.generated.json +0 -2675
- package/extensions/lib/model-facts.ts +0 -162
- package/extensions/tool-search/announce.ts +0 -42
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { basename } from "node:path";
|
|
14
|
+
import { unwrapUserMessage } from "../lib/agent-view.ts";
|
|
14
15
|
import { cutPlainText, firstNonEmptyLine } from "../lib/tui-render.ts";
|
|
16
|
+
import { sanitizeDisplayText } from "../lib/terminal-text.ts";
|
|
15
17
|
import { normalizeToolName } from "../permissions/matcher.ts";
|
|
16
18
|
import { emptyUsage, sumUsage, type UsageTotals } from "./usage.ts";
|
|
17
19
|
|
|
@@ -22,7 +24,7 @@ export type FinishOutcome = boolean | "stopped";
|
|
|
22
24
|
|
|
23
25
|
/** One rendered block of a child's transcript, mirroring the main-session marks. */
|
|
24
26
|
export interface TranscriptBlock {
|
|
25
|
-
kind: "task" | "text" | "call" | "result";
|
|
27
|
+
kind: "task" | "text" | "call" | "result" | "user";
|
|
26
28
|
/** For a call: the tool name; for a result: the tool it belongs to. */
|
|
27
29
|
tool?: string;
|
|
28
30
|
/** Rendered short content (args summary, result summary, or assistant text). */
|
|
@@ -79,6 +81,8 @@ export interface LiveRun {
|
|
|
79
81
|
parentTaskId?: string;
|
|
80
82
|
/** Nesting level: 0 = spawned by main, 1 = spawned by a child (CC's `└` rows). */
|
|
81
83
|
depth: number;
|
|
84
|
+
/** The user opened this run's view: `/tasks` then lists it under Completed (findings §40). */
|
|
85
|
+
viewed?: boolean;
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
/** Keep memory bounded for long/chatty children; the viewer scrolls the tail. */
|
|
@@ -129,6 +133,8 @@ export function deriveActivity(toolName: string | undefined, args: unknown, last
|
|
|
129
133
|
export interface RegisterInput {
|
|
130
134
|
taskId: string;
|
|
131
135
|
name: string;
|
|
136
|
+
/** Claude Code's `description` (AgentRunRecord.description): the row and chip label when set. */
|
|
137
|
+
description?: string;
|
|
132
138
|
agentType: string;
|
|
133
139
|
model?: string;
|
|
134
140
|
thinking?: string;
|
|
@@ -163,20 +169,22 @@ export class LiveRunRegistry {
|
|
|
163
169
|
}
|
|
164
170
|
|
|
165
171
|
register(input: RegisterInput): void {
|
|
172
|
+
// Display state only: the prompt reaches the terminal, so its control characters go.
|
|
173
|
+
const task = sanitizeDisplayText(input.task);
|
|
166
174
|
const run: LiveRun = {
|
|
167
175
|
taskId: input.taskId,
|
|
168
176
|
name: input.name,
|
|
169
177
|
agentType: input.agentType,
|
|
170
178
|
model: input.model,
|
|
171
179
|
thinking: input.thinking,
|
|
172
|
-
label:
|
|
180
|
+
label: input.description ? cutPlainText(sanitizeDisplayText(input.description), 60) : deriveLabel(task, input.name),
|
|
173
181
|
status: "running",
|
|
174
182
|
startedAt: input.startedAt,
|
|
175
183
|
toolCalls: 0,
|
|
176
184
|
tokens: emptyUsage(),
|
|
177
185
|
activity: "Starting…",
|
|
178
186
|
// The child's prompt opens the transcript, like Claude Code's viewer.
|
|
179
|
-
blocks:
|
|
187
|
+
blocks: task.trim() ? [{ kind: "task", text: task }] : [],
|
|
180
188
|
baseToolCalls: 0,
|
|
181
189
|
baseTokens: emptyUsage(),
|
|
182
190
|
parentTaskId: input.parentTaskId,
|
|
@@ -203,7 +211,10 @@ export class LiveRunRegistry {
|
|
|
203
211
|
// stats() keeps them instead of regressing the displayed cost.
|
|
204
212
|
run.baseToolCalls = run.toolCalls;
|
|
205
213
|
run.baseTokens = { ...run.tokens };
|
|
206
|
-
|
|
214
|
+
// A message the user typed in the agent's view is its `❯` row, not a task.
|
|
215
|
+
const typed = unwrapUserMessage(task);
|
|
216
|
+
if (typed !== undefined) this.block(taskId, { kind: "user", text: typed });
|
|
217
|
+
else if (task.trim()) this.block(taskId, { kind: "task", text: task });
|
|
207
218
|
this.changed(taskId);
|
|
208
219
|
return true;
|
|
209
220
|
}
|
|
@@ -229,7 +240,7 @@ export class LiveRunRegistry {
|
|
|
229
240
|
setActivity(taskId: string, activity: string): void {
|
|
230
241
|
const run = this.byId.get(taskId);
|
|
231
242
|
if (!run) return;
|
|
232
|
-
run.activity = activity;
|
|
243
|
+
run.activity = sanitizeDisplayText(activity);
|
|
233
244
|
this.wake(run);
|
|
234
245
|
this.changed(taskId);
|
|
235
246
|
}
|
|
@@ -238,11 +249,20 @@ export class LiveRunRegistry {
|
|
|
238
249
|
block(taskId: string, block: TranscriptBlock): void {
|
|
239
250
|
const run = this.byId.get(taskId);
|
|
240
251
|
if (!run) return;
|
|
241
|
-
|
|
252
|
+
// Display state only: the text reaches the terminal, so its control characters go.
|
|
253
|
+
run.blocks.push({ ...block, text: sanitizeDisplayText(block.text) });
|
|
242
254
|
if (run.blocks.length > MAX_BLOCKS) run.blocks.splice(0, run.blocks.length - MAX_BLOCKS);
|
|
243
255
|
this.changed(taskId);
|
|
244
256
|
}
|
|
245
257
|
|
|
258
|
+
/** The user opened this run's view (it joins `/tasks`' Completed list once settled). */
|
|
259
|
+
markViewed(taskId: string): void {
|
|
260
|
+
const run = this.byId.get(taskId);
|
|
261
|
+
if (!run || run.viewed) return;
|
|
262
|
+
run.viewed = true;
|
|
263
|
+
this.changed(taskId);
|
|
264
|
+
}
|
|
265
|
+
|
|
246
266
|
/** The in-flight assistant message (or undefined at message_end). O(1) per delta. */
|
|
247
267
|
setStreaming(taskId: string, message: StreamingMessage | undefined): void {
|
|
248
268
|
const run = this.byId.get(taskId);
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
* same-provider profile serves instead.
|
|
34
34
|
* - A configured default or agent-file model that cannot resolve degrades, with
|
|
35
35
|
* a notice naming the knob, to the automatic same-provider pick — the
|
|
36
|
-
* cheapest contained model
|
|
37
|
-
* the auto-mode classifier applies (`
|
|
36
|
+
* cheapest contained model in the session's tier or above, the SAME rule
|
|
37
|
+
* the auto-mode classifier applies (`sameTierContainedCandidates`) — and only
|
|
38
38
|
* then to the session model. Only an explicit `inherit` names the session
|
|
39
39
|
* model outright. A bad *per-call* request first falls through to the agent's
|
|
40
40
|
* own model and the configured default (running the subagent on its intended
|
|
@@ -61,7 +61,8 @@ import {
|
|
|
61
61
|
pricedInput,
|
|
62
62
|
supportsImageInput,
|
|
63
63
|
} from "../lib/model-policy.ts";
|
|
64
|
-
import {
|
|
64
|
+
import { pairedModel } from "../lib/model-pairings.ts";
|
|
65
|
+
import { atLeastTier, economicalContainedCandidates, intrinsicTier, type PromptTier, sameTierContainedCandidates } from "../lib/model-tier.ts";
|
|
65
66
|
|
|
66
67
|
/**
|
|
67
68
|
* Cross-extension channel carrying the resolved default subagent model, so the
|
|
@@ -135,7 +136,7 @@ export interface ResolveInput {
|
|
|
135
136
|
* upgraded with a notice (a standing setting or agent-file model). The
|
|
136
137
|
* `/subagent` set command leaves this false — a saved default may be meant for
|
|
137
138
|
* another (text) session, and is gated at spawn instead. See
|
|
138
|
-
* `docs/decisions/model-policy.md`.
|
|
139
|
+
* `working-docs/decisions/model-policy.md`.
|
|
139
140
|
*/
|
|
140
141
|
requireImageInput?: boolean;
|
|
141
142
|
}
|
|
@@ -206,7 +207,7 @@ interface AliasResolution {
|
|
|
206
207
|
* Resolve a Claude Code alias within the session's provider family: by name
|
|
207
208
|
* first (preferring undated alias ids, then the newest id), else as the tier
|
|
208
209
|
* the alias names — the cheapest contained model at or above it
|
|
209
|
-
* (`economicalContainedCandidates` order: never tiny,
|
|
210
|
+
* (`economicalContainedCandidates` order: never tiny, superseded or
|
|
210
211
|
* tool-less; cheap → workhorse → frontier, then price), `frontier` meaning the
|
|
211
212
|
* session model itself, the strongest model the user chose on this provider.
|
|
212
213
|
* Never off-family: "sonnet" on a Codex session is the cheapest workhorse-class
|
|
@@ -236,9 +237,6 @@ function resolveAlias(
|
|
|
236
237
|
const tier = ALIAS_TIER[alias];
|
|
237
238
|
// The session model carries the caller's own modality, so frontier is always safe.
|
|
238
239
|
if (tier === "frontier") return { model: sessionModel, how: "tier" };
|
|
239
|
-
// Name-class only, deliberately: an explicit alias asks for a *class* of model,
|
|
240
|
-
// so a measured pass (which lets a strong flash serve the automatic default)
|
|
241
|
-
// does not lift a lean-named model into "sonnet" here.
|
|
242
240
|
const byTier = economicalContainedCandidates(available, sessionModel, contained, requireImageInput).find((model) => atLeastTier(intrinsicTier(model), tier));
|
|
243
241
|
return byTier ? { model: byTier, how: "tier" } : undefined;
|
|
244
242
|
}
|
|
@@ -398,23 +396,26 @@ export function resolveSubagentModel(input: ResolveInput): SubagentModelResoluti
|
|
|
398
396
|
// Automatic selection is a cost optimisation, so it needs price evidence:
|
|
399
397
|
// with the session price unknown there is no demonstrable saving, and picking
|
|
400
398
|
// a cheap-tier model could silently *upgrade* an (unpriced) cheap session. The
|
|
401
|
-
//
|
|
402
|
-
//
|
|
403
|
-
//
|
|
404
|
-
//
|
|
405
|
-
//
|
|
406
|
-
// weaker one spends the saving on retries (2026-09-11 — before, subagents
|
|
407
|
-
// took the cheapest capable model with no floor). It excludes unpriced/opaque
|
|
408
|
-
// providers by construction, which subsumes the old dynamic-selection gate;
|
|
409
|
-
// those degrade to the session model below.
|
|
399
|
+
// selector — the cheapest same-provider model in the session's tier or above
|
|
400
|
+
// (never `tiny`) — is the SAME rule the auto-mode classifier uses. A
|
|
401
|
+
// delegated worker writes code and calls tools for many turns; a weaker one
|
|
402
|
+
// spends the saving on retries. It excludes unpriced and uncatalogued
|
|
403
|
+
// models by construction; those sessions degrade to the session model below.
|
|
410
404
|
if (sessionModel && !suppressAutomatic) {
|
|
411
|
-
//
|
|
412
|
-
//
|
|
413
|
-
//
|
|
414
|
-
//
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
405
|
+
// The pairing table speaks first for the models it names
|
|
406
|
+
// (lib/model-pairings.ts): a measured smaller model of the session's
|
|
407
|
+
// vendor, never dearer than the session where both are priced. Reuse the
|
|
408
|
+
// `contained` set computed above for the hot path.
|
|
409
|
+
const paired = pairedModel("subagent", available, sessionModel, { contained, requireImageInput });
|
|
410
|
+
if (paired?.kind === "session") return { model: sessionModel, source: "session", notices };
|
|
411
|
+
if (paired) return { model: paired.model, source: "automatic", notices };
|
|
412
|
+
// Otherwise the candidates are always strictly cheaper than the session
|
|
413
|
+
// model, and there are none when the session price is unknown, so a
|
|
414
|
+
// cheap-tier pick never silently upgrades an unpriced session.
|
|
415
|
+
// Experimental builds are never auto-selectable (model-tier.ts
|
|
416
|
+
// isAutoSelectable); a moving alias stays allowed here (Mistral serves
|
|
417
|
+
// most models only as `-latest`).
|
|
418
|
+
const cheaper = sameTierContainedCandidates(available, sessionModel, { contained, requireImageInput })[0];
|
|
418
419
|
if (cheaper) return { model: cheaper, source: "automatic", notices };
|
|
419
420
|
}
|
|
420
421
|
|
|
@@ -427,7 +428,7 @@ export function resolveSubagentModel(input: ResolveInput): SubagentModelResoluti
|
|
|
427
428
|
* gated: the per-call `model` field is the one input the main model chooses for
|
|
428
429
|
* itself. User knobs (setting, env var, agent files the user installed,
|
|
429
430
|
* "inherit") are never gated — naming a model is choosing it — and the
|
|
430
|
-
* automatic default
|
|
431
|
+
* automatic default never picks a dearer model. With either price unknown the
|
|
431
432
|
* gate stays open: a gate that fails closed on an unpriced catalog blocks the
|
|
432
433
|
* feature outright.
|
|
433
434
|
*
|
|
@@ -567,6 +568,18 @@ export function settingOverrideNotice({ sessionModel, defaultModel, defaultSourc
|
|
|
567
568
|
);
|
|
568
569
|
}
|
|
569
570
|
|
|
571
|
+
/**
|
|
572
|
+
* The one-shot that corrects the menu once message 1 is frozen: a model this
|
|
573
|
+
* account refused, and the subagent default it leaves (undefined: the
|
|
574
|
+
* session's own model).
|
|
575
|
+
*/
|
|
576
|
+
export function refusedModelNote(refused: string, defaultModel: Model<Api> | undefined): string {
|
|
577
|
+
return (
|
|
578
|
+
`Model ${refused} is not usable on this account, so automatic selection skips it and the subagent/workflow \`model\` field should not name it. ` +
|
|
579
|
+
`The subagent default is now ${defaultModel ? spec(defaultModel) : "this session's model"}.`
|
|
580
|
+
);
|
|
581
|
+
}
|
|
582
|
+
|
|
570
583
|
/** The every-turn reminder body. Kept short: its tokens are paid on every call. */
|
|
571
584
|
export function subagentModelsReminder(options: MenuOptions): string {
|
|
572
585
|
const menu = subagentModelMenu(options);
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ChildAction } from "../auto-mode/actions.ts";
|
|
8
|
+
import type { FireConversation } from "../lib/agent-cron.ts";
|
|
8
9
|
import type { UsageTotals } from "./usage.ts";
|
|
9
10
|
|
|
10
11
|
export const OUTPUT_CAP = 50_000;
|
|
@@ -20,7 +21,7 @@ export interface ForkIsolation {
|
|
|
20
21
|
* entire transcript; without this, a weaker model tends to abandon its assigned
|
|
21
22
|
* task and continue (or confabulate about) the inherited topic — then its output
|
|
22
23
|
* returns to the parent looking like independent confirmation. See
|
|
23
|
-
* docs/features/tools/records/tool-ambiguity-hardening.md (fork confabulation).
|
|
24
|
+
* working-docs/features/tools/records/tool-ambiguity-hardening.md (fork confabulation).
|
|
24
25
|
*
|
|
25
26
|
* With `isolation`, the fork is told that its working directory moved: the
|
|
26
27
|
* inherited system prompt and transcript name the parent's checkout in every
|
|
@@ -30,7 +31,7 @@ export interface ForkIsolation {
|
|
|
30
31
|
*/
|
|
31
32
|
export function forkTaskMessage(task: string, isolation?: ForkIsolation): string {
|
|
32
33
|
const lines = [
|
|
33
|
-
"You are a forked subagent. The conversation above is inherited context, for reference only — do NOT continue its open threads, verify its claims, or act on its plans. Do ONLY the task below;
|
|
34
|
+
"You are a forked subagent. The conversation above is inherited context, for reference only — do NOT continue its open threads, verify its claims, or act on its plans. Do ONLY the task below; the report you hand back through SubagentHandback is returned to the parent conversation verbatim, as data. You cannot see the parent's background tasks: its task ids are not addressable from here.",
|
|
34
35
|
];
|
|
35
36
|
if (isolation) {
|
|
36
37
|
lines.push(
|
|
@@ -72,6 +73,8 @@ export interface RpcChildHandle {
|
|
|
72
73
|
* the caller never reports a delivery that did not happen.
|
|
73
74
|
*/
|
|
74
75
|
send(message: string): Promise<"started" | "steered">;
|
|
76
|
+
/** The agent's own session: a cron fire's `/loop` sentinel reads and records its delivery there (lib/agent-cron.ts). */
|
|
77
|
+
conversation: FireConversation;
|
|
75
78
|
busy(): boolean;
|
|
76
79
|
exited(): boolean;
|
|
77
80
|
/**
|
|
@@ -1,41 +1,83 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure key decoding for the below-editor panel — Claude Code's agent-tree
|
|
3
|
-
* keys
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* treats `space` like typing. Raw terminal bytes in, intents out — no side
|
|
12
|
-
* effects, fully unit-testable.
|
|
3
|
+
* keys: arrows select, Enter views the selected agent (or `main`), PageUp and
|
|
4
|
+
* PageDown scroll an open view, `x` stops, the `ctrl+x ctrl+k` chord stops
|
|
5
|
+
* all, esc hands focus back to the editor (index.ts owns what each does; an
|
|
6
|
+
* open view stays open while the editor addresses its agent). Raw terminal
|
|
7
|
+
* bytes in, intents out — no side effects, fully unit-testable. Keys are named
|
|
8
|
+
* through `lib/key-input.ts`, so the legacy, kitty and modifyOtherKeys
|
|
9
|
+
* encodings decode alike, and a kitty key release (sent after every press) is
|
|
10
|
+
* never mistaken for typing.
|
|
13
11
|
*/
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
const DOWN = new Set(["\x1b[B", "\x1bOB"]);
|
|
17
|
-
const LEFT = new Set(["\x1b[D", "\x1bOD"]);
|
|
13
|
+
import { isKeyRelease, keyId, keyText } from "../lib/key-input.ts";
|
|
18
14
|
|
|
19
|
-
export type StripKey = "up" | "down" | "
|
|
15
|
+
export type StripKey = "up" | "down" | "open" | "leave" | "stop" | "stopAll" | "pageUp" | "pageDown";
|
|
16
|
+
|
|
17
|
+
const STRIP_KEYS: Record<string, StripKey> = {
|
|
18
|
+
up: "up",
|
|
19
|
+
down: "down",
|
|
20
|
+
enter: "open",
|
|
21
|
+
escape: "leave",
|
|
22
|
+
pageUp: "pageUp",
|
|
23
|
+
pageDown: "pageDown",
|
|
24
|
+
};
|
|
20
25
|
|
|
21
26
|
/**
|
|
22
|
-
* Decoder with chord state: `ctrl+x`
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
27
|
+
* Decoder with chord state: `ctrl+x` arms the chord (consumed, no key); a
|
|
28
|
+
* following `ctrl+k` completes it into `stopAll`; any other key cancels the
|
|
29
|
+
* chord and is decoded normally. A key release decodes to `release`, which
|
|
30
|
+
* changes nothing (the caller lets it through). Any other chunk that decodes
|
|
31
|
+
* to nothing (typing) is the caller's signal to drop focus and let the byte
|
|
32
|
+
* through.
|
|
26
33
|
*/
|
|
27
|
-
export function decodeStripKey(data: string, chordArmed: boolean): { key?: StripKey; chordArmed: boolean } {
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
if (
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
if (
|
|
36
|
-
if (data === "\x1b") return { key: "leave", chordArmed: false };
|
|
37
|
-
if (data === "x" || data === "X") return { key: "stop", chordArmed: false };
|
|
38
|
-
if (data === "\x1b[5~") return { key: "pageUp", chordArmed: false };
|
|
39
|
-
if (data === "\x1b[6~") return { key: "pageDown", chordArmed: false };
|
|
34
|
+
export function decodeStripKey(data: string, chordArmed: boolean): { key?: StripKey; chordArmed: boolean; release?: true } {
|
|
35
|
+
if (isKeyRelease(data)) return { chordArmed, release: true };
|
|
36
|
+
const id = keyId(data);
|
|
37
|
+
if (chordArmed && id === "ctrl+k") return { key: "stopAll", chordArmed: false };
|
|
38
|
+
if (id === "ctrl+x") return { chordArmed: true };
|
|
39
|
+
const key = id ? STRIP_KEYS[id] : undefined;
|
|
40
|
+
if (key) return { key, chordArmed: false };
|
|
41
|
+
const text = keyText(data);
|
|
42
|
+
if (text === "x" || text === "X") return { key: "stop", chordArmed: false };
|
|
40
43
|
return { chordArmed: false };
|
|
41
44
|
}
|
|
45
|
+
|
|
46
|
+
/** A ↓ press (in any encoding, never its release): the key that enters the strip. */
|
|
47
|
+
export function isStripEntryKey(data: string): boolean {
|
|
48
|
+
return !isKeyRelease(data) && keyId(data) === "down";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** The slice of pi's editor the strip reads (structural; every member optional). */
|
|
52
|
+
export interface EditorLike {
|
|
53
|
+
getLines?(): string[];
|
|
54
|
+
getCursor?(): { line: number; col: number };
|
|
55
|
+
isShowingAutocomplete?(): boolean;
|
|
56
|
+
/** pi-tui's history position: -1 when no recalled entry is shown. */
|
|
57
|
+
historyIndex?: unknown;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Whether ↓ belongs to the strip rather than the editor. In a draft the
|
|
62
|
+
* editor needs ↓ to move the cursor down, to walk forward through recalled
|
|
63
|
+
* history, and to move in the autocomplete list, so the strip takes ↓ only
|
|
64
|
+
* with the cursor on the draft's last line, no history entry shown and no
|
|
65
|
+
* autocomplete open (Claude Code's footer rule). An editor without the
|
|
66
|
+
* expected methods keeps the old behaviour (the strip takes ↓).
|
|
67
|
+
*/
|
|
68
|
+
export function editorYieldsDown(editor: unknown): boolean {
|
|
69
|
+
if (!editor || typeof editor !== "object") return true;
|
|
70
|
+
const e = editor as EditorLike;
|
|
71
|
+
try {
|
|
72
|
+
if (e.isShowingAutocomplete?.()) return false;
|
|
73
|
+
// Read-only use of a private pi-tui field; if a pi bump renames it, the
|
|
74
|
+
// history case falls back to taking ↓ (the behaviour before this check).
|
|
75
|
+
if (typeof e.historyIndex === "number" && e.historyIndex > -1) return false;
|
|
76
|
+
const lines = e.getLines?.();
|
|
77
|
+
const cursor = e.getCursor?.();
|
|
78
|
+
if (!lines || !cursor) return true;
|
|
79
|
+
return cursor.line >= lines.length - 1;
|
|
80
|
+
} catch {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|