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
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { NormalizedBlock } from "../types";
|
|
2
|
+
import { clip, clipSentence, firstLine, nonEmptyLines } from "./content";
|
|
3
|
+
import type { SectionData } from "../sections";
|
|
4
|
+
import { extractGoals } from "../extract/goals";
|
|
5
|
+
import { extractFiles } from "../extract/files";
|
|
6
|
+
import { extractPreferences, dedupPreferencesAgainstGoals } from "../extract/preferences";
|
|
7
|
+
import { extractCommits, formatCommits } from "../extract/commits";
|
|
8
|
+
import { buildBriefSections, sectionsToTranscript, stringifyBrief } from "./brief";
|
|
9
|
+
|
|
10
|
+
export interface BuildSectionsInput {
|
|
11
|
+
blocks: NormalizedBlock[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const BLOCKER_RE =
|
|
15
|
+
/\b(fail(ed|s|ure|ing)?|broken|cannot|can't|won't work|does not work|doesn't work|still (broken|failing|wrong)|blocked|blocker|not (fixed|resolved|working)|crash(es|ed|ing)?)\b/i;
|
|
16
|
+
|
|
17
|
+
const extractOutstandingContext = (blocks: NormalizedBlock[]): string[] => {
|
|
18
|
+
const items: string[] = [];
|
|
19
|
+
const tail = blocks.slice(-20);
|
|
20
|
+
|
|
21
|
+
for (const b of tail) {
|
|
22
|
+
if (b.kind === "tool_result" && b.isError) {
|
|
23
|
+
items.push(`[${b.name}] ${firstLine(b.text, 150)}`);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (b.kind === "assistant" || b.kind === "user") {
|
|
28
|
+
for (const line of nonEmptyLines(b.text)) {
|
|
29
|
+
if (!BLOCKER_RE.test(line)) continue;
|
|
30
|
+
if (line.length < 15) continue;
|
|
31
|
+
// Skip continuation fragments (sub-bullets, parentheticals, dangling clauses)
|
|
32
|
+
if (/^\s*[-*+>]\s/.test(line)) continue;
|
|
33
|
+
if (/^\s*\(/.test(line)) continue;
|
|
34
|
+
// Require sentence-like start: capital letter, code identifier, or quote
|
|
35
|
+
if (!/^\s*["'`*_]?[A-Z`]/.test(line)) continue;
|
|
36
|
+
const clipped = b.kind === "user" ? `[user] ${clipSentence(line, 150)}` : clipSentence(line, 150);
|
|
37
|
+
if (!items.includes(clipped)) items.push(clipped);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return items.slice(0, 5);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const formatFileActivity = (blocks: NormalizedBlock[]): string[] => {
|
|
47
|
+
const act = extractFiles(blocks);
|
|
48
|
+
// Dedup: if already Modified, drop from Created (file existed before)
|
|
49
|
+
for (const p of act.modified) act.created.delete(p);
|
|
50
|
+
const lines: string[] = [];
|
|
51
|
+
const cap = (set: Set<string>, limit: number) => {
|
|
52
|
+
const arr = [...set];
|
|
53
|
+
if (arr.length <= limit) return arr.join(", ");
|
|
54
|
+
return arr.slice(0, limit).join(", ") + ` (+${arr.length - limit} more)`;
|
|
55
|
+
};
|
|
56
|
+
if (act.modified.size > 0) lines.push(`Modified: ${cap(act.modified, 10)}`);
|
|
57
|
+
if (act.created.size > 0) lines.push(`Created: ${cap(act.created, 10)}`);
|
|
58
|
+
if (act.read.size > 0) lines.push(`Read: ${cap(act.read, 10)}`);
|
|
59
|
+
return lines;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const buildSections = (input: BuildSectionsInput): SectionData => {
|
|
63
|
+
const { blocks } = input;
|
|
64
|
+
const briefSections = buildBriefSections(blocks);
|
|
65
|
+
const sessionGoal = extractGoals(blocks);
|
|
66
|
+
const userPreferences = dedupPreferencesAgainstGoals(
|
|
67
|
+
extractPreferences(blocks),
|
|
68
|
+
sessionGoal,
|
|
69
|
+
);
|
|
70
|
+
return {
|
|
71
|
+
sessionGoal,
|
|
72
|
+
outstandingContext: extractOutstandingContext(blocks),
|
|
73
|
+
filesAndChanges: formatFileActivity(blocks),
|
|
74
|
+
commits: formatCommits(extractCommits(blocks)),
|
|
75
|
+
userPreferences,
|
|
76
|
+
briefTranscript: stringifyBrief(briefSections),
|
|
77
|
+
transcriptEntries: sectionsToTranscript(briefSections),
|
|
78
|
+
};
|
|
79
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Message } from "@mariozechner/pi-ai";
|
|
2
|
+
|
|
3
|
+
export const clip = (text: string, max = 200): string => {
|
|
4
|
+
if (text.length <= max) return text;
|
|
5
|
+
// Try to cut at a word boundary
|
|
6
|
+
const cut = text.lastIndexOf(" ", max);
|
|
7
|
+
let end = cut > max * 0.6 ? cut : max;
|
|
8
|
+
// Avoid splitting a surrogate pair
|
|
9
|
+
if (end > 0 && end < text.length) {
|
|
10
|
+
const code = text.charCodeAt(end - 1);
|
|
11
|
+
if (code >= 0xd800 && code <= 0xdbff) end--;
|
|
12
|
+
}
|
|
13
|
+
return text.slice(0, end);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Clip text to last sentence boundary at or before `max` chars.
|
|
18
|
+
* Falls back to word boundary (clip()) if no sentence end is found in the
|
|
19
|
+
* acceptable range. Trailing whitespace stripped.
|
|
20
|
+
*/
|
|
21
|
+
export const clipSentence = (text: string, max = 200): string => {
|
|
22
|
+
if (text.length <= max) return text;
|
|
23
|
+
// Look for sentence terminators followed by space/newline within [max*0.5, max]
|
|
24
|
+
const window = text.slice(0, max);
|
|
25
|
+
const matches = [...window.matchAll(/[.!?](?:\s|$)/g)];
|
|
26
|
+
if (matches.length > 0) {
|
|
27
|
+
const last = matches[matches.length - 1];
|
|
28
|
+
const end = (last.index ?? 0) + 1; // include the punctuation
|
|
29
|
+
if (end >= max * 0.5) return text.slice(0, end);
|
|
30
|
+
}
|
|
31
|
+
return clip(text, max);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const nonEmptyLines = (text: string): string[] =>
|
|
35
|
+
text.split("\n").map((line) => line.trim()).filter(Boolean);
|
|
36
|
+
|
|
37
|
+
export const firstLine = (text: string, max = 200): string =>
|
|
38
|
+
clip(text.split("\n")[0] ?? "", max);
|
|
39
|
+
|
|
40
|
+
export const textParts = (content: Message["content"]): string[] => {
|
|
41
|
+
if (!content) return [];
|
|
42
|
+
if (typeof content === "string") return [content];
|
|
43
|
+
return content
|
|
44
|
+
.filter((part) => part.type === "text")
|
|
45
|
+
.map((part) => part.text);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const textOf = (content: Message["content"]): string =>
|
|
49
|
+
textParts(content).join("\n");
|
|
50
|
+
|
|
51
|
+
/** Extract a snippet of ~`radius` chars around the first match of `term` in `text`. */
|
|
52
|
+
export const snippet = (text: string, term: string, radius = 60): string | null => {
|
|
53
|
+
const idx = text.toLowerCase().indexOf(term.toLowerCase());
|
|
54
|
+
if (idx === -1) return null;
|
|
55
|
+
const start = Math.max(0, idx - radius);
|
|
56
|
+
const end = Math.min(text.length, idx + term.length + radius);
|
|
57
|
+
const prefix = start > 0 ? "..." : "";
|
|
58
|
+
const suffix = end < text.length ? "..." : "";
|
|
59
|
+
return `${prefix}${text.slice(start, end)}${suffix}`;
|
|
60
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { NormalizedBlock } from "../types";
|
|
2
|
+
|
|
3
|
+
const NOISE_TOOLS = new Set([
|
|
4
|
+
"TodoWrite", "TodoRead", "ToolSearch", "WebSearch",
|
|
5
|
+
"AskUser", "ExitSpecMode", "GenerateDroid",
|
|
6
|
+
]);
|
|
7
|
+
|
|
8
|
+
const NOISE_STRINGS = [
|
|
9
|
+
"Continue from where you left off.",
|
|
10
|
+
"No response requested.",
|
|
11
|
+
"IMPORTANT: TodoWrite was not called yet.",
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
const XML_WRAPPER_RE = /<(system-reminder|ide_opened_file|command-message|context-window-usage)[^>]*>[\s\S]*?<\/\1>/g;
|
|
15
|
+
|
|
16
|
+
const isNoiseUserBlock = (text: string): boolean => {
|
|
17
|
+
const trimmed = text.trim();
|
|
18
|
+
if (NOISE_STRINGS.some((s) => trimmed.includes(s))) return true;
|
|
19
|
+
const stripped = trimmed.replace(XML_WRAPPER_RE, "").trim();
|
|
20
|
+
return stripped.length === 0;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const cleanUserText = (text: string): string =>
|
|
24
|
+
text.replace(XML_WRAPPER_RE, "").trim();
|
|
25
|
+
|
|
26
|
+
export const filterNoise = (blocks: NormalizedBlock[]): NormalizedBlock[] => {
|
|
27
|
+
const out: NormalizedBlock[] = [];
|
|
28
|
+
for (const b of blocks) {
|
|
29
|
+
if (b.kind === "thinking") continue;
|
|
30
|
+
if (b.kind === "tool_call" && NOISE_TOOLS.has(b.name)) continue;
|
|
31
|
+
if (b.kind === "tool_result" && NOISE_TOOLS.has(b.name)) continue;
|
|
32
|
+
if (b.kind === "user") {
|
|
33
|
+
if (isNoiseUserBlock(b.text)) continue;
|
|
34
|
+
const cleaned = cleanUserText(b.text);
|
|
35
|
+
if (!cleaned) continue;
|
|
36
|
+
out.push({ kind: "user", text: cleaned });
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
out.push(b);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SearchHit } from "./search-entries";
|
|
2
|
+
|
|
3
|
+
export const formatRecallOutput = (
|
|
4
|
+
entries: SearchHit[],
|
|
5
|
+
query?: string,
|
|
6
|
+
headerOverride?: string,
|
|
7
|
+
): string => {
|
|
8
|
+
if (entries.length === 0) {
|
|
9
|
+
return query
|
|
10
|
+
? `No matches for "${query}" in session history.`
|
|
11
|
+
: "No entries in session history.";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const header = headerOverride
|
|
15
|
+
? `${headerOverride} for "${query}":`
|
|
16
|
+
: query
|
|
17
|
+
? `Found ${entries.length} matches for "${query}":`
|
|
18
|
+
: `Session history (${entries.length} entries):`;
|
|
19
|
+
|
|
20
|
+
const lines = entries.map((e) => {
|
|
21
|
+
const fileSuffix = e.files?.length ? ` files:[${e.files.join(", ")}]` : "";
|
|
22
|
+
const body = query && e.snippet ? e.snippet : e.summary;
|
|
23
|
+
return `#${e.index} [${e.role}]${fileSuffix} ${body}`;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
return `${header}\n\n${lines.join("\n\n")}`;
|
|
27
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { SectionData } from "../sections";
|
|
2
|
+
|
|
3
|
+
const section = (title: string, items: string[]): string => {
|
|
4
|
+
if (items.length === 0) return "";
|
|
5
|
+
const body = items.map((i) => `- ${i}`).join("\n");
|
|
6
|
+
return `[${title}]\n${body}`;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const BRIEF_MAX_LINES = 120;
|
|
10
|
+
|
|
11
|
+
export const capBrief = (text: string): string => {
|
|
12
|
+
const lines = text.split("\n");
|
|
13
|
+
if (lines.length <= BRIEF_MAX_LINES) return text;
|
|
14
|
+
const omitted = lines.length - BRIEF_MAX_LINES;
|
|
15
|
+
const kept = lines.slice(-BRIEF_MAX_LINES);
|
|
16
|
+
// Find first section header to avoid cutting mid-section
|
|
17
|
+
const firstHeader = kept.findIndex((l) => /^\[.+\]/.test(l));
|
|
18
|
+
const clean = firstHeader > 0 ? kept.slice(firstHeader) : kept;
|
|
19
|
+
return `...(${omitted} earlier lines omitted)\n\n${clean.join("\n")}`;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const RECALL_NOTE =
|
|
23
|
+
"Use `vcc_recall` to search for prior work, decisions, and context from before this summary. " +
|
|
24
|
+
"Do not redo work already completed.";
|
|
25
|
+
|
|
26
|
+
export const formatSummary = (data: SectionData): string => {
|
|
27
|
+
const headerParts = [
|
|
28
|
+
section("Session Goal", data.sessionGoal),
|
|
29
|
+
section("Files And Changes", data.filesAndChanges),
|
|
30
|
+
section("Commits", data.commits),
|
|
31
|
+
section("Outstanding Context", data.outstandingContext),
|
|
32
|
+
section("User Preferences", data.userPreferences),
|
|
33
|
+
].filter(Boolean);
|
|
34
|
+
|
|
35
|
+
const parts: string[] = [];
|
|
36
|
+
if (headerParts.length > 0) {
|
|
37
|
+
parts.push(headerParts.join("\n\n"));
|
|
38
|
+
}
|
|
39
|
+
if (data.briefTranscript) {
|
|
40
|
+
parts.push(capBrief(data.briefTranscript));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (parts.length === 0) return "";
|
|
44
|
+
|
|
45
|
+
// NOTE: RECALL_NOTE is intentionally NOT appended here.
|
|
46
|
+
// It is appended once by `compile()` at the very end, after merge-with-previous,
|
|
47
|
+
// to avoid the note compounding inside the brief transcript across compactions.
|
|
48
|
+
return parts.join("\n\n---\n\n");
|
|
49
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface LineageEntryLike {
|
|
2
|
+
id?: string;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export interface LineageSessionManagerLike {
|
|
6
|
+
getBranch: () => LineageEntryLike[];
|
|
7
|
+
getEntries?: () => LineageEntryLike[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const getActiveLineageEntryIds = (sessionManager: LineageSessionManagerLike): Set<string> => {
|
|
11
|
+
try {
|
|
12
|
+
const branch = sessionManager.getBranch() ?? [];
|
|
13
|
+
if (branch.length > 0) {
|
|
14
|
+
return new Set(branch.map((e) => e.id).filter((id): id is string => Boolean(id)));
|
|
15
|
+
}
|
|
16
|
+
} catch {
|
|
17
|
+
// fall through to defensive fallback
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const all = sessionManager.getEntries?.() ?? [];
|
|
22
|
+
return new Set(all.map((e) => e.id).filter((id): id is string => Boolean(id)));
|
|
23
|
+
} catch {
|
|
24
|
+
return new Set();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import type { Message } from "@mariozechner/pi-ai";
|
|
3
|
+
import { renderMessage, type RenderedEntry } from "./render-entries";
|
|
4
|
+
|
|
5
|
+
export interface LoadedMessages {
|
|
6
|
+
rendered: RenderedEntry[];
|
|
7
|
+
rawMessages: Message[];
|
|
8
|
+
entryIds: string[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const loadAllMessages = (
|
|
12
|
+
sessionFile: string,
|
|
13
|
+
full: boolean,
|
|
14
|
+
allowedEntryIds?: Set<string>,
|
|
15
|
+
): LoadedMessages => {
|
|
16
|
+
const content = readFileSync(sessionFile, "utf-8");
|
|
17
|
+
const entries: any[] = [];
|
|
18
|
+
for (const line of content.split("\n")) {
|
|
19
|
+
if (!line.trim()) continue;
|
|
20
|
+
try { entries.push(JSON.parse(line)); } catch {}
|
|
21
|
+
}
|
|
22
|
+
const rendered: RenderedEntry[] = [];
|
|
23
|
+
const rawMessages: Message[] = [];
|
|
24
|
+
const entryIds: string[] = [];
|
|
25
|
+
|
|
26
|
+
let messageIndex = 0;
|
|
27
|
+
for (const e of entries) {
|
|
28
|
+
const isMessage = e.type === "message" && e.message;
|
|
29
|
+
if (!isMessage) continue;
|
|
30
|
+
|
|
31
|
+
const allowed = !allowedEntryIds || allowedEntryIds.has(e.id);
|
|
32
|
+
if (allowed) {
|
|
33
|
+
rendered.push(renderMessage(e.message, messageIndex, full));
|
|
34
|
+
rawMessages.push(e.message);
|
|
35
|
+
entryIds.push(String(e.id));
|
|
36
|
+
}
|
|
37
|
+
messageIndex++;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { rendered, rawMessages, entryIds };
|
|
41
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Message } from "@mariozechner/pi-ai";
|
|
2
|
+
import type { NormalizedBlock } from "../types";
|
|
3
|
+
import { textOf } from "./content";
|
|
4
|
+
import { sanitize } from "./sanitize";
|
|
5
|
+
|
|
6
|
+
const normalizeOne = (msg: Message, msgIndex: number): NormalizedBlock[] => {
|
|
7
|
+
if (msg.role === "user") {
|
|
8
|
+
const blocks: NormalizedBlock[] = [];
|
|
9
|
+
const text = sanitize(textOf(msg.content));
|
|
10
|
+
if (text) blocks.push({ kind: "user", text, sourceIndex: msgIndex });
|
|
11
|
+
if (msg.content && typeof msg.content !== "string") {
|
|
12
|
+
for (const part of msg.content) {
|
|
13
|
+
if (part.type === "image") {
|
|
14
|
+
blocks.push({ kind: "user", text: `[image: ${part.mimeType}]`, sourceIndex: msgIndex });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return blocks.length > 0 ? blocks : [{ kind: "user", text: "", sourceIndex: msgIndex }];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (msg.role === "toolResult") {
|
|
22
|
+
return [{
|
|
23
|
+
kind: "tool_result",
|
|
24
|
+
name: msg.toolName,
|
|
25
|
+
text: sanitize(textOf(msg.content)),
|
|
26
|
+
isError: msg.isError,
|
|
27
|
+
sourceIndex: msgIndex,
|
|
28
|
+
}];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (msg.role === "assistant") {
|
|
32
|
+
if (!msg.content) return [];
|
|
33
|
+
if (typeof msg.content === "string") {
|
|
34
|
+
return [{ kind: "assistant", text: sanitize(msg.content), sourceIndex: msgIndex }];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const blocks: NormalizedBlock[] = [];
|
|
38
|
+
for (const part of msg.content) {
|
|
39
|
+
if (part.type === "text") {
|
|
40
|
+
blocks.push({ kind: "assistant", text: sanitize(part.text), sourceIndex: msgIndex });
|
|
41
|
+
} else if (part.type === "thinking") {
|
|
42
|
+
blocks.push({
|
|
43
|
+
kind: "thinking",
|
|
44
|
+
text: sanitize(part.thinking),
|
|
45
|
+
redacted: part.redacted ?? false,
|
|
46
|
+
sourceIndex: msgIndex,
|
|
47
|
+
});
|
|
48
|
+
} else if (part.type === "toolCall") {
|
|
49
|
+
blocks.push({
|
|
50
|
+
kind: "tool_call",
|
|
51
|
+
name: part.name,
|
|
52
|
+
args: part.arguments,
|
|
53
|
+
sourceIndex: msgIndex,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return blocks;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return [];
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const normalize = (messages: Message[]): NormalizedBlock[] =>
|
|
64
|
+
messages.flatMap((msg, i) => normalizeOne(msg, i));
|
|
65
|
+
|
|
66
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type RecallScope = "lineage" | "all";
|
|
2
|
+
|
|
3
|
+
const SCOPE_RE = /\bscope:(lineage|all)\b/i;
|
|
4
|
+
|
|
5
|
+
export const normalizeRecallScope = (scope?: unknown): RecallScope =>
|
|
6
|
+
typeof scope === "string" && scope.toLowerCase() === "all" ? "all" : "lineage";
|
|
7
|
+
|
|
8
|
+
export const parseRecallScope = (text: string): { scope: RecallScope; text: string } => {
|
|
9
|
+
const match = text.match(SCOPE_RE);
|
|
10
|
+
return {
|
|
11
|
+
scope: normalizeRecallScope(match?.[1]),
|
|
12
|
+
text: text.replace(SCOPE_RE, "").replace(/\s+/g, " ").trim(),
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Message } from "@mariozechner/pi-ai";
|
|
2
|
+
import { clip, textOf } from "./content";
|
|
3
|
+
import { summarizeToolArgs } from "./tool-args";
|
|
4
|
+
import { extractPath } from "./tool-args";
|
|
5
|
+
|
|
6
|
+
export interface RenderedEntry {
|
|
7
|
+
index: number;
|
|
8
|
+
role: string;
|
|
9
|
+
summary: string;
|
|
10
|
+
files?: string[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const toolCalls = (content: Message["content"]): string => {
|
|
14
|
+
if (!content || typeof content === "string") return "";
|
|
15
|
+
return content
|
|
16
|
+
.filter((c) => c.type === "toolCall")
|
|
17
|
+
.map((c) => `${c.name}(${summarizeToolArgs(c.arguments)})`)
|
|
18
|
+
.join(", ");
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const extractFilesFromContent = (content: Message["content"]): string[] => {
|
|
22
|
+
if (!content || typeof content === "string") return [];
|
|
23
|
+
return content
|
|
24
|
+
.filter((c) => c.type === "toolCall")
|
|
25
|
+
.map((c) => extractPath(c.arguments))
|
|
26
|
+
.filter((p): p is string => p !== null);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const renderMessage = (msg: Message, index: number, full = false): RenderedEntry => {
|
|
30
|
+
if (msg.role === "user") {
|
|
31
|
+
return { index, role: "user", summary: full ? textOf(msg.content) : clip(textOf(msg.content), 300) };
|
|
32
|
+
}
|
|
33
|
+
if (msg.role === "toolResult") {
|
|
34
|
+
const prefix = msg.isError ? "ERROR " : "";
|
|
35
|
+
const text = full ? textOf(msg.content) : clip(textOf(msg.content), 200);
|
|
36
|
+
return {
|
|
37
|
+
index, role: "tool_result",
|
|
38
|
+
summary: `${prefix}[${msg.toolName}] ${text}`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// bashExecution has command+output instead of content
|
|
42
|
+
if ((msg as any).role === "bashExecution") {
|
|
43
|
+
const cmd = (msg as any).command ?? "";
|
|
44
|
+
const out = (msg as any).output ?? "";
|
|
45
|
+
const text = full ? `$ ${cmd}\n${out}` : clip(`$ ${cmd}\n${out}`, 300);
|
|
46
|
+
return { index, role: "bash", summary: text };
|
|
47
|
+
}
|
|
48
|
+
const text = full ? textOf(msg.content) : clip(textOf(msg.content), 300);
|
|
49
|
+
const tools = toolCalls(msg.content);
|
|
50
|
+
const files = extractFilesFromContent(msg.content);
|
|
51
|
+
const summary = tools ? `${tools}\n${text}` : text;
|
|
52
|
+
return { index, role: "assistant", summary, ...(files.length > 0 && { files }) };
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
|