one-code-extension 0.4.1 → 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 +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 +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 +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 +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 +18 -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
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* send-now extension — Claude Code's "send now" for messages queued mid-turn.
|
|
3
|
+
*
|
|
4
|
+
* A message typed while a turn runs waits in pi's queue until the current
|
|
5
|
+
* response and its tool calls finish. `ctrl+x ctrl+s` (chord.ts) delivers it
|
|
6
|
+
* at once: the running turn is aborted, which makes pi move every queued
|
|
7
|
+
* message and the draft back into the editor (its abort handler), and once the
|
|
8
|
+
* session is idle that text is sent as the next prompt (a pasted image is its
|
|
9
|
+
* file path in the text, so nothing is lost). Running tools are cancelled, as in Claude Code before 2.1.283, which moves
|
|
10
|
+
* them to the background instead. A dim `ctrl+x ctrl+s to send now` line sits
|
|
11
|
+
* above the editor while anything is queued.
|
|
12
|
+
*
|
|
13
|
+
* pi binds `ctrl+x` alone to copy; while send now applies, `ctrl+x` is only the
|
|
14
|
+
* chord's prefix (chord.ts), and one the chord does not complete (another key,
|
|
15
|
+
* or CHORD_TIMEOUT_MS without one) is dropped. Only public extension API.
|
|
16
|
+
*
|
|
17
|
+
* pi exposes no read of its queue to extensions, only `hasPendingMessages()`,
|
|
18
|
+
* so the hint asks on every render rather than tracking queue events (a
|
|
19
|
+
* dequeue with alt+up fires none). TUI only.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
23
|
+
import { SEND_NOW_CHANNEL } from "../lib/send-now-channel.ts";
|
|
24
|
+
import { safeThemePaint, truncateLine } from "../lib/tui-render.ts";
|
|
25
|
+
import { SEND_NOW_HINT, SendNowChord } from "./chord.ts";
|
|
26
|
+
|
|
27
|
+
/** How long send now waits for the aborted turn to settle before giving up. */
|
|
28
|
+
const IDLE_WAIT_MS = 10_000;
|
|
29
|
+
/** How long a held `ctrl+x` waits for its `ctrl+s` before the chord is dropped. */
|
|
30
|
+
const CHORD_TIMEOUT_MS = 1_000;
|
|
31
|
+
|
|
32
|
+
export default function sendNowExtension(pi: ExtensionAPI) {
|
|
33
|
+
let unsubscribe: (() => void) | undefined;
|
|
34
|
+
// Bumped on every session start and shutdown, so a send now still waiting
|
|
35
|
+
// for the aborted turn never acts on a replaced or closed session.
|
|
36
|
+
let epoch = 0;
|
|
37
|
+
/** Resolves a send now waiting for the aborted turn to settle. */
|
|
38
|
+
let onSettled: (() => void) | undefined;
|
|
39
|
+
const wakeSettled = () => {
|
|
40
|
+
const wake = onSettled;
|
|
41
|
+
onSettled = undefined;
|
|
42
|
+
wake?.();
|
|
43
|
+
};
|
|
44
|
+
pi.on("agent_settled", wakeSettled);
|
|
45
|
+
|
|
46
|
+
pi.on("session_shutdown", () => {
|
|
47
|
+
epoch++;
|
|
48
|
+
wakeSettled();
|
|
49
|
+
unsubscribe?.();
|
|
50
|
+
unsubscribe = undefined;
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
pi.on("session_start", (_event, ctx) => {
|
|
54
|
+
unsubscribe?.();
|
|
55
|
+
unsubscribe = undefined;
|
|
56
|
+
const session = ++epoch;
|
|
57
|
+
const current = () => epoch === session;
|
|
58
|
+
if (!ctx.hasUI || ctx.mode !== "tui") return;
|
|
59
|
+
|
|
60
|
+
const queued = () => !ctx.isIdle() && ctx.hasPendingMessages();
|
|
61
|
+
// Claude Code sends the draft too, so a draft alone is enough to send now.
|
|
62
|
+
const active = () => !ctx.isIdle() && (ctx.hasPendingMessages() || ctx.ui.getEditorText().trim() !== "");
|
|
63
|
+
|
|
64
|
+
let sending = false;
|
|
65
|
+
const sendNow = async (turnCtx: ExtensionContext) => {
|
|
66
|
+
if (sending) return;
|
|
67
|
+
sending = true;
|
|
68
|
+
try {
|
|
69
|
+
pi.events.emit(SEND_NOW_CHANNEL, {});
|
|
70
|
+
turnCtx.abort();
|
|
71
|
+
if (!turnCtx.isIdle()) {
|
|
72
|
+
await new Promise<void>((resolve) => {
|
|
73
|
+
const fallback = setTimeout(resolve, IDLE_WAIT_MS);
|
|
74
|
+
fallback.unref?.();
|
|
75
|
+
onSettled = () => {
|
|
76
|
+
clearTimeout(fallback);
|
|
77
|
+
resolve();
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (!current() || !turnCtx.isIdle()) return;
|
|
82
|
+
const text = turnCtx.ui.getEditorText().trim();
|
|
83
|
+
if (!text) return;
|
|
84
|
+
turnCtx.ui.setEditorText("");
|
|
85
|
+
// followUp: an async UserPromptSubmit hook runs before pi's busy
|
|
86
|
+
// check, and on pi 1.2.0 a run starting meanwhile would reject a
|
|
87
|
+
// bare send after the editor was cleared.
|
|
88
|
+
pi.sendUserMessage(text, { deliverAs: "followUp" });
|
|
89
|
+
} finally {
|
|
90
|
+
sending = false;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const chord = new SendNowChord();
|
|
95
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
96
|
+
const stopUnsubscribe = ctx.ui.onTerminalInput((data) => {
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
switch (chord.feed(data, active())) {
|
|
99
|
+
case "hold":
|
|
100
|
+
timer = setTimeout(() => chord.expire(), CHORD_TIMEOUT_MS);
|
|
101
|
+
timer.unref?.();
|
|
102
|
+
return { consume: true };
|
|
103
|
+
case "send":
|
|
104
|
+
void sendNow(ctx);
|
|
105
|
+
return { consume: true };
|
|
106
|
+
default:
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
unsubscribe = () => {
|
|
111
|
+
clearTimeout(timer);
|
|
112
|
+
stopUnsubscribe();
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
ctx.ui.setWidget("send-now", (_tui, theme) => {
|
|
116
|
+
const paint = safeThemePaint(theme);
|
|
117
|
+
let cache: { key: string; lines: string[] } | undefined;
|
|
118
|
+
return {
|
|
119
|
+
render: (width: number) => {
|
|
120
|
+
const shown = queued();
|
|
121
|
+
const key = `${width}:${shown}`;
|
|
122
|
+
if (cache?.key === key) return cache.lines;
|
|
123
|
+
const lines = shown ? [truncateLine(paint("dim", ` ↳ ${SEND_NOW_HINT}`), width)] : [];
|
|
124
|
+
cache = { key, lines };
|
|
125
|
+
return lines;
|
|
126
|
+
},
|
|
127
|
+
invalidate: () => {
|
|
128
|
+
cache = undefined;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
@@ -27,6 +27,7 @@ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-a
|
|
|
27
27
|
import { withReasoningFallback } from "../lib/model-policy.ts";
|
|
28
28
|
import { pickEconomicalContainedModel } from "../lib/model-tier.ts";
|
|
29
29
|
import { sessionOutlivesTurn } from "../lib/notifications.ts";
|
|
30
|
+
import { isUserRun } from "../lib/prompt-options.ts";
|
|
30
31
|
import { recordUsage } from "../lib/usage-bus.ts";
|
|
31
32
|
import { firstUserText, isNameableText, parseTitle, SESSION_TITLE_PROMPT, sessionTitleInput } from "./title.ts";
|
|
32
33
|
|
|
@@ -61,6 +62,8 @@ export default function sessionTitleExtension(pi: ExtensionAPI) {
|
|
|
61
62
|
// message never changes, so it is examined once: a first message that is
|
|
62
63
|
// not prose (a breadcrumb, a slash command sent as text) leaves the
|
|
63
64
|
// session unnamed rather than re-scanning the entries every turn.
|
|
65
|
+
// A run an extension opened (pi 1.2.0) carries no prompt: wait for the user's.
|
|
66
|
+
if (!isUserRun(event)) return;
|
|
64
67
|
attempted = true;
|
|
65
68
|
const text = firstUserText(ctx.sessionManager.getEntries() as never) ?? event.prompt;
|
|
66
69
|
if (!isNameableText(text)) return;
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
import { LOCAL_COMMAND_TAG_PREFIXES } from "../lib/local-command.ts";
|
|
16
16
|
import { customMessageText } from "../lib/tui-render.ts";
|
|
17
|
+
import { sanitizeTitle } from "../lib/terminal-text.ts";
|
|
17
18
|
|
|
18
19
|
/** CC's naming instruction (system prompt), verbatim from the 2.1.278 capture. */
|
|
19
20
|
export const SESSION_TITLE_PROMPT =
|
|
@@ -86,7 +87,9 @@ function titleFromJson(text: string): string | undefined {
|
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
function normalizeTitle(raw: string): string | undefined {
|
|
89
|
-
|
|
90
|
+
// The title becomes the terminal title inside pi's own OSC 0: an embedded
|
|
91
|
+
// BEL or ESC would end that sequence and run the rest as terminal output.
|
|
92
|
+
const title = sanitizeTitle(raw);
|
|
90
93
|
if (!title || title.length > MAX_TITLE_LENGTH) return undefined;
|
|
91
94
|
// CC: "Capitalize the first letter of the title."
|
|
92
95
|
return title[0].toUpperCase() + title.slice(1);
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which `/code-review` body a session gets (pure apart from reading the cell
|
|
3
|
+
* files). Claude Code no longer has one body: it picks a "cell" by the model
|
|
4
|
+
* and the effort level, from one table per model family. One Code keys the
|
|
5
|
+
* same choice by prompt tier:
|
|
6
|
+
*
|
|
7
|
+
* - frontier takes Claude Code's default table, the one its Opus 5.5,
|
|
8
|
+
* Sonnet 5.5 and Fable sessions use (minimal prompt at medium, inline
|
|
9
|
+
* angles at high and xhigh, a verified fan-out at max);
|
|
10
|
+
* - workhorse, cheap and tiny take its Sonnet 5 table: the long, explicit
|
|
11
|
+
* recipe (finder angles fanned out over the Agent tool, a verify vote)
|
|
12
|
+
* written for the one model below that line Claude Code tunes a table for.
|
|
13
|
+
* Claude Code's default table reaches its older models only because they
|
|
14
|
+
* have no table of their own; its medium cell leaves the whole review to
|
|
15
|
+
* the model's judgment, which the lower tiers' registers exist to avoid.
|
|
16
|
+
*
|
|
17
|
+
* The effort is the level the user typed first (`/code-review high 123`),
|
|
18
|
+
* else the session's (`/effort`). Claude Code runs Opus 5.5's medium cell as
|
|
19
|
+
* a background fork; here every cell runs in the session's own turn.
|
|
20
|
+
*
|
|
21
|
+
* The cells are Claude Code's text in `skills/code-review/cells/`; the minimal
|
|
22
|
+
* prompt reports through the JSON array the other cells use, since One Code
|
|
23
|
+
* has no findings tool. Every cell is followed by One Code's "Arguments and
|
|
24
|
+
* flags" section.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { readFileSync } from "node:fs";
|
|
28
|
+
import { join } from "node:path";
|
|
29
|
+
import type { PromptTier } from "../lib/model-tier.ts";
|
|
30
|
+
|
|
31
|
+
export const REVIEW_EFFORTS = ["low", "medium", "high", "xhigh", "max"] as const;
|
|
32
|
+
export type ReviewEffort = (typeof REVIEW_EFFORTS)[number];
|
|
33
|
+
|
|
34
|
+
/** Claude Code's default table (`cells/<name>.md`). */
|
|
35
|
+
const DEFAULT_TABLE: Record<ReviewEffort, string> = {
|
|
36
|
+
low: "low-1-pass-max4",
|
|
37
|
+
medium: "minimal-prompt",
|
|
38
|
+
high: "high-8-inline",
|
|
39
|
+
xhigh: "xhigh-10-inline-sweep",
|
|
40
|
+
max: "max-5x5-verify-sweep",
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/** Claude Code's Sonnet 5 table. */
|
|
44
|
+
const SONNET5_TABLE: Record<ReviewEffort, string> = {
|
|
45
|
+
low: "low-1-pass-min-files-4",
|
|
46
|
+
medium: "medium-3x5-verify",
|
|
47
|
+
high: "high-3x5-recall-verify",
|
|
48
|
+
xhigh: "xhigh-5x5-verify-sweep",
|
|
49
|
+
max: "max-5x5-verify-sweep",
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const ARGUMENTS_AND_FLAGS = "arguments-and-flags";
|
|
53
|
+
|
|
54
|
+
export function codeReviewCell(tier: PromptTier, effort: ReviewEffort): string {
|
|
55
|
+
return (tier === "frontier" ? DEFAULT_TABLE : SONNET5_TABLE)[effort];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The review effort for a session thinking level: below low reads as low, unknown as medium (Claude Code's default). */
|
|
59
|
+
export function reviewEffortFor(thinkingLevel: string | undefined): ReviewEffort {
|
|
60
|
+
switch (thinkingLevel) {
|
|
61
|
+
case "off":
|
|
62
|
+
case "minimal":
|
|
63
|
+
case "low":
|
|
64
|
+
return "low";
|
|
65
|
+
case "high":
|
|
66
|
+
case "xhigh":
|
|
67
|
+
case "max":
|
|
68
|
+
return thinkingLevel;
|
|
69
|
+
default:
|
|
70
|
+
return "medium";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** A typed level as the first argument (`/code-review high 123`) and what follows it. */
|
|
75
|
+
export function parseCodeReviewArgs(args: string): { effort?: ReviewEffort; rest: string } {
|
|
76
|
+
const match = /^\s*(\S+)(?:\s+([\s\S]*))?$/.exec(args);
|
|
77
|
+
const first = match?.[1]?.toLowerCase();
|
|
78
|
+
if (!first || !(REVIEW_EFFORTS as readonly string[]).includes(first)) return { rest: args.trim() };
|
|
79
|
+
return { effort: first as ReviewEffort, rest: (match?.[2] ?? "").trim() };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The body for a session: the chosen cell, then the flags section. `args`
|
|
84
|
+
* comes back without the typed level, which the cell already reflects.
|
|
85
|
+
*/
|
|
86
|
+
export function codeReviewBody(
|
|
87
|
+
cellsDir: string,
|
|
88
|
+
tier: PromptTier,
|
|
89
|
+
thinkingLevel: string | undefined,
|
|
90
|
+
args: string,
|
|
91
|
+
): { body: string; args: string; cell: string } {
|
|
92
|
+
const { effort, rest } = parseCodeReviewArgs(args);
|
|
93
|
+
const cell = codeReviewCell(tier, effort ?? reviewEffortFor(thinkingLevel));
|
|
94
|
+
// A checkout that turned line endings into CRLF still sends Claude Code's bytes.
|
|
95
|
+
const read = (name: string) => readFileSync(join(cellsDir, `${name}.md`), "utf-8").replace(/\r\n/g, "\n").trimEnd();
|
|
96
|
+
return { body: `${read(cell)}\n\n${read(ARGUMENTS_AND_FLAGS)}`, args: rest, cell };
|
|
97
|
+
}
|