@herbertgao/pi-extensions 2026.8.11 → 2026.8.13

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 (476) hide show
  1. package/README.md +23 -10
  2. package/{node_modules/@herbertgao/pi-mermaid-open/LICENSE → THIRD_PARTY_NOTICES.md} +19 -1
  3. package/node_modules/@czottmann/pi-automode/CHANGELOG.md +15 -0
  4. package/node_modules/@czottmann/pi-automode/README.md +5 -3
  5. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-001-permission-precedence-and-trust-boundaries.md +2 -0
  6. package/node_modules/@czottmann/pi-automode/docs/adr/ADR-002-global-config-in-extension-data-directory.md +60 -0
  7. package/node_modules/@czottmann/pi-automode/docs/adr/INDEX.md +1 -0
  8. package/node_modules/@czottmann/pi-automode/docs/automode-classifier-flow.md +4 -4
  9. package/node_modules/@czottmann/pi-automode/docs/configuration.md +20 -4
  10. package/node_modules/@czottmann/pi-automode/docs/observability-logging.md +1 -1
  11. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/bash.ts +692 -0
  12. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/config.ts +181 -3
  13. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/constants.ts +4 -1
  14. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/extension.ts +143 -36
  15. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/hard-deny.ts +103 -148
  16. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/paths.ts +32 -6
  17. package/node_modules/@czottmann/pi-automode/extensions/auto-mode/permissions.ts +344 -22
  18. package/node_modules/@czottmann/pi-automode/extensions/auto-mode.ts +1 -0
  19. package/node_modules/@czottmann/pi-automode/package.json +4 -1
  20. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -1
  21. package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -1
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +4 -0
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +21 -1
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +1 -1
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +19 -19
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +4 -2
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +2 -1
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +10 -2
  29. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  30. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +10 -0
  31. package/node_modules/@herbertgao/pi-subagents/README.md +21 -15
  32. package/node_modules/@herbertgao/pi-subagents/package.json +3 -3
  33. package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +11 -8
  34. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +184 -106
  35. package/node_modules/@herbertgao/pi-subagents/src/cross-extension-rpc.ts +31 -11
  36. package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +9 -1
  37. package/node_modules/@herbertgao/pi-subagents/src/index.ts +156 -31
  38. package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +17 -0
  39. package/node_modules/@herbertgao/pi-subagents/src/model-resolver.ts +14 -0
  40. package/node_modules/@herbertgao/pi-subagents/src/schedule.ts +8 -0
  41. package/node_modules/@herbertgao/pi-subagents/src/settings.ts +32 -1
  42. package/node_modules/@herbertgao/pi-subagents/src/types.ts +17 -2
  43. package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +23 -2
  44. package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +259 -24
  45. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
  46. package/node_modules/@luxusai/pi-hindsight/CHANGELOG.md +376 -0
  47. package/node_modules/@luxusai/pi-hindsight/README.md +92 -0
  48. package/node_modules/@luxusai/pi-hindsight/docs/adr/001-memory-lifecycle-and-scope.md +56 -0
  49. package/node_modules/@luxusai/pi-hindsight/docs/adr/002-explicit-routing-strategy-seam.md +169 -0
  50. package/node_modules/@luxusai/pi-hindsight/docs/adr/003-tui-memory-mode-vocabulary.md +107 -0
  51. package/node_modules/@luxusai/pi-hindsight/docs/adr/004-lifeos-dual-bank-design.md +89 -0
  52. package/node_modules/@luxusai/pi-hindsight/docs/adr/005-domain-banks-and-agent-first-surface.md +189 -0
  53. package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark.webp +0 -0
  54. package/node_modules/@luxusai/pi-hindsight/docs/assets/logos/pi-hindsight-logo-dark@2x.webp +0 -0
  55. package/node_modules/@luxusai/pi-hindsight/docs/coding-memory-evaluation.md +54 -0
  56. package/node_modules/@luxusai/pi-hindsight/docs/compatibility.md +75 -0
  57. package/node_modules/@luxusai/pi-hindsight/docs/hindsight-core-functions.md +300 -0
  58. package/node_modules/@luxusai/pi-hindsight/docs/mission-and-mental-model-quality.md +158 -0
  59. package/node_modules/@luxusai/pi-hindsight/docs/next-opt-out-design.md +164 -0
  60. package/node_modules/@luxusai/pi-hindsight/docs/risky-memory-modes.md +139 -0
  61. package/node_modules/@luxusai/pi-hindsight/docs/starter-mental-model-suggestions.md +74 -0
  62. package/node_modules/@luxusai/pi-hindsight/docs/surface-reference.md +261 -0
  63. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-operations.ts +151 -0
  64. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-selection.ts +18 -0
  65. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-settings-presenter.ts +46 -0
  66. package/node_modules/@luxusai/pi-hindsight/extensions/banks/bank-templates.ts +383 -0
  67. package/node_modules/@luxusai/pi-hindsight/extensions/banks/banking.ts +240 -0
  68. package/node_modules/@luxusai/pi-hindsight/extensions/banks/knowledge-page-seed.ts +176 -0
  69. package/node_modules/@luxusai/pi-hindsight/extensions/banks/retain-strategies.ts +178 -0
  70. package/node_modules/@luxusai/pi-hindsight/extensions/client/client-retry.ts +41 -0
  71. package/node_modules/@luxusai/pi-hindsight/extensions/client/client.ts +386 -0
  72. package/node_modules/@luxusai/pi-hindsight/extensions/client/fetch-compat.ts +39 -0
  73. package/node_modules/@luxusai/pi-hindsight/extensions/client/timeout.ts +34 -0
  74. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-defaults.ts +140 -0
  75. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-model.ts +61 -0
  76. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-editing-registry.ts +925 -0
  77. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-field-paths.ts +247 -0
  78. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-normalize.ts +547 -0
  79. package/node_modules/@luxusai/pi-hindsight/extensions/config/config-writer.ts +480 -0
  80. package/node_modules/@luxusai/pi-hindsight/extensions/config/config.ts +182 -0
  81. package/node_modules/@luxusai/pi-hindsight/extensions/config/setup-gate.ts +86 -0
  82. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-execute.ts +1010 -0
  83. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-parse.ts +175 -0
  84. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-plan.ts +425 -0
  85. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-presentation.ts +210 -0
  86. package/node_modules/@luxusai/pi-hindsight/extensions/imports/import-sessions.ts +817 -0
  87. package/node_modules/@luxusai/pi-hindsight/extensions/index.ts +25 -0
  88. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/git-seed.ts +319 -0
  89. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-recall.ts +196 -0
  90. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-retain.ts +189 -0
  91. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle-runtime.ts +65 -0
  92. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/memory-lifecycle.ts +260 -0
  93. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/mental-models.ts +244 -0
  94. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/observation-scopes.ts +59 -0
  95. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-cleanup.ts +82 -0
  96. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall-visibility.ts +45 -0
  97. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/recall.ts +331 -0
  98. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-cursor.ts +354 -0
  99. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-job-builder.ts +66 -0
  100. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain-receipts.ts +132 -0
  101. package/node_modules/@luxusai/pi-hindsight/extensions/lifecycle/retain.ts +228 -0
  102. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-bank-template-operations.ts +74 -0
  103. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-config-operations.ts +16 -0
  104. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-control-operations.ts +648 -0
  105. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-diagnostics-operations.ts +105 -0
  106. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-identity.ts +68 -0
  107. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-service.ts +71 -0
  108. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-operation-types.ts +13 -0
  109. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-recall-operations.ts +162 -0
  110. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-retain-operations.ts +131 -0
  111. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-scope.ts +104 -0
  112. package/node_modules/@luxusai/pi-hindsight/extensions/operations/memory-session-operations.ts +37 -0
  113. package/node_modules/@luxusai/pi-hindsight/extensions/operations/operation-catalog.ts +893 -0
  114. package/node_modules/@luxusai/pi-hindsight/extensions/operations/reflect-presenter.ts +35 -0
  115. package/node_modules/@luxusai/pi-hindsight/extensions/operations/scope-migrate.ts +177 -0
  116. package/node_modules/@luxusai/pi-hindsight/extensions/operations/tools.ts +7 -0
  117. package/node_modules/@luxusai/pi-hindsight/extensions/queue/flush-presenter.ts +21 -0
  118. package/node_modules/@luxusai/pi-hindsight/extensions/queue/jsonl-queue-store.ts +112 -0
  119. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-delivery.ts +111 -0
  120. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-lock.ts +214 -0
  121. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue-operations.ts +70 -0
  122. package/node_modules/@luxusai/pi-hindsight/extensions/queue/queue.ts +392 -0
  123. package/node_modules/@luxusai/pi-hindsight/extensions/tui/bank-template-presentation.ts +45 -0
  124. package/node_modules/@luxusai/pi-hindsight/extensions/tui/commands.ts +9 -0
  125. package/node_modules/@luxusai/pi-hindsight/extensions/tui/guided-setup.ts +860 -0
  126. package/node_modules/@luxusai/pi-hindsight/extensions/tui/prefill-input.ts +105 -0
  127. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-flow.ts +189 -0
  128. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-server-probe.ts +299 -0
  129. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-actions.ts +201 -0
  130. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-facts.ts +47 -0
  131. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-render.ts +239 -0
  132. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui-types.ts +50 -0
  133. package/node_modules/@luxusai/pi-hindsight/extensions/tui/setup-tui.ts +259 -0
  134. package/node_modules/@luxusai/pi-hindsight/extensions/tui/tool-presenters.ts +77 -0
  135. package/node_modules/@luxusai/pi-hindsight/extensions/types.ts +534 -0
  136. package/node_modules/@luxusai/pi-hindsight/extensions/utils/diagnostics.ts +319 -0
  137. package/node_modules/@luxusai/pi-hindsight/extensions/utils/messages.ts +325 -0
  138. package/node_modules/@luxusai/pi-hindsight/extensions/utils/sanitize.ts +42 -0
  139. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-memory-meta.ts +244 -0
  140. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session-operations.ts +56 -0
  141. package/node_modules/@luxusai/pi-hindsight/extensions/utils/session.ts +50 -0
  142. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-fields.ts +167 -0
  143. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status-health.ts +207 -0
  144. package/node_modules/@luxusai/pi-hindsight/extensions/utils/status.ts +120 -0
  145. package/node_modules/@luxusai/pi-hindsight/extensions/version.ts +8 -0
  146. package/node_modules/@luxusai/pi-hindsight/package.json +118 -0
  147. package/node_modules/@luxusai/pi-hindsight/skills/hindsight-memory-doctor/SKILL.md +75 -0
  148. package/node_modules/@narumitw/pi-btw/dist/index.ts +143 -46
  149. package/node_modules/@narumitw/pi-btw/dist/index.ts.map +3 -3
  150. package/node_modules/@narumitw/pi-btw/package.json +6 -6
  151. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +136 -22
  152. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/README.md +2 -4
  153. package/node_modules/{@herbertgao → @tifan}/pi-copy-response/package.json +5 -15
  154. package/node_modules/{@herbertgao → @tifan}/pi-handoff/README.md +4 -6
  155. package/node_modules/@tifan/pi-handoff/package.json +43 -0
  156. package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/index.ts +1 -1
  157. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/README.md +2 -4
  158. package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/package.json +5 -15
  159. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/README.md +5 -7
  160. package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/package.json +5 -19
  161. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/README.md +4 -6
  162. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/package.json +6 -16
  163. package/node_modules/{@herbertgao → @tifan}/pi-preferred-thinking/src/index.ts +1 -6
  164. package/node_modules/{@herbertgao → @tifan}/pi-recap/README.md +4 -6
  165. package/node_modules/@tifan/pi-recap/package.json +42 -0
  166. package/node_modules/{@herbertgao → @tifan}/pi-recap/src/models.ts +1 -6
  167. package/node_modules/{@herbertgao → @tifan}/pi-rename/README.md +13 -8
  168. package/node_modules/@tifan/pi-rename/package.json +47 -0
  169. package/node_modules/@tifan/pi-rename/src/herdr-label.ts +4 -0
  170. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/index.ts +4 -16
  171. package/node_modules/{@herbertgao → @tifan}/pi-rename/src/models.ts +1 -6
  172. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/README.md +2 -4
  173. package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/package.json +5 -15
  174. package/node_modules/pi-lens/CHANGELOG.md +96 -1
  175. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +2 -1
  176. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +14 -5
  177. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +48 -18
  178. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +1 -3
  179. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +16 -4
  180. package/node_modules/pi-lens/dist/clients/bash-file-access.js +3 -1
  181. package/node_modules/pi-lens/dist/clients/biome-client.js +1 -3
  182. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +21 -8
  183. package/node_modules/pi-lens/dist/clients/bounded-cache.js +24 -8
  184. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +4 -3
  185. package/node_modules/pi-lens/dist/clients/cache-manager.js +6 -7
  186. package/node_modules/pi-lens/dist/clients/cache-observability.js +461 -66
  187. package/node_modules/pi-lens/dist/clients/call-graph.js +238 -63
  188. package/node_modules/pi-lens/dist/clients/codebase-model.js +13 -5
  189. package/node_modules/pi-lens/dist/clients/complexity-client.js +1 -3
  190. package/node_modules/pi-lens/dist/clients/dead-code-client.js +19 -8
  191. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +1 -2
  192. package/node_modules/pi-lens/dist/clients/deadline-utils.js +3 -1
  193. package/node_modules/pi-lens/dist/clients/debug-heap.js +8 -1
  194. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +1 -1
  195. package/node_modules/pi-lens/dist/clients/dependency-checker.js +11 -7
  196. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +39 -2
  197. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +5 -1
  198. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +2 -3
  199. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +13 -1
  200. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +3 -1
  201. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +2 -1
  202. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +1 -1
  203. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +9 -4
  204. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +3 -1
  205. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +6 -2
  206. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +31 -7
  207. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +5 -2
  208. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +10 -14
  209. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +5 -1
  210. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +1 -1
  211. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +3 -1
  212. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +25 -6
  213. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +1 -1
  214. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +1 -1
  215. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +3 -1
  216. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +13 -8
  217. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +4 -1
  218. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +25 -10
  219. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +1 -1
  220. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +1 -1
  221. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +1 -1
  222. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +28 -4
  223. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +6 -8
  224. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +212 -11
  225. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +1 -1
  226. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +8 -4
  227. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -6
  228. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +23 -14
  229. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +1 -1
  230. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +7 -9
  231. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +5 -2
  232. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +7 -7
  233. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +6 -8
  234. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +13 -8
  235. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +13 -8
  236. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +17 -3
  237. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +7 -1
  238. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +24 -1
  239. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +35 -0
  240. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +1 -3
  241. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +6 -8
  242. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +1 -1
  243. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +2 -1
  244. package/node_modules/pi-lens/dist/clients/dispatch/types.js +6 -1
  245. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +6 -2
  246. package/node_modules/pi-lens/dist/clients/extension-log.js +5 -3
  247. package/node_modules/pi-lens/dist/clients/feature-hints.js +8 -1
  248. package/node_modules/pi-lens/dist/clients/file-kinds.js +34 -129
  249. package/node_modules/pi-lens/dist/clients/file-utils.js +17 -1
  250. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +57 -2
  251. package/node_modules/pi-lens/dist/clients/formatters.js +144 -27
  252. package/node_modules/pi-lens/dist/clients/freshness.js +38 -0
  253. package/node_modules/pi-lens/dist/clients/git-guard.js +43 -13
  254. package/node_modules/pi-lens/dist/clients/go-client.js +1 -3
  255. package/node_modules/pi-lens/dist/clients/grammar-source.js +1 -1
  256. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +30 -4
  257. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +1 -3
  258. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +4 -2
  259. package/node_modules/pi-lens/dist/clients/installer/index.js +86 -77
  260. package/node_modules/pi-lens/dist/clients/instance-reaper.js +5 -2
  261. package/node_modules/pi-lens/dist/clients/instance-registry.js +4 -2
  262. package/node_modules/pi-lens/dist/clients/jscpd-client.js +6 -1
  263. package/node_modules/pi-lens/dist/clients/knip-client.js +29 -15
  264. package/node_modules/pi-lens/dist/clients/language-profile.js +4 -1
  265. package/node_modules/pi-lens/dist/clients/latency-logger.js +13 -2
  266. package/node_modules/pi-lens/dist/clients/lens-config.js +1 -1
  267. package/node_modules/pi-lens/dist/clients/lens-map.js +8 -3
  268. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +1 -1
  269. package/node_modules/pi-lens/dist/clients/lsp/config.js +4 -6
  270. package/node_modules/pi-lens/dist/clients/lsp/edits.js +119 -32
  271. package/node_modules/pi-lens/dist/clients/lsp/index.js +94 -35
  272. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +2 -1
  273. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +4 -1
  274. package/node_modules/pi-lens/dist/clients/lsp/launch.js +11 -3
  275. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +152 -0
  276. package/node_modules/pi-lens/dist/clients/lsp/server.js +19 -7
  277. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +10 -2
  278. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +9 -4
  279. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +1 -3
  280. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +10 -20
  281. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +1 -1
  282. package/node_modules/pi-lens/dist/clients/memory-sampler.js +73 -7
  283. package/node_modules/pi-lens/dist/clients/metrics-client.js +1 -3
  284. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +8 -3
  285. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +7 -1
  286. package/node_modules/pi-lens/dist/clients/module-report.js +14 -17
  287. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +3 -5
  288. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +220 -0
  289. package/node_modules/pi-lens/dist/clients/package-manager.js +6 -1
  290. package/node_modules/pi-lens/dist/clients/pipeline.js +57 -9
  291. package/node_modules/pi-lens/dist/clients/project-conventions.js +2 -8
  292. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +10 -7
  293. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +2 -1
  294. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +3 -1
  295. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +13 -9
  296. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +3 -1
  297. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -2
  298. package/node_modules/pi-lens/dist/clients/project-lens-config.js +12 -5
  299. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +48 -0
  300. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +15 -1
  301. package/node_modules/pi-lens/dist/clients/project-snapshot.js +472 -66
  302. package/node_modules/pi-lens/dist/clients/read-expansion.js +12 -2
  303. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +5 -4
  304. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +5 -2
  305. package/node_modules/pi-lens/dist/clients/read-guard.js +1 -1
  306. package/node_modules/pi-lens/dist/clients/resource-sampler.js +1 -1
  307. package/node_modules/pi-lens/dist/clients/reverse-deps.js +6 -5
  308. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +42 -17
  309. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +8 -2
  310. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +10 -1
  311. package/node_modules/pi-lens/dist/clients/review-graph/query.js +2 -1
  312. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +4 -2
  313. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +2 -2
  314. package/node_modules/pi-lens/dist/clients/ruff-client.js +6 -5
  315. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +63 -31
  316. package/node_modules/pi-lens/dist/clients/runtime-context.js +12 -4
  317. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +83 -4
  318. package/node_modules/pi-lens/dist/clients/runtime-session.js +14 -0
  319. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +59 -3
  320. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +148 -34
  321. package/node_modules/pi-lens/dist/clients/runtime-turn.js +147 -6
  322. package/node_modules/pi-lens/dist/clients/rust-client.js +1 -3
  323. package/node_modules/pi-lens/dist/clients/safe-spawn.js +150 -11
  324. package/node_modules/pi-lens/dist/clients/security-scan-client.js +1 -3
  325. package/node_modules/pi-lens/dist/clients/session-summary.js +3 -1
  326. package/node_modules/pi-lens/dist/clients/sg-runner.js +1 -3
  327. package/node_modules/pi-lens/dist/clients/source-filter.js +10 -6
  328. package/node_modules/pi-lens/dist/clients/source-walker.js +1 -1
  329. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +96 -0
  330. package/node_modules/pi-lens/dist/clients/startup-scan.js +4 -1
  331. package/node_modules/pi-lens/dist/clients/tool-definition.js +7 -0
  332. package/node_modules/pi-lens/dist/clients/tool-policy.js +26 -11
  333. package/node_modules/pi-lens/dist/clients/tool-render.js +2 -1
  334. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +10 -4
  335. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +2 -2
  336. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +12 -5
  337. package/node_modules/pi-lens/dist/clients/warm-attach.js +12 -5
  338. package/node_modules/pi-lens/dist/clients/widget-state.js +27 -11
  339. package/node_modules/pi-lens/dist/clients/word-index.js +3 -1
  340. package/node_modules/pi-lens/dist/clients/workspace-topology.js +8 -2
  341. package/node_modules/pi-lens/dist/clients/zizmor-config.js +9 -1
  342. package/node_modules/pi-lens/dist/i18n.js +13 -5
  343. package/node_modules/pi-lens/dist/index.js +10797 -8627
  344. package/node_modules/pi-lens/dist/mcp/server.js +3 -1
  345. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +68 -12
  346. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +21 -7
  347. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +164 -35
  348. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +24 -7
  349. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +3 -1
  350. package/node_modules/pi-lens/dist/tools/module-report.js +1 -1
  351. package/node_modules/pi-lens/dist/tools/project-report.js +1 -1
  352. package/node_modules/pi-lens/dist/tools/symbol-search.js +5 -2
  353. package/node_modules/pi-lens/docs/durable-store-audit-1202.md +1 -1
  354. package/node_modules/pi-lens/docs/servercapabilities.md +1 -1
  355. package/node_modules/pi-lens/package.json +160 -156
  356. package/node_modules/pi-lens/rules/typos/_typos.toml +2 -2
  357. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +31 -13
  358. package/node_modules/pi-lens/scripts/download-grammars.js +9 -3
  359. package/node_modules/pi-lens/scripts/rpc-load-check.mjs +30 -9
  360. package/node_modules/pi-mcp-adapter/CHANGELOG.md +47 -0
  361. package/node_modules/pi-mcp-adapter/README.md +42 -13
  362. package/node_modules/pi-mcp-adapter/commands.ts +4 -2
  363. package/node_modules/pi-mcp-adapter/config.ts +45 -5
  364. package/node_modules/pi-mcp-adapter/direct-tools.ts +103 -92
  365. package/node_modules/pi-mcp-adapter/dist/agent-dir.d.ts +10 -0
  366. package/node_modules/pi-mcp-adapter/dist/agent-dir.js +63 -0
  367. package/node_modules/pi-mcp-adapter/dist/agent-dir.js.map +1 -0
  368. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.d.ts +8 -0
  369. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js +356 -0
  370. package/node_modules/pi-mcp-adapter/dist/agent-plugin-loader.js.map +1 -0
  371. package/node_modules/pi-mcp-adapter/dist/config.d.ts +123 -0
  372. package/node_modules/pi-mcp-adapter/dist/config.js +1087 -0
  373. package/node_modules/pi-mcp-adapter/dist/config.js.map +1 -0
  374. package/node_modules/pi-mcp-adapter/dist/metadata-cache.d.ts +19 -0
  375. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js +319 -0
  376. package/node_modules/pi-mcp-adapter/dist/metadata-cache.js.map +1 -0
  377. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.d.ts +2 -0
  378. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js +156 -0
  379. package/node_modules/pi-mcp-adapter/dist/package-mcp-loader.js.map +1 -0
  380. package/node_modules/pi-mcp-adapter/dist/resource-tools.d.ts +1 -0
  381. package/node_modules/pi-mcp-adapter/dist/resource-tools.js +15 -0
  382. package/node_modules/pi-mcp-adapter/dist/resource-tools.js.map +1 -0
  383. package/node_modules/pi-mcp-adapter/dist/types.d.ts +564 -0
  384. package/node_modules/pi-mcp-adapter/dist/types.js +287 -0
  385. package/node_modules/pi-mcp-adapter/dist/types.js.map +1 -0
  386. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.d.ts +6 -0
  387. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js +37 -0
  388. package/node_modules/pi-mcp-adapter/dist/ui-app-bridge-helpers.js.map +1 -0
  389. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.d.ts +104 -0
  390. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js +59 -0
  391. package/node_modules/pi-mcp-adapter/dist/ui-stream-types.js.map +1 -0
  392. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.d.ts +4 -0
  393. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js +27 -0
  394. package/node_modules/pi-mcp-adapter/dist/ui-tool-visibility.js.map +1 -0
  395. package/node_modules/pi-mcp-adapter/dist/utils.d.ts +32 -0
  396. package/node_modules/pi-mcp-adapter/dist/utils.js +338 -0
  397. package/node_modules/pi-mcp-adapter/dist/utils.js.map +1 -0
  398. package/node_modules/pi-mcp-adapter/failure-backoff.ts +23 -0
  399. package/node_modules/pi-mcp-adapter/index.ts +204 -82
  400. package/node_modules/pi-mcp-adapter/init.ts +41 -30
  401. package/node_modules/pi-mcp-adapter/lifecycle.ts +16 -8
  402. package/node_modules/pi-mcp-adapter/mcp-code.ts +2 -0
  403. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +66 -16
  404. package/node_modules/pi-mcp-adapter/mcp-output-guard.ts +95 -7
  405. package/node_modules/pi-mcp-adapter/mcp-probe.ts +18 -4
  406. package/node_modules/pi-mcp-adapter/mcp-references.ts +368 -0
  407. package/node_modules/pi-mcp-adapter/mcp-status.ts +8 -19
  408. package/node_modules/pi-mcp-adapter/metadata-cache.ts +20 -12
  409. package/node_modules/pi-mcp-adapter/namespace-tools.ts +276 -0
  410. package/node_modules/pi-mcp-adapter/package.json +24 -6
  411. package/node_modules/pi-mcp-adapter/proxy-modes.ts +66 -10
  412. package/node_modules/pi-mcp-adapter/search-ranking.ts +2 -0
  413. package/node_modules/pi-mcp-adapter/server-manager.ts +63 -12
  414. package/node_modules/pi-mcp-adapter/state.ts +1 -3
  415. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +16 -2
  416. package/node_modules/pi-mcp-adapter/types.ts +48 -1
  417. package/node_modules/pi-mcp-adapter/ui-server.ts +3 -19
  418. package/node_modules/pi-mcp-adapter/ui-session.ts +2 -1
  419. package/node_modules/pi-mcp-adapter/utils.ts +21 -19
  420. package/node_modules/pi-web-access/CHANGELOG.md +26 -0
  421. package/node_modules/pi-web-access/README.md +71 -14
  422. package/node_modules/pi-web-access/chrome-cookies.ts +115 -35
  423. package/node_modules/pi-web-access/credential-source.ts +6 -2
  424. package/node_modules/pi-web-access/curator-page.ts +5 -3
  425. package/node_modules/pi-web-access/curator-server.ts +2 -1
  426. package/node_modules/pi-web-access/extract.ts +89 -9
  427. package/node_modules/pi-web-access/fetch-params.ts +13 -0
  428. package/node_modules/pi-web-access/gemini-adc.ts +298 -0
  429. package/node_modules/pi-web-access/gemini-api.ts +59 -15
  430. package/node_modules/pi-web-access/gemini-search.ts +58 -18
  431. package/node_modules/pi-web-access/gemini-url-context.ts +3 -2
  432. package/node_modules/pi-web-access/gemini-web-config.ts +57 -7
  433. package/node_modules/pi-web-access/gemini-web.ts +9 -3
  434. package/node_modules/pi-web-access/github-api.ts +5 -4
  435. package/node_modules/pi-web-access/github-issue-pr.ts +700 -0
  436. package/node_modules/pi-web-access/index.ts +403 -297
  437. package/node_modules/pi-web-access/kimi-search.ts +234 -0
  438. package/node_modules/pi-web-access/openai-search.ts +118 -21
  439. package/node_modules/pi-web-access/package.json +3 -2
  440. package/node_modules/pi-web-access/ssrf-protection.ts +4 -1
  441. package/node_modules/pi-web-access/utils.ts +307 -1
  442. package/node_modules/pi-web-access/youtube-extract.ts +2 -2
  443. package/package.json +46 -37
  444. package/node_modules/@herbertgao/pi-copy-response/CHANGELOG.md +0 -49
  445. package/node_modules/@herbertgao/pi-copy-response/LICENSE +0 -22
  446. package/node_modules/@herbertgao/pi-handoff/CHANGELOG.md +0 -83
  447. package/node_modules/@herbertgao/pi-handoff/LICENSE +0 -22
  448. package/node_modules/@herbertgao/pi-handoff/package.json +0 -60
  449. package/node_modules/@herbertgao/pi-inline-skills/CHANGELOG.md +0 -57
  450. package/node_modules/@herbertgao/pi-inline-skills/LICENSE +0 -22
  451. package/node_modules/@herbertgao/pi-mermaid-open/CHANGELOG.md +0 -39
  452. package/node_modules/@herbertgao/pi-preferred-thinking/CHANGELOG.md +0 -63
  453. package/node_modules/@herbertgao/pi-preferred-thinking/LICENSE +0 -22
  454. package/node_modules/@herbertgao/pi-recap/CHANGELOG.md +0 -101
  455. package/node_modules/@herbertgao/pi-recap/LICENSE +0 -22
  456. package/node_modules/@herbertgao/pi-recap/package.json +0 -55
  457. package/node_modules/@herbertgao/pi-rename/CHANGELOG.md +0 -49
  458. package/node_modules/@herbertgao/pi-rename/LICENSE +0 -22
  459. package/node_modules/@herbertgao/pi-rename/package.json +0 -63
  460. package/node_modules/@herbertgao/pi-titlebar-spinner/CHANGELOG.md +0 -25
  461. package/node_modules/@herbertgao/pi-titlebar-spinner/LICENSE +0 -22
  462. /package/node_modules/{@herbertgao → @tifan}/pi-copy-response/src/index.ts +0 -0
  463. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/complete-text.ts +0 -0
  464. /package/node_modules/{@herbertgao → @tifan}/pi-handoff/src/session-query.ts +0 -0
  465. /package/node_modules/{@herbertgao → @tifan}/pi-inline-skills/src/index.ts +0 -0
  466. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/herdr-plugin.toml +0 -0
  467. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/herdr-plugin/viewer.mjs +0 -0
  468. /package/node_modules/{@herbertgao → @tifan}/pi-mermaid-open/src/index.ts +0 -0
  469. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/index.ts +0 -0
  470. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/model-picker.ts +0 -0
  471. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/sanitize.ts +0 -0
  472. /package/node_modules/{@herbertgao → @tifan}/pi-recap/src/tui.ts +0 -0
  473. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/model-picker.ts +0 -0
  474. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/naming.ts +0 -0
  475. /package/node_modules/{@herbertgao → @tifan}/pi-rename/src/sanitize.ts +0 -0
  476. /package/node_modules/{@herbertgao → @tifan}/pi-titlebar-spinner/src/index.ts +0 -0
