one-code-extension 0.4.0 → 0.5.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 +219 -219
- 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 +32 -23
- package/docs/guide/doctor.md +20 -13
- package/docs/guide/hooks.md +18 -3
- package/docs/guide/installation.md +27 -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 +66 -34
- 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 +123 -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 +515 -0
- package/extensions/background/index.ts +514 -236
- package/extensions/background/loop-fire.ts +136 -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 +52 -0
- package/extensions/background/wakeup.ts +159 -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 +88 -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 +229 -71
- package/extensions/btw/panel.ts +228 -100
- package/extensions/btw/prompt.ts +41 -4
- package/extensions/claude-compat/index.ts +7 -11
- package/extensions/claude-context/index.ts +446 -58
- package/extensions/compaction/cut.ts +157 -0
- package/extensions/compaction/index.ts +216 -75
- package/extensions/compaction/kept-thinking.ts +62 -0
- package/extensions/compaction/prompt.ts +15 -12
- package/extensions/context-budget/index.ts +24 -5
- package/extensions/context-management/index.ts +25 -0
- 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 +72 -19
- 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 +337 -26
- package/extensions/file-tracker/replay.ts +96 -10
- package/extensions/file-tracker/restore.ts +63 -0
- package/extensions/file-tracker/results.ts +66 -0
- package/extensions/file-tracker/shell-reads.ts +211 -0
- package/extensions/file-tracker/tracker.ts +32 -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 +198 -31
- package/extensions/hooks/matcher.ts +3 -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 +13 -5
- 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/lib/agent-cron.ts +130 -0
- package/extensions/lib/agent-loader.ts +15 -1
- package/extensions/lib/agent-view.ts +85 -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 +42 -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 +78 -0
- package/extensions/lib/context-stack.ts +81 -0
- package/extensions/lib/deferred.ts +219 -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/local-command.ts +47 -13
- 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 +174 -0
- package/extensions/lib/model-catalog/models-dev.json +18297 -0
- package/extensions/lib/model-catalog/openrouter.json +5252 -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 +308 -64
- 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 +21 -2
- package/extensions/lib/plan-mode-channels.ts +20 -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/process-tree.ts +131 -8
- package/extensions/lib/prompt-options.ts +82 -0
- package/extensions/lib/queued-delivery.ts +44 -0
- package/extensions/lib/reminders.ts +364 -58
- package/extensions/lib/replaced-builtins.mjs +199 -0
- package/extensions/lib/replay-call.ts +70 -0
- package/extensions/lib/request-replay.ts +439 -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 +13 -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 +113 -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 +149 -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 +143 -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 +70 -4
- 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 +87 -5
- 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 +209 -71
- 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 +151 -67
- 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/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 +1300 -381
- package/extensions/permissions/matcher.ts +425 -74
- package/extensions/permissions/modes.ts +6 -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 +156 -69
- package/extensions/plan-mode/reminder.ts +89 -21
- 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 +61 -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 +12 -7
- package/extensions/recap/index.ts +65 -60
- 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/code-review.ts +97 -0
- package/extensions/skill/index.ts +421 -101
- package/extensions/skill/invoke.ts +128 -18
- 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 +116 -23
- package/extensions/subagents/announce.ts +69 -0
- package/extensions/subagents/default-model.ts +2 -3
- package/extensions/subagents/delegation-steer.ts +4 -4
- package/extensions/subagents/fork-cache.ts +76 -0
- package/extensions/subagents/guide-agent.ts +189 -0
- package/extensions/subagents/hand-back-review.ts +3 -0
- package/extensions/subagents/index.ts +1493 -824
- package/extensions/subagents/live-runs.ts +26 -6
- package/extensions/subagents/model-select.ts +38 -25
- package/extensions/subagents/outcome.ts +2 -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/runner.ts +108 -80
- package/extensions/subagents/runs.ts +39 -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 +131 -47
- package/extensions/system-prompt/template.ts +24 -50
- 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 +175 -13
- 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/announce.ts +16 -0
- package/extensions/tool-search/index.ts +189 -41
- 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 +105 -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 +145 -162
- package/extensions/workflow/records.ts +1 -0
- package/extensions/workflow/run-manager.ts +29 -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 +121 -39
- package/extensions/worktree/powershell-guards.ts +167 -0
- package/extensions/worktree/rewrite.ts +14 -16
- package/package.json +19 -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
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* effort extension — Claude Code's `/effort`, including the `ultracode` stop.
|
|
3
3
|
*
|
|
4
|
+
* Interactive low/medium/high/xhigh choices persist per model in pi's own
|
|
5
|
+
* settings (`modelThinkingLevels`); max and ultracode stay session-only. pi
|
|
6
|
+
* restores the saved level natively, so launch overrides and resume still win.
|
|
7
|
+
*
|
|
4
8
|
* Reasoning effort is pi's thinking level under another name, and shift+tab
|
|
5
9
|
* already cycles it. pi reserves that key (`app.thinking.cycle` is on its
|
|
6
10
|
* RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS list, so `registerShortcut` on
|
|
@@ -17,9 +21,11 @@
|
|
|
17
21
|
* same shape the permissions extension uses for plan mode.
|
|
18
22
|
*/
|
|
19
23
|
|
|
24
|
+
import { join } from "node:path";
|
|
20
25
|
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
21
26
|
import { getSupportedThinkingLevels } from "@earendil-works/pi-ai/compat";
|
|
22
|
-
import type
|
|
27
|
+
import { getAgentDir, SettingsManager, type ExtensionAPI, type ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
28
|
+
import { effortSetMessage, isPersistedEffort, type PersistedEffort } from "./settings.ts";
|
|
23
29
|
import { REMINDER_CHANNEL } from "../lib/reminders.ts";
|
|
24
30
|
import { dimRightAlignedWidget, safeThemePaint, truncateLine } from "../lib/tui-render.ts";
|
|
25
31
|
import {
|
|
@@ -43,6 +49,8 @@ import {
|
|
|
43
49
|
ULTRACODE_STATUS_KEY,
|
|
44
50
|
} from "./slider.ts";
|
|
45
51
|
import { registerLocalCommand } from "../lib/local-command.ts";
|
|
52
|
+
import { panelUi } from "../lib/panel-focus.ts";
|
|
53
|
+
import { extendingCompletions } from "../lib/argument-hints.ts";
|
|
46
54
|
|
|
47
55
|
/** The levels pi says the active model can reach; the full ladder when unknown. */
|
|
48
56
|
function supportedLevels(ctx: ExtensionContext): ThinkingLevel[] {
|
|
@@ -126,8 +134,28 @@ export default function effortExtension(pi: ExtensionAPI) {
|
|
|
126
134
|
}
|
|
127
135
|
};
|
|
128
136
|
|
|
137
|
+
const canPersist = (ctx: ExtensionContext) => ctx.hasUI && (ctx.mode === "tui" || ctx.mode === "rpc") && !!ctx.model;
|
|
138
|
+
/** Through pi's own settings writer: its key format, file lock and merge of changed fields. */
|
|
139
|
+
const persist = async (ctx: ExtensionContext, level: PersistedEffort | undefined): Promise<string | undefined> => {
|
|
140
|
+
const settings = SettingsManager.create(ctx.cwd, getAgentDir());
|
|
141
|
+
const loadError = settings.drainErrors().find((entry) => entry.scope === "global");
|
|
142
|
+
// An unreadable file would be rewritten from empty settings; leave it for the user.
|
|
143
|
+
if (loadError) return `Failed to set effort level: ${loadError.error.message}`;
|
|
144
|
+
if (level === undefined) settings.removeModelThinkingLevel(ctx.model!.provider, ctx.model!.id);
|
|
145
|
+
else settings.setModelThinkingLevel(ctx.model!.provider, ctx.model!.id, level);
|
|
146
|
+
await settings.flush();
|
|
147
|
+
const writeError = settings.drainErrors()[0];
|
|
148
|
+
if (writeError) return `Failed to set effort level: ${writeError.error.message}`;
|
|
149
|
+
};
|
|
150
|
+
const report = (ctx: ExtensionContext, message: string, error = false) => {
|
|
151
|
+
ctx.ui.notify(message, error ? "error" : "info");
|
|
152
|
+
return message;
|
|
153
|
+
};
|
|
154
|
+
|
|
129
155
|
/** Apply a chosen stop and report what actually took effect. */
|
|
130
|
-
const applyChoice = (choice: EffortChoice, ctx: ExtensionContext) => {
|
|
156
|
+
const applyChoice = async (choice: EffortChoice, ctx: ExtensionContext, asDefault = true): Promise<string> => {
|
|
157
|
+
const wasUltracode = ultracodeActive;
|
|
158
|
+
const previous = pi.getThinkingLevel();
|
|
131
159
|
const wanted = thinkingLevelFor(choice);
|
|
132
160
|
pi.setThinkingLevel(wanted);
|
|
133
161
|
const actual = pi.getThinkingLevel();
|
|
@@ -144,13 +172,25 @@ export default function effortExtension(pi: ExtensionAPI) {
|
|
|
144
172
|
const cappedDown = ar >= 0 && wr >= 0 && ar < wr;
|
|
145
173
|
const note = cappedDown ? ` (${modelLabel(ctx)} tops out at ${actual})` : "";
|
|
146
174
|
if (choice === ULTRACODE) {
|
|
147
|
-
ctx
|
|
148
|
-
} else {
|
|
149
|
-
ctx.ui.notify(`Effort: ${actual}${note}`, "info");
|
|
175
|
+
return report(ctx, `Effort: ultracode — ${actual} reasoning, workflows armed every turn${note}`);
|
|
150
176
|
}
|
|
177
|
+
const saved = asDefault && canPersist(ctx) && isPersistedEffort(choice) && actual === wanted;
|
|
178
|
+
if (saved) {
|
|
179
|
+
const error = await persist(ctx, choice);
|
|
180
|
+
if (error) {
|
|
181
|
+
// Claude Code changes nothing when the save fails.
|
|
182
|
+
pi.setThinkingLevel(previous);
|
|
183
|
+
setUltracode(wasUltracode, previous);
|
|
184
|
+
applyStatus(ctx);
|
|
185
|
+
showEffortNote(ctx, previous);
|
|
186
|
+
return report(ctx, error, true);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (isPersistedEffort(actual) || actual === "max") return report(ctx, `${effortSetMessage(actual, saved)}${wasUltracode ? " · Ultracode off" : ""}`);
|
|
190
|
+
return report(ctx, `Effort: ${actual}${note}`);
|
|
151
191
|
};
|
|
152
192
|
|
|
153
|
-
const showSlider = async (ctx: ExtensionContext): Promise<void> => {
|
|
193
|
+
const showSlider = async (ctx: ExtensionContext): Promise<string | void> => {
|
|
154
194
|
const supported = supportedLevels(ctx);
|
|
155
195
|
if (!supported.some((level) => level !== "off")) {
|
|
156
196
|
ctx.ui.notify(`${modelLabel(ctx)} doesn't support reasoning effort.`, "info");
|
|
@@ -165,7 +205,7 @@ export default function effortExtension(pi: ExtensionAPI) {
|
|
|
165
205
|
index = nearestEnabled(index, enabled);
|
|
166
206
|
|
|
167
207
|
const label = modelLabel(ctx);
|
|
168
|
-
const chosen = await ctx.ui.custom<EffortChoice | null>((tui, theme, _keybindings, done) => {
|
|
208
|
+
const chosen = await panelUi(pi.events, ctx.ui).custom<{ choice: EffortChoice; asDefault: boolean } | null>((tui, theme, _keybindings, done) => {
|
|
169
209
|
const paint = safeThemePaint(theme);
|
|
170
210
|
return {
|
|
171
211
|
// The slider's own layout is column-safe for its ASCII labels, but this
|
|
@@ -180,8 +220,8 @@ export default function effortExtension(pi: ExtensionAPI) {
|
|
|
180
220
|
done(null);
|
|
181
221
|
return;
|
|
182
222
|
}
|
|
183
|
-
if (key === "confirm") {
|
|
184
|
-
done(EFFORT_CHOICES[index]);
|
|
223
|
+
if (key === "confirm" || key === "session") {
|
|
224
|
+
done({ choice: EFFORT_CHOICES[index], asDefault: key === "confirm" });
|
|
185
225
|
return;
|
|
186
226
|
}
|
|
187
227
|
index = moveIndex(index, key, enabled);
|
|
@@ -191,18 +231,32 @@ export default function effortExtension(pi: ExtensionAPI) {
|
|
|
191
231
|
};
|
|
192
232
|
});
|
|
193
233
|
|
|
194
|
-
if (chosen)
|
|
234
|
+
if (!chosen) return "Cancelled";
|
|
235
|
+
return applyChoice(chosen.choice, ctx, chosen.asDefault);
|
|
195
236
|
};
|
|
196
237
|
|
|
197
238
|
registerLocalCommand(pi, "effort", {
|
|
198
|
-
description: `Set reasoning effort (shift+tab cycles the plain levels): /effort [${EFFORT_CHOICES.join("|")}] — ultracode is ${ULTRACODE_LEVEL} + workflows`,
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
},
|
|
239
|
+
description: `Set reasoning effort (shift+tab cycles the plain levels): /effort [${EFFORT_CHOICES.join("|")}|auto] — ultracode is ${ULTRACODE_LEVEL} + workflows`,
|
|
240
|
+
argumentHint: `[${EFFORT_CHOICES.join("|")}|auto]`,
|
|
241
|
+
reportsResult: true,
|
|
242
|
+
getArgumentCompletions: (prefix) => extendingCompletions(prefix, [...acceptedEffortArgs(), "auto", "unset"].map((value) => ({ value, label: value }))),
|
|
203
243
|
handler: async (args, ctx) => {
|
|
204
244
|
const typed = args.trim();
|
|
205
245
|
if (typed) {
|
|
246
|
+
if (typed.toLowerCase() === "auto" || typed.toLowerCase() === "unset") {
|
|
247
|
+
// Clear the saved level first: a failed save changes nothing.
|
|
248
|
+
const saved = canPersist(ctx);
|
|
249
|
+
if (saved) {
|
|
250
|
+
const error = await persist(ctx, undefined);
|
|
251
|
+
if (error) return report(ctx, error, true);
|
|
252
|
+
}
|
|
253
|
+
// getSettings arrived in pi 1.0.1; the package still admits older pi.
|
|
254
|
+
pi.setThinkingLevel(pi.getSettings?.().defaultThinkingLevel ?? "medium");
|
|
255
|
+
setUltracode(false);
|
|
256
|
+
applyStatus(ctx);
|
|
257
|
+
showEffortNote(ctx, pi.getThinkingLevel());
|
|
258
|
+
return report(ctx, `Effort level set to auto${saved ? "" : " (this session only)"}`);
|
|
259
|
+
}
|
|
206
260
|
const parsed = parseEffortArg(typed);
|
|
207
261
|
if (!parsed) {
|
|
208
262
|
ctx.ui.notify(`Unknown effort "${typed}". Use one of: ${acceptedEffortArgs().join(", ")}`, "error");
|
|
@@ -220,20 +274,19 @@ export default function effortExtension(pi: ExtensionAPI) {
|
|
|
220
274
|
return;
|
|
221
275
|
}
|
|
222
276
|
}
|
|
223
|
-
applyChoice(parsed, ctx);
|
|
224
|
-
return;
|
|
277
|
+
return applyChoice(parsed, ctx);
|
|
225
278
|
}
|
|
226
279
|
|
|
227
280
|
// The picker needs focus and a terminal; elsewhere say what to type.
|
|
228
281
|
if (!ctx.hasUI || ctx.mode !== "tui") {
|
|
229
282
|
ctx.ui.notify(
|
|
230
283
|
`Current effort: ${ultracodeActive ? `ultracode (${pi.getThinkingLevel()} + workflows)` : pi.getThinkingLevel()}. ` +
|
|
231
|
-
`Set one with /effort <${acceptedEffortArgs().join("|")}>.`,
|
|
284
|
+
`Set one with /effort <${acceptedEffortArgs().join("|")}|auto>.`,
|
|
232
285
|
"info",
|
|
233
286
|
);
|
|
234
287
|
return;
|
|
235
288
|
}
|
|
236
|
-
await showSlider(ctx);
|
|
289
|
+
return await showSlider(ctx);
|
|
237
290
|
},
|
|
238
291
|
});
|
|
239
292
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Which effort levels are saved, and the result text (pure, no pi imports). */
|
|
2
|
+
|
|
3
|
+
const PERSISTED_LEVELS = ["low", "medium", "high", "xhigh"] as const;
|
|
4
|
+
export type PersistedEffort = (typeof PERSISTED_LEVELS)[number];
|
|
5
|
+
|
|
6
|
+
export function isPersistedEffort(level: string): level is PersistedEffort {
|
|
7
|
+
return (PERSISTED_LEVELS as readonly string[]).includes(level);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const DESCRIPTIONS: Record<string, string> = {
|
|
11
|
+
low: "Quick, straightforward implementation with minimal overhead",
|
|
12
|
+
medium: "Balanced approach with standard implementation and testing",
|
|
13
|
+
high: "Comprehensive implementation with extensive testing and documentation",
|
|
14
|
+
xhigh: "Deeper reasoning than high, just below maximum (on supported models)",
|
|
15
|
+
max: "Maximum capability with deepest reasoning. May use excessive tokens resulting in long response times or overthinking. Use sparingly for the hardest tasks.",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** The ordinary local response, without organization or environment overrides. */
|
|
19
|
+
export function effortSetMessage(level: PersistedEffort | "max", saved: boolean): string {
|
|
20
|
+
return `Set effort level to ${level} (${saved ? "saved as your default for new sessions" : "this session only"}): ${DESCRIPTIONS[level]}`;
|
|
21
|
+
}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
21
|
+
import { keyId, keyText } from "../lib/key-input.ts";
|
|
21
22
|
|
|
22
23
|
/** The final stop on the track: top reasoning + workflows armed every turn. */
|
|
23
24
|
export const ULTRACODE = "ultracode";
|
|
@@ -73,35 +74,38 @@ export function choiceForState(level: ThinkingLevel | undefined, ultracodeActive
|
|
|
73
74
|
return "medium";
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
export type SliderKey = "left" | "right" | "first" | "last" | "confirm" | "cancel";
|
|
77
|
+
export type SliderKey = "left" | "right" | "first" | "last" | "confirm" | "session" | "cancel";
|
|
77
78
|
|
|
78
79
|
/**
|
|
79
80
|
* Decode a raw terminal chunk. `Component.handleInput` hands over bytes, not key
|
|
80
|
-
* names
|
|
81
|
-
*
|
|
81
|
+
* names; `lib/key-input.ts` names them, so every terminal encoding of a key
|
|
82
|
+
* (legacy, kitty, modifyOtherKeys) decodes alike.
|
|
82
83
|
*/
|
|
83
84
|
export function decodeKey(data: string): SliderKey | undefined {
|
|
84
|
-
switch (data) {
|
|
85
|
-
case "
|
|
86
|
-
case "\x1bOC":
|
|
87
|
-
case "l":
|
|
85
|
+
switch (keyId(data)) {
|
|
86
|
+
case "right":
|
|
88
87
|
return "right";
|
|
89
|
-
case "
|
|
90
|
-
case "\x1bOD":
|
|
91
|
-
case "h":
|
|
88
|
+
case "left":
|
|
92
89
|
return "left";
|
|
93
|
-
case "
|
|
94
|
-
case "\x1b[1~":
|
|
90
|
+
case "home":
|
|
95
91
|
return "first";
|
|
96
|
-
case "
|
|
97
|
-
case "\x1b[4~":
|
|
92
|
+
case "end":
|
|
98
93
|
return "last";
|
|
99
|
-
case "
|
|
100
|
-
case "\n":
|
|
94
|
+
case "enter":
|
|
101
95
|
return "confirm";
|
|
102
|
-
case "
|
|
103
|
-
case "
|
|
96
|
+
case "escape":
|
|
97
|
+
case "ctrl+c": // same intent as escape while a picker is focused
|
|
104
98
|
return "cancel";
|
|
99
|
+
default:
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
switch (keyText(data)) {
|
|
103
|
+
case "s":
|
|
104
|
+
return "session";
|
|
105
|
+
case "l":
|
|
106
|
+
return "right";
|
|
107
|
+
case "h":
|
|
108
|
+
return "left";
|
|
105
109
|
default:
|
|
106
110
|
return undefined;
|
|
107
111
|
}
|
|
@@ -178,10 +182,10 @@ export interface SliderView {
|
|
|
178
182
|
}
|
|
179
183
|
|
|
180
184
|
const TITLE = "Effort";
|
|
181
|
-
const HINTS = "←/→ or h/l adjust · Enter confirm · Esc cancel · shift+tab cycles the plain levels";
|
|
185
|
+
const HINTS = "←/→ or h/l adjust · Enter confirm · s for this session only · Esc cancel · shift+tab cycles the plain levels";
|
|
182
186
|
/** Anthropic's cache hierarchy: a thinking/effort change invalidates the message cache once (CACHE-REVIEW-2026-09-04 M4). */
|
|
183
187
|
const CACHE_NOTE = "changing effort re-caches the conversation (one uncached request)";
|
|
184
|
-
const SHORT_HINTS = "←/→ h/l · Enter · Esc";
|
|
188
|
+
const SHORT_HINTS = "←/→ h/l · Enter · s · Esc";
|
|
185
189
|
const ULTRACODE_SUBTITLE = `${ULTRACODE_LEVEL} + workflows`;
|
|
186
190
|
|
|
187
191
|
/**
|
package/extensions/exit/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* exit extension — Claude Code's `/exit
|
|
2
|
+
* exit extension — Claude Code's `/exit` and one-shot failure status.
|
|
3
3
|
*
|
|
4
4
|
* pi's built-in quit command is `/quit`; Claude Code's is `/exit` (with `quit`
|
|
5
5
|
* shown as an alias). A user coming from Claude Code types `/exit` out of habit
|
|
@@ -17,8 +17,39 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
20
|
+
import { ONE_SHOT_COMMAND_FAILED_CHANNEL, type RunOutcome, RunOutcomeLatch, TURN_FAILED_CHANNEL } from "../lib/interrupt.ts";
|
|
20
21
|
|
|
21
22
|
export default function exitExtension(pi: ExtensionAPI) {
|
|
23
|
+
const outcome = new RunOutcomeLatch();
|
|
24
|
+
let settled: RunOutcome | undefined;
|
|
25
|
+
// The harness stopped the turn in progress: its run ends "aborted", which
|
|
26
|
+
// must not read as a user cancel when the turn settles.
|
|
27
|
+
let turnFailed = false;
|
|
28
|
+
pi.on("agent_end", (event, ctx) => {
|
|
29
|
+
outcome.record(event.messages, ctx.signal?.aborted);
|
|
30
|
+
});
|
|
31
|
+
pi.on("agent_settled", () => {
|
|
32
|
+
const run = outcome.take();
|
|
33
|
+
settled = turnFailed ? "error" : run ?? settled;
|
|
34
|
+
turnFailed = false;
|
|
35
|
+
});
|
|
36
|
+
pi.events.on(ONE_SHOT_COMMAND_FAILED_CHANNEL, () => {
|
|
37
|
+
settled = "error";
|
|
38
|
+
});
|
|
39
|
+
pi.events.on(TURN_FAILED_CHANNEL, () => {
|
|
40
|
+
turnFailed = true;
|
|
41
|
+
});
|
|
42
|
+
pi.on("session_shutdown", (event, ctx) => {
|
|
43
|
+
if (ctx.mode !== "print" && ctx.mode !== "json") return;
|
|
44
|
+
if (event.reason !== "quit" || (settled !== "error" && !turnFailed)) return;
|
|
45
|
+
// pi 1.0.1 checks provider errors for text output, but not JSON. A print
|
|
46
|
+
// run may submit several prompts or replace the session (/clear), so a
|
|
47
|
+
// settled turn is not yet the process's final outcome. Commit only at
|
|
48
|
+
// final disposal, after retries/compaction and every prompt. main preserves
|
|
49
|
+
// this code when runPrintMode returns zero; never clear another failure.
|
|
50
|
+
if (process.exitCode === undefined || Number(process.exitCode) === 0) process.exitCode = 1;
|
|
51
|
+
});
|
|
52
|
+
|
|
22
53
|
pi.registerCommand("exit", {
|
|
23
54
|
description: "Quit One Code (same as /quit)",
|
|
24
55
|
handler: async (_args, ctx) => {
|