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,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi's built-in extensions that One Code replaces.
|
|
3
|
+
*
|
|
4
|
+
* pi 0.99 ships `tool-search` and `mcp` as built-in extensions and skips one
|
|
5
|
+
* when another extension registers one of its names: our `tool_search` tool
|
|
6
|
+
* and our `/mcp` command. pi then warns at every start, even with
|
|
7
|
+
* `quietStartup`, and the warning ends by advising the user to "disable or
|
|
8
|
+
* remove the existing extension", meaning One Code (findings §44, §45). Only
|
|
9
|
+
* the `extensions` setting turns a built-in off without the warning, so the
|
|
10
|
+
* bundled app writes `-builtin:<name>` into its own settings, and on the
|
|
11
|
+
* user's own pi a startup notice and `/doctor` say how (decisions/tools.md,
|
|
12
|
+
* "pi's built-in tool search and MCP").
|
|
13
|
+
*
|
|
14
|
+
* Plain JS with no pi imports, like app-launch.mjs: app/bin.mjs loads it on
|
|
15
|
+
* bare Node before pi does.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** pi's built-in extensions One Code replaces, and what of ours replaces each. */
|
|
19
|
+
export const REPLACED_BUILTINS = [
|
|
20
|
+
{ name: "tool-search", ours: "tool search" },
|
|
21
|
+
{ name: "mcp", ours: "MCP" },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/** pi version that first ships the built-ins (`builtin:<name>` extension paths). */
|
|
25
|
+
export const BUILTIN_EXTENSIONS_PI = "0.99.0";
|
|
26
|
+
|
|
27
|
+
const PREFIX = "builtin:";
|
|
28
|
+
|
|
29
|
+
function entriesOf(extensions) {
|
|
30
|
+
return Array.isArray(extensions) ? extensions.filter((entry) => typeof entry === "string") : [];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* pi's `!` patterns are minimatch globs. Callers that can reach pi's own
|
|
35
|
+
* minimatch pass it as `matches` (doctor/builtins.ts); this port is the
|
|
36
|
+
* fallback. A built-in path has no `/`, so it covers `*`, `?`, `[...]`
|
|
37
|
+
* (`[!...]` negated) and `{a,b}` alternatives, nested, but not extglobs such
|
|
38
|
+
* as `@(a|b)`.
|
|
39
|
+
*/
|
|
40
|
+
export function globMatches(pattern, path) {
|
|
41
|
+
let source = "";
|
|
42
|
+
let depth = 0;
|
|
43
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
44
|
+
const char = pattern[i];
|
|
45
|
+
if (char === "*") source += "[^/]*";
|
|
46
|
+
else if (char === "?") source += "[^/]";
|
|
47
|
+
else if (char === "[" && pattern.indexOf("]", i + 2) !== -1) {
|
|
48
|
+
const end = pattern.indexOf("]", i + 2);
|
|
49
|
+
const body = pattern.slice(i + 1, end);
|
|
50
|
+
const negated = body.startsWith("!") || body.startsWith("^");
|
|
51
|
+
source += `[${negated ? "^" : ""}${(negated ? body.slice(1) : body).replace(/[\\\]^]/g, "\\$&")}]`;
|
|
52
|
+
i = end;
|
|
53
|
+
} else if (char === "{") {
|
|
54
|
+
depth++;
|
|
55
|
+
source += "(?:";
|
|
56
|
+
} else if (char === "}" && depth > 0) {
|
|
57
|
+
depth--;
|
|
58
|
+
source += ")";
|
|
59
|
+
} else if (char === "," && depth > 0) source += "|";
|
|
60
|
+
else source += char.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
61
|
+
}
|
|
62
|
+
if (depth > 0) return false; // an unclosed brace: minimatch reads it literally, and no built-in name has one
|
|
63
|
+
return new RegExp(`^${source}$`).test(path);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Whether one setting's override entries turn `path` on (true), off (false),
|
|
68
|
+
* or leave it alone (undefined), in pi's order: `!glob` off, then an exact
|
|
69
|
+
* `+path` on, then an exact `-path` off (`isEnabledByOverrides`).
|
|
70
|
+
*/
|
|
71
|
+
function overrideFor(path, entries, matches) {
|
|
72
|
+
let result;
|
|
73
|
+
for (const entry of entries) {
|
|
74
|
+
if (entry.startsWith("!") && matches(entry.slice(1), path)) result = false;
|
|
75
|
+
}
|
|
76
|
+
if (entries.includes(`+${path}`)) result = true;
|
|
77
|
+
if (entries.includes(`-${path}`)) result = false;
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Whether pi loads built-in `name`, and whether the project's setting is what
|
|
83
|
+
* turns it on: on unless the user's `extensions` setting turns it off, with a
|
|
84
|
+
* matching entry in the project's setting winning (pi's package manager, the
|
|
85
|
+
* `builtinExtensions` loop).
|
|
86
|
+
*/
|
|
87
|
+
function builtinState(name, userExtensions, projectExtensions, matches) {
|
|
88
|
+
const path = `${PREFIX}${name}`;
|
|
89
|
+
const project = overrideFor(path, entriesOf(projectExtensions), matches);
|
|
90
|
+
return { enabled: project ?? overrideFor(path, entriesOf(userExtensions), matches) ?? true, byProject: project === true };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Whether pi loads built-in `name` (`builtinState`); `matches(pattern, path)` reads a `!` glob. */
|
|
94
|
+
export function builtinEnabled(name, userExtensions, projectExtensions, matches = globMatches) {
|
|
95
|
+
return builtinState(name, userExtensions, projectExtensions, matches).enabled;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The replaced built-ins pi still loads, each with the scope that keeps it on:
|
|
100
|
+
* `project` when the project's setting turns it on, else `user`.
|
|
101
|
+
*/
|
|
102
|
+
export function builtinsLeftOn(userExtensions, projectExtensions, matches = globMatches) {
|
|
103
|
+
const left = [];
|
|
104
|
+
for (const { name, ours } of REPLACED_BUILTINS) {
|
|
105
|
+
const { enabled, byProject } = builtinState(name, userExtensions, projectExtensions, matches);
|
|
106
|
+
if (enabled) left.push({ name, ours, scope: byProject ? "project" : "user" });
|
|
107
|
+
}
|
|
108
|
+
return left;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The app's user `extensions` setting with every replaced built-in turned off,
|
|
113
|
+
* except one the user already has a `+` or `-` entry for: that is their
|
|
114
|
+
* choice. `changed` is false when nothing was added.
|
|
115
|
+
*/
|
|
116
|
+
export function withReplacedBuiltinsOff(userExtensions) {
|
|
117
|
+
const entries = entriesOf(userExtensions);
|
|
118
|
+
const names = REPLACED_BUILTINS.map((builtin) => builtin.name).filter(
|
|
119
|
+
(name) => !entries.includes(`+${PREFIX}${name}`) && !entries.includes(`-${PREFIX}${name}`),
|
|
120
|
+
);
|
|
121
|
+
return { extensions: withBuiltinsTurnedOff(userExtensions, names), changed: names.length > 0 };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** "tool-search and mcp" for a list of built-ins. */
|
|
125
|
+
function nameList(left) {
|
|
126
|
+
const names = left.map((builtin) => builtin.name);
|
|
127
|
+
return names.length < 2 ? names.join("") : `${names.slice(0, -1).join(", ")} and ${names[names.length - 1]}`;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The startup notice for built-ins pi still loads, or undefined when none is.
|
|
132
|
+
* `configCommand` is how the user reaches pi's config UI (`pi config`, or
|
|
133
|
+
* `onecode config` under the app).
|
|
134
|
+
*/
|
|
135
|
+
export function replacedBuiltinsNotice(left, configCommand = "pi config") {
|
|
136
|
+
if (left.length === 0) return undefined;
|
|
137
|
+
const ours = left.map((builtin) => builtin.ours).join(" and ");
|
|
138
|
+
const names = nameList(left);
|
|
139
|
+
const plural = left.length > 1;
|
|
140
|
+
return (
|
|
141
|
+
`One Code provides its own ${ours}, so pi skips its built-in ${names} ${plural ? "extensions" : "extension"} and warns about ${plural ? "them" : "it"} at startup. ` +
|
|
142
|
+
`Keep One Code installed. To hide the ${plural ? "warnings" : "warning"}, run \`${configCommand}\` and turn off ${names} under Built-in, or run /doctor to have it done for you.`
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* The exact settings change that turns the built-ins off, for `/doctor`'s fix
|
|
148
|
+
* line: the user file gets `-builtin:<name>` entries, and a project entry
|
|
149
|
+
* that turns one back on has to go.
|
|
150
|
+
*/
|
|
151
|
+
export function replacedBuiltinsFix(left, paths, configCommand = "pi config") {
|
|
152
|
+
const user = left.filter((builtin) => builtin.scope === "user");
|
|
153
|
+
const project = left.filter((builtin) => builtin.scope === "project");
|
|
154
|
+
const steps = [];
|
|
155
|
+
if (user.length > 0) {
|
|
156
|
+
const entries = user.map((builtin) => `"-${PREFIX}${builtin.name}"`).join(" and ");
|
|
157
|
+
steps.push(`add ${entries} to the "extensions" array in ${paths.user} (or run \`${configCommand}\` and turn ${nameList(user)} off under Built-in)`);
|
|
158
|
+
}
|
|
159
|
+
if (project.length > 0) {
|
|
160
|
+
const entries = project.map((builtin) => `"+${PREFIX}${builtin.name}"`).join(" and ");
|
|
161
|
+
steps.push(`remove ${entries} from the "extensions" array in ${paths.project}`);
|
|
162
|
+
}
|
|
163
|
+
const text = steps.join("; then ");
|
|
164
|
+
return `${text.charAt(0).toUpperCase()}${text.slice(1)}. It takes effect at the next start.`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* The user `extensions` setting with `names` turned off: each one's `+` entry
|
|
169
|
+
* removed and a `-` entry added (the consent path: the user said yes, so a
|
|
170
|
+
* `+` entry of theirs is replaced, unlike `withReplacedBuiltinsOff`).
|
|
171
|
+
*/
|
|
172
|
+
export function withBuiltinsTurnedOff(userExtensions, names) {
|
|
173
|
+
const turnOn = new Set(names.map((name) => `+${PREFIX}${name}`));
|
|
174
|
+
const entries = (Array.isArray(userExtensions) ? userExtensions : []).filter((entry) => !turnOn.has(entry));
|
|
175
|
+
for (const name of names) {
|
|
176
|
+
if (!entries.includes(`-${PREFIX}${name}`)) entries.push(`-${PREFIX}${name}`);
|
|
177
|
+
}
|
|
178
|
+
return entries;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export const TURN_OFF_YES = "Yes, turn them off";
|
|
182
|
+
export const TURN_OFF_NO = "No, keep pi's built-ins on";
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* The one-time question on the user's own pi, saying why: what pi's warning
|
|
186
|
+
* means, what turning the built-ins off changes, and how to undo it.
|
|
187
|
+
*/
|
|
188
|
+
export function turnOffPrompt(left, settingsPath, configCommand = "pi config") {
|
|
189
|
+
const names = nameList(left);
|
|
190
|
+
const plural = left.length > 1;
|
|
191
|
+
const ours = left.map((builtin) => builtin.ours).join(" and ");
|
|
192
|
+
return [
|
|
193
|
+
`Turn off pi's built-in ${names}?`,
|
|
194
|
+
"",
|
|
195
|
+
`pi ${plural ? "ships these" : "ships this"} as built-in ${plural ? "extensions" : "extension"}. One Code brings its own ${ours} (Claude Code's tool search, and MCP that reads your Claude Code config), so pi already skips ${plural ? "them" : "it"} and warns about ${plural ? "each" : "it"} at every start, telling you to remove One Code.`,
|
|
196
|
+
"",
|
|
197
|
+
`Turning ${plural ? "them" : "it"} off changes nothing while One Code is installed and silences the ${plural ? "warnings" : "warning"} from the next start. One Code adds ${left.map((builtin) => `"-${PREFIX}${builtin.name}"`).join(" and ")} to "extensions" in ${settingsPath}. If you remove One Code later, turn ${plural ? "them" : "it"} back on with \`${configCommand}\`.`,
|
|
198
|
+
].join("\n");
|
|
199
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A side call sent as a replay of the session's last provider request, for the
|
|
3
|
+
* extensions that consume the compaction extension's capture (btw, recap). The
|
|
4
|
+
* shape rules are in request-replay.ts; this is the wiring they share.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
8
|
+
import type { Api, Message, Model, Usage } from "@earendil-works/pi-ai";
|
|
9
|
+
import { completeSimple } from "@earendil-works/pi-ai/compat";
|
|
10
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
11
|
+
import { sessionRequestHeaders } from "../context-management/index.ts";
|
|
12
|
+
import { extendPayload, LAST_REQUEST_CHANNEL, LastExchange, type RequestCapture, replayOutputCap, replayTail } from "./request-replay.ts";
|
|
13
|
+
import { answerText } from "./side-call.ts";
|
|
14
|
+
|
|
15
|
+
export type SessionExchange = LastExchange<AgentMessage & { role: string }>;
|
|
16
|
+
|
|
17
|
+
/** The last captured request and its reply, kept current from the capture channel and `message_end`. */
|
|
18
|
+
export function followLastExchange(pi: ExtensionAPI): SessionExchange {
|
|
19
|
+
const exchange: SessionExchange = new LastExchange();
|
|
20
|
+
pi.events.on(LAST_REQUEST_CHANNEL, (capture) => exchange.setCapture(capture as RequestCapture | undefined));
|
|
21
|
+
pi.on("message_end", (event) => exchange.noteMessage(event.message as AgentMessage & { role: string }));
|
|
22
|
+
return exchange;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Send `prompt` as the replay of the last request on `model`, after
|
|
27
|
+
* `options.history` (earlier side exchanges), returning the answer's text.
|
|
28
|
+
* Undefined when there is no capture for `model`, too little output room is
|
|
29
|
+
* left, there is no API key, the call failed, or the reply called a tool or
|
|
30
|
+
* held no text (the replayed request declares the session's tools, and text
|
|
31
|
+
* beside a tool call is a preamble, not the answer), so the caller runs its
|
|
32
|
+
* standalone call instead; an empty string when the caller's own signal
|
|
33
|
+
* aborted it. Throws when `timeoutMs` ran out: the time budget is spent, so a
|
|
34
|
+
* standalone call must not start a second one.
|
|
35
|
+
*/
|
|
36
|
+
export async function replaySideCall(
|
|
37
|
+
ctx: Pick<ExtensionContext, "modelRegistry" | "sessionManager">,
|
|
38
|
+
model: Model<Api>,
|
|
39
|
+
exchange: SessionExchange,
|
|
40
|
+
prompt: string,
|
|
41
|
+
options: { signal: AbortSignal; timeoutMs: number; onUsage: (usage: Usage) => void; history?: readonly Message[] },
|
|
42
|
+
): Promise<string | undefined> {
|
|
43
|
+
const wire = exchange.forModel(model);
|
|
44
|
+
if (!wire) return undefined;
|
|
45
|
+
const tail = replayTail(wire.reply as Message | undefined, prompt, Date.now(), options.history);
|
|
46
|
+
const cap = replayOutputCap(wire.capture, tail);
|
|
47
|
+
if (cap === undefined) return undefined;
|
|
48
|
+
const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
|
|
49
|
+
if (!auth.ok) return undefined;
|
|
50
|
+
const baseUrl = (auth as { baseUrl?: string }).baseUrl;
|
|
51
|
+
const timeout = AbortSignal.timeout(options.timeoutMs);
|
|
52
|
+
const result = await completeSimple(
|
|
53
|
+
baseUrl ? ({ ...model, baseUrl } as Model<Api>) : model,
|
|
54
|
+
{ systemPrompt: "", messages: tail, tools: [] },
|
|
55
|
+
{
|
|
56
|
+
apiKey: auth.apiKey,
|
|
57
|
+
headers: sessionRequestHeaders(model, auth.headers),
|
|
58
|
+
env: auth.env,
|
|
59
|
+
signal: AbortSignal.any([options.signal, timeout]),
|
|
60
|
+
maxTokens: cap,
|
|
61
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
62
|
+
onPayload: (payload) => extendPayload(wire.capture, payload as Record<string, unknown>, cap),
|
|
63
|
+
},
|
|
64
|
+
);
|
|
65
|
+
options.onUsage(result.usage);
|
|
66
|
+
if (options.signal.aborted) return "";
|
|
67
|
+
if (timeout.aborted) throw new Error(`No answer within ${Math.round(options.timeoutMs / 1000)} seconds.`);
|
|
68
|
+
if (result.stopReason === "aborted" || result.stopReason === "error" || result.stopReason === "toolUse") return undefined;
|
|
69
|
+
return answerText(result.content) || undefined;
|
|
70
|
+
}
|