ultimate-pi 0.1.2 → 0.1.4

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.
Files changed (516) hide show
  1. package/.agents/skills/ck-search/SKILL.md +99 -0
  2. package/.agents/skills/defuddle/SKILL.md +90 -0
  3. package/.agents/skills/find-skills/SKILL.md +142 -0
  4. package/.agents/skills/firecrawl/SKILL.md +150 -0
  5. package/.agents/skills/firecrawl/rules/install.md +82 -0
  6. package/.agents/skills/firecrawl/rules/security.md +26 -0
  7. package/.agents/skills/firecrawl-agent/SKILL.md +57 -0
  8. package/.agents/skills/firecrawl-build-interact/SKILL.md +67 -0
  9. package/.agents/skills/firecrawl-build-onboarding/SKILL.md +102 -0
  10. package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +39 -0
  11. package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +20 -0
  12. package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +17 -0
  13. package/.agents/skills/firecrawl-build-scrape/SKILL.md +68 -0
  14. package/.agents/skills/firecrawl-build-search/SKILL.md +68 -0
  15. package/.agents/skills/firecrawl-crawl/SKILL.md +58 -0
  16. package/.agents/skills/firecrawl-download/SKILL.md +69 -0
  17. package/.agents/skills/firecrawl-interact/SKILL.md +83 -0
  18. package/.agents/skills/firecrawl-map/SKILL.md +50 -0
  19. package/.agents/skills/firecrawl-parse/SKILL.md +61 -0
  20. package/.agents/skills/firecrawl-scrape/SKILL.md +68 -0
  21. package/.agents/skills/firecrawl-search/SKILL.md +59 -0
  22. package/.agents/skills/obsidian-bases/SKILL.md +299 -0
  23. package/.agents/skills/obsidian-markdown/SKILL.md +237 -0
  24. package/.agents/skills/posthog-analyst/SKILL.md +306 -0
  25. package/.agents/skills/posthog-analyst/evals/evals.json +23 -0
  26. package/.agents/skills/wiki/SKILL.md +215 -0
  27. package/.agents/skills/wiki/references/css-snippets.md +122 -0
  28. package/.agents/skills/wiki/references/frontmatter.md +107 -0
  29. package/.agents/skills/wiki/references/git-setup.md +58 -0
  30. package/.agents/skills/wiki/references/mcp-setup.md +149 -0
  31. package/.agents/skills/wiki/references/modes.md +259 -0
  32. package/.agents/skills/wiki/references/plugins.md +96 -0
  33. package/.agents/skills/wiki/references/rest-api.md +124 -0
  34. package/.agents/skills/wiki-autoresearch/SKILL.md +211 -0
  35. package/.agents/skills/wiki-autoresearch/references/program.md +75 -0
  36. package/.agents/skills/wiki-fold/SKILL.md +204 -0
  37. package/.agents/skills/wiki-fold/references/fold-template.md +133 -0
  38. package/.agents/skills/wiki-ingest/SKILL.md +288 -0
  39. package/.agents/skills/wiki-lint/SKILL.md +183 -0
  40. package/.agents/skills/wiki-query/SKILL.md +176 -0
  41. package/.agents/skills/wiki-save/SKILL.md +128 -0
  42. package/.ckignore +41 -0
  43. package/.env.example +9 -0
  44. package/.github/workflows/lint.yml +33 -0
  45. package/.github/workflows/publish-github-packages.yml +35 -0
  46. package/.github/workflows/publish-npm.yml +1 -1
  47. package/.pi/SYSTEM.md +107 -40
  48. package/.pi/agents/pi-pi/agent-expert.md +205 -0
  49. package/.pi/agents/pi-pi/cli-expert.md +47 -0
  50. package/.pi/agents/pi-pi/config-expert.md +67 -0
  51. package/.pi/agents/pi-pi/ext-expert.md +53 -0
  52. package/.pi/agents/pi-pi/keybinding-expert.md +123 -0
  53. package/.pi/agents/pi-pi/pi-orchestrator.md +103 -0
  54. package/.pi/agents/pi-pi/prompt-expert.md +83 -0
  55. package/.pi/agents/pi-pi/skill-expert.md +52 -0
  56. package/.pi/agents/pi-pi/theme-expert.md +46 -0
  57. package/.pi/agents/pi-pi/tui-expert.md +100 -0
  58. package/.pi/agents/rethink.md +140 -0
  59. package/.pi/agents/wiki-ingest.md +67 -0
  60. package/.pi/agents/wiki-lint.md +75 -0
  61. package/.pi/auto-commit.json +20 -0
  62. package/.pi/extensions/banner.png +0 -0
  63. package/.pi/extensions/ck-enforce.ts +216 -0
  64. package/.pi/extensions/custom-footer.ts +308 -0
  65. package/.pi/extensions/custom-header.ts +116 -0
  66. package/.pi/extensions/dotenv-loader.ts +170 -0
  67. package/.pi/internal/cursor-sdk-transcript-parser.ts +59 -0
  68. package/.pi/model-router.json +95 -0
  69. package/.pi/npm/.gitignore +2 -0
  70. package/.pi/prompts/git-sync.md +124 -0
  71. package/.pi/prompts/harness-setup.md +509 -0
  72. package/.pi/prompts/save.md +16 -0
  73. package/.pi/prompts/wiki-autoresearch.md +19 -0
  74. package/.pi/prompts/wiki.md +23 -0
  75. package/.pi/providers/cursor-sdk-provider.test.mjs +476 -0
  76. package/.pi/providers/cursor-sdk-provider.ts +1085 -0
  77. package/.pi/settings.json +14 -4
  78. package/.pi/skills/agent-router/SKILL.md +174 -0
  79. package/.pi/sounds/alert/1-kaching-track.mp3 +0 -0
  80. package/.pi/sounds/error/1-ksi-wth-track.mp3 +0 -0
  81. package/.pi/sounds/error/2-smash-track.mp3 +0 -0
  82. package/.pi/sounds/error/3-buzzer-track.mp3 +0 -0
  83. package/.pi/sounds/notification/1-soft-notification-track.mp3 +0 -0
  84. package/.pi/sounds/project-sounds.json +25 -0
  85. package/.pi/sounds/reminder/1-soft-notification-track.mp3 +0 -0
  86. package/.pi/sounds/success/1-tada-track.mp3 +0 -0
  87. package/.pi/sounds/success/2-jobs-done-track.mp3 +0 -0
  88. package/.pi/sounds/success/3-yay-track.mp3 +0 -0
  89. package/CONTRIBUTING.md +116 -0
  90. package/README.md +32 -39
  91. package/biome.json +34 -0
  92. package/firecrawl/.env.template +58 -0
  93. package/firecrawl/README.md +49 -0
  94. package/firecrawl/docker-compose.yaml +201 -0
  95. package/firecrawl/searxng/searxng.env +3 -0
  96. package/firecrawl/searxng/settings.yml +85 -0
  97. package/lefthook.yml +8 -0
  98. package/package.json +55 -24
  99. package/vault/AGENTS.md +37 -0
  100. package/vault/wiki/_templates/comparison.md +39 -0
  101. package/vault/wiki/_templates/concept.md +40 -0
  102. package/vault/wiki/_templates/decision.md +21 -0
  103. package/vault/wiki/_templates/entity.md +32 -0
  104. package/vault/wiki/_templates/flow.md +14 -0
  105. package/vault/wiki/_templates/module.md +18 -0
  106. package/vault/wiki/_templates/question.md +31 -0
  107. package/vault/wiki/_templates/source.md +39 -0
  108. package/vault/wiki/concepts/AST-Aware Code Chunking.md +44 -0
  109. package/vault/wiki/concepts/Build-Time Prompt Compilation.md +107 -0
  110. package/vault/wiki/concepts/Context Engine (AI Coding).md +47 -0
  111. package/vault/wiki/concepts/Context-Aware System Reminders.md +61 -0
  112. package/vault/wiki/concepts/Contextualized Text Embedding.md +42 -0
  113. package/vault/wiki/concepts/Contractor vs Employee AI Model.md +55 -0
  114. package/vault/wiki/concepts/Dual-Model Agent Architecture.md +65 -0
  115. package/vault/wiki/concepts/Late Chunking vs Early Chunking.md +43 -0
  116. package/vault/wiki/concepts/Majority Vote Ensembling.md +68 -0
  117. package/vault/wiki/concepts/Meta-Harness.md +16 -0
  118. package/vault/wiki/concepts/Multi-Agent AI Coding Architecture.md +75 -0
  119. package/vault/wiki/concepts/Prompt Enhancement.md +90 -0
  120. package/vault/wiki/concepts/Prompt Renderer.md +89 -0
  121. package/vault/wiki/concepts/Semantic Codebase Indexing.md +67 -0
  122. package/vault/wiki/concepts/additive-config-hierarchy.md +16 -0
  123. package/vault/wiki/concepts/agent-artifacts-verifiable-deliverables.md +71 -0
  124. package/vault/wiki/concepts/agent-browser-browser-automation.md +99 -0
  125. package/vault/wiki/concepts/agent-codebase-interface.md +43 -0
  126. package/vault/wiki/concepts/agent-harness-architecture.md +67 -0
  127. package/vault/wiki/concepts/agent-loop-detection-patterns.md +133 -0
  128. package/vault/wiki/concepts/agent-search-enforcement.md +126 -0
  129. package/vault/wiki/concepts/agent-skills-ecosystem.md +74 -0
  130. package/vault/wiki/concepts/agent-skills-pattern.md +68 -0
  131. package/vault/wiki/concepts/agentic-harness-context-enforcement.md +91 -0
  132. package/vault/wiki/concepts/agentic-harness.md +34 -0
  133. package/vault/wiki/concepts/agentic-orchestration-pipeline.md +56 -0
  134. package/vault/wiki/concepts/agentic-search-no-embeddings.md +18 -0
  135. package/vault/wiki/concepts/anthropic-context-engineering.md +13 -0
  136. package/vault/wiki/concepts/antigravity-agent-first-architecture.md +61 -0
  137. package/vault/wiki/concepts/ast-compression.md +19 -0
  138. package/vault/wiki/concepts/ast-truncation.md +66 -0
  139. package/vault/wiki/concepts/barrel-files.md +37 -0
  140. package/vault/wiki/concepts/browser-harness-agent.md +41 -0
  141. package/vault/wiki/concepts/browser-subagent-visual-verification.md +82 -0
  142. package/vault/wiki/concepts/codebase-intelligence-ecosystem-comparison.md +192 -0
  143. package/vault/wiki/concepts/codebase-intelligence-harness-integration.md +161 -0
  144. package/vault/wiki/concepts/codebase-to-context-ingestion.md +46 -0
  145. package/vault/wiki/concepts/codex-harness-innovations.md +147 -0
  146. package/vault/wiki/concepts/consensus-debate-flow.md +17 -0
  147. package/vault/wiki/concepts/consensus-debate.md +206 -0
  148. package/vault/wiki/concepts/content-addressed-spec-identity.md +166 -0
  149. package/vault/wiki/concepts/context-anxiety.md +57 -0
  150. package/vault/wiki/concepts/context-compression-techniques.md +19 -0
  151. package/vault/wiki/concepts/context-continuity.md +22 -0
  152. package/vault/wiki/concepts/context-drift-in-agents.md +106 -0
  153. package/vault/wiki/concepts/context-engineering.md +62 -0
  154. package/vault/wiki/concepts/context-folding.md +67 -0
  155. package/vault/wiki/concepts/context-mode.md +38 -0
  156. package/vault/wiki/concepts/cursor-harness-innovations.md +107 -0
  157. package/vault/wiki/concepts/deterministic-session-compaction.md +79 -0
  158. package/vault/wiki/concepts/drift-detection-unified.md +296 -0
  159. package/vault/wiki/concepts/execution-feedback-loop.md +46 -0
  160. package/vault/wiki/concepts/feedforward-feedback-harness.md +60 -0
  161. package/vault/wiki/concepts/five-root-cause-metrics-sentrux.md +40 -0
  162. package/vault/wiki/concepts/fork-safe-spec-storage.md +89 -0
  163. package/vault/wiki/concepts/fts5-sandbox.md +19 -0
  164. package/vault/wiki/concepts/fuzzy-edit-matching.md +71 -0
  165. package/vault/wiki/concepts/gemini-cli-architecture.md +104 -0
  166. package/vault/wiki/concepts/generator-evaluator-architecture.md +64 -0
  167. package/vault/wiki/concepts/guardian-agent-pattern.md +67 -0
  168. package/vault/wiki/concepts/harness-configuration-layers.md +89 -0
  169. package/vault/wiki/concepts/harness-control-frameworks.md +155 -0
  170. package/vault/wiki/concepts/harness-engineering-first-principles.md +90 -0
  171. package/vault/wiki/concepts/harness-h-formalism.md +53 -0
  172. package/vault/wiki/concepts/hybrid-code-search.md +61 -0
  173. package/vault/wiki/concepts/inline-post-edit-validation.md +112 -0
  174. package/vault/wiki/concepts/legendary-engineering-patterns-harness.md +110 -0
  175. package/vault/wiki/concepts/lifecycle-hooks.md +94 -0
  176. package/vault/wiki/concepts/mcp-tool-routing.md +102 -0
  177. package/vault/wiki/concepts/memory-system-of-record-vs-ephemeral-cache.md +47 -0
  178. package/vault/wiki/concepts/meta-agent-context-pruning.md +151 -0
  179. package/vault/wiki/concepts/model-adaptive-harness.md +122 -0
  180. package/vault/wiki/concepts/model-routing-agents.md +101 -0
  181. package/vault/wiki/concepts/monorepo-architecture.md +45 -0
  182. package/vault/wiki/concepts/multi-agent-specialization.md +61 -0
  183. package/vault/wiki/concepts/permission-subsystem.md +16 -0
  184. package/vault/wiki/concepts/pi-messenger-analysis.md +243 -0
  185. package/vault/wiki/concepts/pi-vscode-extension-landscape.md +37 -0
  186. package/vault/wiki/concepts/policy-engine-pattern.md +78 -0
  187. package/vault/wiki/concepts/progressive-disclosure-agents.md +53 -0
  188. package/vault/wiki/concepts/progressive-skill-disclosure.md +17 -0
  189. package/vault/wiki/concepts/provider-native-prompting.md +203 -0
  190. package/vault/wiki/concepts/quality-signal-sentrux.md +37 -0
  191. package/vault/wiki/concepts/repo-map-ranking.md +42 -0
  192. package/vault/wiki/concepts/result-monad-error-handling.md +47 -0
  193. package/vault/wiki/concepts/safety-defense-in-depth.md +83 -0
  194. package/vault/wiki/concepts/sandbox-os-enforcement.md +18 -0
  195. package/vault/wiki/concepts/selective-debate-routing.md +70 -0
  196. package/vault/wiki/concepts/self-evolving-harness.md +60 -0
  197. package/vault/wiki/concepts/sentrux-mcp-integration.md +36 -0
  198. package/vault/wiki/concepts/sentrux-rules-engine.md +49 -0
  199. package/vault/wiki/concepts/shell-pattern-compression.md +24 -0
  200. package/vault/wiki/concepts/skill-first-architecture.md +166 -0
  201. package/vault/wiki/concepts/structured-compaction.md +78 -0
  202. package/vault/wiki/concepts/subagent-orchestration.md +17 -0
  203. package/vault/wiki/concepts/subagent-worktree-isolation.md +68 -0
  204. package/vault/wiki/concepts/superpowers-methodology.md +78 -0
  205. package/vault/wiki/concepts/think-in-code.md +73 -0
  206. package/vault/wiki/concepts/ts-execution-layer.md +100 -0
  207. package/vault/wiki/concepts/typescript-strict-mode.md +37 -0
  208. package/vault/wiki/concepts/vcc-conversation-compaction-for-pi.md +51 -0
  209. package/vault/wiki/concepts/verification-drift-detection.md +19 -0
  210. package/vault/wiki/consensus/consensus-records.md +58 -0
  211. package/vault/wiki/decisions/2026-04-30-pi-lean-ctx-native.md +122 -0
  212. package/vault/wiki/decisions/adr-008.md +40 -0
  213. package/vault/wiki/decisions/adr-009.md +46 -0
  214. package/vault/wiki/decisions/adr-010.md +55 -0
  215. package/vault/wiki/decisions/adr-011.md +165 -0
  216. package/vault/wiki/decisions/adr-012.md +102 -0
  217. package/vault/wiki/decisions/adr-013.md +59 -0
  218. package/vault/wiki/decisions/adr-014.md +73 -0
  219. package/vault/wiki/decisions/adr-015.md +81 -0
  220. package/vault/wiki/decisions/adr-016.md +91 -0
  221. package/vault/wiki/decisions/adr-017.md +79 -0
  222. package/vault/wiki/decisions/adr-018.md +100 -0
  223. package/vault/wiki/decisions/adr-019.md +75 -0
  224. package/vault/wiki/decisions/adr-020.md +106 -0
  225. package/vault/wiki/decisions/adr-021.md +86 -0
  226. package/vault/wiki/decisions/adr-022.md +113 -0
  227. package/vault/wiki/decisions/adr-023.md +113 -0
  228. package/vault/wiki/decisions/adr-024.md +73 -0
  229. package/vault/wiki/decisions/adr-025.md +130 -0
  230. package/vault/wiki/decisions/adr-026.md +56 -0
  231. package/vault/wiki/decisions/colocate-wiki.md +34 -0
  232. package/vault/wiki/entities/Anders Hejlsberg.md +29 -0
  233. package/vault/wiki/entities/Anthropic.md +17 -0
  234. package/vault/wiki/entities/Augment Code.md +49 -0
  235. package/vault/wiki/entities/Bjarne Stroustrup.md +26 -0
  236. package/vault/wiki/entities/Bolt.new (StackBlitz).md +39 -0
  237. package/vault/wiki/entities/Boris Cherny.md +11 -0
  238. package/vault/wiki/entities/Claude Code.md +19 -0
  239. package/vault/wiki/entities/Dennis Ritchie.md +26 -0
  240. package/vault/wiki/entities/Emergent Labs.md +32 -0
  241. package/vault/wiki/entities/Google Cloud.md +16 -0
  242. package/vault/wiki/entities/Guido van Rossum.md +28 -0
  243. package/vault/wiki/entities/Ken Thompson.md +28 -0
  244. package/vault/wiki/entities/Lee et al.md +16 -0
  245. package/vault/wiki/entities/Linus Torvalds.md +28 -0
  246. package/vault/wiki/entities/Lovable (company).md +40 -0
  247. package/vault/wiki/entities/Martin Fowler.md +16 -0
  248. package/vault/wiki/entities/Meng et al.md +16 -0
  249. package/vault/wiki/entities/OpenAI.md +16 -0
  250. package/vault/wiki/entities/Rocket.new.md +38 -0
  251. package/vault/wiki/entities/VILA-Lab.md +15 -0
  252. package/vault/wiki/entities/autodev-codebase.md +18 -0
  253. package/vault/wiki/entities/ck-tool.md +59 -0
  254. package/vault/wiki/entities/codesearch.md +18 -0
  255. package/vault/wiki/entities/disler-indydevdan.md +33 -0
  256. package/vault/wiki/entities/gsd-get-shit-done.md +56 -0
  257. package/vault/wiki/entities/javascript-runtimes.md +48 -0
  258. package/vault/wiki/entities/jesse-vincent.md +38 -0
  259. package/vault/wiki/entities/lean-ctx.md +32 -0
  260. package/vault/wiki/entities/opendev.md +41 -0
  261. package/vault/wiki/entities/ops-codegraph-tool.md +18 -0
  262. package/vault/wiki/entities/pi-coding-agent.md +53 -0
  263. package/vault/wiki/entities/sentrux.md +54 -0
  264. package/vault/wiki/entities/vgrep-tool.md +57 -0
  265. package/vault/wiki/entities/vitest.md +41 -0
  266. package/vault/wiki/flows/harness-wiki-pipeline.md +204 -0
  267. package/vault/wiki/hot.md +932 -0
  268. package/vault/wiki/index.md +437 -0
  269. package/vault/wiki/log.md +418 -0
  270. package/vault/wiki/meta/dashboard.md +30 -0
  271. package/vault/wiki/meta/lint-report-2026-04-30.md +86 -0
  272. package/vault/wiki/meta/lint-report-2026-05-02.md +251 -0
  273. package/vault/wiki/meta/overview.canvas +43 -0
  274. package/vault/wiki/modules/adversarial-verification.md +57 -0
  275. package/vault/wiki/modules/automated-observability.md +54 -0
  276. package/vault/wiki/modules/bench.md +20 -0
  277. package/vault/wiki/modules/extensions.md +23 -0
  278. package/vault/wiki/modules/grounding-checkpoints.md +62 -0
  279. package/vault/wiki/modules/harness-implementation-plan.md +345 -0
  280. package/vault/wiki/modules/harness-wiki-skill-mapping.md +135 -0
  281. package/vault/wiki/modules/harness.md +86 -0
  282. package/vault/wiki/modules/persistent-memory.md +85 -0
  283. package/vault/wiki/modules/schema-orchestration.md +68 -0
  284. package/vault/wiki/modules/skills.md +27 -0
  285. package/vault/wiki/modules/spec-hardening.md +58 -0
  286. package/vault/wiki/modules/structured-planning.md +53 -0
  287. package/vault/wiki/modules/think-in-code-enforcement.md +153 -0
  288. package/vault/wiki/modules/wiki-query-interface.md +64 -0
  289. package/vault/wiki/overview.md +51 -0
  290. package/vault/wiki/questions/Research-pi-vs-claude-code-agentic-orchestration-pipeline.md +87 -0
  291. package/vault/wiki/questions/Research-sentrux-dev.md +123 -0
  292. package/vault/wiki/questions/Research-superpowers-skill-for-agentic-coding-agents.md +164 -0
  293. package/vault/wiki/questions/Research: Augment Code Context Engine.md +244 -0
  294. package/vault/wiki/questions/Research: Automating Software Engineering - Lovable, Bolt, Emergent, Rocket.md +112 -0
  295. package/vault/wiki/questions/Research: Claude Code State-of-the-Art Harness Improvements.md +209 -0
  296. package/vault/wiki/questions/Research: Codex State-of-the-Art Harness Improvements.md +99 -0
  297. package/vault/wiki/questions/Research: Engineering Workflows of Legendary Programmers and AI Harness Mapping.md +107 -0
  298. package/vault/wiki/questions/Research: Fallow Codebase Intelligence Harness Integration.md +72 -0
  299. package/vault/wiki/questions/Research: Gemini CLI SOTA Harness Integration.md +166 -0
  300. package/vault/wiki/questions/Research: GitHub Issues as Harness Spec Storage.md +188 -0
  301. package/vault/wiki/questions/Research: Google Antigravity Harness Integration.md +120 -0
  302. package/vault/wiki/questions/Research: Meta-Agent Context Drift Detection.md +236 -0
  303. package/vault/wiki/questions/Research: Model-Adaptive Agent Harness Design.md +95 -0
  304. package/vault/wiki/questions/Research: Model-Specific Prompting Guides.md +165 -0
  305. package/vault/wiki/questions/Research: Prompt Renderer for Multi-Model Agent Harness.md +216 -0
  306. package/vault/wiki/questions/Research: Skill-First Harness Architecture.md +91 -0
  307. package/vault/wiki/questions/Research: TypeScript Best Practices and Codebase Structure.md +88 -0
  308. package/vault/wiki/questions/Research: TypeScript Execution Layer for Agent Tool Calling.md +81 -0
  309. package/vault/wiki/questions/Research: claude-mem over Obsidian for Harness Layer.md +71 -0
  310. 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 +80 -0
  311. package/vault/wiki/questions/Research: context-mode vs lean-ctx.md +72 -0
  312. package/vault/wiki/questions/Research: cursor.sh Harness Innovations.md +92 -0
  313. package/vault/wiki/questions/Research: executor.sh Harness Integration.md +170 -0
  314. package/vault/wiki/questions/Research: how GSD fits into our coding harness setup.md +97 -0
  315. 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 +80 -0
  316. package/vault/wiki/questions/Research: pi-vcc.md +113 -0
  317. package/vault/wiki/questions/Research: semantic code search tools.md +69 -0
  318. package/vault/wiki/questions/Research: vcc extension for pi coding agent.md +73 -0
  319. package/vault/wiki/questions/how-to-enable-semantic-code-search-now.md +111 -0
  320. package/vault/wiki/questions/mvp-implementation-blueprint.md +552 -0
  321. package/vault/wiki/questions/research-agent-first-codebase-exploration.md +199 -0
  322. package/vault/wiki/questions/research-agentic-coding-harness-latest-papers.md +142 -0
  323. package/vault/wiki/questions/research-gitingest-gitreverse-integration.md +100 -0
  324. package/vault/wiki/questions/research-wozcode-token-reduction.md +67 -0
  325. package/vault/wiki/questions/resolved-context-pruning-inplace-vs-restart.md +95 -0
  326. package/vault/wiki/questions/resolved-context-window-economics.md +167 -0
  327. package/vault/wiki/questions/resolved-imad-debate-gating-transfer.md +126 -0
  328. package/vault/wiki/questions/resolved-mcp-tool-preference.md +112 -0
  329. package/vault/wiki/questions/resolved-small-model-meta-agents.md +107 -0
  330. package/vault/wiki/questions/resolved-treesitter-dynamic-languages.md +95 -0
  331. package/vault/wiki/sources/Auggie Context MCP Server.md +63 -0
  332. package/vault/wiki/sources/Augment Code Codacy AI Giants.md +61 -0
  333. package/vault/wiki/sources/Augment Code MCP SiliconAngle.md +49 -0
  334. package/vault/wiki/sources/Augment Code WorkOS ERC 2025.md +55 -0
  335. package/vault/wiki/sources/Augment Context Engine Official.md +71 -0
  336. package/vault/wiki/sources/Augment SWE-bench Agent GitHub.md +74 -0
  337. package/vault/wiki/sources/Augment SWE-bench Pro Blog.md +58 -0
  338. package/vault/wiki/sources/Source: AgentBus Jinja2 Prompt Pipelines.md +75 -0
  339. package/vault/wiki/sources/Source: Arxiv /342/200/224 Don't Break the Cache.md" +85 -0
  340. package/vault/wiki/sources/Source: Augment - Harness Engineering for AI Coding Agents.md +58 -0
  341. package/vault/wiki/sources/Source: Blake Crosley Agent Architecture Guide.md +100 -0
  342. package/vault/wiki/sources/Source: Bolt.new Architecture & Case Study.md +75 -0
  343. package/vault/wiki/sources/Source: Build-Time Prompt Compilation Architecture.md +107 -0
  344. package/vault/wiki/sources/Source: Claude API Agent Skills Overview.md +70 -0
  345. package/vault/wiki/sources/Source: Gemini CLI Changelogs.md +88 -0
  346. package/vault/wiki/sources/Source: Google Blog - Gemini CLI Announcement.md +57 -0
  347. package/vault/wiki/sources/Source: Google Gemini CLI Architecture Docs.md +53 -0
  348. package/vault/wiki/sources/Source: LangChain - Anatomy of Agent Harness.md +65 -0
  349. package/vault/wiki/sources/Source: Lovable Architecture & Clone Analysis.md +83 -0
  350. package/vault/wiki/sources/Source: Martin Fowler - Harness Engineering.md +70 -0
  351. package/vault/wiki/sources/Source: OpenAI Harness Engineering Five Principles.md +58 -0
  352. package/vault/wiki/sources/Source: OpenAI Harness Engineering /342/200/224 0 Lines of Human Code.md" +101 -0
  353. package/vault/wiki/sources/Source: OpenDev /342/200/224 Building AI Coding Agents for the Terminal.md" +100 -0
  354. package/vault/wiki/sources/Source: Render AI Coding Agents Benchmark 2025.md +53 -0
  355. package/vault/wiki/sources/Source: Rocket.new /342/200/224 Vibe Solutioning Platform.md" +70 -0
  356. package/vault/wiki/sources/Source: SwirlAI Agent Skills Progressive Disclosure.md +71 -0
  357. package/vault/wiki/sources/Source: TianPan Prompt Caching Architecture.md +89 -0
  358. package/vault/wiki/sources/Source: Vercel Labs agent-browser.md +155 -0
  359. package/vault/wiki/sources/Source: browser-harness CDP Harness.md +126 -0
  360. package/vault/wiki/sources/agent-drift-academic-paper.md +79 -0
  361. package/vault/wiki/sources/aider-repomap-tree-sitter.md +42 -0
  362. package/vault/wiki/sources/anthropic-compaction-api.md +58 -0
  363. package/vault/wiki/sources/anthropic-effective-harnesses.md +42 -0
  364. package/vault/wiki/sources/anthropic-prompt-best-practices.md +100 -0
  365. package/vault/wiki/sources/anthropic2026-harness-design.md +63 -0
  366. package/vault/wiki/sources/barrel-files-tkdodo.md +38 -0
  367. package/vault/wiki/sources/birth-of-unix-kernighan-interview.md +57 -0
  368. package/vault/wiki/sources/bockeler2026-harness-engineering.md +69 -0
  369. package/vault/wiki/sources/cast-code-chunking-paper.md +50 -0
  370. package/vault/wiki/sources/ck-semantic-search.md +78 -0
  371. package/vault/wiki/sources/claude-code-architecture-karaxai-2026.md +71 -0
  372. package/vault/wiki/sources/claude-code-architecture-qubytes-2026.md +50 -0
  373. package/vault/wiki/sources/claude-code-architecture-vila-lab-2026.md +64 -0
  374. package/vault/wiki/sources/claude-code-security-architecture-penligent-2026.md +70 -0
  375. package/vault/wiki/sources/claude-context-editing-docs.md +13 -0
  376. package/vault/wiki/sources/cloudflare-codemode.md +63 -0
  377. package/vault/wiki/sources/code-chunk-library-supermemory.md +63 -0
  378. package/vault/wiki/sources/codeact-apple-2024.md +62 -0
  379. package/vault/wiki/sources/codex-dsc-rfc-8573.md +41 -0
  380. package/vault/wiki/sources/codex-open-source-agent-2026.md +110 -0
  381. package/vault/wiki/sources/coir-code-retrieval-benchmark.md +51 -0
  382. package/vault/wiki/sources/colinmcnamara-context-optimization-codemode.md +48 -0
  383. package/vault/wiki/sources/context-folding-paper.md +61 -0
  384. package/vault/wiki/sources/context-mode-website.md +63 -0
  385. package/vault/wiki/sources/cursor-agent-best-practices-2026.md +62 -0
  386. package/vault/wiki/sources/cursor-fork-29b-2025.md +50 -0
  387. package/vault/wiki/sources/cursor-harness-april-2026.md +76 -0
  388. package/vault/wiki/sources/cursor-instant-apply-2024.md +45 -0
  389. package/vault/wiki/sources/cursor-shadow-workspace-2024.md +52 -0
  390. package/vault/wiki/sources/cursor-shipped-coding-agent-2026.md +53 -0
  391. package/vault/wiki/sources/cursor-vs-antigravity-2026.md +51 -0
  392. package/vault/wiki/sources/disler-pi-vs-claude-code.md +69 -0
  393. package/vault/wiki/sources/distill-deterministic-context-compression.md +53 -0
  394. package/vault/wiki/sources/embedding-models-benchmark-supermemory-2025.md +48 -0
  395. package/vault/wiki/sources/executor-rhyssullivan.md +122 -0
  396. package/vault/wiki/sources/fallow-rs-codebase-intelligence.md +125 -0
  397. package/vault/wiki/sources/fan2025-imad.md +60 -0
  398. package/vault/wiki/sources/forgecode-gpt5-agent-improvements.md +63 -0
  399. package/vault/wiki/sources/gemini-3-prompting-guide.md +78 -0
  400. package/vault/wiki/sources/gh-cli-sub-issue-rfc.md +50 -0
  401. package/vault/wiki/sources/gh-sub-issue-extension.md +72 -0
  402. package/vault/wiki/sources/github-fork-issues-discussion.md +44 -0
  403. package/vault/wiki/sources/github-issue-dependencies-docs.md +49 -0
  404. package/vault/wiki/sources/github-sub-issues-docs.md +51 -0
  405. package/vault/wiki/sources/gitingest.md +91 -0
  406. package/vault/wiki/sources/gitreverse.md +63 -0
  407. package/vault/wiki/sources/google-antigravity-official-blog.md +47 -0
  408. package/vault/wiki/sources/google-antigravity-wikipedia.md +53 -0
  409. package/vault/wiki/sources/gsd-codecentric-deep-dive.md +57 -0
  410. package/vault/wiki/sources/gsd-github-repo.md +51 -0
  411. package/vault/wiki/sources/gsd-hn-discussion.md +59 -0
  412. package/vault/wiki/sources/guido-python-design-philosophy.md +56 -0
  413. package/vault/wiki/sources/hejlsberg-7-learnings.md +48 -0
  414. package/vault/wiki/sources/ironclaw-drift-monitor.md +80 -0
  415. package/vault/wiki/sources/langsight-loop-detection.md +80 -0
  416. package/vault/wiki/sources/leanctx-website.md +69 -0
  417. package/vault/wiki/sources/lee2026-meta-harness.md +59 -0
  418. package/vault/wiki/sources/linux-kernel-coding-workflow.md +50 -0
  419. package/vault/wiki/sources/lou2026-autoharness.md +53 -0
  420. package/vault/wiki/sources/martin-fowler-harness-engineering.md +73 -0
  421. package/vault/wiki/sources/mcp-architecture-docs.md +13 -0
  422. package/vault/wiki/sources/meng2026-agent-harness-survey.md +79 -0
  423. package/vault/wiki/sources/mindstudio-four-agent-types.md +68 -0
  424. package/vault/wiki/sources/ms-chat-history-management.md +13 -0
  425. package/vault/wiki/sources/openai-prompt-guidance.md +104 -0
  426. package/vault/wiki/sources/openclaw-session-pruning.md +13 -0
  427. package/vault/wiki/sources/opencode-dcp.md +13 -0
  428. package/vault/wiki/sources/opendev-arxiv-2603.05344v1.md +79 -0
  429. package/vault/wiki/sources/openhands-platform.md +39 -0
  430. package/vault/wiki/sources/oss-guide-codebase-exploration.md +53 -0
  431. package/vault/wiki/sources/pi-compaction-extensions-ecosystem.md +102 -0
  432. package/vault/wiki/sources/pi-context-prune-github-repo.md +38 -0
  433. package/vault/wiki/sources/pi-mono-compaction-docs.md +38 -0
  434. package/vault/wiki/sources/pi-omni-compact-github-repo.md +50 -0
  435. package/vault/wiki/sources/pi-rtk-optimizer-github-repo.md +45 -0
  436. package/vault/wiki/sources/pi-vcc-github-repo.md +69 -0
  437. package/vault/wiki/sources/pi-vscode-marketplace.md +41 -0
  438. package/vault/wiki/sources/pi-vscode-model-provider-marketplace.md +39 -0
  439. package/vault/wiki/sources/py-tree-sitter.md +13 -0
  440. package/vault/wiki/sources/sentrux-dev-landing.md +40 -0
  441. package/vault/wiki/sources/sentrux-docs-pro-architecture.md +75 -0
  442. package/vault/wiki/sources/sentrux-docs-quality-signal.md +46 -0
  443. package/vault/wiki/sources/sentrux-docs-root-cause-metrics.md +57 -0
  444. package/vault/wiki/sources/sentrux-docs-rules-engine.md +58 -0
  445. package/vault/wiki/sources/sentrux-github-repo.md +56 -0
  446. package/vault/wiki/sources/superpowers-github-repo.md +56 -0
  447. package/vault/wiki/sources/superpowers-release-blog.md +54 -0
  448. package/vault/wiki/sources/superpowers-termdock-analysis.md +45 -0
  449. package/vault/wiki/sources/swe-agent-aci.md +42 -0
  450. package/vault/wiki/sources/swe-bench.md +45 -0
  451. package/vault/wiki/sources/swe-pruner-context-pruning.md +13 -0
  452. package/vault/wiki/sources/think-in-code-blog.md +48 -0
  453. package/vault/wiki/sources/tree-sitter-docs.md +13 -0
  454. package/vault/wiki/sources/ts-best-practices-2025-devto.md +42 -0
  455. package/vault/wiki/sources/ts-folder-structure-mingyang.md +58 -0
  456. package/vault/wiki/sources/ts-monorepo-koerselman.md +44 -0
  457. package/vault/wiki/sources/ts-result-error-handling-kkalamarski.md +52 -0
  458. package/vault/wiki/sources/ts-runtimes-comparison-betterstack.md +42 -0
  459. package/vault/wiki/sources/ts-strict-mode-rishikc.md +43 -0
  460. package/vault/wiki/sources/unix-philosophy.md +48 -0
  461. package/vault/wiki/sources/vectara-chunking-vs-embedding-naacl2025.md +39 -0
  462. package/vault/wiki/sources/vectara-guardian-agents.md +79 -0
  463. package/vault/wiki/sources/vgrep-semantic-search.md +76 -0
  464. package/vault/wiki/sources/vitest-official.md +41 -0
  465. package/vault/wiki/sources/vscode-pi-community-extension.md +40 -0
  466. package/vault/wiki/sources/wozcode.md +79 -0
  467. package/.agents/skills/compress/SKILL.md +0 -111
  468. package/.agents/skills/compress/scripts/__init__.py +0 -9
  469. package/.agents/skills/compress/scripts/__main__.py +0 -3
  470. package/.agents/skills/compress/scripts/benchmark.py +0 -78
  471. package/.agents/skills/compress/scripts/cli.py +0 -73
  472. package/.agents/skills/compress/scripts/compress.py +0 -227
  473. package/.agents/skills/compress/scripts/detect.py +0 -121
  474. package/.agents/skills/compress/scripts/validate.py +0 -189
  475. package/.agents/skills/emil-design-eng/SKILL.md +0 -679
  476. package/.agents/skills/lean-ctx/SKILL.md +0 -149
  477. package/.agents/skills/lean-ctx/scripts/install.sh +0 -95
  478. package/.agents/skills/scrapling-official/LICENSE.txt +0 -28
  479. package/.agents/skills/scrapling-official/SKILL.md +0 -390
  480. package/.agents/skills/scrapling-official/examples/01_fetcher_session.py +0 -26
  481. package/.agents/skills/scrapling-official/examples/02_dynamic_session.py +0 -26
  482. package/.agents/skills/scrapling-official/examples/03_stealthy_session.py +0 -26
  483. package/.agents/skills/scrapling-official/examples/04_spider.py +0 -58
  484. package/.agents/skills/scrapling-official/examples/README.md +0 -45
  485. package/.agents/skills/scrapling-official/references/fetching/choosing.md +0 -78
  486. package/.agents/skills/scrapling-official/references/fetching/dynamic.md +0 -352
  487. package/.agents/skills/scrapling-official/references/fetching/static.md +0 -432
  488. package/.agents/skills/scrapling-official/references/fetching/stealthy.md +0 -255
  489. package/.agents/skills/scrapling-official/references/mcp-server.md +0 -214
  490. package/.agents/skills/scrapling-official/references/migrating_from_beautifulsoup.md +0 -86
  491. package/.agents/skills/scrapling-official/references/parsing/adaptive.md +0 -212
  492. package/.agents/skills/scrapling-official/references/parsing/main_classes.md +0 -586
  493. package/.agents/skills/scrapling-official/references/parsing/selection.md +0 -494
  494. package/.agents/skills/scrapling-official/references/spiders/advanced.md +0 -344
  495. package/.agents/skills/scrapling-official/references/spiders/architecture.md +0 -94
  496. package/.agents/skills/scrapling-official/references/spiders/getting-started.md +0 -164
  497. package/.agents/skills/scrapling-official/references/spiders/proxy-blocking.md +0 -235
  498. package/.agents/skills/scrapling-official/references/spiders/requests-responses.md +0 -196
  499. package/.agents/skills/scrapling-official/references/spiders/sessions.md +0 -205
  500. package/PLAN.md +0 -11
  501. package/extensions/lean-ctx-enforce.ts +0 -166
  502. package/skills-lock.json +0 -35
  503. package/wiki/README.md +0 -19
  504. package/wiki/decisions/0001-establish-project-wiki-and-decision-record-format.md +0 -25
  505. package/wiki/decisions/0002-add-project-banner-to-readme.md +0 -26
  506. package/wiki/decisions/0003-remove-redundant-readme-title-heading.md +0 -26
  507. package/wiki/decisions/0004-publish-package-to-npm-as-ultimate-pi.md +0 -26
  508. package/wiki/decisions/0005-automate-npm-publish-with-github-actions.md +0 -27
  509. package/wiki/decisions/0006-switch-to-npm-trusted-publishing.md +0 -26
  510. package/wiki/decisions/0007-use-absolute-banner-url-for-npm-readme-rendering.md +0 -26
  511. package/wiki/decisions/0008-rename-banner-asset-for-cache-busting.md +0 -26
  512. package/wiki/decisions/0009-force-oidc-path-by-clearing-node-auth-token-in-publish-step.md +0 -25
  513. package/wiki/decisions/0010-simplify-setup-node-for-npm-trusted-publishing.md +0 -26
  514. package/wiki/decisions/0011-add-noop-workflow-change-to-force-fresh-publish-run.md +0 -25
  515. package/wiki/decisions/0012-align-workflow-runtime-with-npm-trusted-publishing-requirements.md +0 -26
  516. package/wiki/decisions/0013-add-package-repository-url-for-provenance-validation.md +0 -25
