ultimate-pi 0.1.7 → 0.2.2
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/.agents/skills/graphify/.graphify_version +1 -0
- package/.agents/skills/graphify/SKILL.md +1204 -0
- package/.agents/skills/wiki-autoresearch/SKILL.md +225 -97
- package/.agents/skills/wiki-autoresearch/references/program.md +28 -62
- package/.agents/skills/wiki-autoresearch/references/quality-sites.md +32 -0
- package/.env.example +5 -1
- package/.gitattributes +1 -0
- package/.github/workflows/publish-github-packages.yml +1 -1
- package/.pi/SYSTEM.md +72 -18
- package/.pi/agents/harness/adversary.md +32 -0
- package/.pi/agents/harness/evaluator.md +32 -0
- package/.pi/agents/harness/executor.md +34 -0
- package/.pi/agents/harness/meta-optimizer.md +33 -0
- package/.pi/agents/harness/planner.md +33 -0
- package/.pi/agents/harness/tie-breaker.md +35 -0
- package/.pi/agents/harness/trace-librarian.md +32 -0
- package/.pi/extensions/banner.png +0 -0
- package/.pi/extensions/budget-guard.ts +265 -0
- package/.pi/extensions/custom-footer.ts +194 -22
- package/.pi/extensions/custom-header.ts +47 -9
- package/.pi/extensions/debate-orchestrator.ts +479 -0
- package/.pi/extensions/harness-live-widget.ts +438 -0
- package/.pi/extensions/policy-gate.ts +349 -0
- package/.pi/extensions/review-integrity.ts +198 -0
- package/.pi/extensions/test-diff-integrity.ts +240 -0
- package/.pi/extensions/trace-recorder.ts +315 -0
- package/.pi/harness/README.md +23 -0
- package/.pi/harness/router/README.md +35 -0
- package/.pi/harness/router/apply-router-proposal.mjs +153 -0
- package/.pi/harness/router/propose-router-tuning.mjs +149 -0
- package/.pi/harness/specs/README.md +37 -0
- package/.pi/harness/specs/adversary-report.schema.json +53 -0
- package/.pi/harness/specs/budget-exhausted-event.schema.json +93 -0
- package/.pi/harness/specs/consensus-packet.schema.json +175 -0
- package/.pi/harness/specs/eval-verdict.schema.json +59 -0
- package/.pi/harness/specs/incident-record.schema.json +84 -0
- package/.pi/harness/specs/plan-packet.schema.json +90 -0
- package/.pi/harness/specs/round-result.schema.json +126 -0
- package/.pi/harness/specs/router-tuning-proposal.schema.json +114 -0
- package/.pi/harness/specs/run-trace.schema.json +107 -0
- package/.pi/lib/harness-ui-state.ts +311 -0
- package/.pi/mcp.json +4 -0
- package/.pi/model-router.json +93 -93
- package/.pi/prompts/graphify.md +23 -0
- package/.pi/prompts/harness-abort.md +41 -0
- package/.pi/prompts/harness-auto.md +83 -0
- package/.pi/prompts/harness-critic.md +52 -0
- package/.pi/prompts/harness-eval.md +51 -0
- package/.pi/prompts/harness-incident.md +51 -0
- package/.pi/prompts/harness-plan.md +64 -0
- package/.pi/prompts/harness-review.md +52 -0
- package/.pi/prompts/harness-router-tune.md +74 -0
- package/.pi/prompts/harness-run.md +59 -0
- package/.pi/prompts/harness-setup.md +316 -216
- package/.pi/prompts/harness-trace.md +51 -0
- package/.pi/prompts/wiki-autoresearch.md +9 -7
- package/.pi/prompts/wiki-save.md +20 -0
- package/.pi/skills/agent-router/SKILL.md +2 -4
- package/.pi/skills/ast-grep/SKILL.md +354 -0
- package/.pi/sounds/project-sounds.json +18 -24
- package/AGENTS.md +30 -0
- package/CHANGELOG.md +89 -0
- package/CONTRIBUTING.md +51 -1
- package/README.md +264 -20
- package/biome.json +8 -2
- package/lefthook.yml +3 -2
- package/node_modules/@sting8k/pi-vcc/README.md +200 -0
- package/node_modules/@sting8k/pi-vcc/index.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/package.json +26 -0
- package/node_modules/@sting8k/pi-vcc/scripts/audit-sessions.ts +88 -0
- package/node_modules/@sting8k/pi-vcc/scripts/benchmark-real-sessions.ts +25 -0
- package/node_modules/@sting8k/pi-vcc/scripts/compare-before-after.ts +36 -0
- package/node_modules/@sting8k/pi-vcc/scripts/dump-branch-output.ts +20 -0
- package/node_modules/@sting8k/pi-vcc/src/commands/pi-vcc.ts +36 -0
- package/node_modules/@sting8k/pi-vcc/src/commands/vcc-recall.ts +65 -0
- package/node_modules/@sting8k/pi-vcc/src/core/brief.ts +381 -0
- package/node_modules/@sting8k/pi-vcc/src/core/build-sections.ts +79 -0
- package/node_modules/@sting8k/pi-vcc/src/core/content.ts +60 -0
- package/node_modules/@sting8k/pi-vcc/src/core/filter-noise.ts +42 -0
- package/node_modules/@sting8k/pi-vcc/src/core/format-recall.ts +27 -0
- package/node_modules/@sting8k/pi-vcc/src/core/format.ts +49 -0
- package/node_modules/@sting8k/pi-vcc/src/core/lineage.ts +26 -0
- package/node_modules/@sting8k/pi-vcc/src/core/load-messages.ts +41 -0
- package/node_modules/@sting8k/pi-vcc/src/core/normalize.ts +66 -0
- package/node_modules/@sting8k/pi-vcc/src/core/recall-scope.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/src/core/render-entries.ts +55 -0
- package/node_modules/@sting8k/pi-vcc/src/core/report.ts +237 -0
- package/node_modules/@sting8k/pi-vcc/src/core/sanitize.ts +5 -0
- package/node_modules/@sting8k/pi-vcc/src/core/search-entries.ts +221 -0
- package/node_modules/@sting8k/pi-vcc/src/core/settings.ts +77 -0
- package/node_modules/@sting8k/pi-vcc/src/core/skill-collapse.ts +35 -0
- package/node_modules/@sting8k/pi-vcc/src/core/summarize.ts +157 -0
- package/node_modules/@sting8k/pi-vcc/src/core/tool-args.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/src/details.ts +7 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/commits.ts +69 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/files.ts +80 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/goals.ts +79 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/preferences.ts +55 -0
- package/node_modules/@sting8k/pi-vcc/src/hooks/before-compact.ts +322 -0
- package/node_modules/@sting8k/pi-vcc/src/sections.ts +12 -0
- package/node_modules/@sting8k/pi-vcc/src/tools/recall.ts +109 -0
- package/node_modules/@sting8k/pi-vcc/src/types.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/tests/before-compact-hook.test.ts +181 -0
- package/node_modules/@sting8k/pi-vcc/tests/before-compact.test.ts +140 -0
- package/node_modules/@sting8k/pi-vcc/tests/brief.test.ts +206 -0
- package/node_modules/@sting8k/pi-vcc/tests/build-sections.test.ts +59 -0
- package/node_modules/@sting8k/pi-vcc/tests/compile.test.ts +80 -0
- package/node_modules/@sting8k/pi-vcc/tests/content.test.ts +31 -0
- package/node_modules/@sting8k/pi-vcc/tests/extract-goals.test.ts +86 -0
- package/node_modules/@sting8k/pi-vcc/tests/extract-preferences.test.ts +30 -0
- package/node_modules/@sting8k/pi-vcc/tests/filter-noise.test.ts +61 -0
- package/node_modules/@sting8k/pi-vcc/tests/fixtures.ts +61 -0
- package/node_modules/@sting8k/pi-vcc/tests/format-recall.test.ts +30 -0
- package/node_modules/@sting8k/pi-vcc/tests/format.test.ts +62 -0
- package/node_modules/@sting8k/pi-vcc/tests/lineage.test.ts +33 -0
- package/node_modules/@sting8k/pi-vcc/tests/load-messages.test.ts +51 -0
- package/node_modules/@sting8k/pi-vcc/tests/normalize.test.ts +97 -0
- package/node_modules/@sting8k/pi-vcc/tests/real-sessions.test.ts +38 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-expand.test.ts +15 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-scope.test.ts +32 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-tool-scope.test.ts +67 -0
- package/node_modules/@sting8k/pi-vcc/tests/render-entries.test.ts +62 -0
- package/node_modules/@sting8k/pi-vcc/tests/report.test.ts +44 -0
- package/node_modules/@sting8k/pi-vcc/tests/sanitize.test.ts +24 -0
- package/node_modules/@sting8k/pi-vcc/tests/search-entries.test.ts +144 -0
- package/node_modules/@sting8k/pi-vcc/tests/support/load-session.ts +23 -0
- package/node_modules/@sting8k/pi-vcc/tests/support/real-sessions.ts +51 -0
- package/package.json +15 -4
- package/scripts/__pycache__/merge_graphify_corpora.cpython-314.pyc +0 -0
- package/scripts/index_youtube_urls.py +376 -0
- package/scripts/merge_graphify_corpora.py +398 -0
- package/scripts/regen_graphify_html.py +46 -0
- package/.agents/skills/defuddle/SKILL.md +0 -90
- package/.agents/skills/wiki/SKILL.md +0 -215
- package/.agents/skills/wiki/references/css-snippets.md +0 -122
- package/.agents/skills/wiki/references/frontmatter.md +0 -107
- package/.agents/skills/wiki/references/git-setup.md +0 -58
- package/.agents/skills/wiki/references/mcp-setup.md +0 -149
- package/.agents/skills/wiki/references/modes.md +0 -259
- package/.agents/skills/wiki/references/plugins.md +0 -96
- package/.agents/skills/wiki/references/rest-api.md +0 -124
- package/.agents/skills/wiki-fold/SKILL.md +0 -204
- package/.agents/skills/wiki-fold/references/fold-template.md +0 -133
- package/.agents/skills/wiki-ingest/SKILL.md +0 -288
- package/.agents/skills/wiki-lint/SKILL.md +0 -183
- package/.agents/skills/wiki-query/SKILL.md +0 -176
- package/.pi/agents/rethink.md +0 -140
- package/.pi/agents/wiki-ingest.md +0 -67
- package/.pi/agents/wiki-lint.md +0 -75
- package/.pi/internal/cursor-sdk-transcript-parser.ts +0 -59
- package/.pi/prompts/save.md +0 -16
- package/.pi/prompts/wiki.md +0 -23
- package/.pi/providers/cursor-sdk-provider.test.mjs +0 -476
- package/.pi/providers/cursor-sdk-provider.ts +0 -1085
- package/vault/AGENTS.md +0 -37
- package/vault/wiki/_templates/comparison.md +0 -39
- package/vault/wiki/_templates/concept.md +0 -40
- package/vault/wiki/_templates/decision.md +0 -21
- package/vault/wiki/_templates/entity.md +0 -32
- package/vault/wiki/_templates/flow.md +0 -14
- package/vault/wiki/_templates/module.md +0 -18
- package/vault/wiki/_templates/question.md +0 -31
- package/vault/wiki/_templates/source.md +0 -39
- package/vault/wiki/concepts/AST-Aware Code Chunking.md +0 -44
- package/vault/wiki/concepts/Build-Time Prompt Compilation.md +0 -107
- package/vault/wiki/concepts/Context Engine (AI Coding).md +0 -47
- package/vault/wiki/concepts/Context-Aware System Reminders.md +0 -61
- package/vault/wiki/concepts/Contextualized Text Embedding.md +0 -42
- package/vault/wiki/concepts/Contractor vs Employee AI Model.md +0 -55
- package/vault/wiki/concepts/Dual-Model Agent Architecture.md +0 -65
- package/vault/wiki/concepts/Late Chunking vs Early Chunking.md +0 -43
- package/vault/wiki/concepts/Majority Vote Ensembling.md +0 -68
- package/vault/wiki/concepts/Meta-Harness.md +0 -16
- package/vault/wiki/concepts/Multi-Agent AI Coding Architecture.md +0 -75
- package/vault/wiki/concepts/Prompt Enhancement.md +0 -90
- package/vault/wiki/concepts/Prompt Renderer.md +0 -89
- package/vault/wiki/concepts/Semantic Codebase Indexing.md +0 -67
- package/vault/wiki/concepts/additive-config-hierarchy.md +0 -16
- package/vault/wiki/concepts/agent-artifacts-verifiable-deliverables.md +0 -71
- package/vault/wiki/concepts/agent-browser-browser-automation.md +0 -99
- package/vault/wiki/concepts/agent-codebase-interface.md +0 -43
- package/vault/wiki/concepts/agent-harness-architecture.md +0 -67
- package/vault/wiki/concepts/agent-loop-detection-patterns.md +0 -133
- package/vault/wiki/concepts/agent-search-enforcement.md +0 -126
- package/vault/wiki/concepts/agent-skills-ecosystem.md +0 -74
- package/vault/wiki/concepts/agent-skills-pattern.md +0 -68
- package/vault/wiki/concepts/agentic-harness-context-enforcement.md +0 -91
- package/vault/wiki/concepts/agentic-harness.md +0 -34
- package/vault/wiki/concepts/agentic-orchestration-pipeline.md +0 -56
- package/vault/wiki/concepts/agentic-search-no-embeddings.md +0 -18
- package/vault/wiki/concepts/anthropic-context-engineering.md +0 -13
- package/vault/wiki/concepts/antigravity-agent-first-architecture.md +0 -61
- package/vault/wiki/concepts/ast-compression.md +0 -19
- package/vault/wiki/concepts/ast-truncation.md +0 -66
- package/vault/wiki/concepts/barrel-files.md +0 -37
- package/vault/wiki/concepts/browser-harness-agent.md +0 -41
- package/vault/wiki/concepts/browser-subagent-visual-verification.md +0 -82
- package/vault/wiki/concepts/codebase-intelligence-ecosystem-comparison.md +0 -192
- package/vault/wiki/concepts/codebase-intelligence-harness-integration.md +0 -161
- package/vault/wiki/concepts/codebase-to-context-ingestion.md +0 -46
- package/vault/wiki/concepts/codex-harness-innovations.md +0 -147
- package/vault/wiki/concepts/consensus-debate-flow.md +0 -17
- package/vault/wiki/concepts/consensus-debate.md +0 -206
- package/vault/wiki/concepts/content-addressed-spec-identity.md +0 -166
- package/vault/wiki/concepts/context-anxiety.md +0 -57
- package/vault/wiki/concepts/context-compression-techniques.md +0 -19
- package/vault/wiki/concepts/context-continuity.md +0 -22
- package/vault/wiki/concepts/context-drift-in-agents.md +0 -106
- package/vault/wiki/concepts/context-engineering.md +0 -62
- package/vault/wiki/concepts/context-folding.md +0 -67
- package/vault/wiki/concepts/context-mode.md +0 -38
- package/vault/wiki/concepts/cursor-harness-innovations.md +0 -107
- package/vault/wiki/concepts/deterministic-session-compaction.md +0 -79
- package/vault/wiki/concepts/drift-detection-unified.md +0 -296
- package/vault/wiki/concepts/execution-feedback-loop.md +0 -46
- package/vault/wiki/concepts/feedforward-feedback-harness.md +0 -60
- package/vault/wiki/concepts/five-root-cause-metrics-sentrux.md +0 -40
- package/vault/wiki/concepts/fork-safe-spec-storage.md +0 -89
- package/vault/wiki/concepts/fts5-sandbox.md +0 -19
- package/vault/wiki/concepts/fuzzy-edit-matching.md +0 -71
- package/vault/wiki/concepts/gemini-cli-architecture.md +0 -104
- package/vault/wiki/concepts/generator-evaluator-architecture.md +0 -64
- package/vault/wiki/concepts/guardian-agent-pattern.md +0 -67
- package/vault/wiki/concepts/harness-configuration-layers.md +0 -89
- package/vault/wiki/concepts/harness-control-frameworks.md +0 -155
- package/vault/wiki/concepts/harness-engineering-first-principles.md +0 -90
- package/vault/wiki/concepts/harness-h-formalism.md +0 -53
- package/vault/wiki/concepts/hybrid-code-search.md +0 -61
- package/vault/wiki/concepts/inline-post-edit-validation.md +0 -112
- package/vault/wiki/concepts/legendary-engineering-patterns-harness.md +0 -110
- package/vault/wiki/concepts/lifecycle-hooks.md +0 -94
- package/vault/wiki/concepts/mcp-tool-routing.md +0 -102
- package/vault/wiki/concepts/memory-system-of-record-vs-ephemeral-cache.md +0 -47
- package/vault/wiki/concepts/meta-agent-context-pruning.md +0 -151
- package/vault/wiki/concepts/model-adaptive-harness.md +0 -122
- package/vault/wiki/concepts/model-routing-agents.md +0 -101
- package/vault/wiki/concepts/monorepo-architecture.md +0 -45
- package/vault/wiki/concepts/multi-agent-specialization.md +0 -61
- package/vault/wiki/concepts/permission-subsystem.md +0 -16
- package/vault/wiki/concepts/pi-messenger-analysis.md +0 -243
- package/vault/wiki/concepts/pi-vscode-extension-landscape.md +0 -37
- package/vault/wiki/concepts/policy-engine-pattern.md +0 -78
- package/vault/wiki/concepts/progressive-disclosure-agents.md +0 -53
- package/vault/wiki/concepts/progressive-skill-disclosure.md +0 -17
- package/vault/wiki/concepts/provider-native-prompting.md +0 -203
- package/vault/wiki/concepts/quality-signal-sentrux.md +0 -37
- package/vault/wiki/concepts/repo-map-ranking.md +0 -42
- package/vault/wiki/concepts/result-monad-error-handling.md +0 -47
- package/vault/wiki/concepts/safety-defense-in-depth.md +0 -83
- package/vault/wiki/concepts/sandbox-os-enforcement.md +0 -18
- package/vault/wiki/concepts/selective-debate-routing.md +0 -70
- package/vault/wiki/concepts/self-evolving-harness.md +0 -60
- package/vault/wiki/concepts/sentrux-mcp-integration.md +0 -36
- package/vault/wiki/concepts/sentrux-rules-engine.md +0 -49
- package/vault/wiki/concepts/shell-pattern-compression.md +0 -24
- package/vault/wiki/concepts/skill-first-architecture.md +0 -166
- package/vault/wiki/concepts/structured-compaction.md +0 -78
- package/vault/wiki/concepts/subagent-orchestration.md +0 -17
- package/vault/wiki/concepts/subagent-worktree-isolation.md +0 -68
- package/vault/wiki/concepts/superpowers-methodology.md +0 -78
- package/vault/wiki/concepts/think-in-code.md +0 -73
- package/vault/wiki/concepts/ts-execution-layer.md +0 -100
- package/vault/wiki/concepts/typescript-strict-mode.md +0 -37
- package/vault/wiki/concepts/vcc-conversation-compaction-for-pi.md +0 -53
- package/vault/wiki/concepts/verification-drift-detection.md +0 -19
- package/vault/wiki/consensus/consensus-records.md +0 -58
- package/vault/wiki/decisions/2026-04-30-pi-lean-ctx-native.md +0 -122
- package/vault/wiki/decisions/2026-05-07-replace-lean-ctx-with-context-mode.md +0 -59
- package/vault/wiki/decisions/adr-008.md +0 -40
- package/vault/wiki/decisions/adr-009.md +0 -46
- package/vault/wiki/decisions/adr-010.md +0 -55
- package/vault/wiki/decisions/adr-011.md +0 -165
- package/vault/wiki/decisions/adr-012.md +0 -102
- package/vault/wiki/decisions/adr-013.md +0 -59
- package/vault/wiki/decisions/adr-014.md +0 -73
- package/vault/wiki/decisions/adr-015.md +0 -81
- package/vault/wiki/decisions/adr-016.md +0 -91
- package/vault/wiki/decisions/adr-017.md +0 -79
- package/vault/wiki/decisions/adr-018.md +0 -100
- package/vault/wiki/decisions/adr-019.md +0 -75
- package/vault/wiki/decisions/adr-020.md +0 -106
- package/vault/wiki/decisions/adr-021.md +0 -86
- package/vault/wiki/decisions/adr-022.md +0 -113
- package/vault/wiki/decisions/adr-023.md +0 -113
- package/vault/wiki/decisions/adr-024.md +0 -73
- package/vault/wiki/decisions/adr-025.md +0 -130
- package/vault/wiki/decisions/adr-026.md +0 -56
- package/vault/wiki/decisions/adr-027.md +0 -94
- package/vault/wiki/decisions/colocate-wiki.md +0 -34
- package/vault/wiki/entities/Anders Hejlsberg.md +0 -29
- package/vault/wiki/entities/Anthropic.md +0 -17
- package/vault/wiki/entities/Augment Code.md +0 -49
- package/vault/wiki/entities/Bjarne Stroustrup.md +0 -26
- package/vault/wiki/entities/Bolt.new (StackBlitz).md +0 -39
- package/vault/wiki/entities/Boris Cherny.md +0 -11
- package/vault/wiki/entities/Claude Code.md +0 -19
- package/vault/wiki/entities/Dennis Ritchie.md +0 -26
- package/vault/wiki/entities/Emergent Labs.md +0 -32
- package/vault/wiki/entities/Google Cloud.md +0 -16
- package/vault/wiki/entities/Guido van Rossum.md +0 -28
- package/vault/wiki/entities/Ken Thompson.md +0 -28
- package/vault/wiki/entities/Lee et al.md +0 -16
- package/vault/wiki/entities/Linus Torvalds.md +0 -28
- package/vault/wiki/entities/Lovable (company).md +0 -40
- package/vault/wiki/entities/Martin Fowler.md +0 -16
- package/vault/wiki/entities/Meng et al.md +0 -16
- package/vault/wiki/entities/OpenAI.md +0 -16
- package/vault/wiki/entities/Rocket.new.md +0 -38
- package/vault/wiki/entities/VILA-Lab.md +0 -15
- package/vault/wiki/entities/autodev-codebase.md +0 -18
- package/vault/wiki/entities/ck-tool.md +0 -59
- package/vault/wiki/entities/codesearch.md +0 -18
- package/vault/wiki/entities/disler-indydevdan.md +0 -33
- package/vault/wiki/entities/gsd-get-shit-done.md +0 -56
- package/vault/wiki/entities/javascript-runtimes.md +0 -48
- package/vault/wiki/entities/jesse-vincent.md +0 -38
- package/vault/wiki/entities/lean-ctx.md +0 -32
- package/vault/wiki/entities/opendev.md +0 -41
- package/vault/wiki/entities/ops-codegraph-tool.md +0 -18
- package/vault/wiki/entities/pi-coding-agent.md +0 -53
- package/vault/wiki/entities/sentrux.md +0 -54
- package/vault/wiki/entities/vgrep-tool.md +0 -57
- package/vault/wiki/entities/vitest.md +0 -41
- package/vault/wiki/flows/harness-wiki-pipeline.md +0 -204
- package/vault/wiki/hot.md +0 -932
- package/vault/wiki/index.md +0 -437
- package/vault/wiki/log.md +0 -422
- package/vault/wiki/meta/dashboard.md +0 -30
- package/vault/wiki/meta/lint-report-2026-04-30.md +0 -86
- package/vault/wiki/meta/lint-report-2026-05-02.md +0 -251
- package/vault/wiki/meta/overview.canvas +0 -43
- package/vault/wiki/modules/adversarial-verification.md +0 -57
- package/vault/wiki/modules/automated-observability.md +0 -54
- package/vault/wiki/modules/bench.md +0 -20
- package/vault/wiki/modules/extensions.md +0 -23
- package/vault/wiki/modules/grounding-checkpoints.md +0 -62
- package/vault/wiki/modules/harness-implementation-plan.md +0 -345
- package/vault/wiki/modules/harness-wiki-skill-mapping.md +0 -135
- package/vault/wiki/modules/harness.md +0 -86
- package/vault/wiki/modules/persistent-memory.md +0 -85
- package/vault/wiki/modules/schema-orchestration.md +0 -68
- package/vault/wiki/modules/skills.md +0 -27
- package/vault/wiki/modules/spec-hardening.md +0 -58
- package/vault/wiki/modules/structured-planning.md +0 -53
- package/vault/wiki/modules/think-in-code-enforcement.md +0 -153
- package/vault/wiki/modules/wiki-query-interface.md +0 -64
- package/vault/wiki/overview.md +0 -51
- package/vault/wiki/questions/Research-pi-vs-claude-code-agentic-orchestration-pipeline.md +0 -87
- package/vault/wiki/questions/Research-sentrux-dev.md +0 -123
- package/vault/wiki/questions/Research-superpowers-skill-for-agentic-coding-agents.md +0 -164
- package/vault/wiki/questions/Research: Augment Code Context Engine.md +0 -244
- package/vault/wiki/questions/Research: Automating Software Engineering - Lovable, Bolt, Emergent, Rocket.md +0 -112
- package/vault/wiki/questions/Research: Claude Code State-of-the-Art Harness Improvements.md +0 -209
- package/vault/wiki/questions/Research: Codex State-of-the-Art Harness Improvements.md +0 -99
- package/vault/wiki/questions/Research: Engineering Workflows of Legendary Programmers and AI Harness Mapping.md +0 -107
- package/vault/wiki/questions/Research: Fallow Codebase Intelligence Harness Integration.md +0 -72
- package/vault/wiki/questions/Research: Gemini CLI SOTA Harness Integration.md +0 -166
- package/vault/wiki/questions/Research: GitHub Issues as Harness Spec Storage.md +0 -188
- package/vault/wiki/questions/Research: Google Antigravity Harness Integration.md +0 -120
- package/vault/wiki/questions/Research: Meta-Agent Context Drift Detection.md +0 -236
- package/vault/wiki/questions/Research: Model-Adaptive Agent Harness Design.md +0 -95
- package/vault/wiki/questions/Research: Model-Specific Prompting Guides.md +0 -165
- package/vault/wiki/questions/Research: Prompt Renderer for Multi-Model Agent Harness.md +0 -216
- package/vault/wiki/questions/Research: Skill-First Harness Architecture.md +0 -91
- package/vault/wiki/questions/Research: TypeScript Best Practices and Codebase Structure.md +0 -88
- package/vault/wiki/questions/Research: TypeScript Execution Layer for Agent Tool Calling.md +0 -81
- package/vault/wiki/questions/Research: claude-mem over Obsidian for Harness Layer.md +0 -71
- package/vault/wiki/questions/Research: claude-mem over obsidian wiki as the knowledge base for our agentic harness pipeline. think from first principles. does this replace or complement our current setup? no hard feelings about previous decisions. gimme accurate points.md +0 -80
- package/vault/wiki/questions/Research: context-mode vs lean-ctx.md +0 -72
- package/vault/wiki/questions/Research: cursor.sh Harness Innovations.md +0 -92
- package/vault/wiki/questions/Research: executor.sh Harness Integration.md +0 -170
- package/vault/wiki/questions/Research: how GSD fits into our coding harness setup.md +0 -97
- package/vault/wiki/questions/Research: how claude-mem fits into our workflow. and whether it should replace obsidian in the codebase. no hard feelings about previous actions, rethink from first principles always.md +0 -80
- package/vault/wiki/questions/Research: pi-vcc.md +0 -113
- package/vault/wiki/questions/Research: semantic code search tools.md +0 -69
- package/vault/wiki/questions/Research: vcc extension for pi coding agent.md +0 -73
- package/vault/wiki/questions/how-to-enable-semantic-code-search-now.md +0 -111
- package/vault/wiki/questions/mvp-implementation-blueprint.md +0 -552
- package/vault/wiki/questions/research-agent-first-codebase-exploration.md +0 -199
- package/vault/wiki/questions/research-agentic-coding-harness-latest-papers.md +0 -142
- package/vault/wiki/questions/research-gitingest-gitreverse-integration.md +0 -100
- package/vault/wiki/questions/research-wozcode-token-reduction.md +0 -67
- package/vault/wiki/questions/resolved-context-pruning-inplace-vs-restart.md +0 -95
- package/vault/wiki/questions/resolved-context-window-economics.md +0 -167
- package/vault/wiki/questions/resolved-imad-debate-gating-transfer.md +0 -126
- package/vault/wiki/questions/resolved-mcp-tool-preference.md +0 -112
- package/vault/wiki/questions/resolved-small-model-meta-agents.md +0 -107
- package/vault/wiki/questions/resolved-treesitter-dynamic-languages.md +0 -95
- package/vault/wiki/sources/Auggie Context MCP Server.md +0 -63
- package/vault/wiki/sources/Augment Code Codacy AI Giants.md +0 -61
- package/vault/wiki/sources/Augment Code MCP SiliconAngle.md +0 -49
- package/vault/wiki/sources/Augment Code WorkOS ERC 2025.md +0 -55
- package/vault/wiki/sources/Augment Context Engine Official.md +0 -71
- package/vault/wiki/sources/Augment SWE-bench Agent GitHub.md +0 -74
- package/vault/wiki/sources/Augment SWE-bench Pro Blog.md +0 -58
- package/vault/wiki/sources/Source: AgentBus Jinja2 Prompt Pipelines.md +0 -75
- package/vault/wiki/sources/Source: Arxiv /342/200/224 Don't Break the Cache.md" +0 -85
- package/vault/wiki/sources/Source: Augment - Harness Engineering for AI Coding Agents.md +0 -58
- package/vault/wiki/sources/Source: Blake Crosley Agent Architecture Guide.md +0 -100
- package/vault/wiki/sources/Source: Bolt.new Architecture & Case Study.md +0 -75
- package/vault/wiki/sources/Source: Build-Time Prompt Compilation Architecture.md +0 -107
- package/vault/wiki/sources/Source: Claude API Agent Skills Overview.md +0 -70
- package/vault/wiki/sources/Source: Gemini CLI Changelogs.md +0 -88
- package/vault/wiki/sources/Source: Google Blog - Gemini CLI Announcement.md +0 -57
- package/vault/wiki/sources/Source: Google Gemini CLI Architecture Docs.md +0 -53
- package/vault/wiki/sources/Source: LangChain - Anatomy of Agent Harness.md +0 -65
- package/vault/wiki/sources/Source: Lovable Architecture & Clone Analysis.md +0 -83
- package/vault/wiki/sources/Source: Martin Fowler - Harness Engineering.md +0 -70
- package/vault/wiki/sources/Source: OpenAI Harness Engineering Five Principles.md +0 -58
- package/vault/wiki/sources/Source: OpenAI Harness Engineering /342/200/224 0 Lines of Human Code.md" +0 -101
- package/vault/wiki/sources/Source: OpenDev /342/200/224 Building AI Coding Agents for the Terminal.md" +0 -100
- package/vault/wiki/sources/Source: Render AI Coding Agents Benchmark 2025.md +0 -53
- package/vault/wiki/sources/Source: Rocket.new /342/200/224 Vibe Solutioning Platform.md" +0 -70
- package/vault/wiki/sources/Source: SwirlAI Agent Skills Progressive Disclosure.md +0 -71
- package/vault/wiki/sources/Source: TianPan Prompt Caching Architecture.md +0 -89
- package/vault/wiki/sources/Source: Vercel Labs agent-browser.md +0 -155
- package/vault/wiki/sources/Source: browser-harness CDP Harness.md +0 -126
- package/vault/wiki/sources/agent-drift-academic-paper.md +0 -79
- package/vault/wiki/sources/aider-repomap-tree-sitter.md +0 -42
- package/vault/wiki/sources/anthropic-compaction-api.md +0 -58
- package/vault/wiki/sources/anthropic-effective-harnesses.md +0 -42
- package/vault/wiki/sources/anthropic-prompt-best-practices.md +0 -100
- package/vault/wiki/sources/anthropic2026-harness-design.md +0 -63
- package/vault/wiki/sources/barrel-files-tkdodo.md +0 -38
- package/vault/wiki/sources/birth-of-unix-kernighan-interview.md +0 -57
- package/vault/wiki/sources/bockeler2026-harness-engineering.md +0 -69
- package/vault/wiki/sources/cast-code-chunking-paper.md +0 -50
- package/vault/wiki/sources/ck-semantic-search.md +0 -78
- package/vault/wiki/sources/claude-code-architecture-karaxai-2026.md +0 -71
- package/vault/wiki/sources/claude-code-architecture-qubytes-2026.md +0 -50
- package/vault/wiki/sources/claude-code-architecture-vila-lab-2026.md +0 -64
- package/vault/wiki/sources/claude-code-security-architecture-penligent-2026.md +0 -70
- package/vault/wiki/sources/claude-context-editing-docs.md +0 -13
- package/vault/wiki/sources/cloudflare-codemode.md +0 -63
- package/vault/wiki/sources/code-chunk-library-supermemory.md +0 -63
- package/vault/wiki/sources/codeact-apple-2024.md +0 -62
- package/vault/wiki/sources/codex-dsc-rfc-8573.md +0 -41
- package/vault/wiki/sources/codex-open-source-agent-2026.md +0 -110
- package/vault/wiki/sources/coir-code-retrieval-benchmark.md +0 -51
- package/vault/wiki/sources/colinmcnamara-context-optimization-codemode.md +0 -48
- package/vault/wiki/sources/context-folding-paper.md +0 -61
- package/vault/wiki/sources/context-mode-website.md +0 -63
- package/vault/wiki/sources/cursor-agent-best-practices-2026.md +0 -62
- package/vault/wiki/sources/cursor-fork-29b-2025.md +0 -50
- package/vault/wiki/sources/cursor-harness-april-2026.md +0 -76
- package/vault/wiki/sources/cursor-instant-apply-2024.md +0 -45
- package/vault/wiki/sources/cursor-shadow-workspace-2024.md +0 -52
- package/vault/wiki/sources/cursor-shipped-coding-agent-2026.md +0 -53
- package/vault/wiki/sources/cursor-vs-antigravity-2026.md +0 -51
- package/vault/wiki/sources/disler-pi-vs-claude-code.md +0 -69
- package/vault/wiki/sources/distill-deterministic-context-compression.md +0 -53
- package/vault/wiki/sources/embedding-models-benchmark-supermemory-2025.md +0 -48
- package/vault/wiki/sources/executor-rhyssullivan.md +0 -122
- package/vault/wiki/sources/fallow-rs-codebase-intelligence.md +0 -125
- package/vault/wiki/sources/fan2025-imad.md +0 -60
- package/vault/wiki/sources/forgecode-gpt5-agent-improvements.md +0 -63
- package/vault/wiki/sources/gemini-3-prompting-guide.md +0 -78
- package/vault/wiki/sources/gh-cli-sub-issue-rfc.md +0 -50
- package/vault/wiki/sources/gh-sub-issue-extension.md +0 -72
- package/vault/wiki/sources/github-fork-issues-discussion.md +0 -44
- package/vault/wiki/sources/github-issue-dependencies-docs.md +0 -49
- package/vault/wiki/sources/github-sub-issues-docs.md +0 -51
- package/vault/wiki/sources/gitingest.md +0 -91
- package/vault/wiki/sources/gitreverse.md +0 -63
- package/vault/wiki/sources/google-antigravity-official-blog.md +0 -47
- package/vault/wiki/sources/google-antigravity-wikipedia.md +0 -53
- package/vault/wiki/sources/gsd-codecentric-deep-dive.md +0 -57
- package/vault/wiki/sources/gsd-github-repo.md +0 -51
- package/vault/wiki/sources/gsd-hn-discussion.md +0 -59
- package/vault/wiki/sources/guido-python-design-philosophy.md +0 -56
- package/vault/wiki/sources/hejlsberg-7-learnings.md +0 -48
- package/vault/wiki/sources/ironclaw-drift-monitor.md +0 -80
- package/vault/wiki/sources/langsight-loop-detection.md +0 -80
- package/vault/wiki/sources/leanctx-website.md +0 -69
- package/vault/wiki/sources/lee2026-meta-harness.md +0 -59
- package/vault/wiki/sources/linux-kernel-coding-workflow.md +0 -50
- package/vault/wiki/sources/lou2026-autoharness.md +0 -53
- package/vault/wiki/sources/martin-fowler-harness-engineering.md +0 -73
- package/vault/wiki/sources/mcp-architecture-docs.md +0 -13
- package/vault/wiki/sources/meng2026-agent-harness-survey.md +0 -79
- package/vault/wiki/sources/mindstudio-four-agent-types.md +0 -68
- package/vault/wiki/sources/ms-chat-history-management.md +0 -13
- package/vault/wiki/sources/openai-prompt-guidance.md +0 -104
- package/vault/wiki/sources/openclaw-session-pruning.md +0 -13
- package/vault/wiki/sources/opencode-dcp.md +0 -13
- package/vault/wiki/sources/opendev-arxiv-2603.05344v1.md +0 -79
- package/vault/wiki/sources/openhands-platform.md +0 -39
- package/vault/wiki/sources/oss-guide-codebase-exploration.md +0 -53
- package/vault/wiki/sources/pi-compaction-extensions-ecosystem.md +0 -102
- package/vault/wiki/sources/pi-context-prune-github-repo.md +0 -38
- package/vault/wiki/sources/pi-mono-compaction-docs.md +0 -38
- package/vault/wiki/sources/pi-omni-compact-github-repo.md +0 -50
- package/vault/wiki/sources/pi-rtk-optimizer-github-repo.md +0 -45
- package/vault/wiki/sources/pi-vcc-github-repo.md +0 -69
- package/vault/wiki/sources/pi-vscode-marketplace.md +0 -41
- package/vault/wiki/sources/pi-vscode-model-provider-marketplace.md +0 -39
- package/vault/wiki/sources/py-tree-sitter.md +0 -13
- package/vault/wiki/sources/sentrux-dev-landing.md +0 -40
- package/vault/wiki/sources/sentrux-docs-pro-architecture.md +0 -75
- package/vault/wiki/sources/sentrux-docs-quality-signal.md +0 -46
- package/vault/wiki/sources/sentrux-docs-root-cause-metrics.md +0 -57
- package/vault/wiki/sources/sentrux-docs-rules-engine.md +0 -58
- package/vault/wiki/sources/sentrux-github-repo.md +0 -56
- package/vault/wiki/sources/superpowers-github-repo.md +0 -56
- package/vault/wiki/sources/superpowers-release-blog.md +0 -54
- package/vault/wiki/sources/superpowers-termdock-analysis.md +0 -45
- package/vault/wiki/sources/swe-agent-aci.md +0 -42
- package/vault/wiki/sources/swe-bench.md +0 -45
- package/vault/wiki/sources/swe-pruner-context-pruning.md +0 -13
- package/vault/wiki/sources/think-in-code-blog.md +0 -48
- package/vault/wiki/sources/tree-sitter-docs.md +0 -13
- package/vault/wiki/sources/ts-best-practices-2025-devto.md +0 -42
- package/vault/wiki/sources/ts-folder-structure-mingyang.md +0 -58
- package/vault/wiki/sources/ts-monorepo-koerselman.md +0 -44
- package/vault/wiki/sources/ts-result-error-handling-kkalamarski.md +0 -52
- package/vault/wiki/sources/ts-runtimes-comparison-betterstack.md +0 -42
- package/vault/wiki/sources/ts-strict-mode-rishikc.md +0 -43
- package/vault/wiki/sources/unix-philosophy.md +0 -48
- package/vault/wiki/sources/vectara-chunking-vs-embedding-naacl2025.md +0 -39
- package/vault/wiki/sources/vectara-guardian-agents.md +0 -79
- package/vault/wiki/sources/vgrep-semantic-search.md +0 -76
- package/vault/wiki/sources/vitest-official.md +0 -41
- package/vault/wiki/sources/vscode-pi-community-extension.md +0 -40
- package/vault/wiki/sources/wozcode.md +0 -79
|
@@ -5,9 +5,70 @@
|
|
|
5
5
|
* ~/project (main) ↑12k ↓8k $0.042 [████████░░] 72% anthropic • claude-sonnet-4-20250514 • xhigh
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type {
|
|
8
|
+
import type {
|
|
9
|
+
ExtensionAPI,
|
|
10
|
+
ExtensionContext,
|
|
11
|
+
ThemeColor,
|
|
12
|
+
} from "@mariozechner/pi-coding-agent";
|
|
9
13
|
import type { TUI } from "@mariozechner/pi-tui";
|
|
10
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
Box,
|
|
16
|
+
Text,
|
|
17
|
+
truncateToWidth,
|
|
18
|
+
visibleWidth,
|
|
19
|
+
} from "@mariozechner/pi-tui";
|
|
20
|
+
|
|
21
|
+
// ── router decision reader ──────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
/** Extract last routing decision from model-router session entries. */
|
|
24
|
+
function readRouterDecision(
|
|
25
|
+
ctx: ExtensionContext,
|
|
26
|
+
): {
|
|
27
|
+
targetProvider: string;
|
|
28
|
+
targetModelId: string;
|
|
29
|
+
thinking: string;
|
|
30
|
+
profile: string;
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
} | null {
|
|
33
|
+
try {
|
|
34
|
+
const entries = ctx.sessionManager.getEntries();
|
|
35
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
36
|
+
const e = entries[i];
|
|
37
|
+
if (
|
|
38
|
+
e.type === "custom" &&
|
|
39
|
+
(e as any).customType === "router-state" &&
|
|
40
|
+
(e as any).data
|
|
41
|
+
) {
|
|
42
|
+
const data = (e as any).data;
|
|
43
|
+
const d = data.lastDecision;
|
|
44
|
+
if (d?.targetProvider && d?.targetModelId) {
|
|
45
|
+
return {
|
|
46
|
+
targetProvider: d.targetProvider,
|
|
47
|
+
targetModelId: d.targetModelId,
|
|
48
|
+
thinking: d.thinking,
|
|
49
|
+
profile: data.selectedProfile ?? d.profile,
|
|
50
|
+
enabled: data.enabled ?? true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} catch {
|
|
56
|
+
// session not ready
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ── profile colors ────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
const PROFILE_COLORS: Record<string, ThemeColor> = {
|
|
64
|
+
auto: "accent",
|
|
65
|
+
cheap: "success",
|
|
66
|
+
deep: "toolTitle",
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
function profileColor(profile: string): ThemeColor {
|
|
70
|
+
return PROFILE_COLORS[profile] ?? "muted";
|
|
71
|
+
}
|
|
11
72
|
|
|
12
73
|
// ── token formatting ──────────────────────────────────────────────
|
|
13
74
|
|
|
@@ -85,13 +146,31 @@ interface ModelInfo {
|
|
|
85
146
|
function modelInfo(ctx: ExtensionContext): ModelInfo {
|
|
86
147
|
const m = ctx.model;
|
|
87
148
|
if (!m) return { id: "no-model", provider: "unknown", reasoning: false };
|
|
149
|
+
|
|
150
|
+
// Router provider — extract actual model from routing decision
|
|
151
|
+
if (m.provider === "router") {
|
|
152
|
+
const decision = readRouterDecision(ctx);
|
|
153
|
+
if (decision) {
|
|
154
|
+
return {
|
|
155
|
+
id: decision.targetModelId,
|
|
156
|
+
provider: decision.targetProvider,
|
|
157
|
+
reasoning: true,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// No decision yet — show profile name so user knows router is active
|
|
161
|
+
return { id: m.id, provider: "router", reasoning: m.reasoning };
|
|
162
|
+
}
|
|
163
|
+
|
|
88
164
|
return { id: m.id, provider: m.provider, reasoning: m.reasoning };
|
|
89
165
|
}
|
|
90
166
|
|
|
91
167
|
// ── thinking label ────────────────────────────────────────────────
|
|
92
168
|
|
|
93
169
|
/** Returns thinking level display string, or null if model doesn't support reasoning. */
|
|
94
|
-
function thinkingLabel(
|
|
170
|
+
function thinkingLabel(
|
|
171
|
+
level: string | null,
|
|
172
|
+
reasoning: boolean,
|
|
173
|
+
): string | null {
|
|
95
174
|
if (!reasoning || level == null) return null;
|
|
96
175
|
if (level === "minimal") return "off";
|
|
97
176
|
return level;
|
|
@@ -99,7 +178,10 @@ function thinkingLabel(level: string | null, reasoning: boolean): string | null
|
|
|
99
178
|
|
|
100
179
|
// ── cwd + branch ──────────────────────────────────────────────────
|
|
101
180
|
|
|
102
|
-
function pathLabel(
|
|
181
|
+
function pathLabel(
|
|
182
|
+
cwd: string,
|
|
183
|
+
branch: string | null,
|
|
184
|
+
): { cwd: string; branch: string | null } {
|
|
103
185
|
let pwd = cwd;
|
|
104
186
|
const home = process.env.HOME || process.env.USERPROFILE;
|
|
105
187
|
if (home && pwd.startsWith(home)) {
|
|
@@ -124,6 +206,8 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
124
206
|
modelProvider: string;
|
|
125
207
|
modelReasoning: boolean;
|
|
126
208
|
thinkingLevel: string | null;
|
|
209
|
+
routerProfile: string | null;
|
|
210
|
+
routerActive: boolean;
|
|
127
211
|
branch: string | null;
|
|
128
212
|
} = {
|
|
129
213
|
tui: null,
|
|
@@ -136,6 +220,8 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
136
220
|
modelProvider: "…",
|
|
137
221
|
modelReasoning: false,
|
|
138
222
|
thinkingLevel: null,
|
|
223
|
+
routerProfile: null,
|
|
224
|
+
routerActive: false,
|
|
139
225
|
branch: null,
|
|
140
226
|
};
|
|
141
227
|
|
|
@@ -150,7 +236,18 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
150
236
|
state.modelId = mi.id;
|
|
151
237
|
state.modelProvider = mi.provider;
|
|
152
238
|
state.modelReasoning = mi.reasoning;
|
|
153
|
-
|
|
239
|
+
|
|
240
|
+
// When router active, use thinking from the routing decision
|
|
241
|
+
if (ctx.model?.provider === "router") {
|
|
242
|
+
const routerDecision = readRouterDecision(ctx);
|
|
243
|
+
state.thinkingLevel = routerDecision?.thinking ?? pi.getThinkingLevel();
|
|
244
|
+
state.routerProfile = routerDecision?.profile ?? ctx.model?.id;
|
|
245
|
+
state.routerActive = routerDecision?.enabled ?? true;
|
|
246
|
+
} else {
|
|
247
|
+
state.thinkingLevel = pi.getThinkingLevel();
|
|
248
|
+
state.routerProfile = null;
|
|
249
|
+
state.routerActive = false;
|
|
250
|
+
}
|
|
154
251
|
}
|
|
155
252
|
|
|
156
253
|
pi.on("session_start", (_event, ctx) => {
|
|
@@ -159,7 +256,10 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
159
256
|
state.cost = computeCost(ctx);
|
|
160
257
|
|
|
161
258
|
ctx.ui.setFooter((tui, theme, footerData) => {
|
|
162
|
-
if (unsubBranch) {
|
|
259
|
+
if (unsubBranch) {
|
|
260
|
+
unsubBranch();
|
|
261
|
+
unsubBranch = null;
|
|
262
|
+
}
|
|
163
263
|
|
|
164
264
|
state.tui = tui;
|
|
165
265
|
state.branch = footerData.getGitBranch();
|
|
@@ -178,7 +278,10 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
178
278
|
|
|
179
279
|
return {
|
|
180
280
|
dispose() {
|
|
181
|
-
if (unsubBranch) {
|
|
281
|
+
if (unsubBranch) {
|
|
282
|
+
unsubBranch();
|
|
283
|
+
unsubBranch = null;
|
|
284
|
+
}
|
|
182
285
|
state.tui = null;
|
|
183
286
|
state.box = null;
|
|
184
287
|
state.textLine = null;
|
|
@@ -200,7 +303,10 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
200
303
|
const innerW = Math.max(1, width - 2 - SAFETY_MARGIN);
|
|
201
304
|
|
|
202
305
|
// ── left: cwd/branch tokens cost ──
|
|
203
|
-
const { cwd: cwdPath, branch: gitBranch } = pathLabel(
|
|
306
|
+
const { cwd: cwdPath, branch: gitBranch } = pathLabel(
|
|
307
|
+
state.cwd,
|
|
308
|
+
state.branch,
|
|
309
|
+
);
|
|
204
310
|
const pathDisplay = gitBranch
|
|
205
311
|
? `${cwdPath} (${theme.fg("error", gitBranch)})`
|
|
206
312
|
: cwdPath;
|
|
@@ -223,26 +329,58 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
223
329
|
// ── right: provider • modelId thinkingLevel ──
|
|
224
330
|
const tl = thinkingLabel(state.thinkingLevel, state.modelReasoning);
|
|
225
331
|
const modelDisplay = tl ? `${state.modelId} ${tl}` : state.modelId;
|
|
226
|
-
|
|
227
|
-
|
|
332
|
+
|
|
333
|
+
// Colorize: router profile gets mode color, model gets thinking color
|
|
334
|
+
const rightStr = state.routerActive
|
|
335
|
+
? (() => {
|
|
336
|
+
const pColor = profileColor(
|
|
337
|
+
state.routerProfile ?? "router",
|
|
338
|
+
);
|
|
339
|
+
const profileStr = theme.fg(pColor, state.routerProfile ?? "router");
|
|
340
|
+
const thinkingColorFn = theme.getThinkingBorderColor(
|
|
341
|
+
(state.thinkingLevel as any) ?? "medium",
|
|
342
|
+
);
|
|
343
|
+
const modelStr = thinkingColorFn(modelDisplay);
|
|
344
|
+
return `${profileStr} • ${modelStr}`;
|
|
345
|
+
})()
|
|
346
|
+
: `${state.modelProvider} • ${modelDisplay}`;
|
|
228
347
|
|
|
229
348
|
// ── compose single line ──
|
|
230
349
|
const colLeft = leftStr;
|
|
231
|
-
const
|
|
350
|
+
const finalRight = state.routerActive ? rightStr : dim(rightStr);
|
|
232
351
|
const lw = visibleWidth(colLeft);
|
|
233
|
-
const rw = visibleWidth(
|
|
352
|
+
const rw = visibleWidth(finalRight);
|
|
234
353
|
const bw = visibleWidth(barFull);
|
|
235
354
|
const gap = 2;
|
|
236
355
|
|
|
237
356
|
if (lw + gap + bw + gap + rw <= innerW) {
|
|
238
357
|
const pad = innerW - lw - gap - bw - gap - rw;
|
|
239
|
-
const line =
|
|
358
|
+
const line =
|
|
359
|
+
colLeft +
|
|
360
|
+
" ".repeat(gap + pad) +
|
|
361
|
+
barFull +
|
|
362
|
+
" ".repeat(gap) +
|
|
363
|
+
finalRight;
|
|
240
364
|
textLine.setText(truncateToWidth(line, innerW));
|
|
241
365
|
} else {
|
|
242
366
|
// Priority: keep bar visible, keep left (cwd) intact, truncate modelId first
|
|
243
|
-
const tlNow = thinkingLabel(
|
|
367
|
+
const tlNow = thinkingLabel(
|
|
368
|
+
state.thinkingLevel,
|
|
369
|
+
state.modelReasoning,
|
|
370
|
+
);
|
|
371
|
+
const thinkingColorFn = theme.getThinkingBorderColor(
|
|
372
|
+
(state.thinkingLevel as any) ?? "medium",
|
|
373
|
+
);
|
|
244
374
|
const buildRight = (mid: string) => {
|
|
245
375
|
const modelPart = tlNow ? `${mid} ${tlNow}` : mid;
|
|
376
|
+
if (state.routerActive) {
|
|
377
|
+
const pColor = profileColor(
|
|
378
|
+
state.routerProfile ?? "router",
|
|
379
|
+
);
|
|
380
|
+
const profileStr = theme.fg(pColor, state.routerProfile ?? "router");
|
|
381
|
+
const modelStr = thinkingColorFn(modelPart);
|
|
382
|
+
return `${profileStr} • ${modelStr}`;
|
|
383
|
+
}
|
|
246
384
|
const parts: string[] = [state.modelProvider];
|
|
247
385
|
if (modelPart) parts.push(modelPart);
|
|
248
386
|
return dim(parts.join(" • "));
|
|
@@ -252,7 +390,10 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
252
390
|
let dimR = buildRight(truncMid);
|
|
253
391
|
let rwNow = visibleWidth(dimR);
|
|
254
392
|
|
|
255
|
-
while (
|
|
393
|
+
while (
|
|
394
|
+
truncMid.length > 0 &&
|
|
395
|
+
lw + gap + bw + gap + rwNow > innerW
|
|
396
|
+
) {
|
|
256
397
|
truncMid = truncMid.slice(0, -1);
|
|
257
398
|
dimR = buildRight(truncMid);
|
|
258
399
|
rwNow = visibleWidth(dimR);
|
|
@@ -260,7 +401,12 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
260
401
|
|
|
261
402
|
if (lw + gap + bw + gap + rwNow <= innerW) {
|
|
262
403
|
const pad = innerW - lw - gap - bw - gap - rwNow;
|
|
263
|
-
const line =
|
|
404
|
+
const line =
|
|
405
|
+
colLeft +
|
|
406
|
+
" ".repeat(gap + pad) +
|
|
407
|
+
barFull +
|
|
408
|
+
" ".repeat(gap) +
|
|
409
|
+
dimR;
|
|
264
410
|
textLine.setText(truncateToWidth(line, innerW));
|
|
265
411
|
} else {
|
|
266
412
|
// ModelId gone, still overflows: truncate leftStr
|
|
@@ -269,7 +415,12 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
269
415
|
textLine.setText(truncateToWidth(dimR, innerW));
|
|
270
416
|
} else {
|
|
271
417
|
const truncLeft = truncateToWidth(colLeft, Math.max(1, avail));
|
|
272
|
-
const line =
|
|
418
|
+
const line =
|
|
419
|
+
truncLeft +
|
|
420
|
+
" ".repeat(gap) +
|
|
421
|
+
barFull +
|
|
422
|
+
" ".repeat(gap) +
|
|
423
|
+
dimR;
|
|
273
424
|
textLine.setText(truncateToWidth(line, innerW));
|
|
274
425
|
}
|
|
275
426
|
}
|
|
@@ -291,11 +442,32 @@ export default function customFooter(pi: ExtensionAPI) {
|
|
|
291
442
|
});
|
|
292
443
|
|
|
293
444
|
// Track model changes
|
|
294
|
-
pi.on("model_select", (event) => {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
445
|
+
pi.on("model_select", (event, ctx) => {
|
|
446
|
+
if (event.model?.provider === "router") {
|
|
447
|
+
const routerDecision = readRouterDecision(ctx);
|
|
448
|
+
if (routerDecision) {
|
|
449
|
+
state.modelId = routerDecision.targetModelId;
|
|
450
|
+
state.modelProvider = routerDecision.targetProvider;
|
|
451
|
+
state.modelReasoning = true;
|
|
452
|
+
state.thinkingLevel = routerDecision.thinking;
|
|
453
|
+
state.routerProfile = routerDecision.profile;
|
|
454
|
+
state.routerActive = routerDecision.enabled;
|
|
455
|
+
} else {
|
|
456
|
+
state.modelId = event.model.id ?? "…";
|
|
457
|
+
state.modelProvider = "router";
|
|
458
|
+
state.modelReasoning = event.model?.reasoning ?? false;
|
|
459
|
+
state.thinkingLevel = pi.getThinkingLevel();
|
|
460
|
+
state.routerProfile = event.model.id;
|
|
461
|
+
state.routerActive = true;
|
|
462
|
+
}
|
|
463
|
+
} else {
|
|
464
|
+
state.modelId = event.model?.id ?? "…";
|
|
465
|
+
state.modelProvider = event.model?.provider ?? "…";
|
|
466
|
+
state.modelReasoning = event.model?.reasoning ?? false;
|
|
467
|
+
state.thinkingLevel = pi.getThinkingLevel();
|
|
468
|
+
state.routerProfile = null;
|
|
469
|
+
state.routerActive = false;
|
|
470
|
+
}
|
|
299
471
|
invalidate();
|
|
300
472
|
});
|
|
301
473
|
|
|
@@ -6,30 +6,67 @@
|
|
|
6
6
|
* doubling vertical resolution in the same terminal footprint.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { join } from "node:path";
|
|
9
10
|
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
10
11
|
import { truncateToWidth } from "@mariozechner/pi-tui";
|
|
11
|
-
import
|
|
12
|
-
import { join } from "node:path";
|
|
12
|
+
import * as JimpModule from "jimp";
|
|
13
13
|
|
|
14
14
|
const imagePath = join(process.cwd(), ".pi", "extensions", "banner.png");
|
|
15
15
|
|
|
16
16
|
// Terminal footprint — keep a safety margin so we never crash on narrow terminals
|
|
17
17
|
const SAFETY_MARGIN = 2;
|
|
18
|
-
const TERM_WIDTH =
|
|
19
|
-
const TERM_HEIGHT =
|
|
18
|
+
const TERM_WIDTH = 100;
|
|
19
|
+
const TERM_HEIGHT = 15;
|
|
20
20
|
|
|
21
21
|
// Pixel grid: 1 char wide × 2 pixels tall (half-block)
|
|
22
22
|
const PIXEL_WIDTH = TERM_WIDTH;
|
|
23
|
-
const PIXEL_HEIGHT = TERM_HEIGHT
|
|
23
|
+
const PIXEL_HEIGHT = TERM_HEIGHT;
|
|
24
24
|
|
|
25
25
|
const HALF_BLOCK = "\u2584"; // lower half block: fg = bottom, bg = top
|
|
26
26
|
|
|
27
27
|
let cachedBanner: string[] | null = null;
|
|
28
28
|
let loadPromise: Promise<string[]> | null = null;
|
|
29
29
|
|
|
30
|
+
function getJimpRuntime(): { read(path: string): Promise<any> } {
|
|
31
|
+
const mod = JimpModule as Record<string, unknown>;
|
|
32
|
+
const candidates = [mod.default, mod.Jimp, mod];
|
|
33
|
+
for (const candidate of candidates) {
|
|
34
|
+
if (
|
|
35
|
+
candidate &&
|
|
36
|
+
(typeof candidate === "object" || typeof candidate === "function") &&
|
|
37
|
+
typeof (candidate as { read?: unknown }).read === "function"
|
|
38
|
+
) {
|
|
39
|
+
return candidate as { read(path: string): Promise<any> };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
throw new TypeError("Jimp runtime missing read() export");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function intToRgba(pixel: number): {
|
|
46
|
+
r: number;
|
|
47
|
+
g: number;
|
|
48
|
+
b: number;
|
|
49
|
+
a: number;
|
|
50
|
+
} {
|
|
51
|
+
return {
|
|
52
|
+
r: (pixel >> 24) & 255,
|
|
53
|
+
g: (pixel >> 16) & 255,
|
|
54
|
+
b: (pixel >> 8) & 255,
|
|
55
|
+
a: pixel & 255,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function resizeImageCompat(image: any, w: number, h: number): void {
|
|
60
|
+
try {
|
|
61
|
+
image.resize({ w, h });
|
|
62
|
+
} catch {
|
|
63
|
+
image.resize(w, h);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
30
67
|
function ansiCell(
|
|
31
68
|
top: { r: number; g: number; b: number; a: number },
|
|
32
|
-
bottom: { r: number; g: number; b: number; a: number }
|
|
69
|
+
bottom: { r: number; g: number; b: number; a: number },
|
|
33
70
|
): string {
|
|
34
71
|
const topTransparent = top.a < 128;
|
|
35
72
|
const bottomTransparent = bottom.a < 128;
|
|
@@ -46,15 +83,16 @@ function ansiCell(
|
|
|
46
83
|
}
|
|
47
84
|
|
|
48
85
|
async function loadBanner(): Promise<string[]> {
|
|
86
|
+
const Jimp = getJimpRuntime();
|
|
49
87
|
const image = await Jimp.read(imagePath);
|
|
50
|
-
image
|
|
88
|
+
resizeImageCompat(image, PIXEL_WIDTH, PIXEL_HEIGHT);
|
|
51
89
|
|
|
52
90
|
const lines: string[] = [];
|
|
53
91
|
for (let row = 0; row < PIXEL_HEIGHT; row += 2) {
|
|
54
92
|
let line = "";
|
|
55
93
|
for (let col = 0; col < PIXEL_WIDTH; col++) {
|
|
56
|
-
const top =
|
|
57
|
-
const bottom =
|
|
94
|
+
const top = intToRgba(image.getPixelColor(col, row));
|
|
95
|
+
const bottom = intToRgba(image.getPixelColor(col, row + 1));
|
|
58
96
|
line += ansiCell(top, bottom);
|
|
59
97
|
}
|
|
60
98
|
lines.push(line);
|