pi-usereq 0.6.0 → 0.10.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/.gitignore +2 -0
- package/CHANGELOG.md +44 -0
- package/README.md +1 -1
- package/docs/pi.dev/coding-agent-docs/custom-provider.md +42 -1
- package/docs/pi.dev/coding-agent-docs/extensions.md +302 -28
- package/docs/pi.dev/coding-agent-docs/keybindings.md +23 -1
- package/docs/pi.dev/coding-agent-docs/models.md +3 -0
- package/docs/pi.dev/coding-agent-docs/packages.md +2 -2
- package/docs/pi.dev/coding-agent-docs/prompt-templates.md +21 -0
- package/docs/pi.dev/coding-agent-docs/providers.md +1 -0
- package/docs/pi.dev/coding-agent-docs/rpc.md +36 -6
- package/docs/pi.dev/coding-agent-docs/sdk.md +30 -5
- package/docs/pi.dev/coding-agent-docs/session.md +1 -1
- package/docs/pi.dev/coding-agent-docs/settings.md +2 -1
- package/docs/pi.dev/coding-agent-docs/skills.md +12 -12
- package/docs/pi.dev/coding-agent-docs/tree.md +2 -0
- package/docs/pi.dev/coding-agent-docs/tui.md +31 -0
- package/docs/pi.dev/mom-docs/new.md +4 -4
- package/package.json +1 -1
- package/pi-usereq/docs/REFERENCES.md +2658 -2035
- package/pi-usereq/docs/REQUIREMENTS.md +345 -191
- package/pi-usereq/docs/WORKFLOW.md +387 -363
- package/pi.dev-src/pi-mono/agent/src/agent-loop.ts +683 -0
- package/pi.dev-src/pi-mono/agent/src/agent.ts +543 -0
- package/pi.dev-src/pi-mono/agent/src/index.ts +8 -0
- package/pi.dev-src/pi-mono/agent/src/proxy.ts +367 -0
- package/pi.dev-src/pi-mono/agent/src/types.ts +364 -0
- package/pi.dev-src/pi-mono/agent/test/agent-loop.test.ts +1181 -0
- package/pi.dev-src/pi-mono/agent/test/agent.test.ts +463 -0
- package/pi.dev-src/pi-mono/agent/test/e2e.test.ts +404 -0
- package/pi.dev-src/pi-mono/agent/test/utils/calculate.ts +32 -0
- package/pi.dev-src/pi-mono/agent/test/utils/get-current-time.ts +46 -0
- package/pi.dev-src/pi-mono/agent/vitest.config.ts +9 -0
- package/pi.dev-src/pi-mono/ai/bedrock-provider.d.ts +1 -0
- package/pi.dev-src/pi-mono/ai/bedrock-provider.js +1 -0
- package/pi.dev-src/pi-mono/ai/scripts/generate-models.ts +1635 -0
- package/pi.dev-src/pi-mono/ai/scripts/generate-test-image.ts +34 -0
- package/pi.dev-src/pi-mono/ai/src/api-registry.ts +98 -0
- package/pi.dev-src/pi-mono/ai/src/bedrock-provider.ts +6 -0
- package/pi.dev-src/pi-mono/ai/src/cli.ts +133 -0
- package/pi.dev-src/pi-mono/ai/src/env-api-keys.ts +134 -0
- package/pi.dev-src/pi-mono/ai/src/index.ts +35 -0
- package/pi.dev-src/pi-mono/ai/src/models.generated.ts +14928 -0
- package/pi.dev-src/pi-mono/ai/src/models.ts +82 -0
- package/pi.dev-src/pi-mono/ai/src/oauth.ts +1 -0
- package/pi.dev-src/pi-mono/ai/src/providers/amazon-bedrock.ts +929 -0
- package/pi.dev-src/pi-mono/ai/src/providers/anthropic.ts +1125 -0
- package/pi.dev-src/pi-mono/ai/src/providers/azure-openai-responses.ts +253 -0
- package/pi.dev-src/pi-mono/ai/src/providers/faux.ts +499 -0
- package/pi.dev-src/pi-mono/ai/src/providers/github-copilot-headers.ts +37 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google-gemini-cli.ts +996 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google-shared.ts +354 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google-vertex.ts +543 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google.ts +500 -0
- package/pi.dev-src/pi-mono/ai/src/providers/mistral.ts +629 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-codex-responses.ts +984 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-completions.ts +1063 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-responses-shared.ts +539 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-responses.ts +264 -0
- package/pi.dev-src/pi-mono/ai/src/providers/register-builtins.ts +433 -0
- package/pi.dev-src/pi-mono/ai/src/providers/simple-options.ts +47 -0
- package/pi.dev-src/pi-mono/ai/src/providers/transform-messages.ts +220 -0
- package/pi.dev-src/pi-mono/ai/src/stream.ts +59 -0
- package/pi.dev-src/pi-mono/ai/src/types.ts +417 -0
- package/pi.dev-src/pi-mono/ai/src/utils/event-stream.ts +87 -0
- package/pi.dev-src/pi-mono/ai/src/utils/hash.ts +13 -0
- package/pi.dev-src/pi-mono/ai/src/utils/headers.ts +7 -0
- package/pi.dev-src/pi-mono/ai/src/utils/json-parse.ts +124 -0
- package/pi.dev-src/pi-mono/ai/src/utils/overflow.ts +138 -0
- package/pi.dev-src/pi-mono/ai/src/utils/sanitize-unicode.ts +25 -0
- package/pi.dev-src/pi-mono/ai/src/utils/typebox-helpers.ts +24 -0
- package/pi.dev-src/pi-mono/ai/src/utils/validation.ts +324 -0
- package/pi.dev-src/pi-mono/ai/test/abort.test.ts +260 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-oauth.test.ts +99 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-opus-4-7-smoke.test.ts +72 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-sse-parsing.test.ts +113 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-thinking-disable.test.ts +152 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-tool-name-normalization.test.ts +205 -0
- package/pi.dev-src/pi-mono/ai/test/azure-utils.ts +28 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-endpoint-resolution.test.ts +131 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-models.test.ts +66 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-thinking-payload.test.ts +107 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-utils.ts +18 -0
- package/pi.dev-src/pi-mono/ai/test/cache-retention.test.ts +335 -0
- package/pi.dev-src/pi-mono/ai/test/context-overflow.test.ts +714 -0
- package/pi.dev-src/pi-mono/ai/test/cross-provider-handoff.test.ts +458 -0
- package/pi.dev-src/pi-mono/ai/test/data/red-circle.png +0 -0
- package/pi.dev-src/pi-mono/ai/test/empty.test.ts +742 -0
- package/pi.dev-src/pi-mono/ai/test/faux-provider.test.ts +597 -0
- package/pi.dev-src/pi-mono/ai/test/fireworks-models.test.ts +49 -0
- package/pi.dev-src/pi-mono/ai/test/github-copilot-anthropic.test.ts +108 -0
- package/pi.dev-src/pi-mono/ai/test/github-copilot-oauth.test.ts +196 -0
- package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-claude-thinking-header.test.ts +103 -0
- package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-empty-stream.test.ts +108 -0
- package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-retry-delay.test.ts +53 -0
- package/pi.dev-src/pi-mono/ai/test/google-shared-convert-tools.test.ts +187 -0
- package/pi.dev-src/pi-mono/ai/test/google-shared-gemini3-unsigned-tool-call.test.ts +172 -0
- package/pi.dev-src/pi-mono/ai/test/google-shared-image-tool-result-routing.test.ts +124 -0
- package/pi.dev-src/pi-mono/ai/test/google-thinking-disable.test.ts +183 -0
- package/pi.dev-src/pi-mono/ai/test/google-thinking-signature.test.ts +38 -0
- package/pi.dev-src/pi-mono/ai/test/google-tool-call-missing-args.test.ts +105 -0
- package/pi.dev-src/pi-mono/ai/test/google-vertex-api-key-resolution.test.ts +144 -0
- package/pi.dev-src/pi-mono/ai/test/image-tool-result.test.ts +481 -0
- package/pi.dev-src/pi-mono/ai/test/interleaved-thinking.test.ts +145 -0
- package/pi.dev-src/pi-mono/ai/test/lazy-module-load.test.ts +102 -0
- package/pi.dev-src/pi-mono/ai/test/mistral-reasoning-mode.test.ts +66 -0
- package/pi.dev-src/pi-mono/ai/test/mistral-tool-schema.test.ts +61 -0
- package/pi.dev-src/pi-mono/ai/test/oauth.ts +89 -0
- package/pi.dev-src/pi-mono/ai/test/openai-codex-cache-affinity-e2e.test.ts +36 -0
- package/pi.dev-src/pi-mono/ai/test/openai-codex-stream.test.ts +686 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-cache-control-format.test.ts +189 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-prompt-cache.test.ts +198 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-thinking-as-text.test.ts +214 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-choice.test.ts +560 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-result-images.test.ts +101 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-cache-affinity-e2e.test.ts +32 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-copilot-provider.test.ts +128 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-foreign-toolcall-id.test.ts +66 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-partial-json-cleanup.test.ts +101 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-reasoning-replay-e2e.test.ts +292 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-tool-result-images.test.ts +200 -0
- package/pi.dev-src/pi-mono/ai/test/openrouter-cache-write-repro.test.ts +78 -0
- package/pi.dev-src/pi-mono/ai/test/overflow.test.ts +64 -0
- package/pi.dev-src/pi-mono/ai/test/responseid.test.ts +145 -0
- package/pi.dev-src/pi-mono/ai/test/stream.test.ts +1405 -0
- package/pi.dev-src/pi-mono/ai/test/supports-xhigh.test.ts +34 -0
- package/pi.dev-src/pi-mono/ai/test/tokens.test.ts +304 -0
- package/pi.dev-src/pi-mono/ai/test/tool-call-id-normalization.test.ts +291 -0
- package/pi.dev-src/pi-mono/ai/test/tool-call-without-result.test.ts +313 -0
- package/pi.dev-src/pi-mono/ai/test/total-tokens.test.ts +695 -0
- package/pi.dev-src/pi-mono/ai/test/transform-messages-copilot-openai-to-anthropic.test.ts +191 -0
- package/pi.dev-src/pi-mono/ai/test/unicode-surrogate.test.ts +754 -0
- package/pi.dev-src/pi-mono/ai/test/validation.test.ts +116 -0
- package/pi.dev-src/pi-mono/ai/test/xhigh.test.ts +71 -0
- package/pi.dev-src/pi-mono/ai/test/zen.test.ts +25 -0
- package/pi.dev-src/pi-mono/ai/vitest.config.ts +9 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/antigravity-image-gen.ts +418 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bash-spawn-hook.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bookmark.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/claude-rules.ts +86 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/commands.ts +72 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/confirm-destructive.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-compaction.ts +127 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-footer.ts +64 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-header.ts +73 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dirty-repo-guard.ts +56 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/index.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/index.ts +15 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-tools.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/event-bus.ts +43 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/file-trigger.ts +41 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/git-checkpoint.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/handoff.ts +153 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hello.ts +26 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hidden-thinking-label.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/inline-bash.ts +94 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/input-transform.ts +43 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/interactive-shell.ts +196 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/mac-system-theme.ts +47 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/message-renderer.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/minimal-mode.ts +426 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/modal-editor.ts +85 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/model-status.ts +31 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/notify.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-qa-tests.ts +1348 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-test.ts +150 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/permission-gate.ts +34 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/pirate.ts +47 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/index.ts +340 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/utils.ts +168 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/preset.ts +430 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/prompt-customizer.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/protected-paths.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/provider-payload.ts +18 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/qna.ts +122 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/question.ts +264 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/questionnaire.ts +427 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rainbow-editor.ts +88 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/reload-runtime.ts +37 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rpc-demo.ts +118 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/index.ts +321 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/package-lock.json +92 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/send-user-message.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/session-name.ts +27 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/shutdown-command.ts +63 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/snake.ts +343 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/space-invaders.ts +560 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/ssh.ts +220 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/status-line.ts +32 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/structured-output.ts +65 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/planner.md +37 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/scout.md +50 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/worker.md +24 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents.ts +126 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/index.ts +987 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement.md +10 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/summarize.ts +206 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/system-prompt-header.ts +17 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tic-tac-toe.ts +1008 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/timed-confirm.ts +70 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/titlebar-spinner.ts +58 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/todo.ts +297 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tool-override.ts +144 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tools.ts +141 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/trigger-compact.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/truncated-tool.ts +195 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/widget-placement.ts +9 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/index.ts +32 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/package-lock.json +31 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-indicator.ts +123 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-message-test.ts +25 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/rpc-extension-ui.ts +632 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/01-minimal.ts +22 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/02-custom-model.ts +49 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/03-custom-prompt.ts +62 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/04-skills.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/05-tools.ts +44 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/06-extensions.ts +90 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/07-context-files.ts +42 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/08-prompt-templates.ts +51 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/10-settings.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/11-sessions.ts +48 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/12-full-control.ts +73 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/13-session-runtime.ts +67 -0
- package/pi.dev-src/pi-mono/coding-agent/scripts/migrate-sessions.sh +93 -0
- package/pi.dev-src/pi-mono/coding-agent/src/bun/cli.ts +6 -0
- package/pi.dev-src/pi-mono/coding-agent/src/bun/register-bedrock.ts +4 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/args.ts +335 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/config-selector.ts +52 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/file-processor.ts +100 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/initial-message.ts +43 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/list-models.ts +110 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/session-picker.ts +52 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli.ts +17 -0
- package/pi.dev-src/pi-mono/coding-agent/src/config.ts +261 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-runtime.ts +394 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-services.ts +196 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session.ts +3096 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/auth-storage.ts +493 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/bash-executor.ts +154 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/branch-summarization.ts +355 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/compaction.ts +839 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/index.ts +7 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/utils.ts +170 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/defaults.ts +3 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/diagnostics.ts +15 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/event-bus.ts +33 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/exec.ts +107 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/ansi-to-html.ts +258 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/index.ts +314 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.css +1017 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.html +55 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.js +1770 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/tool-renderer.ts +158 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/highlight.min.js +1213 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/marked.min.js +6 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/index.ts +171 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/loader.ts +606 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/runner.ts +1019 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/types.ts +1542 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/wrapper.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/footer-data-provider.ts +354 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/index.ts +77 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/keybindings.ts +370 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/messages.ts +195 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/model-registry.ts +858 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/model-resolver.ts +629 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/output-guard.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/package-manager.ts +2408 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/prompt-templates.ts +296 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/resolve-config-value.ts +142 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/resource-loader.ts +917 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/sdk.ts +380 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/session-cwd.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/session-manager.ts +1425 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/settings-manager.ts +999 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/skills.ts +508 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/slash-commands.ts +39 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/source-info.ts +40 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/system-prompt.ts +172 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/telemetry.ts +13 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/timings.ts +31 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/bash.ts +448 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit-diff.ts +445 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit.ts +487 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/file-mutation-queue.ts +39 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/find.ts +370 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/grep.ts +384 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/index.ts +196 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/ls.ts +229 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/path-utils.ts +94 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/read.ts +273 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/render-utils.ts +64 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/tool-definition-wrapper.ts +45 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/truncate.ts +265 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/write.ts +281 -0
- package/pi.dev-src/pi-mono/coding-agent/src/index.ts +352 -0
- package/pi.dev-src/pi-mono/coding-agent/src/main.ts +731 -0
- package/pi.dev-src/pi-mono/coding-agent/src/migrations.ts +314 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/index.ts +9 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/assets/clankolas.png +0 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/armin.ts +382 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/assistant-message.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bash-execution.ts +218 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bordered-loader.ts +68 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/branch-summary-message.ts +58 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/compaction-summary-message.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/config-selector.ts +592 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/countdown-timer.ts +38 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-editor.ts +80 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-message.ts +99 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/daxnuts.ts +164 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/diff.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/dynamic-border.ts +25 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/earendil-announcement.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-editor.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-input.ts +87 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-selector.ts +107 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/footer.ts +220 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/index.ts +32 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/keybinding-hints.ts +24 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/login-dialog.ts +178 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/model-selector.ts +338 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/oauth-selector.ts +121 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/scoped-models-selector.ts +355 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector-search.ts +194 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector.ts +1026 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/settings-selector.ts +456 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/show-images-selector.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/skill-invocation-message.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/theme-selector.ts +67 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/thinking-selector.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tool-execution.ts +352 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tree-selector.ts +1246 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message-selector.ts +155 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message.ts +35 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/visual-truncate.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/interactive-mode.ts +5155 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/dark.json +85 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/light.json +84 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme-schema.json +335 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme.ts +1141 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/print-mode.ts +158 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/jsonl.ts +58 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-client.ts +515 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-mode.ts +745 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-types.ts +264 -0
- package/pi.dev-src/pi-mono/coding-agent/src/package-manager-cli.ts +270 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/changelog.ts +99 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/child-process.ts +86 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-image.ts +300 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-native.ts +22 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard.ts +81 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/exif-orientation.ts +183 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/frontmatter.ts +39 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/fs-watch.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/git.ts +192 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/image-convert.ts +41 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/image-resize.ts +176 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/mime.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/paths.ts +20 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/photon.ts +139 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/shell.ts +210 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/sleep.ts +18 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/tools-manager.ts +287 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-auto-compaction-queue.test.ts +437 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-branching.test.ts +156 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-compaction.test.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-concurrent.test.ts +618 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-provider.test.ts +117 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-tools.test.ts +182 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-retry.test.ts +318 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-runtime-events.test.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-stats.test.ts +143 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-tree-navigation.test.ts +323 -0
- package/pi.dev-src/pi-mono/coding-agent/test/args.test.ts +328 -0
- package/pi.dev-src/pi-mono/coding-agent/test/assistant-message.test.ts +57 -0
- package/pi.dev-src/pi-mono/coding-agent/test/auth-storage.test.ts +462 -0
- package/pi.dev-src/pi-mono/coding-agent/test/bash-close-hang-windows.test.ts +126 -0
- package/pi.dev-src/pi-mono/coding-agent/test/bash-execution-width.test.ts +80 -0
- package/pi.dev-src/pi-mono/coding-agent/test/block-images.test.ts +120 -0
- package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image-bmp-conversion.test.ts +88 -0
- package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image.test.ts +136 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions-example.test.ts +66 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions.test.ts +415 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-serialization.test.ts +79 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-summary-reasoning.test.ts +118 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-thinking-model.test.ts +223 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction.test.ts +550 -0
- package/pi.dev-src/pi-mono/coding-agent/test/config.test.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-legacy-input.test.ts +116 -0
- package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-no-full-redraw.test.ts +235 -0
- package/pi.dev-src/pi-mono/coding-agent/test/export-html-whitespace.test.ts +12 -0
- package/pi.dev-src/pi-mono/coding-agent/test/export-html-xss.test.ts +28 -0
- package/pi.dev-src/pi-mono/coding-agent/test/extensions-discovery.test.ts +463 -0
- package/pi.dev-src/pi-mono/coding-agent/test/extensions-input-event.test.ts +112 -0
- package/pi.dev-src/pi-mono/coding-agent/test/extensions-runner.test.ts +805 -0
- package/pi.dev-src/pi-mono/coding-agent/test/file-mutation-queue.test.ts +163 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/assistant-message-with-thinking-code.json +33 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/before-compaction.jsonl +1003 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-agent/.gitkeep +0 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-cwd/.gitkeep +0 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/large-session.jsonl +1019 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/consecutive-hyphens/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/disable-model-invocation/SKILL.md +9 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-name-chars/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-yaml/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/long-name/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/missing-description/SKILL.md +7 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/multiline-description/SKILL.md +11 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/name-mismatch/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/nested/child-skill/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/no-frontmatter/SKILL.md +3 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/SKILL.md +3 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/nested-child/SKILL.md +3 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/unknown-field/SKILL.md +10 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/valid-skill/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/first/calendar/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/second/calendar/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/footer-data-provider.test.ts +265 -0
- package/pi.dev-src/pi-mono/coding-agent/test/footer-width.test.ts +115 -0
- package/pi.dev-src/pi-mono/coding-agent/test/frontmatter.test.ts +60 -0
- package/pi.dev-src/pi-mono/coding-agent/test/git-ssh-url.test.ts +78 -0
- package/pi.dev-src/pi-mono/coding-agent/test/git-update.test.ts +411 -0
- package/pi.dev-src/pi-mono/coding-agent/test/image-processing.test.ts +145 -0
- package/pi.dev-src/pi-mono/coding-agent/test/image-resize-callers.test.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/test/initial-message.test.ts +48 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-anthropic-warning.test.ts +73 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-clone-command.test.ts +77 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-compaction.test.ts +57 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-import-command.test.ts +144 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-status.test.ts +635 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-suspend.test.ts +149 -0
- package/pi.dev-src/pi-mono/coding-agent/test/keybindings-migration.test.ts +88 -0
- package/pi.dev-src/pi-mono/coding-agent/test/model-registry.test.ts +1209 -0
- package/pi.dev-src/pi-mono/coding-agent/test/model-resolver.test.ts +436 -0
- package/pi.dev-src/pi-mono/coding-agent/test/package-command-paths.test.ts +144 -0
- package/pi.dev-src/pi-mono/coding-agent/test/package-manager-ssh.test.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/test/package-manager.test.ts +1795 -0
- package/pi.dev-src/pi-mono/coding-agent/test/path-utils.test.ts +162 -0
- package/pi.dev-src/pi-mono/coding-agent/test/plan-mode-utils.test.ts +261 -0
- package/pi.dev-src/pi-mono/coding-agent/test/print-mode.test.ts +140 -0
- package/pi.dev-src/pi-mono/coding-agent/test/prompt-templates.test.ts +515 -0
- package/pi.dev-src/pi-mono/coding-agent/test/resource-loader.test.ts +576 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-client-clone.test.ts +29 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-example.ts +86 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-jsonl.test.ts +65 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-prompt-response-semantics.test.ts +285 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc.test.ts +321 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts +364 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-openrouter-attribution.test.ts +181 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-session-manager.test.ts +95 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-skills.test.ts +109 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-cwd.test.ts +91 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-info-modified-timestamp.test.ts +83 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/build-context.test.ts +268 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/custom-session-id.test.ts +109 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/file-operations.test.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/labels.test.ts +198 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/migration.test.ts +78 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/save-entry.test.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/tree-traversal.test.ts +533 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-selector-path-delete.test.ts +315 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-selector-rename.test.ts +111 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-selector-search.test.ts +195 -0
- package/pi.dev-src/pi-mono/coding-agent/test/settings-manager-bug.test.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/test/settings-manager.test.ts +319 -0
- package/pi.dev-src/pi-mono/coding-agent/test/skills.test.ts +432 -0
- package/pi.dev-src/pi-mono/coding-agent/test/stdout-cleanliness.test.ts +103 -0
- package/pi.dev-src/pi-mono/coding-agent/test/streaming-render-debug.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-bash-persistence.test.ts +242 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-compaction.test.ts +343 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-model-extension.test.ts +325 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-prompt.test.ts +323 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-queue.test.ts +422 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-retry-events.test.ts +358 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-runtime.test.ts +553 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/harness.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts +80 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts +100 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2781-skill-collision-precedence.test.ts +120 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts +106 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts +94 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts +274 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts +104 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts +72 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts +83 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts +33 -0
- package/pi.dev-src/pi-mono/coding-agent/test/system-prompt.test.ts +102 -0
- package/pi.dev-src/pi-mono/coding-agent/test/test-harness.test.ts +321 -0
- package/pi.dev-src/pi-mono/coding-agent/test/test-harness.ts +446 -0
- package/pi.dev-src/pi-mono/coding-agent/test/test-theme-colors.ts +246 -0
- package/pi.dev-src/pi-mono/coding-agent/test/theme-export.test.ts +104 -0
- package/pi.dev-src/pi-mono/coding-agent/test/tool-execution-component.test.ts +331 -0
- package/pi.dev-src/pi-mono/coding-agent/test/tools.test.ts +889 -0
- package/pi.dev-src/pi-mono/coding-agent/test/tree-selector.test.ts +655 -0
- package/pi.dev-src/pi-mono/coding-agent/test/trigger-compact-extension.test.ts +57 -0
- package/pi.dev-src/pi-mono/coding-agent/test/truncate-to-width.test.ts +81 -0
- package/pi.dev-src/pi-mono/coding-agent/test/user-message.test.ts +25 -0
- package/pi.dev-src/pi-mono/coding-agent/test/utilities.ts +316 -0
- package/pi.dev-src/pi-mono/coding-agent/tsconfig.examples.json +16 -0
- package/pi.dev-src/pi-mono/coding-agent/vitest.config.ts +26 -0
- package/pi.dev-src/pi-mono/mom/dev.sh +30 -0
- package/pi.dev-src/pi-mono/mom/docker.sh +95 -0
- package/pi.dev-src/pi-mono/mom/scripts/migrate-timestamps.ts +121 -0
- package/pi.dev-src/pi-mono/mom/src/agent.ts +882 -0
- package/pi.dev-src/pi-mono/mom/src/context.ts +180 -0
- package/pi.dev-src/pi-mono/mom/src/download.ts +117 -0
- package/pi.dev-src/pi-mono/mom/src/events.ts +442 -0
- package/pi.dev-src/pi-mono/mom/src/fs-watch.ts +30 -0
- package/pi.dev-src/pi-mono/mom/src/log.ts +271 -0
- package/pi.dev-src/pi-mono/mom/src/main.ts +367 -0
- package/pi.dev-src/pi-mono/mom/src/sandbox.ts +221 -0
- package/pi.dev-src/pi-mono/mom/src/slack.ts +623 -0
- package/pi.dev-src/pi-mono/mom/src/store.ts +234 -0
- package/pi.dev-src/pi-mono/mom/src/tools/attach.ts +47 -0
- package/pi.dev-src/pi-mono/mom/src/tools/bash.ts +97 -0
- package/pi.dev-src/pi-mono/mom/src/tools/edit.ts +165 -0
- package/pi.dev-src/pi-mono/mom/src/tools/index.ts +19 -0
- package/pi.dev-src/pi-mono/mom/src/tools/read.ts +159 -0
- package/pi.dev-src/pi-mono/mom/src/tools/truncate.ts +236 -0
- package/pi.dev-src/pi-mono/mom/src/tools/write.ts +45 -0
- package/pi.dev-src/pi-mono/mom/test/events.test.ts +50 -0
- package/pi.dev-src/pi-mono/pods/scripts/model_run.sh +83 -0
- package/pi.dev-src/pi-mono/pods/scripts/pod_setup.sh +336 -0
- package/pi.dev-src/pi-mono/pods/src/cli.ts +360 -0
- package/pi.dev-src/pi-mono/pods/src/commands/models.ts +753 -0
- package/pi.dev-src/pi-mono/pods/src/commands/pods.ts +205 -0
- package/pi.dev-src/pi-mono/pods/src/commands/prompt.ts +84 -0
- package/pi.dev-src/pi-mono/pods/src/config.ts +80 -0
- package/pi.dev-src/pi-mono/pods/src/index.ts +2 -0
- package/pi.dev-src/pi-mono/pods/src/model-configs.ts +111 -0
- package/pi.dev-src/pi-mono/pods/src/models.json +295 -0
- package/pi.dev-src/pi-mono/pods/src/ssh.ts +151 -0
- package/pi.dev-src/pi-mono/pods/src/types.ts +27 -0
- package/pi.dev-src/pi-mono/tui/src/autocomplete.ts +783 -0
- package/pi.dev-src/pi-mono/tui/src/components/box.ts +137 -0
- package/pi.dev-src/pi-mono/tui/src/components/cancellable-loader.ts +40 -0
- package/pi.dev-src/pi-mono/tui/src/components/editor.ts +2280 -0
- package/pi.dev-src/pi-mono/tui/src/components/image.ts +104 -0
- package/pi.dev-src/pi-mono/tui/src/components/input.ts +503 -0
- package/pi.dev-src/pi-mono/tui/src/components/loader.ts +86 -0
- package/pi.dev-src/pi-mono/tui/src/components/markdown.ts +852 -0
- package/pi.dev-src/pi-mono/tui/src/components/select-list.ts +229 -0
- package/pi.dev-src/pi-mono/tui/src/components/settings-list.ts +250 -0
- package/pi.dev-src/pi-mono/tui/src/components/spacer.ts +28 -0
- package/pi.dev-src/pi-mono/tui/src/components/text.ts +106 -0
- package/pi.dev-src/pi-mono/tui/src/components/truncated-text.ts +65 -0
- package/pi.dev-src/pi-mono/tui/src/editor-component.ts +74 -0
- package/pi.dev-src/pi-mono/tui/src/fuzzy.ts +133 -0
- package/pi.dev-src/pi-mono/tui/src/index.ts +106 -0
- package/pi.dev-src/pi-mono/tui/src/keybindings.ts +244 -0
- package/pi.dev-src/pi-mono/tui/src/keys.ts +1400 -0
- package/pi.dev-src/pi-mono/tui/src/kill-ring.ts +46 -0
- package/pi.dev-src/pi-mono/tui/src/stdin-buffer.ts +386 -0
- package/pi.dev-src/pi-mono/tui/src/terminal-image.ts +414 -0
- package/pi.dev-src/pi-mono/tui/src/terminal.ts +373 -0
- package/pi.dev-src/pi-mono/tui/src/tui.ts +1243 -0
- package/pi.dev-src/pi-mono/tui/src/undo-stack.ts +28 -0
- package/pi.dev-src/pi-mono/tui/src/utils.ts +1085 -0
- package/pi.dev-src/pi-mono/tui/test/autocomplete.test.ts +542 -0
- package/pi.dev-src/pi-mono/tui/test/bug-regression-isimageline-startswith-bug.test.ts +237 -0
- package/pi.dev-src/pi-mono/tui/test/chat-simple.ts +129 -0
- package/pi.dev-src/pi-mono/tui/test/editor.test.ts +3812 -0
- package/pi.dev-src/pi-mono/tui/test/fuzzy.test.ts +98 -0
- package/pi.dev-src/pi-mono/tui/test/image-test.ts +56 -0
- package/pi.dev-src/pi-mono/tui/test/input.test.ts +580 -0
- package/pi.dev-src/pi-mono/tui/test/key-tester.ts +105 -0
- package/pi.dev-src/pi-mono/tui/test/keybindings.test.ts +38 -0
- package/pi.dev-src/pi-mono/tui/test/keys.test.ts +614 -0
- package/pi.dev-src/pi-mono/tui/test/markdown.test.ts +1236 -0
- package/pi.dev-src/pi-mono/tui/test/overlay-non-capturing.test.ts +609 -0
- package/pi.dev-src/pi-mono/tui/test/overlay-options.test.ts +538 -0
- package/pi.dev-src/pi-mono/tui/test/overlay-short-content.test.ts +56 -0
- package/pi.dev-src/pi-mono/tui/test/regression-regional-indicator-width.test.ts +52 -0
- package/pi.dev-src/pi-mono/tui/test/select-list.test.ts +116 -0
- package/pi.dev-src/pi-mono/tui/test/stdin-buffer.test.ts +422 -0
- package/pi.dev-src/pi-mono/tui/test/terminal-image.test.ts +279 -0
- package/pi.dev-src/pi-mono/tui/test/test-themes.ts +38 -0
- package/pi.dev-src/pi-mono/tui/test/truncate-to-width.test.ts +62 -0
- package/pi.dev-src/pi-mono/tui/test/truncated-text.test.ts +129 -0
- package/pi.dev-src/pi-mono/tui/test/tui-cell-size-input.test.ts +81 -0
- package/pi.dev-src/pi-mono/tui/test/tui-overlay-style-leak.test.ts +72 -0
- package/pi.dev-src/pi-mono/tui/test/tui-render.test.ts +509 -0
- package/pi.dev-src/pi-mono/tui/test/viewport-overwrite-repro.ts +106 -0
- package/pi.dev-src/pi-mono/tui/test/virtual-terminal.ts +218 -0
- package/pi.dev-src/pi-mono/tui/test/wrap-ansi.test.ts +207 -0
- package/pi.dev-src/pi-mono/tui/vitest.config.ts +7 -0
- package/pi.dev-src/pi-mono/web-ui/example/index.html +13 -0
- package/pi.dev-src/pi-mono/web-ui/example/src/app.css +1 -0
- package/pi.dev-src/pi-mono/web-ui/example/src/custom-messages.ts +99 -0
- package/pi.dev-src/pi-mono/web-ui/example/src/main.ts +421 -0
- package/pi.dev-src/pi-mono/web-ui/example/tsconfig.json +23 -0
- package/pi.dev-src/pi-mono/web-ui/example/vite.config.ts +6 -0
- package/pi.dev-src/pi-mono/web-ui/scripts/count-prompt-tokens.ts +88 -0
- package/pi.dev-src/pi-mono/web-ui/src/ChatPanel.ts +209 -0
- package/pi.dev-src/pi-mono/web-ui/src/app.css +68 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/AgentInterface.ts +403 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/AttachmentTile.ts +107 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ConsoleBlock.ts +72 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/CustomProviderCard.ts +100 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ExpandableSection.ts +46 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/Input.ts +113 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/MessageEditor.ts +405 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/MessageList.ts +98 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/Messages.ts +383 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ProviderKeyInput.ts +153 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/SandboxedIframe.ts +626 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/StreamingMessageContainer.ts +103 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ThinkingBlock.ts +43 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/message-renderer-registry.ts +28 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts +220 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/AttachmentsRuntimeProvider.ts +66 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts +186 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/FileDownloadRuntimeProvider.ts +110 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageBridge.ts +82 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageRouter.ts +216 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/SandboxRuntimeProvider.ts +52 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/ApiKeyPromptDialog.ts +75 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/AttachmentOverlay.ts +636 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/CustomProviderDialog.ts +274 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/ModelSelector.ts +370 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/PersistentStorageDialog.ts +144 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/ProvidersModelsTab.ts +212 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/SessionListDialog.ts +150 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/SettingsDialog.ts +218 -0
- package/pi.dev-src/pi-mono/web-ui/src/index.ts +120 -0
- package/pi.dev-src/pi-mono/web-ui/src/prompts/prompts.ts +282 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/app-storage.ts +60 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/backends/indexeddb-storage-backend.ts +193 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/store.ts +33 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/custom-providers-store.ts +62 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/provider-keys-store.ts +33 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/sessions-store.ts +136 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/settings-store.ts +34 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/types.ts +206 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactElement.ts +14 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactPill.ts +26 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/Console.ts +93 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/DocxArtifact.ts +213 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ExcelArtifact.ts +231 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/GenericArtifact.ts +117 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/HtmlArtifact.ts +195 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ImageArtifact.ts +116 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/MarkdownArtifact.ts +82 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/PdfArtifact.ts +201 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/SvgArtifact.ts +119 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/TextArtifact.ts +148 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts +310 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts.ts +713 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/index.ts +7 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/extract-document.ts +275 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/index.ts +46 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/javascript-repl.ts +293 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderer-registry.ts +130 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/BashRenderer.ts +52 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/CalculateRenderer.ts +58 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/DefaultRenderer.ts +103 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts +92 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/types.ts +15 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/attachment-utils.ts +472 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/auth-token.ts +22 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/format.ts +42 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/i18n.ts +653 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/model-discovery.ts +277 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/proxy-utils.ts +139 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/test-sessions.ts +2357 -0
- package/pi.dev-src/pi-mono/web-ui/tsconfig.json +7 -0
- package/scripts/lib/extension-debug-harness.ts +3 -10
- package/scripts/lib/recording-extension-api.ts +71 -2
- package/scripts/pi-usereq-debug.sh +1 -1
- package/scripts/tool-args-to-params.ts +4 -15
- package/src/cli.ts +24 -68
- package/src/core/agent-tool-json.ts +53 -239
- package/src/core/compress-payload.ts +4 -74
- package/src/core/compress.ts +26 -15
- package/src/core/config.ts +546 -65
- package/src/core/debug-runtime.ts +542 -0
- package/src/core/extension-status.ts +324 -202
- package/src/core/find-constructs.ts +3 -3
- package/src/core/find-payload.ts +26 -132
- package/src/core/path-context.ts +346 -81
- package/src/core/pi-notify.ts +585 -315
- package/src/core/pi-usereq-tools.ts +57 -19
- package/src/core/prompt-command-catalog.ts +46 -0
- package/src/core/prompt-command-runtime.ts +1650 -0
- package/src/core/prompt-command-state.ts +211 -0
- package/src/core/prompts.ts +173 -41
- package/src/core/reference-payload.ts +5 -63
- package/src/core/resources.ts +61 -5
- package/src/core/settings-menu.ts +33 -7
- package/src/core/source-analyzer.ts +27 -7
- package/src/core/token-counter.ts +61 -79
- package/src/core/tool-runner.ts +38 -317
- package/src/index.ts +2629 -1220
- package/src/resources/images/favicon.svg +21 -0
- package/src/resources/images/pi.dev.png +0 -0
- package/src/resources/instructions/git_commit.md +16 -0
- package/src/resources/instructions/git_read-only.md +2 -0
- package/src/resources/prompts/analyze.md +12 -13
- package/src/resources/prompts/change.md +21 -59
- package/src/resources/prompts/check.md +14 -16
- package/src/resources/prompts/cover.md +21 -59
- package/src/resources/prompts/create.md +5 -4
- package/src/resources/prompts/fix.md +20 -58
- package/src/resources/prompts/flowchart.md +14 -49
- package/src/resources/prompts/implement.md +14 -50
- package/src/resources/prompts/new.md +20 -58
- package/src/resources/prompts/readme.md +14 -50
- package/src/resources/prompts/recreate.md +14 -45
- package/src/resources/prompts/refactor.md +20 -58
- package/src/resources/prompts/references.md +7 -43
- package/src/resources/prompts/renumber.md +8 -39
- package/src/resources/prompts/workflow.md +14 -50
- package/src/resources/prompts/write.md +5 -4
- package/tests/attended-results-scenarios.ts +30 -136
- package/tests/cli-command-option-parity.test.ts +148 -192
- package/tests/debug-extension-harness.test.ts +74 -73
- package/tests/extension-registration.test.ts +3626 -685
- package/tests/fixtures_attended_results/project/compress-line-numbers.json +1 -1
- package/tests/fixtures_attended_results/project/compress.json +1 -1
- package/tests/fixtures_attended_results/project/find-line-numbers.json +1 -1
- package/tests/fixtures_attended_results/project/find.json +1 -1
- package/tests/fixtures_attended_results/project/references.json +2 -2
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-find/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_c.c.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_cpp.cpp.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_csharp.cs.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_elixir.ex.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_haskell.hs.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_java.java.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_javascript.js.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_kotlin.kt.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_lua.lua.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_perl.pl.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_php.php.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_python.py.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_ruby.rb.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_rust.rs.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_scala.scala.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_shell.sh.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_swift.swift.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_typescript.ts.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_zig.zig.json +1 -1
- package/tests/helpers.ts +24 -15
- package/tests/oracle-project.test.ts +29 -30
- package/tests/oracle-standalone.test.ts +27 -1
- package/tests/prompt-rendering.test.ts +40 -9
- package/tests/python_oracle_stubs/tiktoken.py +76 -0
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
* scheduling through exported controller helpers.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import path from "node:path";
|
|
12
11
|
import type {
|
|
13
12
|
AgentEndEvent,
|
|
14
13
|
ContextUsage,
|
|
@@ -16,8 +15,15 @@ import type {
|
|
|
16
15
|
ThemeColor,
|
|
17
16
|
} from "@mariozechner/pi-coding-agent";
|
|
18
17
|
import type { UseReqConfig } from "./config.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
18
|
+
import type { PromptCommandExecutionPlan } from "./prompt-command-runtime.js";
|
|
19
|
+
import {
|
|
20
|
+
formatRuntimePathForDisplay,
|
|
21
|
+
getRuntimeContextPath,
|
|
22
|
+
} from "./path-context.js";
|
|
23
|
+
import {
|
|
24
|
+
restorePersistedPromptCommandRuntimeStateForSession,
|
|
25
|
+
writePersistedPromptCommandRuntimeState,
|
|
26
|
+
} from "./prompt-command-state.js";
|
|
21
27
|
|
|
22
28
|
/**
|
|
23
29
|
* @brief Enumerates the CLI-supported theme tokens consumed by status rendering.
|
|
@@ -32,42 +38,24 @@ type StatusForegroundColor = Extract<
|
|
|
32
38
|
|
|
33
39
|
/**
|
|
34
40
|
* @brief Describes the raw theme capabilities required for status rendering.
|
|
35
|
-
* @details Accepts the `ctx.ui.theme` foreground renderer
|
|
36
|
-
*
|
|
37
|
-
* context-usage bar. Compile-time only and introduces no runtime cost.
|
|
41
|
+
* @details Accepts the `ctx.ui.theme` foreground renderer used by the
|
|
42
|
+
* single-line footer. Compile-time only and introduces no runtime cost.
|
|
38
43
|
*/
|
|
39
44
|
interface RawStatusTheme {
|
|
40
45
|
fg: (color: StatusForegroundColor, text: string) => string;
|
|
41
|
-
bgFromFg?: (color: StatusForegroundColor, text: string) => string;
|
|
42
|
-
getFgAnsi?: (color: StatusForegroundColor) => string;
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
/**
|
|
46
49
|
* @brief Describes the normalized theme adapter used by status formatters.
|
|
47
|
-
* @details Exposes deterministic label, value, foreground,
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
+
* @details Exposes deterministic label, value, foreground, and separator
|
|
51
|
+
* renderers so status text generation stays independent from the raw theme API.
|
|
52
|
+
* Compile-time only and introduces no runtime cost.
|
|
50
53
|
*/
|
|
51
54
|
interface StatusThemeAdapter {
|
|
52
55
|
label: (fieldName: string) => string;
|
|
53
56
|
value: (text: string) => string;
|
|
54
57
|
colorize: (color: StatusForegroundColor, text: string) => string;
|
|
55
|
-
backgroundize: (color: StatusForegroundColor, text: string) => string;
|
|
56
58
|
separator: string;
|
|
57
|
-
filledContextCell: string;
|
|
58
|
-
emptyContextCell: string;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* @brief Describes one fixed-width context-bar overlay.
|
|
63
|
-
* @details Stores the literal text plus foreground and background color roles
|
|
64
|
-
* used when the context bar must render threshold-specific labels instead of
|
|
65
|
-
* block glyphs. Compile-time only and introduces no runtime cost.
|
|
66
|
-
*/
|
|
67
|
-
interface ContextUsageOverlaySpec {
|
|
68
|
-
backgroundColor: StatusForegroundColor;
|
|
69
|
-
foregroundColor: StatusForegroundColor;
|
|
70
|
-
text: "◀ CLEAR ▶ " | " ◀ FULL ▶ ";
|
|
71
59
|
}
|
|
72
60
|
|
|
73
61
|
/**
|
|
@@ -115,18 +103,22 @@ export type PiUsereqStatusHookName = (typeof PI_USEREQ_STATUS_HOOK_NAMES)[number
|
|
|
115
103
|
|
|
116
104
|
/**
|
|
117
105
|
* @brief Describes one prompt request tracked across extension command delivery and runtime execution.
|
|
118
|
-
* @details
|
|
106
|
+
* @details Reuses the prepared prompt-command execution plan so status rendering and prompt-end side effects can recover the original project base, active execution base, and optional worktree metadata for the current prompt run. The alias is compile-time only and introduces no runtime cost.
|
|
119
107
|
*/
|
|
120
|
-
export
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
108
|
+
export type PiUsereqPromptRequest = PromptCommandExecutionPlan;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @brief Represents one prompt-orchestration workflow state displayed in the status bar.
|
|
112
|
+
* @details Narrows workflow tracking to the documented `idle`, `checking`, `running`, `merging`, and `error` states reused by prompt-command gating, prompt-end orchestration, and status rendering. Compile-time only and introduces no runtime cost.
|
|
113
|
+
*/
|
|
114
|
+
export type PiUsereqWorkflowState = "idle" | "checking" | "running" | "merging" | "error";
|
|
124
115
|
|
|
125
116
|
/**
|
|
126
117
|
* @brief Stores the mutable runtime facts displayed by the status bar.
|
|
127
|
-
* @details Persists the latest context-usage snapshot, the active run start timestamp, the most recent normally completed run duration, the accumulated duration of all normally completed runs, and prompt-request metadata carried from command dispatch into the next runtime execution. Runtime state is mutated in-place by controller helpers. Compile-time only and introduces no runtime cost.
|
|
118
|
+
* @details Persists the prompt-orchestration workflow state, the latest context-usage snapshot, the active run start timestamp, the most recent normally completed run duration, the accumulated duration of all normally completed runs, and prompt-request metadata carried from command dispatch into the next runtime execution. Runtime state is mutated in-place by controller helpers. Compile-time only and introduces no runtime cost.
|
|
128
119
|
*/
|
|
129
120
|
export interface PiUsereqStatusState {
|
|
121
|
+
workflowState: PiUsereqWorkflowState;
|
|
130
122
|
contextUsage: ContextUsage | undefined;
|
|
131
123
|
runStartTimeMs: number | undefined;
|
|
132
124
|
lastRunDurationMs: number | undefined;
|
|
@@ -150,89 +142,193 @@ export interface PiUsereqStatusController {
|
|
|
150
142
|
}
|
|
151
143
|
|
|
152
144
|
/**
|
|
153
|
-
* @brief
|
|
154
|
-
* @details
|
|
155
|
-
* Returns `undefined` when the input cannot be transformed deterministically.
|
|
156
|
-
* Runtime is O(n) in ANSI sequence length. No external state is mutated.
|
|
157
|
-
* @param[in] foregroundAnsi {string} Foreground ANSI sequence.
|
|
158
|
-
* @return {string | undefined} Background ANSI sequence when derivable.
|
|
145
|
+
* @brief Stores the process-scoped elapsed-timer snapshot reused across session replacement.
|
|
146
|
+
* @details Preserves only the latest completed duration and accumulated completed runtime so `/new`, `/resume`, and `/fork` can restore elapsed counters after the extension runtime is rebound. Compile-time only and introduces no runtime cost.
|
|
159
147
|
*/
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (!foregroundAnsi.includes("\u001b[")) {
|
|
164
|
-
return undefined;
|
|
165
|
-
}
|
|
166
|
-
const backgroundAnsi = foregroundAnsi.replace("[38;", "[48;");
|
|
167
|
-
return backgroundAnsi === foregroundAnsi ? undefined : backgroundAnsi;
|
|
148
|
+
interface PiUsereqStatusPersistenceStore {
|
|
149
|
+
lastRunDurationMs: number | undefined;
|
|
150
|
+
totalRunDurationMs: number | undefined;
|
|
168
151
|
}
|
|
169
152
|
|
|
170
153
|
/**
|
|
171
|
-
* @brief
|
|
172
|
-
* @details
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
* @
|
|
178
|
-
* @
|
|
179
|
-
* @return {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
154
|
+
* @brief Defines the global property name used for elapsed-timer persistence.
|
|
155
|
+
* @details The property lives on `globalThis` so prompt counters can survive extension-runtime replacement within the same pi process while remaining internal to pi-usereq. Access complexity is O(1).
|
|
156
|
+
*/
|
|
157
|
+
const PI_USEREQ_STATUS_PERSISTENCE_KEY = "__piUsereqStatusPersistenceStore";
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @brief Returns the process-scoped elapsed-timer persistence store.
|
|
161
|
+
* @details Lazily initializes one internal `globalThis` record because pi rebinds extension modules for `/new`, `/resume`, `/fork`, and `/reload`, but the hosting process persists across those operations. Runtime is O(1). Side effect: initializes internal process-scoped state on first access.
|
|
162
|
+
* @return {PiUsereqStatusPersistenceStore} Mutable persistence record.
|
|
163
|
+
* @note Design rationale: required to preserve elapsed counters across session replacement without writing session-global menu state into project configuration.
|
|
164
|
+
*/
|
|
165
|
+
function getPiUsereqStatusPersistenceStore(): PiUsereqStatusPersistenceStore {
|
|
166
|
+
const globalState = globalThis as typeof globalThis & {
|
|
167
|
+
__piUsereqStatusPersistenceStore?: PiUsereqStatusPersistenceStore;
|
|
168
|
+
};
|
|
169
|
+
globalState[PI_USEREQ_STATUS_PERSISTENCE_KEY] ??= {
|
|
170
|
+
lastRunDurationMs: undefined,
|
|
171
|
+
totalRunDurationMs: undefined,
|
|
172
|
+
};
|
|
173
|
+
return globalState[PI_USEREQ_STATUS_PERSISTENCE_KEY]!;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @brief Restores persisted elapsed counters into one mutable status snapshot.
|
|
178
|
+
* @details Copies the process-scoped last-run and accumulated completed durations into the supplied controller state so rebinding events can continue showing prior counters. Runtime is O(1). Side effect: mutates `state`.
|
|
179
|
+
* @param[in,out] state {PiUsereqStatusState} Mutable status state.
|
|
180
|
+
* @return {void} No return value.
|
|
181
|
+
*/
|
|
182
|
+
function restorePersistedElapsedState(state: PiUsereqStatusState): void {
|
|
183
|
+
const store = getPiUsereqStatusPersistenceStore();
|
|
184
|
+
state.lastRunDurationMs = store.lastRunDurationMs;
|
|
185
|
+
state.totalRunDurationMs = store.totalRunDurationMs;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @brief Persists elapsed counters from one mutable status snapshot.
|
|
190
|
+
* @details Copies the current last-run and accumulated completed durations into the process-scoped store so later extension instances can restore them after session replacement. Runtime is O(1). Side effect: mutates internal process-scoped state.
|
|
191
|
+
* @param[in] state {PiUsereqStatusState} Mutable status state snapshot.
|
|
192
|
+
* @return {void} No return value.
|
|
193
|
+
*/
|
|
194
|
+
function persistElapsedState(state: PiUsereqStatusState): void {
|
|
195
|
+
const store = getPiUsereqStatusPersistenceStore();
|
|
196
|
+
store.lastRunDurationMs = state.lastRunDurationMs;
|
|
197
|
+
store.totalRunDurationMs = state.totalRunDurationMs;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* @brief Mirrors one controller prompt state into the process-scoped persistence store.
|
|
202
|
+
* @details Persists the current workflow state plus the pending and active prompt execution plans so prompt orchestration can survive session replacement. Runtime is O(1). Side effect: mutates process-scoped prompt-command persistence state.
|
|
203
|
+
* @param[in] state {PiUsereqStatusState} Current controller state snapshot.
|
|
204
|
+
* @return {void} No return value.
|
|
205
|
+
*/
|
|
206
|
+
function persistPromptCommandState(state: PiUsereqStatusState): void {
|
|
207
|
+
writePersistedPromptCommandRuntimeState({
|
|
208
|
+
workflowState: state.workflowState,
|
|
209
|
+
pendingPromptRequest: state.pendingPromptRequest,
|
|
210
|
+
activePromptRequest: state.activePromptRequest,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* @brief Detects whether `session_shutdown` must preserve prompt-command state.
|
|
216
|
+
* @details Keeps both the in-memory controller prompt state and the process-scoped prompt execution plan intact while pi switches from the original session into the forked execution session, because the old extension instance can keep running the initiating command handler after `session_shutdown` fires and before the replacement session fully takes over. Runtime is O(1). No external state is mutated.
|
|
217
|
+
* @param[in] state {PiUsereqStatusState} Controller state before shutdown mutation.
|
|
218
|
+
* @return {boolean} `true` when prompt-command state must survive the shutdown event.
|
|
219
|
+
* @satisfies REQ-278
|
|
220
|
+
*/
|
|
221
|
+
export function shouldPreservePromptCommandStateOnShutdown(state: PiUsereqStatusState): boolean {
|
|
222
|
+
return state.workflowState !== "idle"
|
|
223
|
+
&& (state.pendingPromptRequest !== undefined || state.activePromptRequest !== undefined);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* @brief Restores prompt-command persistence into one fresh controller when the active session matches.
|
|
228
|
+
* @details Rehydrates workflow state plus pending or active prompt execution plans only when the current session file targets the persisted execution session created for prompt orchestration. Runtime is O(1). Side effect: mutates `state` when persisted prompt state is available.
|
|
229
|
+
* @param[in,out] state {PiUsereqStatusState} Mutable controller state.
|
|
230
|
+
* @param[in] sessionFile {string | undefined} Current active session file.
|
|
231
|
+
* @return {void} No return value.
|
|
232
|
+
*/
|
|
233
|
+
function restorePersistedPromptCommandState(
|
|
234
|
+
state: PiUsereqStatusState,
|
|
235
|
+
sessionFile: string | undefined,
|
|
236
|
+
): void {
|
|
237
|
+
const persistedState = restorePersistedPromptCommandRuntimeStateForSession(sessionFile);
|
|
238
|
+
if (persistedState === undefined) {
|
|
239
|
+
return;
|
|
196
240
|
}
|
|
197
|
-
|
|
241
|
+
state.workflowState = persistedState.workflowState;
|
|
242
|
+
state.pendingPromptRequest = persistedState.pendingPromptRequest;
|
|
243
|
+
state.activePromptRequest = persistedState.activePromptRequest;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @brief Resolves the active session file exposed by one extension context.
|
|
248
|
+
* @details Reads the session-manager session-file getter when available so prompt-command persistence can be resynchronized on every lifecycle hook after session replacement. Runtime is O(1). No external state is mutated.
|
|
249
|
+
* @param[in] ctx {ExtensionContext} Active extension context.
|
|
250
|
+
* @return {string | undefined} Current session file when available.
|
|
251
|
+
*/
|
|
252
|
+
function getContextSessionFile(ctx: ExtensionContext): string | undefined {
|
|
253
|
+
return typeof ctx.sessionManager?.getSessionFile === "function"
|
|
254
|
+
? ctx.sessionManager.getSessionFile()
|
|
255
|
+
: undefined;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* @brief Detects stale extension-context access after session replacement.
|
|
260
|
+
* @details Matches the guarded pi runtime error emitted when one invalidated extension context, command context, or replacement-session context is accessed after session replacement or reload. Runtime is O(n) in message length only when an error is supplied. No external state is mutated.
|
|
261
|
+
* @param[in] error {unknown} Candidate thrown value.
|
|
262
|
+
* @return {boolean} `true` when the value matches the stale-extension-context runtime error.
|
|
263
|
+
* @satisfies REQ-280
|
|
264
|
+
*/
|
|
265
|
+
export function isStaleExtensionContextError(error: unknown): boolean {
|
|
266
|
+
return error instanceof Error
|
|
267
|
+
&& /stale after session replacement or reload/i.test(error.message);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* @brief Resets the in-memory and persisted elapsed counters.
|
|
272
|
+
* @details Clears both completed-duration fields in the supplied state and mirrors that cleared snapshot into the process-scoped store. Runtime is O(1). Side effects include mutable state reset and process-scoped persistence update.
|
|
273
|
+
* @param[in,out] state {PiUsereqStatusState} Mutable status state.
|
|
274
|
+
* @return {void} No return value.
|
|
275
|
+
* @satisfies REQ-217
|
|
276
|
+
*/
|
|
277
|
+
function resetElapsedState(state: PiUsereqStatusState): void {
|
|
278
|
+
state.lastRunDurationMs = undefined;
|
|
279
|
+
state.totalRunDurationMs = undefined;
|
|
280
|
+
persistElapsedState(state);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* @brief Detects whether a `session_start` event must reset elapsed counters.
|
|
285
|
+
* @details Treats `startup` and `reload` as hard-reset boundaries while preserving counters for `new`, `resume`, and `fork`. Runtime is O(1). No external state is mutated.
|
|
286
|
+
* @param[in] event {unknown} Session-start payload.
|
|
287
|
+
* @return {boolean} `true` when elapsed counters must reset.
|
|
288
|
+
* @satisfies REQ-217
|
|
289
|
+
*/
|
|
290
|
+
function shouldResetElapsedStateOnSessionStart(event: unknown): boolean {
|
|
291
|
+
const reason = (event as { reason?: unknown }).reason;
|
|
292
|
+
return reason === "startup" || reason === "reload";
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* @brief Detects whether a `session_start` event must reset the workflow state to `idle`.
|
|
297
|
+
* @details Treats `startup`, `new`, and `reload` as workflow-reset boundaries so prompt-orchestration state never leaks across boot, explicit session replacement, or extension reload. Runtime is O(1). No external state is mutated.
|
|
298
|
+
* @param[in] event {unknown} Session-start payload.
|
|
299
|
+
* @return {boolean} `true` when workflow state must reset to `idle`.
|
|
300
|
+
* @satisfies REQ-009, REQ-221
|
|
301
|
+
*/
|
|
302
|
+
function shouldResetWorkflowStateOnSessionStart(event: unknown): boolean {
|
|
303
|
+
const reason = (event as { reason?: unknown }).reason;
|
|
304
|
+
return reason === "startup" || reason === "new" || reason === "reload";
|
|
198
305
|
}
|
|
199
306
|
|
|
200
307
|
/**
|
|
201
308
|
* @brief Builds the normalized theme adapter used by pi-usereq status formatters.
|
|
202
|
-
* @details Precomputes label, value, foreground,
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
* is mutated.
|
|
309
|
+
* @details Precomputes label, value, foreground, and separator renderers so
|
|
310
|
+
* status formatting remains stable across real TUI themes and deterministic
|
|
311
|
+
* test doubles. Runtime is O(1). No external state is mutated.
|
|
206
312
|
* @param[in] theme {RawStatusTheme} Raw theme implementation from `ctx.ui.theme`.
|
|
207
313
|
* @return {StatusThemeAdapter} Normalized status-theme adapter.
|
|
208
314
|
*/
|
|
209
315
|
function createStatusThemeAdapter(theme: RawStatusTheme): StatusThemeAdapter {
|
|
210
316
|
const colorize = (color: StatusForegroundColor, text: string): string =>
|
|
211
317
|
theme.fg(color, text);
|
|
212
|
-
const backgroundize = (color: StatusForegroundColor, text: string): string =>
|
|
213
|
-
applyForegroundAsBackground(theme, color, text);
|
|
214
318
|
return {
|
|
215
319
|
label: (fieldName: string): string => colorize("accent", `${fieldName}:`),
|
|
216
320
|
value: (text: string): string => colorize("warning", text),
|
|
217
321
|
colorize,
|
|
218
|
-
backgroundize,
|
|
219
322
|
separator: colorize("dim", " • "),
|
|
220
|
-
filledContextCell: backgroundize(
|
|
221
|
-
"accent",
|
|
222
|
-
colorize("warning", "▓"),
|
|
223
|
-
),
|
|
224
|
-
emptyContextCell: backgroundize(
|
|
225
|
-
"accent",
|
|
226
|
-
colorize("dim", "▓"),
|
|
227
|
-
),
|
|
228
323
|
};
|
|
229
324
|
}
|
|
230
325
|
|
|
231
326
|
/**
|
|
232
327
|
* @brief Normalizes one raw context-usage snapshot.
|
|
233
328
|
* @details Preserves the runtime token and context-window counts, derives a
|
|
234
|
-
* percentage when the runtime omits it,
|
|
235
|
-
* Runtime is O(1). No
|
|
329
|
+
* percentage when the runtime omits it, clamps negative percentages to `0`,
|
|
330
|
+
* and preserves overflow above `100` for footer rendering. Runtime is O(1). No
|
|
331
|
+
* external state is mutated.
|
|
236
332
|
* @param[in] contextUsage {ContextUsage | undefined} Raw runtime snapshot.
|
|
237
333
|
* @return {ContextUsage | undefined} Normalized snapshot.
|
|
238
334
|
*/
|
|
@@ -251,7 +347,7 @@ function normalizeContextUsage(
|
|
|
251
347
|
...contextUsage,
|
|
252
348
|
percent: derivedPercent === null
|
|
253
349
|
? null
|
|
254
|
-
: Math.max(0,
|
|
350
|
+
: Math.max(0, derivedPercent),
|
|
255
351
|
};
|
|
256
352
|
}
|
|
257
353
|
|
|
@@ -273,100 +369,53 @@ function refreshContextUsage(
|
|
|
273
369
|
}
|
|
274
370
|
|
|
275
371
|
/**
|
|
276
|
-
* @brief
|
|
277
|
-
* @details
|
|
278
|
-
*
|
|
279
|
-
* O(1). No external state is mutated.
|
|
372
|
+
* @brief Resolves the icon text for one normalized context-usage snapshot.
|
|
373
|
+
* @details Maps context usage to one fixed-width icon band so footer rendering
|
|
374
|
+
* remains compact and deterministic. Unavailable usage degrades to the `0%`
|
|
375
|
+
* icon. Runtime is O(1). No external state is mutated.
|
|
280
376
|
* @param[in] contextUsage {ContextUsage | undefined} Normalized context snapshot.
|
|
281
|
-
* @return {
|
|
282
|
-
* @satisfies REQ-122
|
|
377
|
+
* @return {string} Fixed-width gauge icon text.
|
|
378
|
+
* @satisfies REQ-121, REQ-122
|
|
283
379
|
*/
|
|
284
|
-
function
|
|
380
|
+
function resolveContextUsageIconText(
|
|
285
381
|
contextUsage: ContextUsage | undefined,
|
|
286
|
-
):
|
|
287
|
-
const percent = contextUsage?.percent;
|
|
288
|
-
if (percent === null || percent === undefined || percent <= 0) {
|
|
289
|
-
return 0;
|
|
290
|
-
}
|
|
291
|
-
return Math.min(10, Math.ceil((percent * 10) / 100));
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* @brief Resolves the threshold-specific context-bar overlay when required.
|
|
296
|
-
* @details Returns the empty-state `◀ CLEAR ▶ ` overlay when normalized context
|
|
297
|
-
* usage is unavailable or non-positive and returns the centered ` ◀ FULL ▶ `
|
|
298
|
-
* overlay with the active theme `error` token when usage exceeds 90 percent.
|
|
299
|
-
* Runtime is O(1). No external state is mutated.
|
|
300
|
-
* @param[in] contextUsage {ContextUsage | undefined} Normalized context snapshot.
|
|
301
|
-
* @return {ContextUsageOverlaySpec | undefined} Overlay spec when a replacement label is required.
|
|
302
|
-
* @satisfies REQ-127, REQ-128
|
|
303
|
-
*/
|
|
304
|
-
function resolveContextUsageOverlay(
|
|
305
|
-
contextUsage: ContextUsage | undefined,
|
|
306
|
-
): ContextUsageOverlaySpec | undefined {
|
|
382
|
+
): string {
|
|
307
383
|
const percent = contextUsage?.percent;
|
|
308
384
|
if (percent === undefined || percent === null || percent <= 0) {
|
|
309
|
-
return
|
|
310
|
-
backgroundColor: "accent",
|
|
311
|
-
foregroundColor: "warning",
|
|
312
|
-
text: "◀ CLEAR ▶ ",
|
|
313
|
-
};
|
|
385
|
+
return "▕_▏";
|
|
314
386
|
}
|
|
315
|
-
if (percent
|
|
316
|
-
return
|
|
317
|
-
backgroundColor: "warning",
|
|
318
|
-
foregroundColor: "error",
|
|
319
|
-
text: " ◀ FULL ▶ ",
|
|
320
|
-
};
|
|
387
|
+
if (percent <= 25) {
|
|
388
|
+
return "▕▂▏";
|
|
321
389
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
* and state-specific backdrop remain preserved. Runtime is O(n) in overlay
|
|
330
|
-
* width. No external state is mutated.
|
|
331
|
-
* @param[in] theme {StatusThemeAdapter} Normalized status theme.
|
|
332
|
-
* @param[in] overlay {ContextUsageOverlaySpec} Overlay specification.
|
|
333
|
-
* @return {string} Rendered overlay text.
|
|
334
|
-
* @satisfies REQ-127, REQ-128
|
|
335
|
-
*/
|
|
336
|
-
function formatContextUsageOverlay(
|
|
337
|
-
theme: StatusThemeAdapter,
|
|
338
|
-
overlay: ContextUsageOverlaySpec,
|
|
339
|
-
): string {
|
|
340
|
-
return theme.backgroundize(
|
|
341
|
-
overlay.backgroundColor,
|
|
342
|
-
theme.colorize(overlay.foregroundColor, overlay.text),
|
|
343
|
-
);
|
|
390
|
+
if (percent <= 50) {
|
|
391
|
+
return "▕▄▏";
|
|
392
|
+
}
|
|
393
|
+
if (percent <= 90) {
|
|
394
|
+
return "▕▆▏";
|
|
395
|
+
}
|
|
396
|
+
return "▕█▏";
|
|
344
397
|
}
|
|
345
398
|
|
|
346
399
|
/**
|
|
347
|
-
* @brief Formats one
|
|
348
|
-
* @details Renders
|
|
349
|
-
* otherwise renders filled cells with the theme `warning` token on an
|
|
350
|
-
* accent-derived background and unfilled cells in `dim` on the same background
|
|
351
|
-
* to preserve constant bar width. Runtime is O(1). No external state is
|
|
352
|
-
* mutated.
|
|
400
|
+
* @brief Formats one icon-based context-usage gauge.
|
|
401
|
+
* @details Renders the documented `warning`-colored icon bands for `0-90%`, applies terminal blink control to the `warning`-colored `>90-100%` icon, and applies terminal blink control to the `error`-colored overflow icon so unsupported terminals degrade to non-blinking colored text automatically. Runtime is O(1). No external state is mutated.
|
|
353
402
|
* @param[in] theme {StatusThemeAdapter} Normalized status theme.
|
|
354
403
|
* @param[in] contextUsage {ContextUsage | undefined} Normalized context snapshot.
|
|
355
|
-
* @return {string} Rendered
|
|
356
|
-
* @satisfies REQ-121, REQ-122, REQ-126, REQ-127, REQ-128
|
|
404
|
+
* @return {string} Rendered fixed-width gauge icon.
|
|
405
|
+
* @satisfies REQ-121, REQ-122, REQ-126, REQ-127, REQ-128, REQ-233
|
|
357
406
|
*/
|
|
358
407
|
function formatContextUsageBar(
|
|
359
408
|
theme: StatusThemeAdapter,
|
|
360
409
|
contextUsage: ContextUsage | undefined,
|
|
361
410
|
): string {
|
|
362
|
-
const
|
|
363
|
-
if (
|
|
364
|
-
return
|
|
411
|
+
const percent = contextUsage?.percent ?? 0;
|
|
412
|
+
if (percent > 100) {
|
|
413
|
+
return theme.colorize("error", "\u001b[5m▕█▏\u001b[25m");
|
|
414
|
+
}
|
|
415
|
+
if (percent > 90) {
|
|
416
|
+
return theme.colorize("warning", "\u001b[5m▕█▏\u001b[25m");
|
|
365
417
|
}
|
|
366
|
-
|
|
367
|
-
return Array.from({ length: 10 }, (_value, index) =>
|
|
368
|
-
index < filledCells ? theme.filledContextCell : theme.emptyContextCell,
|
|
369
|
-
).join("");
|
|
418
|
+
return theme.value(resolveContextUsageIconText(contextUsage));
|
|
370
419
|
}
|
|
371
420
|
|
|
372
421
|
/**
|
|
@@ -404,7 +453,7 @@ function formatCompletedStatusDuration(
|
|
|
404
453
|
* @brief Formats the consolidated `elapsed` status-bar value.
|
|
405
454
|
* @details Emits the active prompt segment `⏱︎ <active>`, the latest normally
|
|
406
455
|
* completed segment `⚑ <last>`, and the accumulated successful-runtime segment
|
|
407
|
-
*
|
|
456
|
+
* `⌛︎<total>` with fixed spacing. Runtime is O(1). No external state is
|
|
408
457
|
* mutated.
|
|
409
458
|
* @param[in] state {PiUsereqStatusState} Mutable status state snapshot.
|
|
410
459
|
* @param[in] nowMs {number} Current wall-clock time in milliseconds.
|
|
@@ -420,7 +469,7 @@ function formatElapsedStatusValue(
|
|
|
420
469
|
: formatStatusDuration(nowMs - state.runStartTimeMs);
|
|
421
470
|
const lastText = formatCompletedStatusDuration(state.lastRunDurationMs);
|
|
422
471
|
const totalText = formatCompletedStatusDuration(state.totalRunDurationMs);
|
|
423
|
-
return
|
|
472
|
+
return `⏱︎ ${activeText} ⚑ ${lastText} ⌛︎${totalText}`;
|
|
424
473
|
}
|
|
425
474
|
|
|
426
475
|
/**
|
|
@@ -458,6 +507,24 @@ function formatRenderedStatusField(
|
|
|
458
507
|
return `${theme.label(fieldName)}${renderedValue}`;
|
|
459
508
|
}
|
|
460
509
|
|
|
510
|
+
/**
|
|
511
|
+
* @brief Formats the rendered workflow-state value for the `status` field.
|
|
512
|
+
* @details Uses the standard warning-colored value renderer for non-error states and emits a blinking `error`-colored value for `status:error` so the footer highlights orchestration failures immediately. Runtime is O(n) in text length. No external state is mutated.
|
|
513
|
+
* @param[in] theme {StatusThemeAdapter} Normalized status theme.
|
|
514
|
+
* @param[in] workflowState {PiUsereqWorkflowState} Current workflow state.
|
|
515
|
+
* @return {string} Rendered workflow-state value.
|
|
516
|
+
* @satisfies REQ-112, REQ-223
|
|
517
|
+
*/
|
|
518
|
+
function formatWorkflowStateValue(
|
|
519
|
+
theme: StatusThemeAdapter,
|
|
520
|
+
workflowState: PiUsereqWorkflowState,
|
|
521
|
+
): string {
|
|
522
|
+
if (workflowState === "error") {
|
|
523
|
+
return theme.colorize("error", "\u001b[5merror\u001b[25m");
|
|
524
|
+
}
|
|
525
|
+
return theme.value(workflowState);
|
|
526
|
+
}
|
|
527
|
+
|
|
461
528
|
/**
|
|
462
529
|
* @brief Detects whether an agent run ended through abort semantics.
|
|
463
530
|
* @details Treats any assistant message whose `stopReason` equals `aborted` as
|
|
@@ -478,14 +545,14 @@ function didAgentEndAbort(messages: AgentEndEvent["messages"]): boolean {
|
|
|
478
545
|
|
|
479
546
|
/**
|
|
480
547
|
* @brief Builds the full single-line pi-usereq status-bar payload.
|
|
481
|
-
* @details Renders
|
|
482
|
-
* @param[in] cwd {string} Runtime working directory used for
|
|
548
|
+
* @details Renders status, current-path, context, elapsed, and sound fields in the canonical order with dim bullet separators, workflow-state highlighting, and the documented icon-based context gauge. Runtime is O(1). No external state is mutated.
|
|
549
|
+
* @param[in] cwd {string} Runtime working directory used for context-path derivation.
|
|
483
550
|
* @param[in] config {UseReqConfig} Effective project configuration.
|
|
484
551
|
* @param[in] theme {StatusThemeAdapter} Normalized status theme.
|
|
485
552
|
* @param[in] state {PiUsereqStatusState} Mutable status state snapshot.
|
|
486
553
|
* @param[in] nowMs {number} Current wall-clock time in milliseconds.
|
|
487
554
|
* @return {string} Single-line status-bar text.
|
|
488
|
-
* @satisfies REQ-109, REQ-112, REQ-120, REQ-121, REQ-123, REQ-124, REQ-125, REQ-126, REQ-127, REQ-128, REQ-
|
|
555
|
+
* @satisfies REQ-109, REQ-112, REQ-120, REQ-121, REQ-123, REQ-124, REQ-125, REQ-126, REQ-127, REQ-128, REQ-148, REQ-156, REQ-159, REQ-180, REQ-222, REQ-223
|
|
489
556
|
*/
|
|
490
557
|
function buildPiUsereqStatusText(
|
|
491
558
|
cwd: string,
|
|
@@ -494,22 +561,23 @@ function buildPiUsereqStatusText(
|
|
|
494
561
|
state: PiUsereqStatusState,
|
|
495
562
|
nowMs: number,
|
|
496
563
|
): string {
|
|
497
|
-
const
|
|
564
|
+
const currentPathText = formatRuntimePathForDisplay(getRuntimeContextPath(cwd));
|
|
498
565
|
const elapsedText = formatElapsedStatusValue(state, nowMs);
|
|
499
|
-
const beepText = formatPiNotifyBeepStatus(config);
|
|
500
566
|
const soundText = config["notify-sound"];
|
|
501
|
-
const pushoverText = formatPiNotifyPushoverStatus(config);
|
|
502
567
|
return [
|
|
503
|
-
|
|
568
|
+
formatRenderedStatusField(
|
|
569
|
+
theme,
|
|
570
|
+
"status",
|
|
571
|
+
formatWorkflowStateValue(theme, state.workflowState),
|
|
572
|
+
),
|
|
573
|
+
formatStatusField(theme, "current-path", currentPathText),
|
|
504
574
|
formatRenderedStatusField(
|
|
505
575
|
theme,
|
|
506
576
|
"context",
|
|
507
577
|
formatContextUsageBar(theme, state.contextUsage),
|
|
508
578
|
),
|
|
509
579
|
formatStatusField(theme, "elapsed", elapsedText),
|
|
510
|
-
formatStatusField(theme, "beep", beepText),
|
|
511
580
|
formatStatusField(theme, "sound", soundText),
|
|
512
|
-
formatStatusField(theme, "pushover", pushoverText),
|
|
513
581
|
].join(theme.separator);
|
|
514
582
|
}
|
|
515
583
|
|
|
@@ -567,6 +635,7 @@ export function createPiUsereqStatusController(): PiUsereqStatusController {
|
|
|
567
635
|
config: undefined,
|
|
568
636
|
latestContext: undefined,
|
|
569
637
|
state: {
|
|
638
|
+
workflowState: "idle",
|
|
570
639
|
contextUsage: undefined,
|
|
571
640
|
runStartTimeMs: undefined,
|
|
572
641
|
lastRunDurationMs: undefined,
|
|
@@ -597,14 +666,11 @@ export function setPiUsereqStatusConfig(
|
|
|
597
666
|
|
|
598
667
|
/**
|
|
599
668
|
* @brief Renders the current pi-usereq status bar into the active UI context.
|
|
600
|
-
* @details Updates the controller's latest context pointer and writes the
|
|
601
|
-
* single-line status text only when configuration is available, including any
|
|
602
|
-
* threshold-specific context-bar overlays. Runtime is O(s) in configured
|
|
603
|
-
* source-path count. Side effect: mutates `ctx.ui` status.
|
|
669
|
+
* @details Updates the controller's latest context pointer and writes the single-line status text only when configuration is available, deriving `current-path` from the active runtime context path aligned to `ctx.cwd` and including the documented icon-based context gauge. When pi has already invalidated the supplied context after session replacement or reload, the helper clears the stale cached context and returns without surfacing the stale-instance exception. Runtime is O(s) in configured source-path count. Side effect: mutates `ctx.ui` status when the context is still active.
|
|
604
670
|
* @param[in,out] controller {PiUsereqStatusController} Mutable status controller.
|
|
605
671
|
* @param[in] ctx {ExtensionContext} Active extension context.
|
|
606
672
|
* @return {void} No return value.
|
|
607
|
-
* @satisfies REQ-120, REQ-121, REQ-123, REQ-124, REQ-125, REQ-126, REQ-127, REQ-128, REQ-
|
|
673
|
+
* @satisfies REQ-120, REQ-121, REQ-123, REQ-124, REQ-125, REQ-126, REQ-127, REQ-128, REQ-148, REQ-159, REQ-180, REQ-280
|
|
608
674
|
*/
|
|
609
675
|
export function renderPiUsereqStatus(
|
|
610
676
|
controller: PiUsereqStatusController,
|
|
@@ -614,33 +680,60 @@ export function renderPiUsereqStatus(
|
|
|
614
680
|
if (!controller.config) {
|
|
615
681
|
return;
|
|
616
682
|
}
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
683
|
+
try {
|
|
684
|
+
const theme = createStatusThemeAdapter(ctx.ui.theme as RawStatusTheme);
|
|
685
|
+
ctx.ui.setStatus(
|
|
686
|
+
"pi-usereq",
|
|
687
|
+
buildPiUsereqStatusText(
|
|
688
|
+
ctx.cwd,
|
|
689
|
+
controller.config,
|
|
690
|
+
theme,
|
|
691
|
+
controller.state,
|
|
692
|
+
Date.now(),
|
|
693
|
+
),
|
|
694
|
+
);
|
|
695
|
+
} catch (error) {
|
|
696
|
+
if (isStaleExtensionContextError(error)) {
|
|
697
|
+
if (controller.latestContext === ctx) {
|
|
698
|
+
controller.latestContext = undefined;
|
|
699
|
+
}
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
throw error;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* @brief Transitions the prompt-orchestration workflow state and refreshes the status bar.
|
|
708
|
+
* @details Mutates the tracked workflow state, preserves the latest extension context when available, and re-renders the single-line footer immediately so internal command transitions and pi lifecycle transitions stay visible to the user. Runtime is O(1). Side effect: mutates workflow state and may update `ctx.ui` status.
|
|
709
|
+
* @param[in,out] controller {PiUsereqStatusController} Mutable status controller.
|
|
710
|
+
* @param[in] workflowState {PiUsereqWorkflowState} Next workflow state.
|
|
711
|
+
* @param[in] ctx {ExtensionContext | undefined} Optional active extension context.
|
|
712
|
+
* @return {void} No return value.
|
|
713
|
+
* @satisfies REQ-221, REQ-222, REQ-223
|
|
714
|
+
*/
|
|
715
|
+
export function setPiUsereqWorkflowState(
|
|
716
|
+
controller: PiUsereqStatusController,
|
|
717
|
+
workflowState: PiUsereqWorkflowState,
|
|
718
|
+
ctx?: ExtensionContext,
|
|
719
|
+
): void {
|
|
720
|
+
controller.state.workflowState = workflowState;
|
|
721
|
+
persistPromptCommandState(controller.state);
|
|
722
|
+
const renderContext = ctx ?? controller.latestContext;
|
|
723
|
+
if (renderContext) {
|
|
724
|
+
renderPiUsereqStatus(controller, renderContext);
|
|
725
|
+
}
|
|
628
726
|
}
|
|
629
727
|
|
|
630
728
|
/**
|
|
631
729
|
* @brief Updates mutable status state for one intercepted lifecycle hook.
|
|
632
|
-
* @details Refreshes stored context usage on every hook, starts run timing on
|
|
633
|
-
* `agent_start`, promotes pending prompt-request metadata into the active run, captures non-aborted run duration on `agent_end`, accumulates successful runtime into `Σ`, clears live timing on shutdown, synchronizes
|
|
634
|
-
* the live ticker, and re-renders the status bar when configuration is
|
|
635
|
-
* available. Runtime is O(n) in `agent_end` message count and otherwise O(1).
|
|
636
|
-
* Side effects include in-memory state mutation, interval scheduling, and
|
|
637
|
-
* footer-status updates.
|
|
730
|
+
* @details Refreshes stored context usage on every hook, resets or restores persisted elapsed counters during `session_start`, restores persisted prompt-command metadata when the active session matches a forked execution session, resynchronizes that metadata on later lifecycle hooks so post-switch workflow transitions performed by the initiating command handler become visible to the replacement-session runtime, resets workflow state to `idle` for documented session-start reasons, starts run timing on `agent_start`, promotes pending prompt-request metadata into the active run, captures non-aborted run duration on `agent_end`, accumulates successful runtime into `Σ`, preserves in-memory prompt-command state plus process-scoped persistence across switch-triggered `session_shutdown`, tolerates stale post-replacement render contexts, synchronizes the live ticker, and re-renders the status bar when configuration is available. Runtime is O(n) in `agent_end` message count and otherwise O(1). Side effects include in-memory state mutation, interval scheduling, process-scoped persistence mutation, and footer-status updates.
|
|
638
731
|
* @param[in,out] controller {PiUsereqStatusController} Mutable status controller.
|
|
639
732
|
* @param[in] hookName {PiUsereqStatusHookName} Intercepted hook name.
|
|
640
733
|
* @param[in] event {unknown} Hook payload forwarded from the wrapper.
|
|
641
734
|
* @param[in] ctx {ExtensionContext} Active extension context.
|
|
642
735
|
* @return {void} No return value.
|
|
643
|
-
* @satisfies REQ-117, REQ-118, REQ-119, REQ-123, REQ-124, REQ-125, REQ-159, REQ-169
|
|
736
|
+
* @satisfies REQ-009, REQ-117, REQ-118, REQ-119, REQ-123, REQ-124, REQ-125, REQ-159, REQ-169, REQ-217, REQ-221, REQ-278, REQ-279, REQ-280
|
|
644
737
|
*/
|
|
645
738
|
export function updateExtensionStatus(
|
|
646
739
|
controller: PiUsereqStatusController,
|
|
@@ -651,6 +744,28 @@ export function updateExtensionStatus(
|
|
|
651
744
|
controller.latestContext = ctx;
|
|
652
745
|
refreshContextUsage(controller.state, ctx);
|
|
653
746
|
const nowMs = Date.now();
|
|
747
|
+
const currentSessionFile = getContextSessionFile(ctx);
|
|
748
|
+
|
|
749
|
+
if (hookName === "session_start") {
|
|
750
|
+
if (shouldResetElapsedStateOnSessionStart(event)) {
|
|
751
|
+
resetElapsedState(controller.state);
|
|
752
|
+
} else {
|
|
753
|
+
restorePersistedElapsedState(controller.state);
|
|
754
|
+
}
|
|
755
|
+
const shouldResetWorkflowState = shouldResetWorkflowStateOnSessionStart(event);
|
|
756
|
+
if (shouldResetWorkflowState) {
|
|
757
|
+
controller.state.workflowState = "idle";
|
|
758
|
+
}
|
|
759
|
+
controller.state.runStartTimeMs = undefined;
|
|
760
|
+
if (shouldResetWorkflowState || controller.state.workflowState === "idle") {
|
|
761
|
+
controller.state.pendingPromptRequest = undefined;
|
|
762
|
+
controller.state.activePromptRequest = undefined;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
restorePersistedPromptCommandState(controller.state, currentSessionFile);
|
|
767
|
+
const preservePromptCommandStateOnShutdown = hookName === "session_shutdown"
|
|
768
|
+
&& shouldPreservePromptCommandStateOnShutdown(controller.state);
|
|
654
769
|
|
|
655
770
|
if (hookName === "agent_start") {
|
|
656
771
|
controller.state.runStartTimeMs = nowMs;
|
|
@@ -671,10 +786,17 @@ export function updateExtensionStatus(
|
|
|
671
786
|
|
|
672
787
|
if (hookName === "session_shutdown") {
|
|
673
788
|
controller.state.runStartTimeMs = undefined;
|
|
674
|
-
|
|
675
|
-
|
|
789
|
+
if (!preservePromptCommandStateOnShutdown) {
|
|
790
|
+
controller.state.pendingPromptRequest = undefined;
|
|
791
|
+
controller.state.activePromptRequest = undefined;
|
|
792
|
+
controller.state.workflowState = "idle";
|
|
793
|
+
}
|
|
676
794
|
}
|
|
677
795
|
|
|
796
|
+
persistElapsedState(controller.state);
|
|
797
|
+
if (!preservePromptCommandStateOnShutdown) {
|
|
798
|
+
persistPromptCommandState(controller.state);
|
|
799
|
+
}
|
|
678
800
|
syncPiUsereqStatusTicker(controller);
|
|
679
801
|
renderPiUsereqStatus(controller, ctx);
|
|
680
802
|
}
|