@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,66 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import type {
3
+ HindsightObservationScopes,
4
+ ResolvedConfig,
5
+ RetainJob,
6
+ UpdateMode,
7
+ } from "../types.js";
8
+ import { redactSecrets } from "../utils/sanitize.js";
9
+
10
+ export interface RetainJobBuildArgs {
11
+ config: ResolvedConfig;
12
+ bankId: string;
13
+ content: string;
14
+ context: string;
15
+ tags: string[];
16
+ documentId: string;
17
+ updateMode: UpdateMode;
18
+ metadata?: Record<string, string>;
19
+ timestamp?: string;
20
+ observationScopes?: HindsightObservationScopes;
21
+ documentTags?: string[];
22
+ entities?: RetainJob["item"]["entities"];
23
+ async?: boolean;
24
+ /** Named bank retain strategy (e.g. conversation, gitlog). Overrides bank default for this item. */
25
+ strategy?: string;
26
+ }
27
+
28
+ function sanitizedMetadata(
29
+ metadata: Record<string, string> | undefined,
30
+ redact: boolean,
31
+ ): Record<string, string> | undefined {
32
+ if (!metadata) return undefined;
33
+ if (!redact) return metadata;
34
+ return Object.fromEntries(
35
+ Object.entries(metadata).map(([key, value]) => [key, redactSecrets(value)]),
36
+ );
37
+ }
38
+
39
+ export function buildRetainJob(args: RetainJobBuildArgs): RetainJob {
40
+ const redact = args.config.retain.redactSecrets;
41
+ const content = redact ? redactSecrets(args.content) : args.content;
42
+ const context = redact ? redactSecrets(args.context) : args.context;
43
+ const metadata = sanitizedMetadata(args.metadata, redact);
44
+ return {
45
+ id: randomUUID(),
46
+ bankId: args.bankId,
47
+ createdAt: new Date().toISOString(),
48
+ documentId: args.documentId,
49
+ updateMode: args.updateMode,
50
+ item: {
51
+ content,
52
+ context,
53
+ timestamp: args.timestamp ?? new Date().toISOString(),
54
+ async: args.async ?? args.config.retain.async,
55
+ ...((args.entities?.length ?? args.config.retain.entities.length)
56
+ ? { entities: [...args.config.retain.entities, ...(args.entities ?? [])] }
57
+ : {}),
58
+ tags: args.tags,
59
+ ...(metadata ? { metadata } : {}),
60
+ ...(args.observationScopes?.length ? { observationScopes: args.observationScopes } : {}),
61
+ ...(args.documentTags?.length ? { documentTags: args.documentTags } : {}),
62
+ ...(args.strategy ? { strategy: args.strategy } : {}),
63
+ },
64
+ retries: 0,
65
+ };
66
+ }
@@ -0,0 +1,132 @@
1
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { redactSecrets } from "../utils/sanitize.js";
4
+ import type { RetainOutcome, UpdateMode } from "../types.js";
5
+
6
+ export interface RetainReceipt {
7
+ createdAt: string;
8
+ bankId: string;
9
+ documentId: string;
10
+ queueJobId: string;
11
+ updateMode: UpdateMode;
12
+ source: "tool" | "import" | "queue";
13
+ context: string;
14
+ tags: string[];
15
+ outcome?: RetainOutcome;
16
+ }
17
+
18
+ export interface RetainReceiptHistory {
19
+ version: 1;
20
+ receipts: RetainReceipt[];
21
+ }
22
+
23
+ const MAX_RECEIPTS = 50;
24
+ const MAX_RECEIPT_CONTEXT_CHARS = 1000;
25
+
26
+ export function retainReceiptsPath(cwd: string): string {
27
+ return resolve(cwd, ".pi/hindsight/retain-receipts.json");
28
+ }
29
+
30
+ function emptyHistory(): RetainReceiptHistory {
31
+ return { version: 1, receipts: [] };
32
+ }
33
+
34
+ export async function readRetainReceipts(path: string): Promise<RetainReceiptHistory> {
35
+ try {
36
+ const parsed = JSON.parse(await readFile(path, "utf8")) as Partial<RetainReceiptHistory>;
37
+ if (parsed.version !== 1 || !Array.isArray(parsed.receipts)) return emptyHistory();
38
+ return { version: 1, receipts: parsed.receipts.filter(isRetainReceipt).slice(0, MAX_RECEIPTS) };
39
+ } catch (error) {
40
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return emptyHistory();
41
+ return emptyHistory();
42
+ }
43
+ }
44
+
45
+ function isRetainReceipt(value: unknown): value is RetainReceipt {
46
+ if (!value || typeof value !== "object") return false;
47
+ const receipt = value as Record<string, unknown>;
48
+ return (
49
+ typeof receipt.createdAt === "string" &&
50
+ typeof receipt.bankId === "string" &&
51
+ typeof receipt.documentId === "string" &&
52
+ typeof receipt.queueJobId === "string" &&
53
+ (receipt.updateMode === "append" || receipt.updateMode === "replace") &&
54
+ (receipt.source === "tool" || receipt.source === "import" || receipt.source === "queue") &&
55
+ typeof receipt.context === "string" &&
56
+ Array.isArray(receipt.tags) &&
57
+ receipt.tags.every((tag) => typeof tag === "string")
58
+ );
59
+ }
60
+
61
+ type ReceiptInput = Omit<RetainReceipt, "createdAt"> & { createdAt?: string };
62
+ type ReceiptOptions = { redactSecrets?: boolean; maxContextChars?: number };
63
+
64
+ function receiptContext(context: string, options: ReceiptOptions): string {
65
+ const redacted = options.redactSecrets === false ? context : redactSecrets(context);
66
+ const maxChars = options.maxContextChars ?? MAX_RECEIPT_CONTEXT_CHARS;
67
+ if (redacted.length <= maxChars) return redacted;
68
+ return `${redacted.slice(0, maxChars)}…[truncated]`;
69
+ }
70
+
71
+ function buildReceipt(receipt: ReceiptInput, options: ReceiptOptions): RetainReceipt {
72
+ return {
73
+ createdAt: receipt.createdAt ?? new Date().toISOString(),
74
+ bankId: receipt.bankId,
75
+ documentId: receipt.documentId,
76
+ queueJobId: receipt.queueJobId,
77
+ updateMode: receipt.updateMode,
78
+ source: receipt.source,
79
+ context: receiptContext(receipt.context, options),
80
+ tags: receipt.tags,
81
+ ...(receipt.outcome ? { outcome: receipt.outcome } : {}),
82
+ };
83
+ }
84
+
85
+ function mergeReceipt(receipts: RetainReceipt[], next: RetainReceipt): RetainReceipt[] {
86
+ return [
87
+ next,
88
+ ...receipts.filter(
89
+ (existing) => existing.documentId !== next.documentId || existing.bankId !== next.bankId,
90
+ ),
91
+ ];
92
+ }
93
+
94
+ async function writeReceiptHistory(
95
+ cwd: string,
96
+ receipts: RetainReceipt[],
97
+ ): Promise<RetainReceiptHistory> {
98
+ const path = retainReceiptsPath(cwd);
99
+ const history = { version: 1 as const, receipts: receipts.slice(0, MAX_RECEIPTS) };
100
+ await mkdir(dirname(path), { recursive: true });
101
+ const tempPath = `${path}.${process.pid}.${Date.now()}.tmp`;
102
+ await writeFile(tempPath, `${JSON.stringify(history, null, 2)}\n`, "utf8");
103
+ await rename(tempPath, path);
104
+ return history;
105
+ }
106
+
107
+ export async function appendRetainReceipt(
108
+ cwd: string,
109
+ receipt: ReceiptInput,
110
+ options: ReceiptOptions = {},
111
+ ): Promise<RetainReceiptHistory> {
112
+ const current = await readRetainReceipts(retainReceiptsPath(cwd));
113
+ return writeReceiptHistory(cwd, mergeReceipt(current.receipts, buildReceipt(receipt, options)));
114
+ }
115
+
116
+ export async function appendRetainReceipts(
117
+ cwd: string,
118
+ receiptInputs: ReceiptInput[],
119
+ options: ReceiptOptions = {},
120
+ ): Promise<RetainReceiptHistory> {
121
+ if (receiptInputs.length === 0) return readRetainReceipts(retainReceiptsPath(cwd));
122
+ const current = await readRetainReceipts(retainReceiptsPath(cwd));
123
+ let receipts = current.receipts;
124
+ for (const input of receiptInputs)
125
+ receipts = mergeReceipt(receipts, buildReceipt(input, options));
126
+ return writeReceiptHistory(cwd, receipts);
127
+ }
128
+
129
+ export async function listRetainReceipts(cwd: string, limit = 10): Promise<RetainReceipt[]> {
130
+ const history = await readRetainReceipts(retainReceiptsPath(cwd));
131
+ return history.receipts.slice(0, Math.max(0, limit));
132
+ }
@@ -0,0 +1,228 @@
1
+ import type { AgentEndEvent } from "@earendil-works/pi-coding-agent";
2
+ import type {
3
+ HindsightLikeClient,
4
+ HindsightObservationScopes,
5
+ ResolvedConfig,
6
+ RetainJob,
7
+ RetainOutcome,
8
+ UpdateMode,
9
+ } from "../types.js";
10
+ import { baseTags } from "../banks/banking.js";
11
+ import { projectMessages } from "../utils/messages.js";
12
+ import { redactError } from "../utils/sanitize.js";
13
+ import { contextLabel, liveDocumentId, stableSessionId } from "../utils/session.js";
14
+ import {
15
+ enqueueRetain,
16
+ enqueueRetainCoalesced,
17
+ flushRetain,
18
+ summarizeRetain,
19
+ summarizeRetainQueue,
20
+ retainQueuePath,
21
+ type FlushRetainQueueResult,
22
+ } from "../queue/queue.js";
23
+ import { createMemoryIdentity } from "../operations/memory-identity.js";
24
+ import { LIVE_SESSION_RETAIN_STRATEGY } from "../banks/retain-strategies.js";
25
+ import { expandObservationScopes } from "./observation-scopes.js";
26
+ import { buildRetainJob as buildRetainJobCore } from "./retain-job-builder.js";
27
+ import { appendRetainReceipts } from "./retain-receipts.js";
28
+
29
+ function hasRetainOutcome(outcome: { itemsCount?: number; operations?: number; tokens?: number }) {
30
+ return (
31
+ outcome.itemsCount !== undefined ||
32
+ outcome.operations !== undefined ||
33
+ outcome.tokens !== undefined
34
+ );
35
+ }
36
+
37
+ export async function recordRetainDeliveries(
38
+ cwd: string,
39
+ config: ResolvedConfig,
40
+ result: FlushRetainQueueResult,
41
+ ): Promise<void> {
42
+ if (!result.delivered?.length) return;
43
+ await appendRetainReceipts(
44
+ cwd,
45
+ result.delivered.map((delivery) => ({
46
+ queueJobId: delivery.queueJobId,
47
+ bankId: delivery.bankId,
48
+ documentId: delivery.documentId,
49
+ updateMode: delivery.updateMode,
50
+ source: "queue" as const,
51
+ context: delivery.context,
52
+ tags: delivery.tags,
53
+ ...(hasRetainOutcome(delivery.outcome) ? { outcome: delivery.outcome } : {}),
54
+ })),
55
+ { redactSecrets: config.retain.redactSecrets },
56
+ );
57
+ }
58
+
59
+ export function buildRetainJob(args: {
60
+ config: ResolvedConfig;
61
+ cwd: string;
62
+ sessionFile?: string;
63
+ bankId: string;
64
+ messages: AgentEndEvent["messages"];
65
+ extraTags?: string[];
66
+ }): RetainJob | undefined {
67
+ const projected = projectMessages(args.messages, args.config);
68
+ if (projected.length === 0) return undefined;
69
+ const content = JSON.stringify(projected, null, 2);
70
+ const sessionId = stableSessionId(args.sessionFile, args.cwd);
71
+ const identity = createMemoryIdentity(args.cwd, args.config, args.sessionFile);
72
+ const observationScopes = args.config.observations.enabled
73
+ ? expandObservationScopes(args.config.observations.scopes, {
74
+ ...identity,
75
+ projectBankId: args.bankId,
76
+ })
77
+ : [];
78
+ return buildRetainJobCore({
79
+ config: args.config,
80
+ bankId: args.bankId,
81
+ content,
82
+ context: contextLabel(args.cwd, args.sessionFile, args.config.agentUse),
83
+ documentId: liveDocumentId(args.sessionFile, args.cwd),
84
+ updateMode: args.config.retain.updateMode,
85
+ tags: [...new Set([...baseTags(args.cwd, sessionId, args.config), ...(args.extraTags ?? [])])],
86
+ metadata: {
87
+ cwd: args.cwd,
88
+ imported: "false",
89
+ ...(args.sessionFile ? { pi_session_file: args.sessionFile } : {}),
90
+ },
91
+ ...(observationScopes.length ? { observationScopes } : {}),
92
+ // Coding bank templates define named strategies; live sessions use conversation.
93
+ strategy: LIVE_SESSION_RETAIN_STRATEGY,
94
+ });
95
+ }
96
+
97
+ export async function enqueueRetainFromAgentEnd(args: {
98
+ event: AgentEndEvent;
99
+ cwd: string;
100
+ sessionFile?: string;
101
+ config: ResolvedConfig;
102
+ client: HindsightLikeClient;
103
+ bankId: string;
104
+ extraTags?: string[];
105
+ }): Promise<{ queued: boolean; sent: number; remaining: number; reflectError?: string }> {
106
+ if (!args.config.enabled || !args.config.retain.enabled)
107
+ return { queued: false, sent: 0, remaining: 0 };
108
+ const job = buildRetainJob({
109
+ config: args.config,
110
+ cwd: args.cwd,
111
+ ...(args.sessionFile ? { sessionFile: args.sessionFile } : {}),
112
+ bankId: args.bankId,
113
+ messages: args.event.messages,
114
+ ...(args.extraTags ? { extraTags: args.extraTags } : {}),
115
+ });
116
+ if (!job) return { queued: false, sent: 0, remaining: 0 };
117
+
118
+ // Coalesced delivery: merge this delta into any compatible pending job and defer the
119
+ // remote flush to the session boundary (shutdown) / periodic flush. This collapses the
120
+ // per-agent_end write storm into a few larger operations. Durability is unchanged: the
121
+ // job is persisted to the on-disk queue before we return.
122
+ if (args.config.retain.delivery === "coalesced") {
123
+ await enqueueRetainCoalesced(args.cwd, args.config, job);
124
+ const summary = await summarizeRetainQueue(retainQueuePath(args.cwd, args.config));
125
+ return { queued: true, sent: 0, remaining: summary.active.valid };
126
+ }
127
+
128
+ await enqueueRetain(args.cwd, args.config, job);
129
+ const result = await flushRetain(args.cwd, args.config, args.client);
130
+ await recordRetainDeliveries(args.cwd, args.config, result);
131
+ let reflectError: string | undefined;
132
+ if (args.config.retain.postRetainReflect) {
133
+ try {
134
+ await args.client.reflect(
135
+ args.bankId,
136
+ "Reflect on the recently retained session to extract insights",
137
+ { context: "Post-retain reflection" },
138
+ );
139
+ } catch (error) {
140
+ // Best-effort reflect after retain; the retain itself already succeeded above.
141
+ // Surface the (redacted) cause to the caller instead of swallowing it silently,
142
+ // so callers with a notification channel can make it debug-visible.
143
+ reflectError = redactError(error);
144
+ }
145
+ }
146
+ return {
147
+ queued: true,
148
+ sent: result.sent,
149
+ remaining: result.remaining,
150
+ ...(reflectError ? { reflectError } : {}),
151
+ };
152
+ }
153
+
154
+ export type DurableRetainSource = "auto" | "tool" | "command" | "import";
155
+
156
+ export interface RetainDurablyArgs {
157
+ cwd: string;
158
+ config: ResolvedConfig;
159
+ client: HindsightLikeClient;
160
+ bankId: string;
161
+ content: string;
162
+ context: string;
163
+ tags: string[];
164
+ documentId: string;
165
+ updateMode: UpdateMode;
166
+ metadata?: Record<string, string>;
167
+ source: DurableRetainSource;
168
+ timestamp?: string;
169
+ observationScopes?: HindsightObservationScopes;
170
+ documentTags?: string[];
171
+ entities?: RetainJob["item"]["entities"];
172
+ async?: boolean;
173
+ }
174
+
175
+ export interface RetainDurablyResult {
176
+ enqueued: boolean;
177
+ sent: number;
178
+ remaining: number;
179
+ deadLettered: number;
180
+ bankId: string;
181
+ documentId: string;
182
+ queueJobId: string;
183
+ updateMode: UpdateMode;
184
+ operationIds?: string[];
185
+ outcome?: RetainOutcome;
186
+ }
187
+
188
+ export function buildDurableRetainJob(args: Omit<RetainDurablyArgs, "client">): RetainJob {
189
+ return buildRetainJobCore({
190
+ ...args,
191
+ metadata: {
192
+ ...args.metadata,
193
+ source: "pi-hindsight",
194
+ retainSource: args.source,
195
+ },
196
+ });
197
+ }
198
+
199
+ export async function retainDurably(args: RetainDurablyArgs): Promise<RetainDurablyResult> {
200
+ const job = buildDurableRetainJob(args);
201
+ const receipt = {
202
+ bankId: job.bankId,
203
+ documentId: job.documentId,
204
+ queueJobId: job.id,
205
+ updateMode: job.updateMode,
206
+ };
207
+ const enqueueResult = await enqueueRetain(args.cwd, args.config, job);
208
+ if (enqueueResult.previousLength > 0) {
209
+ const summary = await summarizeRetain(args.cwd, args.config);
210
+ return {
211
+ ...receipt,
212
+ enqueued: true,
213
+ sent: 0,
214
+ remaining: summary.active.valid + summary.active.malformed,
215
+ deadLettered: 0,
216
+ };
217
+ }
218
+ const result = await flushRetain(args.cwd, args.config, args.client, { maxJobs: 1 });
219
+ return {
220
+ ...receipt,
221
+ enqueued: true,
222
+ sent: result.sent,
223
+ remaining: result.remaining,
224
+ deadLettered: result.deadLettered,
225
+ ...(result.operationIds ? { operationIds: result.operationIds } : {}),
226
+ ...(result.outcome ? { outcome: result.outcome } : {}),
227
+ };
228
+ }
@@ -0,0 +1,74 @@
1
+ import {
2
+ getBuiltInBankTemplate,
3
+ listBankTemplatesForAgentUse,
4
+ listBuiltInBankTemplates,
5
+ resolveBankTemplateManifest,
6
+ } from "../banks/bank-templates.js";
7
+ import { resolveProjectIdentity } from "../banks/banking.js";
8
+ import { resolveOperationBank } from "../banks/bank-selection.js";
9
+ import { seedKnowledgePages } from "../banks/knowledge-page-seed.js";
10
+ import type { MemoryOperationsDeps } from "./memory-operation-types.js";
11
+
12
+ export function createBankTemplateOperations(deps: MemoryOperationsDeps) {
13
+ return {
14
+ listBankTemplates() {
15
+ return listBuiltInBankTemplates();
16
+ },
17
+
18
+ listBankTemplatesForAgentUse() {
19
+ return listBankTemplatesForAgentUse(deps.getConfig().agentUse);
20
+ },
21
+
22
+ async applyBankTemplate(args: { templateId: string; dryRun?: boolean }) {
23
+ const template = getBuiltInBankTemplate(args.templateId);
24
+ if (!template) {
25
+ throw new Error(
26
+ `Unknown bank template id: ${args.templateId}. Open /hindsight and press t to list sets for the current agent use.`,
27
+ );
28
+ }
29
+ const client = deps.getClient();
30
+ if (!client.importBankTemplate) {
31
+ throw new Error("Hindsight client does not support bank template import.");
32
+ }
33
+ const config = deps.getConfig();
34
+ // Each bundled template already declares which bank kind it targets, so apply resolves
35
+ // that bank directly instead of taking a separate --bank override.
36
+ const bankId = resolveOperationBank({
37
+ requestedBank: template.target === "user" ? "global" : undefined,
38
+ config,
39
+ projectBankId: deps.getProjectBankId(),
40
+ });
41
+ const bankMissionSettings =
42
+ template.target === "user" ? config.banks.user : config.banks.project;
43
+ const cwd = (deps as { getCwd?: () => string }).getCwd?.() ?? process.cwd();
44
+ const resolvedProjectId =
45
+ template.target === "project" ? resolveProjectIdentity(cwd, config).projectId : undefined;
46
+ const manifest = resolveBankTemplateManifest(template, bankMissionSettings, {
47
+ ...(resolvedProjectId ? { projectId: resolvedProjectId } : {}),
48
+ });
49
+ const dryRun = args.dryRun ?? true;
50
+ const result = await client.importBankTemplate(bankId, manifest, { dryRun });
51
+ // Coding project templates also seed the knowledge-page taxonomy when the server supports pages.
52
+ let knowledgeSeed: Awaited<ReturnType<typeof seedKnowledgePages>> | undefined;
53
+ if (template.id === "pi-coding-project") {
54
+ const baseTags = [
55
+ "source:pi",
56
+ ...(resolvedProjectId ? [`project:${resolvedProjectId}`] : []),
57
+ ];
58
+ knowledgeSeed = await seedKnowledgePages({
59
+ client,
60
+ bankId,
61
+ baseTags,
62
+ dryRun,
63
+ });
64
+ }
65
+ return {
66
+ bankId,
67
+ template,
68
+ dryRun,
69
+ result,
70
+ ...(knowledgeSeed ? { knowledgeSeed } : {}),
71
+ };
72
+ },
73
+ };
74
+ }
@@ -0,0 +1,16 @@
1
+ import type { ConfigureMemoryArgs, MemoryOperationsDeps } from "./memory-operation-types.js";
2
+ import { configureMemory, initMemoryConfig } from "../config/config-writer.js";
3
+
4
+ export function createConfigOperations(deps: MemoryOperationsDeps) {
5
+ return {
6
+ async configure(cwd: string, args: ConfigureMemoryArgs) {
7
+ return configureMemory(cwd, args, deps);
8
+ },
9
+
10
+ async init(cwd: string) {
11
+ const result = await initMemoryConfig(cwd, deps);
12
+ deps.reloadConfig?.(cwd);
13
+ return result;
14
+ },
15
+ };
16
+ }