@@ -77,7 +77,11 @@ import {
77
77
  resolveAgentInvocationConfig,
78
78
  resolveJoinMode,
79
79
  } from "./invocation-config.js"
80
- import { type ModelRegistry, resolveModel } from "./model-resolver.js"
80
+ import {
81
+ describeModel,
82
+ type ModelRegistry,
83
+ resolveModel,
84
+ } from "./model-resolver.js"
81
85
  import {
82
86
  checkModelScope,
83
87
  isScopeModelsEnabled,
@@ -113,6 +117,7 @@ import {
113
117
  type JoinMode,
114
118
  type NotificationDetails,
115
119
  type SubagentType,
120
+ type ViewerMarkdownMode,
116
121
  type WidgetMode,
117
122
  } from "./types.js"
118
123
  import {
@@ -541,6 +546,21 @@ export default function (pi: ExtensionAPI) {
541
546
  widget.update()
542
547
  fleet.update()
543
548
  }
549
+ let showModel = false
550
+ function isShowModelEnabled(): boolean {
551
+ return showModel
552
+ }
553
+ function setShowModel(enabled: boolean): void {
554
+ showModel = enabled
555
+ widget.update()
556
+ }
557
+ let viewerMarkdown: ViewerMarkdownMode = "assistant"
558
+ function getViewerMarkdown(): ViewerMarkdownMode {
559
+ return viewerMarkdown
560
+ }
561
+ function setViewerMarkdown(mode: ViewerMarkdownMode): void {
562
+ viewerMarkdown = mode
563
+ }
544
564
 
545
565
  // ---- Cancellable pending notifications ----
546
566
  // Holds notifications briefly so get_subagent_result can cancel them
@@ -800,6 +820,8 @@ export default function (pi: ExtensionAPI) {
800
820
  // Also internal: it names a transcript directory, so a forged value would
801
821
  // be a path-traversal primitive.
802
822
  delete safeOptions.rootSessionId
823
+ // Every call through this registry is detached, never a blocking tool call.
824
+ delete safeOptions.blocking
803
825
  // Cross-extension callers get the same dispatch contract as the LLM (#183).
804
826
  // The RPC layer already throws for an unresolvable model rather than falling
805
827
  // back silently; a bad agent type should not be quieter. Throws become error
@@ -958,6 +980,7 @@ export default function (pi: ExtensionAPI) {
958
980
  agentActivity,
959
981
  getWidgetMode,
960
982
  isShowCostEnabled,
983
+ isShowModelEnabled,
961
984
  )
962
985
  function setWidgetMode(m: WidgetMode): void {
963
986
  widgetMode = m
@@ -1133,6 +1156,7 @@ export default function (pi: ExtensionAPI) {
1133
1156
  applyAndEmitLoaded(
1134
1157
  {
1135
1158
  setMaxConcurrent: (n) => manager.setMaxConcurrent(n),
1159
+ setMaxConcurrentForeground: (n) => manager.setMaxConcurrentForeground(n),
1136
1160
  setDefaultMaxTurns,
1137
1161
  setGraceTurns,
1138
1162
  setDefaultJoinMode,
@@ -1152,6 +1176,8 @@ export default function (pi: ExtensionAPI) {
1152
1176
  setFallbackSubagent: setFallbackSubagent,
1153
1177
  setReportUsage,
1154
1178
  setShowCost,
1179
+ setShowModel,
1180
+ setViewerMarkdown,
1155
1181
  },
1156
1182
  (event, payload) => pi.events.emit(event, payload),
1157
1183
  )
@@ -1637,20 +1663,27 @@ Terse command-style prompts produce shallow, generic work.
1637
1663
  writeInitialEntry(rec.outputFile, agentId, params.prompt, ctx.cwd)
1638
1664
  }
1639
1665
 
1640
- const parentModelId = ctx.model?.id
1641
- const effectiveModelId = model?.id
1642
- const modelName =
1643
- effectiveModelId && effectiveModelId !== parentModelId
1644
- ? (model?.name ?? effectiveModelId)
1645
- .replace(/^Claude\s+/i, "")
1646
- .toLowerCase()
1647
- : undefined
1666
+ const { modelName, modelId } = model
1667
+ ? describeModel(model)
1668
+ : { modelName: undefined, modelId: undefined }
1669
+ const askedModel = ((asked: string | undefined) => {
1670
+ if (!asked) return undefined
1671
+ const resolvedAsked = resolveModel(asked, ctx.modelRegistry)
1672
+ if (typeof resolvedAsked === "string") return asked
1673
+ return resolvedAsked.provider === model?.provider &&
1674
+ resolvedAsked.id === model?.id
1675
+ ? undefined
1676
+ : asked
1677
+ })(resolvedConfig.overridden?.model)
1648
1678
  const effectiveMaxTurns = normalizeMaxTurns(
1649
1679
  resolvedConfig.maxTurns ?? getDefaultMaxTurns(),
1650
1680
  )
1651
1681
  const agentInvocation: AgentInvocation = {
1652
1682
  modelName,
1683
+ modelId,
1653
1684
  thinking,
1685
+ requestedThinking: resolvedConfig.overridden?.thinking,
1686
+ requestedModel: askedModel,
1654
1687
  // Explicit value only — the default fallback would just add noise.
1655
1688
  // Normalize so `0` (unlimited) doesn't surface as a misleading "max turns: 0".
1656
1689
  maxTurns: normalizeMaxTurns(resolvedConfig.maxTurns),
@@ -1672,6 +1705,23 @@ Terse command-style prompts produce shallow, generic work.
1672
1705
  modelName,
1673
1706
  tags: agentTags.length > 0 ? agentTags : undefined,
1674
1707
  }
1708
+ const detailBaseFor = (
1709
+ rec: AgentRecord | undefined,
1710
+ ): typeof detailBase => {
1711
+ if (!rec?.invocation) return detailBase
1712
+ const { modelName: recModelName, tags } = buildInvocationTags(
1713
+ rec.invocation,
1714
+ )
1715
+ const recModeLabel = getPromptModeLabel(rec.type)
1716
+ const recTags = recModeLabel ? [recModeLabel, ...tags] : tags
1717
+ return {
1718
+ displayName: getDisplayName(rec.type),
1719
+ description: rec.description,
1720
+ subagentType: rec.type,
1721
+ modelName: recModelName,
1722
+ tags: recTags.length > 0 ? recTags : undefined,
1723
+ }
1724
+ }
1675
1725
 
1676
1726
  // ---- Schedule: register a job, don't spawn now ----
1677
1727
  if (params.schedule) {
@@ -1865,9 +1915,7 @@ Terse command-style prompts produce shallow, generic work.
1865
1915
  `\nYou will be notified when this agent completes.\n` +
1866
1916
  `Use get_subagent_result to retrieve full results, or steer_subagent to send it messages.`,
1867
1917
  {
1868
- ...detailBase,
1869
- subagentType: existing.type,
1870
- displayName: existing.type,
1918
+ ...detailBaseFor(record),
1871
1919
  toolUses: record.toolUses,
1872
1920
  tokens: "",
1873
1921
  durationMs: 0,
@@ -1890,12 +1938,12 @@ Terse command-style prompts produce shallow, generic work.
1890
1938
  if (record.status === "error") {
1891
1939
  return textResult(
1892
1940
  `Agent failed: ${record.error}${partialOutputSuffix(record)}`,
1893
- buildDetails(detailBase, record),
1941
+ buildDetails(detailBaseFor(record), record),
1894
1942
  )
1895
1943
  }
1896
1944
  return textResult(
1897
1945
  record.result?.trim() || "No output.",
1898
- buildDetails(detailBase, record),
1946
+ buildDetails(detailBaseFor(record), record),
1899
1947
  )
1900
1948
  }
1901
1949
 
@@ -1990,7 +2038,7 @@ Terse command-style prompts produce shallow, generic work.
1990
2038
  `Use get_subagent_result to retrieve full results, or steer_subagent to send it messages.\n` +
1991
2039
  `Do not duplicate this agent's work.`,
1992
2040
  {
1993
- ...detailBase,
2041
+ ...detailBaseFor(record),
1994
2042
  toolUses: 0,
1995
2043
  tokens: "",
1996
2044
  durationMs: 0,
@@ -2004,10 +2052,11 @@ Terse command-style prompts produce shallow, generic work.
2004
2052
  let spinnerFrame = 0
2005
2053
  const startedAt = Date.now()
2006
2054
  let fgId: string | undefined
2055
+ let queuedAhead: number | undefined
2007
2056
 
2008
2057
  const streamUpdate = () => {
2009
2058
  const details: AgentDetails = {
2010
- ...detailBase,
2059
+ ...detailBaseFor(fgId ? manager.getRecord(fgId) : undefined),
2011
2060
  toolUses: fgState.toolUses,
2012
2061
  tokens: fgId ? formatLifetimeTokens(manager.getRecord(fgId)!) : "",
2013
2062
  cost: fgId
@@ -2017,10 +2066,10 @@ Terse command-style prompts produce shallow, generic work.
2017
2066
  maxTurns: fgState.maxTurns,
2018
2067
  durationMs: Date.now() - startedAt,
2019
2068
  status: "running",
2020
- activity: describeActivity(
2021
- fgState.activeTools,
2022
- fgState.responseText,
2023
- ),
2069
+ activity:
2070
+ queuedAhead === undefined
2071
+ ? describeActivity(fgState.activeTools, fgState.responseText)
2072
+ : `queued — waiting for a foreground slot${queuedAhead > 0 ? ` (${queuedAhead} ahead)` : ""}`,
2024
2073
  spinnerFrame: spinnerFrame % SPINNER.length,
2025
2074
  }
2026
2075
  onUpdate?.({
@@ -2040,6 +2089,10 @@ Terse command-style prompts produce shallow, generic work.
2040
2089
  const origOnSession = fgCallbacks.onSessionCreated
2041
2090
  fgCallbacks.onSessionCreated = (session: any) => {
2042
2091
  origOnSession(session)
2092
+ if (queuedAhead !== undefined) {
2093
+ queuedAhead = undefined
2094
+ streamUpdate()
2095
+ }
2043
2096
  for (const a of manager.listAgents()) {
2044
2097
  if (a.session === session) {
2045
2098
  fgId = a.id
@@ -2090,6 +2143,10 @@ Terse command-style prompts produce shallow, generic work.
2090
2143
  invocation: agentInvocation,
2091
2144
  signal,
2092
2145
  rootSessionId: ctx.sessionManager.getSessionId(),
2146
+ onQueued: (_id, ahead) => {
2147
+ queuedAhead = ahead
2148
+ streamUpdate()
2149
+ },
2093
2150
  ...fgCallbacks,
2094
2151
  },
2095
2152
  (fgAgentId) => {
@@ -2114,7 +2171,7 @@ Terse command-style prompts produce shallow, generic work.
2114
2171
  // Get final token count
2115
2172
  const tokenText = formatLifetimeTokens(record)
2116
2173
 
2117
- const details = buildDetails(detailBase, record, fgState, {
2174
+ const details = buildDetails(detailBaseFor(record), record, fgState, {
2118
2175
  tokens: tokenText,
2119
2176
  })
2120
2177
 
@@ -2553,6 +2610,11 @@ Terse command-style prompts produce shallow, generic work.
2553
2610
  keybindings,
2554
2611
  (message: string) => manager.steer(record.id, message),
2555
2612
  showCost,
2613
+ getViewerMarkdown,
2614
+ (mode) => {
2615
+ setViewerMarkdown(mode)
2616
+ persistSettings(ctx, `Viewer markdown set to ${mode}`)
2617
+ },
2556
2618
  )
2557
2619
  },
2558
2620
  {
@@ -2844,6 +2906,7 @@ Write the file using the write tool. Only write the file, nothing else.`
2844
2906
  {
2845
2907
  description: `Generate ${name} agent`,
2846
2908
  maxTurns: 5,
2909
+ bypassQueue: true,
2847
2910
  },
2848
2911
  )
2849
2912
 
@@ -2968,6 +3031,7 @@ Write the file using the write tool. Only write the file, nothing else.`
2968
3031
  function snapshotSettings() {
2969
3032
  return {
2970
3033
  maxConcurrent: manager.getMaxConcurrent(),
3034
+ maxConcurrentForeground: manager.getMaxConcurrentForeground(),
2971
3035
  // 0 = unlimited — per SubagentsSettings.defaultMaxTurns docstring and
2972
3036
  // normalizeMaxTurns() in agent-runner.ts (which maps 0 → undefined).
2973
3037
  defaultMaxTurns: getDefaultMaxTurns() ?? 0,
@@ -2991,6 +3055,8 @@ Write the file using the write tool. Only write the file, nothing else.`
2991
3055
  fallbackSubagent: getFallbackSubagent(),
2992
3056
  reportUsage: isReportUsageEnabled(),
2993
3057
  showCost: isShowCostEnabled(),
3058
+ showModel: isShowModelEnabled(),
3059
+ viewerMarkdown: getViewerMarkdown(),
2994
3060
  } satisfies SubagentsSettings
2995
3061
  }
2996
3062
 
@@ -3010,6 +3076,7 @@ Write the file using the write tool. Only write the file, nothing else.`
3010
3076
 
3011
3077
  const NUMERIC_IDS = new Set([
3012
3078
  "maxConcurrent",
3079
+ "maxConcurrentForeground",
3013
3080
  "defaultMaxTurns",
3014
3081
  "graceTurns",
3015
3082
  "maxSubagentDepth",
@@ -3018,6 +3085,7 @@ Write the file using the write tool. Only write the file, nothing else.`
3018
3085
  async function showSettings(ctx: ExtensionCommandContext) {
3019
3086
  function buildItems(): SettingItem[] {
3020
3087
  const mc = manager.getMaxConcurrent()
3088
+ const mcf = manager.getMaxConcurrentForeground()
3021
3089
  const dmt = getDefaultMaxTurns() ?? 0
3022
3090
  const gt = getGraceTurns()
3023
3091
  const msd = getMaxSubagentDepth()
@@ -3037,6 +3105,14 @@ Write the file using the write tool. Only write the file, nothing else.`
3037
3105
  currentValue: String(mc),
3038
3106
  values: [String(mc)],
3039
3107
  },
3108
+ {
3109
+ id: "maxConcurrentForeground",
3110
+ label: "Max foreground concurrency",
3111
+ description:
3112
+ "Max concurrent blocking agents (0 = unlimited, Enter to type)",
3113
+ currentValue: String(mcf),
3114
+ values: [String(mcf)],
3115
+ },
3040
3116
  {
3041
3117
  id: "defaultMaxTurns",
3042
3118
  label: "Default max turns",
@@ -3144,6 +3220,21 @@ Write the file using the write tool. Only write the file, nothing else.`
3144
3220
  currentValue: isShowCostEnabled() ? "on" : "off",
3145
3221
  values: ["on", "off"],
3146
3222
  },
3223
+ {
3224
+ id: "showModel",
3225
+ label: "Show model",
3226
+ description: "Show model and thinking level in running widget rows",
3227
+ currentValue: isShowModelEnabled() ? "on" : "off",
3228
+ values: ["on", "off"],
3229
+ },
3230
+ {
3231
+ id: "viewerMarkdown",
3232
+ label: "Viewer markdown",
3233
+ description:
3234
+ "Conversation Markdown: assistant (default), all tool results, or off; press m in the viewer to cycle",
3235
+ currentValue: getViewerMarkdown(),
3236
+ values: ["off", "assistant", "all"],
3237
+ },
3147
3238
  {
3148
3239
  id: "fleetView",
3149
3240
  label: "Fleet view",
@@ -3178,6 +3269,17 @@ Write the file using the write tool. Only write the file, nothing else.`
3178
3269
  manager.setMaxConcurrent(n)
3179
3270
  notifyApplied(ctx, `Max concurrency set to ${n}`)
3180
3271
  }
3272
+ } else if (id === "maxConcurrentForeground") {
3273
+ const n = parseInt(value, 10)
3274
+ if (n >= 0) {
3275
+ manager.setMaxConcurrentForeground(n)
3276
+ notifyApplied(
3277
+ ctx,
3278
+ n === 0
3279
+ ? "Max foreground concurrency set to unlimited"
3280
+ : `Max foreground concurrency set to ${n}`,
3281
+ )
3282
+ }
3181
3283
  } else if (id === "defaultMaxTurns") {
3182
3284
  const n = parseInt(value, 10)
3183
3285
  if (n === 0) {
@@ -3282,6 +3384,13 @@ Write the file using the write tool. Only write the file, nothing else.`
3282
3384
  const enabled = value === "on"
3283
3385
  setShowCost(enabled)
3284
3386
  notifyApplied(ctx, `Cost display ${enabled ? "enabled" : "disabled"}`)
3387
+ } else if (id === "showModel") {
3388
+ const enabled = value === "on"
3389
+ setShowModel(enabled)
3390
+ notifyApplied(ctx, `Model display ${enabled ? "enabled" : "disabled"}`)
3391
+ } else if (id === "viewerMarkdown") {
3392
+ setViewerMarkdown(value as ViewerMarkdownMode)
3393
+ notifyApplied(ctx, `Viewer markdown set to ${value}`)
3285
3394
  } else if (id === "toolDescriptionMode") {
3286
3395
  setToolDescriptionMode(value as ToolDescriptionMode)
3287
3396
  notifyApplied(
@@ -3352,20 +3461,24 @@ Write the file using the write tool. Only write the file, nothing else.`
3352
3461
  const current =
3353
3462
  result === "maxConcurrent"
3354
3463
  ? String(manager.getMaxConcurrent())
3355
- : result === "defaultMaxTurns"
3356
- ? String(getDefaultMaxTurns() ?? 0)
3357
- : result === "maxSubagentDepth"
3358
- ? String(getMaxSubagentDepth())
3359
- : String(getGraceTurns())
3464
+ : result === "maxConcurrentForeground"
3465
+ ? String(manager.getMaxConcurrentForeground())
3466
+ : result === "defaultMaxTurns"
3467
+ ? String(getDefaultMaxTurns() ?? 0)
3468
+ : result === "maxSubagentDepth"
3469
+ ? String(getMaxSubagentDepth())
3470
+ : String(getGraceTurns())
3360
3471
 
3361
3472
  const label =
3362
3473
  result === "maxConcurrent"
3363
3474
  ? "Max concurrency (1+)"
3364
- : result === "defaultMaxTurns"
3365
- ? "Default max turns (0 = unlimited)"
3366
- : result === "maxSubagentDepth"
3367
- ? "Nested depth (0/1 = nesting off)"
3368
- : "Grace turns (1+)"
3475
+ : result === "maxConcurrentForeground"
3476
+ ? "Max foreground concurrency (0 = unlimited)"
3477
+ : result === "defaultMaxTurns"
3478
+ ? "Default max turns (0 = unlimited)"
3479
+ : result === "maxSubagentDepth"
3480
+ ? "Nested depth (0/1 = nesting off)"
3481
+ : "Grace turns (1+)"
3369
3482
 
3370
3483
  // Loop until user enters a valid integer or cancels (Esc / null).
3371
3484
  // Silently trims whitespace; rejects non-numeric input by re-prompting.
@@ -3388,6 +3501,18 @@ Write the file using the write tool. Only write the file, nothing else.`
3388
3501
  // the right toast. Successful saves show info; persistence failures downgrade
3389
3502
  // to warning so users aren't silently reverted on restart. Event fires regardless
3390
3503
  // of outcome so listeners see the in-memory change.
3504
+ function persistSettings(
3505
+ ctx: ExtensionCommandContext,
3506
+ successMsg: string,
3507
+ ): void {
3508
+ const { message, level } = saveAndEmitChanged(
3509
+ snapshotSettings(),
3510
+ successMsg,
3511
+ (event, payload) => pi.events.emit(event, payload),
3512
+ )
3513
+ if (level === "warning") ctx.ui.notify(message, level)
3514
+ }
3515
+
3391
3516
  function notifyApplied(ctx: ExtensionCommandContext, successMsg: string) {
3392
3517
  const { message, level } = saveAndEmitChanged(
3393
3518
  snapshotSettings(),
@@ -113,6 +113,7 @@ export function resolveAgentInvocationConfig(
113
113
  runInBackground: boolean
114
114
  isolated: boolean
115
115
  isolation?: IsolationMode
116
+ overridden?: { thinking?: ThinkingLevel; model?: string }
116
117
  } {
117
118
  // Precedence first, collapse second — reversing these loses the veto, since
118
119
  // an agent file's "off" only outranks a caller's "worktree" while it is still
@@ -122,6 +123,18 @@ export function resolveAgentInvocationConfig(
122
123
  requested === "worktree" && opts?.worktreeAllowed !== false
123
124
  ? "worktree"
124
125
  : undefined
126
+ const overriddenThinking =
127
+ agentConfig?.thinking != null &&
128
+ params.thinking != null &&
129
+ agentConfig.thinking !== params.thinking
130
+ ? (params.thinking as ThinkingLevel)
131
+ : undefined
132
+ const overriddenModel =
133
+ agentConfig?.model != null &&
134
+ params.model != null &&
135
+ agentConfig.model !== params.model
136
+ ? params.model
137
+ : undefined
125
138
 
126
139
  return {
127
140
  modelInput: agentConfig?.model ?? params.model,
@@ -139,6 +152,10 @@ export function resolveAgentInvocationConfig(
139
152
  false,
140
153
  isolated: agentConfig?.isolated ?? params.isolated ?? false,
141
154
  isolation,
155
+ overridden:
156
+ overriddenThinking || overriddenModel
157
+ ? { thinking: overriddenThinking, model: overriddenModel }
158
+ : undefined,
142
159
  }
143
160
  }
144
161
 
@@ -14,6 +14,20 @@ export interface ModelRegistry {
14
14
  getAvailable?(): any[]
15
15
  }
16
16
 
17
+ /** Both display forms of a resolved model. */
18
+ export function describeModel(model: {
19
+ provider: string
20
+ id: string
21
+ name?: string
22
+ }): { modelName: string; modelId: string } {
23
+ return {
24
+ modelName: (model.name ?? model.id)
25
+ .replace(/^Claude\s+/i, "")
26
+ .toLowerCase(),
27
+ modelId: `${model.provider}/${model.id}`,
28
+ }
29
+ }
30
+
17
31
  /**
18
32
  * Resolve a model string to a Model instance.
19
33
  * Tries exact match first ("provider/modelId"), then fuzzy match against all available models.
@@ -22,6 +22,7 @@ import type {
22
22
  import { Cron } from "croner"
23
23
  import { nanoid } from "nanoid"
24
24
  import type { AgentManager } from "./agent-manager.js"
25
+ import { normalizeMaxTurns } from "./agent-runner.js"
25
26
  import { resolveSpawnType } from "./agent-types.js"
26
27
  import { resolveModel } from "./model-resolver.js"
27
28
  import type { ScheduleStore } from "./schedule-store.js"
@@ -280,6 +281,13 @@ export class SubagentScheduler {
280
281
  isolated: job.isolated,
281
282
  thinkingLevel: job.thinking,
282
283
  isolation: job.isolation,
284
+ invocation: {
285
+ thinking: job.thinking,
286
+ maxTurns: normalizeMaxTurns(job.max_turns),
287
+ isolated: job.isolated,
288
+ runInBackground: true,
289
+ isolation: job.isolation,
290
+ },
283
291
  })
284
292
  } catch (err) {
285
293
  const error = err instanceof Error ? err.message : String(err)
@@ -6,10 +6,12 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
6
6
  import { dirname, join } from "node:path"
7
7
  import { getAgentDir } from "@earendil-works/pi-coding-agent"
8
8
  import { NO_FALLBACK } from "./agent-types.js"
9
- import type { JoinMode, WidgetMode } from "./types.js"
9
+ import type { JoinMode, ViewerMarkdownMode, WidgetMode } from "./types.js"
10
10
 
11
11
  export interface SubagentsSettings {
12
12
  maxConcurrent?: number
13
+ /** Max concurrent blocking agents. 0 = unlimited (default). */
14
+ maxConcurrentForeground?: number
13
15
  /**
14
16
  * 0 = unlimited — the extension's single source of truth for that convention:
15
17
  * `normalizeMaxTurns()` in agent-runner.ts treats 0 → `undefined`, and the
@@ -200,6 +202,10 @@ export interface SubagentsSettings {
200
202
  * what the parent session counts.
201
203
  */
202
204
  showCost?: boolean
205
+ /** Show effective model and thinking level in running widget rows. */
206
+ showModel?: boolean
207
+ /** Markdown scope in the conversation viewer. Defaults to assistant. */
208
+ viewerMarkdown?: ViewerMarkdownMode
203
209
  }
204
210
 
205
211
  export type ToolDescriptionMode = "full" | "compact" | "custom"
@@ -207,6 +213,7 @@ export type ToolDescriptionMode = "full" | "compact" | "custom"
207
213
  /** Setter hooks used by applySettings to wire persisted values into in-memory state. */
208
214
  export interface SettingsAppliers {
209
215
  setMaxConcurrent: (n: number) => void
216
+ setMaxConcurrentForeground: (n: number) => void
210
217
  setDefaultMaxTurns: (n: number) => void
211
218
  setGraceTurns: (n: number) => void
212
219
  setDefaultJoinMode: (mode: JoinMode) => void
@@ -224,6 +231,8 @@ export interface SettingsAppliers {
224
231
  setFallbackSubagent: (v: string | undefined) => void
225
232
  setReportUsage: (b: boolean) => void
226
233
  setShowCost: (b: boolean) => void
234
+ setShowModel: (b: boolean) => void
235
+ setViewerMarkdown: (mode: ViewerMarkdownMode) => void
227
236
  }
228
237
 
229
238
  /** Emit callback — a subset of `pi.events.emit` to keep helpers testable. */
@@ -241,6 +250,8 @@ const VALID_WIDGET_MODES: ReadonlySet<string> = new Set<WidgetMode>([
241
250
  "background",
242
251
  "off",
243
252
  ])
253
+ const VALID_VIEWER_MARKDOWN_MODES: ReadonlySet<string> =
254
+ new Set<ViewerMarkdownMode>(["off", "assistant", "all"])
244
255
 
245
256
  // Sanity ceilings — prevent hand-edited configs from asking for values that
246
257
  // make no operational sense (e.g. 1e6 concurrent subagents). Permissive enough
@@ -262,6 +273,13 @@ function sanitize(raw: unknown): SubagentsSettings {
262
273
  ) {
263
274
  out.maxConcurrent = r.maxConcurrent as number
264
275
  }
276
+ if (
277
+ Number.isInteger(r.maxConcurrentForeground) &&
278
+ (r.maxConcurrentForeground as number) >= 0 &&
279
+ (r.maxConcurrentForeground as number) <= MAX_CONCURRENT_CEILING
280
+ ) {
281
+ out.maxConcurrentForeground = r.maxConcurrentForeground as number
282
+ }
265
283
  if (
266
284
  Number.isInteger(r.defaultMaxTurns) &&
267
285
  (r.defaultMaxTurns as number) >= 0 &&
@@ -331,6 +349,15 @@ function sanitize(raw: unknown): SubagentsSettings {
331
349
  if (typeof r.showCost === "boolean") {
332
350
  out.showCost = r.showCost
333
351
  }
352
+ if (typeof r.showModel === "boolean") {
353
+ out.showModel = r.showModel
354
+ }
355
+ if (
356
+ typeof r.viewerMarkdown === "string" &&
357
+ VALID_VIEWER_MARKDOWN_MODES.has(r.viewerMarkdown)
358
+ ) {
359
+ out.viewerMarkdown = r.viewerMarkdown as ViewerMarkdownMode
360
+ }
334
361
  if (r.fallbackSubagent === false) {
335
362
  // The only non-string spelling worth accepting: a boolean would otherwise be
336
363
  // dropped, silently leaving the PERMISSIVE default in place. Every string is
@@ -407,6 +434,8 @@ export function applySettings(
407
434
  ): void {
408
435
  if (typeof s.maxConcurrent === "number")
409
436
  appliers.setMaxConcurrent(s.maxConcurrent)
437
+ if (typeof s.maxConcurrentForeground === "number")
438
+ appliers.setMaxConcurrentForeground(s.maxConcurrentForeground)
410
439
  if (typeof s.defaultMaxTurns === "number")
411
440
  appliers.setDefaultMaxTurns(s.defaultMaxTurns)
412
441
  if (typeof s.graceTurns === "number") appliers.setGraceTurns(s.graceTurns)
@@ -434,6 +463,8 @@ export function applySettings(
434
463
  appliers.setWorktreeIsolation(s.worktreeIsolation)
435
464
  if (typeof s.reportUsage === "boolean") appliers.setReportUsage(s.reportUsage)
436
465
  if (typeof s.showCost === "boolean") appliers.setShowCost(s.showCost)
466
+ if (typeof s.showModel === "boolean") appliers.setShowModel(s.showModel)
467
+ if (s.viewerMarkdown) appliers.setViewerMarkdown(s.viewerMarkdown)
437
468
  }
438
469
 
439
470
  /**
@@ -105,6 +105,9 @@ export type JoinMode = "async" | "group" | "smart"
105
105
  */
106
106
  export type WidgetMode = "all" | "background" | "off"
107
107
 
108
+ /** How much of the conversation viewer renders as Markdown. */
109
+ export type ViewerMarkdownMode = "off" | "assistant" | "all"
110
+
108
111
  export interface AgentRecord {
109
112
  id: string
110
113
  type: SubagentType
@@ -125,6 +128,10 @@ export interface AgentRecord {
125
128
  session?: AgentSession
126
129
  abortController?: AbortController
127
130
  promise?: Promise<string>
131
+ /** Whether a caller is awaiting this agent inline. */
132
+ blocking?: boolean
133
+ /** Resolves when a queued blocking agent starts or is removed from the queue. */
134
+ startGate?: Promise<void>
128
135
  groupId?: string
129
136
  joinMode?: JoinMode
130
137
  /** Set when result was already consumed via get_subagent_result — suppresses completion notification. */
@@ -176,10 +183,18 @@ export interface AgentRecord {
176
183
  rootSessionId?: string
177
184
  }
178
185
 
186
+ /** Effective session level, including pi's display-only `off` value. */
187
+ export type EffectiveThinkingLevel = ThinkingLevel | "off"
188
+
179
189
  export interface AgentInvocation {
180
- /** Short display name, e.g. "haiku" only set when different from parent. */
190
+ /** Short model label for tight UI rows. */
181
191
  modelName?: string
182
- thinking?: ThinkingLevel
192
+ /** Canonical provider/model id. */
193
+ modelId?: string
194
+ thinking?: EffectiveThinkingLevel
195
+ /** Requested values retained only when the run used something else. */
196
+ requestedThinking?: EffectiveThinkingLevel
197
+ requestedModel?: string
183
198
  maxTurns?: number
184
199
  isolated?: boolean
185
200
  inheritContext?: boolean
@@ -226,18 +226,31 @@ export function getPromptModeLabel(type: SubagentType): string | undefined {
226
226
  /** Mode label is not included — callers add it where they want it. */
227
227
  export function buildInvocationTags(invocation: AgentInvocation | undefined): {
228
228
  modelName?: string
229
+ modelId?: string
229
230
  tags: string[]
230
231
  } {
231
232
  const tags: string[] = []
232
233
  if (!invocation) return { tags }
233
- if (invocation.thinking) tags.push(`thinking: ${invocation.thinking}`)
234
+ const asked = (
235
+ value: string | undefined,
236
+ requested: string | undefined,
237
+ ): string | undefined =>
238
+ value && requested && requested !== value
239
+ ? `${value} (asked ${requested})`
240
+ : value
241
+ const thinking = asked(invocation.thinking, invocation.requestedThinking)
242
+ if (thinking) tags.push(`thinking: ${thinking}`)
234
243
  if (invocation.isolated) tags.push("isolated")
235
244
  if (invocation.isolation === "worktree") tags.push("worktree")
236
245
  if (invocation.inheritContext) tags.push("inherit context")
237
246
  if (invocation.runInBackground) tags.push("background")
238
247
  if (invocation.maxTurns != null)
239
248
  tags.push(`max turns: ${invocation.maxTurns}`)
240
- return { modelName: invocation.modelName, tags }
249
+ return {
250
+ modelName: asked(invocation.modelName, invocation.requestedModel),
251
+ modelId: asked(invocation.modelId, invocation.requestedModel),
252
+ tags,
253
+ }
241
254
  }
242
255
 
243
256
  /** Truncate text to a single line, max `len` chars. */
@@ -317,6 +330,8 @@ export class AgentWidget {
317
330
  * supplies the user's `showCost` setting.
318
331
  */
319
332
  private showCost: () => boolean = () => false,
333
+ /** Whether running rows show the model and thinking level. */
334
+ private showModel: () => boolean = () => false,
320
335
  ) {}
321
336
 
322
337
  /**
@@ -526,6 +541,12 @@ export class AgentWidget {
526
541
  : ""
527
542
 
528
543
  const parts: string[] = []
544
+ if (this.showModel()) {
545
+ const { modelName, tags } = buildInvocationTags(a.invocation)
546
+ if (modelName) parts.push(modelName)
547
+ const thinkingTag = tags.find((tag) => tag.startsWith("thinking: "))
548
+ if (thinkingTag) parts.push(thinkingTag)
549
+ }
529
550
  if (bg) parts.push(formatTurns(bg.turnCount, bg.maxTurns))
530
551
  if (toolUses > 0)
531
552
  parts.push(`${toolUses} tool use${toolUses === 1 ? "" : "s"}`)