@@ -0,0 +1,476 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import cursorSdkProvider, { __setCursorAgentFactoryForTests } from "../../.tmp-test/cursor-sdk-provider.mjs";
4
+
5
+ function makeFakeAgent(events, runResult = { status: "finished" }, capture = undefined) {
6
+ let cancelled = false;
7
+ return {
8
+ async send(promptText) {
9
+ if (capture) capture.promptText = promptText;
10
+ return {
11
+ stream: async function* () {
12
+ for (const event of events) {
13
+ if (cancelled) break;
14
+ yield event;
15
+ }
16
+ },
17
+ wait: async () => (cancelled ? { status: "cancelled" } : runResult),
18
+ cancel: async () => {
19
+ cancelled = true;
20
+ },
21
+ };
22
+ },
23
+ close() {},
24
+ };
25
+ }
26
+
27
+ function makeModelAndContext() {
28
+ const model = {
29
+ id: "gpt-5.3-codex",
30
+ api: "cursor-sdk",
31
+ provider: "cursor",
32
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
33
+ };
34
+ const context = {
35
+ systemPrompt: "You are a test assistant.",
36
+ messages: [{ role: "user", content: "hello", timestamp: Date.now() }],
37
+ tools: [{ name: "Shell", description: "Run shell", parameters: { type: "object" } }],
38
+ };
39
+ return { model, context };
40
+ }
41
+
42
+ function getStreamSimple() {
43
+ let streamSimple;
44
+ const pi = {
45
+ registerProvider: (_name, cfg) => {
46
+ streamSimple = cfg.streamSimple;
47
+ },
48
+ };
49
+ cursorSdkProvider(pi);
50
+ assert.ok(streamSimple, "provider should register streamSimple");
51
+ return streamSimple;
52
+ }
53
+
54
+ async function collectEvents(stream) {
55
+ const events = [];
56
+ for await (const event of stream) {
57
+ events.push(event);
58
+ }
59
+ return events;
60
+ }
61
+
62
+ test("streams text deltas into one text block", async () => {
63
+ __setCursorAgentFactoryForTests(async () =>
64
+ makeFakeAgent([
65
+ { type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "Hello " }] } },
66
+ { type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "world" }] } },
67
+ ]),
68
+ );
69
+
70
+ const streamSimple = getStreamSimple();
71
+ const { model, context } = makeModelAndContext();
72
+ const events = await collectEvents(streamSimple(model, context));
73
+
74
+ assert.equal(events.filter((e) => e.type === "text_start").length, 1);
75
+ assert.equal(events.filter((e) => e.type === "text_end").length, 1);
76
+ const done = events.find((e) => e.type === "done");
77
+ assert.ok(done && done.reason === "stop");
78
+ if (done?.type === "done") {
79
+ const text = done.message.content.filter((c) => c.type === "text").map((c) => c.text).join("");
80
+ assert.equal(text, "Hello world");
81
+ assert.ok(done.message.usage.input > 0, "input token estimate should be set");
82
+ assert.ok(done.message.usage.output > 0, "output token estimate should be set");
83
+ assert.equal(
84
+ done.message.usage.totalTokens,
85
+ done.message.usage.input + done.message.usage.output,
86
+ "total token estimate should match input + output",
87
+ );
88
+ }
89
+ });
90
+
91
+ test("context overflow safety: very large context still streams", async () => {
92
+ const capture = {};
93
+ __setCursorAgentFactoryForTests(async () =>
94
+ makeFakeAgent(
95
+ [{ type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "ok" }] } }],
96
+ { status: "finished" },
97
+ capture,
98
+ ),
99
+ );
100
+
101
+ const streamSimple = getStreamSimple();
102
+ const { model, context } = makeModelAndContext();
103
+ context.messages = [
104
+ {
105
+ role: "user",
106
+ content: "x".repeat(400_000),
107
+ timestamp: Date.now(),
108
+ },
109
+ ];
110
+
111
+ const events = await collectEvents(streamSimple(model, context));
112
+ const done = events.find((e) => e.type === "done");
113
+ assert.ok(done && done.reason === "stop");
114
+ assert.ok(capture.promptText.length > 300_000, "serialized prompt should include full large context");
115
+ });
116
+
117
+ test("image limits: user image input is serialized into prompt", async () => {
118
+ const capture = {};
119
+ __setCursorAgentFactoryForTests(async () =>
120
+ makeFakeAgent(
121
+ [{ type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "saw image" }] } }],
122
+ { status: "finished" },
123
+ capture,
124
+ ),
125
+ );
126
+
127
+ const streamSimple = getStreamSimple();
128
+ const { model, context } = makeModelAndContext();
129
+ context.messages = [
130
+ {
131
+ role: "user",
132
+ content: [
133
+ { type: "text", text: "analyze" },
134
+ {
135
+ type: "image",
136
+ mimeType: "image/png",
137
+ data: "aGVsbG8=",
138
+ },
139
+ ],
140
+ timestamp: Date.now(),
141
+ },
142
+ ];
143
+
144
+ const events = await collectEvents(streamSimple(model, context));
145
+ const done = events.find((e) => e.type === "done");
146
+ assert.ok(done && done.reason === "stop");
147
+ assert.match(capture.promptText, /\[Image: image\/png, ~6 bytes\]/);
148
+ });
149
+
150
+ test("image tool result is serialized into prompt", async () => {
151
+ const capture = {};
152
+ __setCursorAgentFactoryForTests(async () =>
153
+ makeFakeAgent(
154
+ [{ type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "processed" }] } }],
155
+ { status: "finished" },
156
+ capture,
157
+ ),
158
+ );
159
+
160
+ const streamSimple = getStreamSimple();
161
+ const { model, context } = makeModelAndContext();
162
+ context.messages = [
163
+ {
164
+ role: "toolResult",
165
+ toolCallId: "tc1",
166
+ toolName: "ReadImage",
167
+ isError: false,
168
+ content: [
169
+ { type: "text", text: "result text" },
170
+ { type: "image", mimeType: "image/jpeg", data: "YWJjZA==" },
171
+ ],
172
+ timestamp: Date.now(),
173
+ },
174
+ ];
175
+
176
+ const events = await collectEvents(streamSimple(model, context));
177
+ const done = events.find((e) => e.type === "done");
178
+ assert.ok(done && done.reason === "stop");
179
+ assert.match(capture.promptText, /\[Tool result: ReadImage\]/);
180
+ assert.match(capture.promptText, /\[Image: image\/jpeg, ~6 bytes\]/);
181
+ });
182
+
183
+ test("cross-provider handoff: assistant thinking/toolCall history does not break serialization", async () => {
184
+ const capture = {};
185
+ __setCursorAgentFactoryForTests(async () =>
186
+ makeFakeAgent(
187
+ [{ type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "handoff ok" }] } }],
188
+ { status: "finished" },
189
+ capture,
190
+ ),
191
+ );
192
+
193
+ const streamSimple = getStreamSimple();
194
+ const { model, context } = makeModelAndContext();
195
+ context.messages = [
196
+ {
197
+ role: "assistant",
198
+ content: [
199
+ { type: "thinking", thinking: "internal notes from previous provider" },
200
+ { type: "toolCall", id: "old1", name: "Shell", arguments: { command: "ls" } },
201
+ { type: "text", text: "visible answer from previous provider" },
202
+ ],
203
+ api: "openai-completions",
204
+ provider: "openai",
205
+ model: "gpt-4o",
206
+ usage: { input: 1, output: 1, cacheRead: 0, cacheWrite: 0, totalTokens: 2, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
207
+ stopReason: "stop",
208
+ timestamp: Date.now(),
209
+ },
210
+ {
211
+ role: "user",
212
+ content: "continue",
213
+ timestamp: Date.now(),
214
+ },
215
+ ];
216
+
217
+ const events = await collectEvents(streamSimple(model, context));
218
+ const done = events.find((e) => e.type === "done");
219
+ assert.ok(done && done.reason === "stop");
220
+ assert.match(capture.promptText, /\[Assistant\]\nvisible answer from previous provider/);
221
+ assert.doesNotMatch(capture.promptText, /internal notes from previous provider/);
222
+ });
223
+
224
+ test("streams model thinking blocks", async () => {
225
+ __setCursorAgentFactoryForTests(async () =>
226
+ makeFakeAgent([
227
+ { type: "thinking", text: "plan " },
228
+ { type: "thinking", text: "more" },
229
+ { type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "done" }] } },
230
+ ]),
231
+ );
232
+
233
+ const streamSimple = getStreamSimple();
234
+ const { model, context } = makeModelAndContext();
235
+ const events = await collectEvents(streamSimple(model, context));
236
+
237
+ assert.equal(events.filter((e) => e.type === "thinking_start").length, 1);
238
+ assert.equal(events.filter((e) => e.type === "thinking_end").length, 1);
239
+ const thinkingDelta = events.filter((e) => e.type === "thinking_delta");
240
+ assert.equal(thinkingDelta.length, 2);
241
+ });
242
+
243
+ test("maps assistant thinking block content to thinking events", async () => {
244
+ __setCursorAgentFactoryForTests(async () =>
245
+ makeFakeAgent([
246
+ { type: "assistant", message: { role: "assistant", content: [{ type: "thinking", thinking: "plan from block" }] } },
247
+ { type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "done" }] } },
248
+ ]),
249
+ );
250
+
251
+ const streamSimple = getStreamSimple();
252
+ const { model, context } = makeModelAndContext();
253
+ const events = await collectEvents(streamSimple(model, context));
254
+
255
+ assert.equal(events.filter((e) => e.type === "thinking_start").length, 1);
256
+ assert.equal(events.filter((e) => e.type === "thinking_end").length, 1);
257
+ });
258
+
259
+ test("keeps thinking segments split around assistant tool_use blocks", async () => {
260
+ __setCursorAgentFactoryForTests(async () =>
261
+ makeFakeAgent([
262
+ {
263
+ type: "assistant",
264
+ message: {
265
+ role: "assistant",
266
+ content: [
267
+ { type: "thinking", thinking: "first-thought" },
268
+ { type: "tool_use", id: "tu_1", name: "shell", input: { command: "pwd" } },
269
+ ],
270
+ },
271
+ },
272
+ {
273
+ type: "assistant",
274
+ message: {
275
+ role: "assistant",
276
+ content: [{ type: "thinking", thinking: "second-thought" }],
277
+ },
278
+ },
279
+ ]),
280
+ );
281
+
282
+ const streamSimple = getStreamSimple();
283
+ const { model, context } = makeModelAndContext();
284
+ const events = await collectEvents(streamSimple(model, context));
285
+
286
+ assert.equal(events.filter((e) => e.type === "toolcall_start").length, 1);
287
+ assert.equal(events.filter((e) => e.type === "thinking_start").length, 2);
288
+ assert.equal(events.filter((e) => e.type === "thinking_end").length, 2);
289
+
290
+ const done = events.find((e) => e.type === "done");
291
+ assert.ok(done && done.reason === "toolUse");
292
+ if (done?.type === "done") {
293
+ const thinkingBlocks = done.message.content.filter((c) => c.type === "thinking").map((c) => c.thinking);
294
+ assert.deepEqual(thinkingBlocks, ["first-thought", "second-thought"]);
295
+ }
296
+ });
297
+
298
+ test("parses multiple transcript tool calls from assistant text", async () => {
299
+ __setCursorAgentFactoryForTests(async () =>
300
+ makeFakeAgent([
301
+ {
302
+ type: "assistant",
303
+ message: {
304
+ role: "assistant",
305
+ content: [
306
+ {
307
+ type: "text",
308
+ text:
309
+ "⏺ Shell\n```json\n{\"command\":\"echo one\"}\n```\n\n⏺ Shell\n```json\n{\"command\":\"echo two\"}\n```",
310
+ },
311
+ ],
312
+ },
313
+ },
314
+ ]),
315
+ );
316
+
317
+ const streamSimple = getStreamSimple();
318
+ const { model, context } = makeModelAndContext();
319
+ const events = await collectEvents(streamSimple(model, context));
320
+
321
+ assert.equal(events.filter((e) => e.type === "toolcall_start").length, 2);
322
+ const done = events.find((e) => e.type === "done");
323
+ assert.ok(done && done.reason === "toolUse");
324
+ });
325
+
326
+ test("does not parse mirrored transcript output blocks as new tool calls", async () => {
327
+ __setCursorAgentFactoryForTests(async () =>
328
+ makeFakeAgent([
329
+ {
330
+ type: "assistant",
331
+ message: {
332
+ role: "assistant",
333
+ content: [
334
+ {
335
+ type: "text",
336
+ text:
337
+ "⏺ Shell\n\n```json\n{\"command\":\"echo hi\"}\n```\n\n```\n{\"stdout\":\"hi\\n\"}\n```",
338
+ },
339
+ ],
340
+ },
341
+ },
342
+ ]),
343
+ );
344
+
345
+ const streamSimple = getStreamSimple();
346
+ const { model, context } = makeModelAndContext();
347
+ const events = await collectEvents(streamSimple(model, context));
348
+
349
+ assert.equal(events.filter((e) => e.type === "toolcall_start").length, 0);
350
+ const done = events.find((e) => e.type === "done");
351
+ assert.ok(done && done.reason === "stop");
352
+ });
353
+
354
+ test("keeps normal lines starting with Thinking", async () => {
355
+ __setCursorAgentFactoryForTests(async () =>
356
+ makeFakeAgent([
357
+ {
358
+ type: "assistant",
359
+ message: { role: "assistant", content: [{ type: "text", text: "Thinking clearly matters for this skill read flow." }] },
360
+ },
361
+ ]),
362
+ );
363
+
364
+ const streamSimple = getStreamSimple();
365
+ const { model, context } = makeModelAndContext();
366
+ const events = await collectEvents(streamSimple(model, context));
367
+ const done = events.find((e) => e.type === "done");
368
+ assert.ok(done?.type === "done");
369
+ if (done?.type === "done") {
370
+ const text = done.message.content.filter((c) => c.type === "text").map((c) => c.text).join("");
371
+ assert.match(text, /Thinking clearly matters/);
372
+ }
373
+ });
374
+
375
+ test("emits tool call without redundant transcript text", async () => {
376
+ __setCursorAgentFactoryForTests(async () =>
377
+ makeFakeAgent([
378
+ { type: "tool_call", call_id: "c1", name: "shell", status: "running", args: { command: "echo hi" } },
379
+ {
380
+ type: "tool_call",
381
+ call_id: "c1",
382
+ name: "shell",
383
+ status: "completed",
384
+ args: { command: "echo hi" },
385
+ result: { stdout: "hi\n", exitCode: 0 },
386
+ },
387
+ ]),
388
+ );
389
+
390
+ const streamSimple = getStreamSimple();
391
+ const { model, context } = makeModelAndContext();
392
+ const events = await collectEvents(streamSimple(model, context));
393
+
394
+ assert.equal(events.filter((e) => e.type === "toolcall_start").length, 1);
395
+ const done = events.find((e) => e.type === "done");
396
+ assert.ok(done && done.reason === "toolUse");
397
+ if (done?.type === "done") {
398
+ const text = done.message.content.filter((c) => c.type === "text").map((c) => c.text).join("\n");
399
+ assert.equal(text.trim(), "");
400
+ }
401
+ });
402
+
403
+ test("remaps cursor edit path-only tool call to read tool", async () => {
404
+ __setCursorAgentFactoryForTests(async () =>
405
+ makeFakeAgent([
406
+ {
407
+ type: "tool_call",
408
+ call_id: "edit_1",
409
+ name: "edit",
410
+ status: "running",
411
+ args: { path: "/home/aryaniyaps/ai-projects/ultimate-pi/vault/wiki/index.md" },
412
+ },
413
+ ]),
414
+ );
415
+
416
+ const streamSimple = getStreamSimple();
417
+ const { model, context } = makeModelAndContext();
418
+ context.tools = [
419
+ { name: "edit", description: "Edit file", parameters: { type: "object" } },
420
+ { name: "ReadFile", description: "Read file", parameters: { type: "object" } },
421
+ ];
422
+ const events = await collectEvents(streamSimple(model, context));
423
+ const done = events.find((e) => e.type === "done");
424
+ assert.ok(done && done.reason === "toolUse");
425
+ if (done?.type === "done") {
426
+ const call = done.message.content.find((c) => c.type === "toolCall");
427
+ assert.ok(call && call.type === "toolCall");
428
+ if (call && call.type === "toolCall") {
429
+ assert.equal(call.name, "ReadFile");
430
+ assert.equal(call.arguments.path, "/home/aryaniyaps/ai-projects/ultimate-pi/vault/wiki/index.md");
431
+ }
432
+ }
433
+ });
434
+
435
+ test("handles abort signal and returns aborted error", async () => {
436
+ __setCursorAgentFactoryForTests(async () =>
437
+ makeFakeAgent([{ type: "assistant", message: { role: "assistant", content: [{ type: "text", text: "x" }] } }]),
438
+ );
439
+ const streamSimple = getStreamSimple();
440
+ const { model, context } = makeModelAndContext();
441
+ const controller = new AbortController();
442
+ const stream = streamSimple(model, context, { signal: controller.signal });
443
+ controller.abort();
444
+ const events = await collectEvents(stream);
445
+ const errorEvent = events.find((e) => e.type === "error");
446
+ assert.ok(errorEvent && errorEvent.reason === "aborted");
447
+ });
448
+
449
+ test("handles empty assistant output gracefully", async () => {
450
+ __setCursorAgentFactoryForTests(async () => makeFakeAgent([], { status: "finished", result: "" }));
451
+ const streamSimple = getStreamSimple();
452
+ const { model, context } = makeModelAndContext();
453
+ const events = await collectEvents(streamSimple(model, context));
454
+ const done = events.find((e) => e.type === "done");
455
+ assert.ok(done && done.reason === "stop");
456
+ });
457
+
458
+ test("preserves unicode surrogate pairs in text stream", async () => {
459
+ const emoji = "🙂";
460
+ __setCursorAgentFactoryForTests(async () =>
461
+ makeFakeAgent([
462
+ { type: "assistant", message: { role: "assistant", content: [{ type: "text", text: `ok ${emoji}` }] } },
463
+ ]),
464
+ );
465
+
466
+ const streamSimple = getStreamSimple();
467
+ const { model, context } = makeModelAndContext();
468
+ const events = await collectEvents(streamSimple(model, context));
469
+ const done = events.find((e) => e.type === "done");
470
+ assert.ok(done?.type === "done");
471
+ if (done?.type === "done") {
472
+ const text = done.message.content.filter((c) => c.type === "text").map((c) => c.text).join("");
473
+ assert.equal(text, `ok ${emoji}`);
474
+ }
475
+ });
476
+