@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
@@ -0,0 +1,201 @@
1
+ import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
2
+ import type { ResolvedConfig } from "../types.js";
3
+ import {
4
+ buildConfigEditingFields,
5
+ inputDefaultForConfigEditingField,
6
+ parseConfigEditingFieldInput,
7
+ patchForConfigEditingField,
8
+ readConfigLayers,
9
+ type ConfigEditingField,
10
+ type FieldId,
11
+ } from "../config/config-editing-model.js";
12
+ import {
13
+ createMemoryOperations,
14
+ type MemoryOperationsDeps,
15
+ } from "../operations/memory-operation-service.js";
16
+ import { type ConfigScope, type ProjectConfigPatchInput } from "../config/config-writer.js";
17
+ import { inputWithPrefill } from "./prefill-input.js";
18
+ import { CANCEL } from "./setup-tui-types.js";
19
+
20
+ const LOCAL_EMBED_GUIDANCE = [
21
+ "Local hindsight-embed guidance:",
22
+ "uvx hindsight-embed@latest profile create pi --port 8888",
23
+ "uvx hindsight-embed@latest -p pi bank create <bank-id>",
24
+ "uvx hindsight-embed@latest -p pi ui start",
25
+ ].join("\n");
26
+
27
+ async function writeAndReload(
28
+ ctx: ExtensionCommandContext,
29
+ deps: MemoryOperationsDeps,
30
+ patch: ProjectConfigPatchInput,
31
+ scope: ConfigScope = "project",
32
+ ): Promise<void> {
33
+ const result = await createMemoryOperations(deps).configure(ctx.cwd, { ...patch, scope });
34
+ ctx.ui.notify(`Saved ${scope} config to ${result.path}; setup view reloaded.`, "info");
35
+ }
36
+
37
+ async function resetField(
38
+ ctx: ExtensionCommandContext,
39
+ deps: MemoryOperationsDeps,
40
+ field: ConfigEditingField,
41
+ scope: ConfigScope = "project",
42
+ ): Promise<void> {
43
+ await writeAndReload(ctx, deps, { resetDefaults: [field.resetKey] }, scope);
44
+ }
45
+
46
+ function settingPrompt(field: ConfigEditingField): string {
47
+ return [
48
+ field.label,
49
+ field.description,
50
+ `Effective: ${field.value} (${field.source ?? "default"})`,
51
+ `Environment: ${field.envValue ?? "not set"}`,
52
+ `Project: ${field.projectValue ?? "not set"}`,
53
+ `User: ${field.globalValue ?? "not set"}`,
54
+ `Default: ${field.defaultValue}`,
55
+ field.source === "env"
56
+ ? "Environment currently wins; project/user edits save for when env override is removed."
57
+ : "Changes save immediately.",
58
+ ].join("\n");
59
+ }
60
+
61
+ function scopeLabel(scope: ConfigScope): string {
62
+ return scope === "project" ? "Project" : "User";
63
+ }
64
+
65
+ function withScopedValues(field: ConfigEditingField, values: string[]): string[] {
66
+ const scoped = (field.editableScopes ?? ["project"]).flatMap((scope) =>
67
+ values.map((value) => `${scopeLabel(scope)}: ${value}`),
68
+ );
69
+ const resets = (field.editableScopes ?? ["project"]).flatMap((scope) => {
70
+ if (scope === "project" && field.projectValue !== undefined) return ["Remove project override"];
71
+ if (scope === "global" && field.globalValue !== undefined) return ["Remove user override"];
72
+ return [];
73
+ });
74
+ return [...scoped, ...resets, CANCEL];
75
+ }
76
+
77
+ function parseScopedAction(action: string): { scope: ConfigScope; value: string } | undefined {
78
+ if (action.startsWith("Project: "))
79
+ return { scope: "project", value: action.slice("Project: ".length) };
80
+ if (action.startsWith("User: ")) return { scope: "global", value: action.slice("User: ".length) };
81
+ return undefined;
82
+ }
83
+
84
+ async function chooseScope(
85
+ ctx: ExtensionCommandContext,
86
+ field: ConfigEditingField,
87
+ ): Promise<ConfigScope | undefined> {
88
+ const scopes = field.editableScopes ?? ["project"];
89
+ if (scopes.length === 1) return scopes[0];
90
+ const value = await ctx.ui.select(settingPrompt(field), scopes.map(scopeLabel).concat(CANCEL));
91
+ if (!value || value === CANCEL) return undefined;
92
+ return value === "User" ? "global" : "project";
93
+ }
94
+
95
+ async function handleResetAction(
96
+ action: string,
97
+ ctx: ExtensionCommandContext,
98
+ deps: MemoryOperationsDeps,
99
+ field: ConfigEditingField,
100
+ ): Promise<boolean> {
101
+ if (action === "Remove project override") {
102
+ await resetField(ctx, deps, field, "project");
103
+ return true;
104
+ }
105
+ if (action === "Remove user override") {
106
+ await resetField(ctx, deps, field, "global");
107
+ return true;
108
+ }
109
+ return false;
110
+ }
111
+
112
+ async function promptScopedValue(
113
+ ctx: ExtensionCommandContext,
114
+ deps: MemoryOperationsDeps,
115
+ field: ConfigEditingField,
116
+ ): Promise<{ scope: ConfigScope; value: string } | undefined> {
117
+ if (field.kind === "boolean" || field.kind === "select") {
118
+ const values = field.kind === "boolean" ? ["Enable", "Disable"] : (field.choices ?? []);
119
+ const action = await ctx.ui.select(settingPrompt(field), withScopedValues(field, values));
120
+ if (!action || action === CANCEL) return undefined;
121
+ if (await handleResetAction(action, ctx, deps, field)) return undefined;
122
+ return parseScopedAction(action);
123
+ }
124
+
125
+ const scope = await chooseScope(ctx, field);
126
+ if (!scope) return undefined;
127
+ const value = await inputWithPrefill(
128
+ ctx.ui,
129
+ settingPrompt(field),
130
+ inputDefaultForConfigEditingField(field.id, deps.getConfig(), deps.getProjectBankId()),
131
+ );
132
+ const parsed = parseConfigEditingFieldInput(field, value);
133
+ if (parsed === undefined) return undefined;
134
+ return { scope, value: parsed };
135
+ }
136
+
137
+ export async function handleResetFieldAction(args: {
138
+ ctx: ExtensionCommandContext;
139
+ deps: MemoryOperationsDeps;
140
+ config: ResolvedConfig;
141
+ projectBankId: string;
142
+ fieldId: FieldId;
143
+ }): Promise<void> {
144
+ const field = buildConfigEditingFields(
145
+ args.config,
146
+ args.projectBankId,
147
+ readConfigLayers(args.ctx.cwd),
148
+ ).find((item) => item.id === args.fieldId);
149
+ if (field) {
150
+ await resetField(args.ctx, args.deps, field, field.source === "global" ? "global" : "project");
151
+ }
152
+ }
153
+
154
+ export async function handleFieldEdit(args: {
155
+ fieldId: FieldId;
156
+ ctx: ExtensionCommandContext;
157
+ deps: MemoryOperationsDeps;
158
+ config: ResolvedConfig;
159
+ projectBankId: string;
160
+ }): Promise<void> {
161
+ const layers = readConfigLayers(args.ctx.cwd);
162
+ const field = buildConfigEditingFields(args.config, args.projectBankId, layers).find(
163
+ (item) => item.id === args.fieldId,
164
+ );
165
+ if (!field) return;
166
+
167
+ const scoped = await promptScopedValue(args.ctx, args.deps, field);
168
+ if (!scoped) return;
169
+ const patch = patchForConfigEditingField(field.id, scoped.value, args.config);
170
+ if (patch) await writeAndReload(args.ctx, args.deps, patch, scoped.scope);
171
+ }
172
+
173
+ export async function handleDeployment(
174
+ ctx: ExtensionCommandContext,
175
+ deps: MemoryOperationsDeps,
176
+ config: ResolvedConfig,
177
+ ): Promise<void> {
178
+ const value = await ctx.ui.select("Hindsight deployment", [
179
+ "Hindsight Cloud",
180
+ "Existing local/external API",
181
+ "Local hindsight-embed guidance",
182
+ CANCEL,
183
+ ]);
184
+ if (value === "Hindsight Cloud") {
185
+ const baseUrl = await ctx.ui.input("Hindsight Cloud base URL", config.hindsight.baseUrl);
186
+ if (baseUrl) await writeAndReload(ctx, deps, { baseUrl: baseUrl.trim() });
187
+ const envName = await ctx.ui.input("API key env var name", "HINDSIGHT_API_TOKEN");
188
+ if (envName) await writeAndReload(ctx, deps, { apiKeyEnvVar: envName.trim() });
189
+ } else if (value === "Existing local/external API") {
190
+ const baseUrl = await ctx.ui.input("Hindsight API base URL", config.hindsight.baseUrl);
191
+ if (baseUrl) await writeAndReload(ctx, deps, { baseUrl: baseUrl.trim() });
192
+ } else if (value === "Local hindsight-embed guidance") {
193
+ ctx.ui.notify(LOCAL_EMBED_GUIDANCE, "info");
194
+ const useDefault = await ctx.ui.select("Set API URL to http://localhost:8888?", [
195
+ "Yes",
196
+ "No",
197
+ CANCEL,
198
+ ]);
199
+ if (useDefault === "Yes") await writeAndReload(ctx, deps, { baseUrl: "http://localhost:8888" });
200
+ }
201
+ }
@@ -0,0 +1,47 @@
1
+ import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
2
+ import type { ResolvedConfig } from "../types.js";
3
+ import {
4
+ buildConfigEditingTabs,
5
+ readConfigLayers,
6
+ type ConfigEditingTab,
7
+ } from "../config/config-editing-model.js";
8
+ import type { MemoryOperationsDeps } from "../operations/memory-operation-service.js";
9
+ import { listRetainReceipts } from "../lifecycle/retain-receipts.js";
10
+ import { collectStatusHealthFacts } from "../utils/status-health.js";
11
+ import { buildRetainReceiptStatusFacts } from "./setup-tui-render.js";
12
+ import { RECEIPT_FACT_LIMIT, type SetupUiState } from "./setup-tui-types.js";
13
+
14
+ export async function buildSetupTabs(args: {
15
+ ctx: ExtensionCommandContext;
16
+ config: ResolvedConfig;
17
+ projectBankId: string;
18
+ deps: MemoryOperationsDeps;
19
+ state: SetupUiState;
20
+ }): Promise<ConfigEditingTab[]> {
21
+ const statusFacts = await collectStatusHealthFacts({
22
+ client: args.deps.getClient(),
23
+ config: args.config,
24
+ projectBankId: args.projectBankId,
25
+ });
26
+ const receiptFacts = buildRetainReceiptStatusFacts(
27
+ await listRetainReceipts(args.ctx.cwd, RECEIPT_FACT_LIMIT),
28
+ );
29
+ return buildConfigEditingTabs(
30
+ args.config,
31
+ args.projectBankId,
32
+ readConfigLayers(args.ctx.cwd),
33
+ [...buildInitHealthFacts(args.deps.getInitHealth?.()), ...statusFacts, ...receiptFacts],
34
+ { showAdvanced: Boolean(args.state.showAdvanced) },
35
+ );
36
+ }
37
+
38
+ export function buildInitHealthFacts(
39
+ initHealth: ReturnType<NonNullable<MemoryOperationsDeps["getInitHealth"]>>,
40
+ ): Array<[string, string]> {
41
+ if (!initHealth) return [];
42
+ if (initHealth.failures.length === 0) return [["Startup", `ok (${initHealth.checkedAt})`]];
43
+ return initHealth.failures.map((failure) => [
44
+ `Startup ${failure.subsystem}`,
45
+ `failed: ${failure.error}`,
46
+ ]);
47
+ }
@@ -0,0 +1,239 @@
1
+ import { DynamicBorder } from "@earendil-works/pi-coding-agent";
2
+ import { truncateToWidth, visibleWidth, type Component } from "@earendil-works/pi-tui";
3
+ import type { ConfigEditingTab } from "../config/config-editing-model.js";
4
+ import type { RetainReceipt } from "../lifecycle/retain-receipts.js";
5
+ import { formatRetainOutcome } from "../queue/flush-presenter.js";
6
+ import {
7
+ applySetupIntent,
8
+ currentSetupTab,
9
+ normalizeSetupUiState,
10
+ selectedSetupField,
11
+ selectedSetupIndex,
12
+ setupIntentFromInput,
13
+ } from "./setup-flow.js";
14
+ import {
15
+ HUB_ACTION_HELP,
16
+ RECEIPT_FACT_LIMIT,
17
+ type SetupActionId,
18
+ type SetupUiState,
19
+ type ThemeLike,
20
+ } from "./setup-tui-types.js";
21
+
22
+ const MIN_BODY_LINES = 30;
23
+ const DOCS_BASE_URL = "https://luxus.github.io/pi-hindsight";
24
+
25
+ const TAB_DOCS: Record<string, string> = {
26
+ Status: `${DOCS_BASE_URL}/guides/use-hindsight-status/`,
27
+ Connection: `${DOCS_BASE_URL}/start/installation/`,
28
+ Banks: `${DOCS_BASE_URL}/concepts/memory-banks/`,
29
+ Recall: `${DOCS_BASE_URL}/concepts/retain-recall-reflect/`,
30
+ Retain: `${DOCS_BASE_URL}/concepts/queue-durability/`,
31
+ Import: `${DOCS_BASE_URL}/guides/importing-sessions/`,
32
+ UI: `${DOCS_BASE_URL}/start/setup-tui/`,
33
+ };
34
+
35
+ function fitColumns(left: string, right: string, width: number): string {
36
+ if (width <= 0) return "";
37
+ if (width < 40) return truncateToWidth(`${left} ${right}`, width);
38
+ const rightWidth = Math.min(Math.max(12, visibleWidth(right)), Math.floor(width * 0.38));
39
+ const leftWidth = Math.max(1, width - rightWidth - 1);
40
+ return `${truncateToWidth(left, leftWidth)} ${truncateToWidth(right, rightWidth)}`;
41
+ }
42
+
43
+ function borderLine(
44
+ width: number,
45
+ left: string,
46
+ fill: string,
47
+ right: string,
48
+ theme: ThemeLike,
49
+ ): string {
50
+ return theme.fg("borderAccent", `${left}${fill.repeat(Math.max(0, width - 2))}${right}`);
51
+ }
52
+
53
+ function padVisibleRight(content: string, width: number): string {
54
+ const truncated = truncateToWidth(content, width);
55
+ return `${truncated}${" ".repeat(Math.max(0, width - visibleWidth(truncated)))}`;
56
+ }
57
+
58
+ function boxed(content: string, width: number, theme: ThemeLike): string {
59
+ if (width < 2) return truncateToWidth(content, width);
60
+ return `${theme.fg("borderAccent", "│")}${padVisibleRight(content, width - 2)}${theme.fg("borderAccent", "│")}`;
61
+ }
62
+
63
+ function shortDocumentId(documentId: string): string {
64
+ const parts = documentId.split(":");
65
+ if (parts[0] === "pi-explicit" && parts.length >= 3) return `${parts[0]}:${parts[2]}`;
66
+ return documentId;
67
+ }
68
+
69
+ function wrapWords(text: string, width: number): string[] {
70
+ if (width <= 0) return [""];
71
+ const words = text.split(/\s+/).filter(Boolean);
72
+ const lines: string[] = [];
73
+ let current = "";
74
+ for (const word of words) {
75
+ if (!current) current = word;
76
+ else if (`${current} ${word}`.length <= width) current = `${current} ${word}`;
77
+ else {
78
+ lines.push(current);
79
+ current = word;
80
+ }
81
+ }
82
+ if (current) lines.push(current);
83
+ return lines.length ? lines : [""];
84
+ }
85
+
86
+ export function buildRetainReceiptStatusFacts(receipts: RetainReceipt[]): Array<[string, string]> {
87
+ if (receipts.length === 0) return [["Retain receipts", "none"]];
88
+ return receipts.slice(0, RECEIPT_FACT_LIMIT).map((receipt, index) => {
89
+ const outcome = formatRetainOutcome(receipt.outcome);
90
+ const value = `${receipt.bankId} ${shortDocumentId(receipt.documentId)}${
91
+ outcome ? ` (${outcome})` : ""
92
+ }`;
93
+ return [index === 0 ? "Recent retain" : `Recent retain ${index + 1}`, value];
94
+ });
95
+ }
96
+
97
+ export function createSetupComponent(
98
+ tabs: ConfigEditingTab[],
99
+ theme: ThemeLike,
100
+ state: SetupUiState,
101
+ done: (action: SetupActionId | null) => void,
102
+ ): Component {
103
+ Object.assign(state, normalizeSetupUiState(tabs, state));
104
+
105
+ return {
106
+ render(width: number): string[] {
107
+ Object.assign(state, normalizeSetupUiState(tabs, state));
108
+ const tab = currentSetupTab(tabs, state) ?? tabs[0]!;
109
+ const lines: string[] = [];
110
+ const innerWidth = Math.max(0, width - 2);
111
+ const changedCount = tabs.reduce(
112
+ (count, item) => count + item.fields.filter((field) => field.changed).length,
113
+ 0,
114
+ );
115
+ const horizontal = new DynamicBorder((s: string) => theme.fg("borderAccent", s));
116
+
117
+ lines.push(...horizontal.render(width));
118
+ lines.push(borderLine(width, "╭", "─", "╮", theme));
119
+ lines.push(
120
+ boxed(
121
+ ` ${theme.fg("accent", theme.bold("Hindsight setup"))} ${theme.fg("dim", "saved immediately after edit · changed values marked *")}`,
122
+ width,
123
+ theme,
124
+ ),
125
+ );
126
+ lines.push(
127
+ boxed(` ${theme.fg("dim", `${changedCount} changed from defaults`)}`, width, theme),
128
+ );
129
+ lines.push(boxed("", width, theme));
130
+
131
+ const tabLine = tabs
132
+ .map((item, index) => {
133
+ const dirty = item.fields.some((field) => field.changed) ? "*" : "";
134
+ const label = ` ${item.id}${dirty} `;
135
+ return index === state.tabIndex
136
+ ? theme.bg("selectedBg", theme.fg("accent", theme.bold(label)))
137
+ : theme.fg("muted", label);
138
+ })
139
+ .join(" ");
140
+ lines.push(boxed(tabLine, width, theme));
141
+ lines.push(boxed("", width, theme));
142
+
143
+ lines.push(
144
+ boxed(
145
+ theme.fg(
146
+ "accent",
147
+ theme.bold(tab.id === "Status" ? "Memory status" : `${tab.id} settings`),
148
+ ),
149
+ width,
150
+ theme,
151
+ ),
152
+ );
153
+ if (tab.facts) {
154
+ for (const [label, value] of tab.facts) {
155
+ lines.push(
156
+ boxed(
157
+ fitColumns(
158
+ ` ${theme.fg("muted", `${label}:`)}`,
159
+ theme.fg("text", value),
160
+ innerWidth,
161
+ ),
162
+ width,
163
+ theme,
164
+ ),
165
+ );
166
+ }
167
+ } else {
168
+ lines.push(
169
+ boxed(theme.fg("dim", fitColumns("Setting", "Value", innerWidth)), width, theme),
170
+ );
171
+ }
172
+
173
+ for (const [index, field] of tab.fields.entries()) {
174
+ const isSelected = index === selectedSetupIndex(tabs, state);
175
+ const marker = isSelected ? theme.fg("accent", "→") : " ";
176
+ const dirty = field.changed ? theme.fg("warning", "*") : " ";
177
+ const label = isSelected
178
+ ? theme.fg("accent", theme.bold(field.label))
179
+ : theme.fg("text", field.label);
180
+ const rawValue = `${field.value} [${field.source ?? "default"}]`;
181
+ const value = field.changed ? theme.fg("warning", rawValue) : theme.fg("text", rawValue);
182
+ lines.push(
183
+ boxed(fitColumns(`${marker}${dirty} ${label}`, value, innerWidth), width, theme),
184
+ );
185
+ }
186
+
187
+ const detailField = selectedSetupField(tabs, state);
188
+ if (detailField) {
189
+ lines.push(boxed("", width, theme));
190
+ lines.push(boxed(theme.fg("accent", theme.bold("Details")), width, theme));
191
+ const details = [
192
+ `Docs: ${TAB_DOCS[detailField.tab] ?? `${DOCS_BASE_URL}/reference/configuration/`}`,
193
+ detailField.description,
194
+ `Default: ${detailField.defaultValue}`,
195
+ ...(detailField.projectValue ? [`Project: ${detailField.projectValue}`] : []),
196
+ ...(detailField.globalValue ? [`User: ${detailField.globalValue}`] : []),
197
+ ...(detailField.envValue ? [`Env: ${detailField.envValue}`] : []),
198
+ ];
199
+ for (const detail of details) {
200
+ for (const line of wrapWords(detail, innerWidth - 3)) {
201
+ lines.push(boxed(` ${theme.fg("dim", line)}`, width, theme));
202
+ }
203
+ }
204
+ } else if (tab.id === "Status") {
205
+ lines.push(boxed("", width, theme));
206
+ lines.push(boxed(theme.fg("accent", theme.bold("Docs")), width, theme));
207
+ for (const line of wrapWords(`Status guide: ${TAB_DOCS.Status}`, innerWidth - 3)) {
208
+ lines.push(boxed(` ${theme.fg("dim", line)}`, width, theme));
209
+ }
210
+ }
211
+
212
+ while (lines.length < MIN_BODY_LINES) lines.push(boxed("", width, theme));
213
+
214
+ lines.push(
215
+ boxed(
216
+ theme.fg(
217
+ "dim",
218
+ state.showAdvanced
219
+ ? ` advanced · h/l tabs · j/k · enter edit · r reset ·${HUB_ACTION_HELP}`
220
+ : ` hub ·${HUB_ACTION_HELP}`,
221
+ ),
222
+ width,
223
+ theme,
224
+ ),
225
+ );
226
+ lines.push(borderLine(width, "╰", "─", "╯", theme));
227
+ lines.push(...horizontal.render(width));
228
+ return lines.map((line) => truncateToWidth(line, width));
229
+ },
230
+ handleInput(data: string): void {
231
+ const intent = setupIntentFromInput(data);
232
+ if (!intent) return;
233
+ const result = applySetupIntent(tabs, state, intent);
234
+ Object.assign(state, result.state);
235
+ if (result.kind === "action") done(result.action);
236
+ },
237
+ invalidate(): void {},
238
+ };
239
+ }
@@ -0,0 +1,50 @@
1
+ import type { FieldId, TabId } from "../config/config-editing-model.js";
2
+
3
+ /** Day-to-day hub actions reachable from the `/hindsight` TUI. */
4
+ export type HubActionId =
5
+ | "choose-deployment"
6
+ | "guided-setup"
7
+ | "flush-queue"
8
+ | "set-mode"
9
+ | "next-opt-out"
10
+ | "apply-mental-models"
11
+ | "import-sessions"
12
+ | "run-doctor"
13
+ | "init-config"
14
+ | "toggle-advanced"
15
+ | "done";
16
+
17
+ export type SetupActionId = FieldId | `reset:${FieldId}` | HubActionId;
18
+
19
+ export type SetupStep = "config" | "profile" | "banks" | "review" | "done";
20
+
21
+ export type SetupProfileChoice =
22
+ | "project-user"
23
+ | "project-only"
24
+ | "isolated-only"
25
+ | "user-only"
26
+ | "recall-only";
27
+
28
+ export type SetupUiState = {
29
+ step?: SetupStep;
30
+ tabIndex: number;
31
+ selectedByTab: Partial<Record<TabId, number>>;
32
+ showAdvanced?: boolean;
33
+ profileChoice?: SetupProfileChoice;
34
+ };
35
+
36
+ export type ThemeLike = {
37
+ fg(
38
+ color: "accent" | "muted" | "dim" | "success" | "error" | "warning" | "borderAccent" | "text",
39
+ text: string,
40
+ ): string;
41
+ bg(color: "selectedBg", text: string): string;
42
+ bold(text: string): string;
43
+ };
44
+
45
+ export const RECEIPT_FACT_LIMIT = 3;
46
+ export const CANCEL = "Cancel";
47
+
48
+ /** Hub footer: status/setup/emergency first; import/templates/advanced demoted (agent tools own day-to-day edits). */
49
+ export const HUB_ACTION_HELP =
50
+ " g guided · m mode · x next-opt-out · f flush · o doctor · n init · d deployment · i import · t templates · a advanced · q close ";