@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,105 @@
1
+ import { checkHindsight } from "../client/client.js";
2
+ import { formatDebugReport } from "../utils/diagnostics.js";
3
+ import { resolveQueuePath, summarizeRetainQueue } from "../queue/queue.js";
4
+ import {
5
+ importManifestSummary,
6
+ readImportManifestSafe,
7
+ resolveImportManifestPath,
8
+ } from "../imports/import-plan.js";
9
+ import { buildSyncStatus, DEFAULT_GIT_SEED_LIMIT, seedGitLog } from "../lifecycle/git-seed.js";
10
+ import type { MemoryOperationsDeps } from "./memory-operation-types.js";
11
+ import {
12
+ buildScopeMigratePlan,
13
+ writeScopeMigrateReceipt,
14
+ type ScopeMigratePlan,
15
+ } from "./scope-migrate.js";
16
+
17
+ export function createDiagnosticsOperations(deps: MemoryOperationsDeps) {
18
+ return {
19
+ async doctor(cwd: string, sessionFile?: string): Promise<string> {
20
+ const config = deps.getConfig();
21
+ const projectBankId = deps.getProjectBankId();
22
+ const manifestPath = resolveImportManifestPath(cwd, config.import.manifestPath);
23
+ const [health, queueSummary, manifestResult, sync] = await Promise.all([
24
+ checkHindsight(deps.getClient(), projectBankId),
25
+ summarizeRetainQueue(resolveQueuePath(cwd, config.retain.queuePath)),
26
+ readImportManifestSafe(manifestPath),
27
+ buildSyncStatus({
28
+ cwd,
29
+ config,
30
+ client: deps.getClient(),
31
+ bankId: projectBankId,
32
+ }),
33
+ ]);
34
+ const imports = importManifestSummary(manifestResult.manifest);
35
+ const scopeMigrate = buildScopeMigratePlan({ cwd, config, projectBankId });
36
+ return formatDebugReport({
37
+ cwd,
38
+ ...(sessionFile ? { sessionFile } : {}),
39
+ projectBankId,
40
+ config,
41
+ queueLength: queueSummary.active.valid,
42
+ queuePath: queueSummary.active.path,
43
+ queueMalformedLines: queueSummary.active.malformed,
44
+ queueReadError: queueSummary.active.error,
45
+ deadLetterPath: queueSummary.deadLetter.path,
46
+ deadLetterLength: queueSummary.deadLetter.valid,
47
+ deadLetterMalformedLines: queueSummary.deadLetter.malformed,
48
+ deadLetterReadError: queueSummary.deadLetter.error,
49
+ importManifestPath: manifestPath,
50
+ importManifestError: manifestResult.error,
51
+ importManifestAction: manifestResult.action,
52
+ importCount: imports.count,
53
+ ...(imports.latest ? { latestImport: imports.latest } : {}),
54
+ health,
55
+ scopeMigrate,
56
+ sync,
57
+ });
58
+ },
59
+
60
+ /** Memory readiness: queue depth, git seed receipt, knowledge-page capability. */
61
+ async syncStatus(cwd: string) {
62
+ return buildSyncStatus({
63
+ cwd,
64
+ config: deps.getConfig(),
65
+ client: deps.getClient(),
66
+ bankId: deps.getProjectBankId(),
67
+ });
68
+ },
69
+
70
+ /**
71
+ * Opt-in cold-repo gitlog seed (commit messages only). dryRun defaults true.
72
+ * Does not auto-run on session start — conversation retain remains the product core.
73
+ */
74
+ async seedGitLog(args: { cwd: string; limit?: number; dryRun?: boolean; flush?: boolean }) {
75
+ return seedGitLog({
76
+ cwd: args.cwd,
77
+ bankId: deps.getProjectBankId(),
78
+ config: deps.getConfig(),
79
+ client: deps.getClient(),
80
+ limit: args.limit ?? DEFAULT_GIT_SEED_LIMIT,
81
+ dryRun: args.dryRun ?? true,
82
+ ...(args.flush !== undefined ? { flush: args.flush } : {}),
83
+ });
84
+ },
85
+
86
+ /**
87
+ * Dry-run only: plan dual-tag / legacy repo-tag migration guidance and write a local receipt.
88
+ * Never rewrites Hindsight tags or documents.
89
+ */
90
+ async scopeMigrateDryRun(
91
+ cwd: string,
92
+ options: { bankTags?: string[]; writeReceipt?: boolean } = {},
93
+ ): Promise<ScopeMigratePlan | import("./scope-migrate.js").ScopeMigrateReceipt> {
94
+ const config = deps.getConfig();
95
+ const plan = buildScopeMigratePlan({
96
+ cwd,
97
+ config,
98
+ projectBankId: deps.getProjectBankId(),
99
+ ...(options.bankTags ? { bankTags: options.bankTags } : {}),
100
+ });
101
+ if (options.writeReceipt === false) return plan;
102
+ return writeScopeMigrateReceipt(cwd, plan);
103
+ },
104
+ };
105
+ }
@@ -0,0 +1,68 @@
1
+ import type { ResolvedConfig } from "../types.js";
2
+ import {
3
+ baseTags,
4
+ deriveProjectBankId,
5
+ recallScopeTags,
6
+ resolveProjectIdentity,
7
+ type ProjectIdBasis,
8
+ } from "../banks/banking.js";
9
+ import { importDocumentId, liveDocumentId, stableSessionId } from "../utils/session.js";
10
+
11
+ export interface MemoryIdentity {
12
+ cwd: string;
13
+ sessionFile?: string;
14
+ /** Stable project id (pin / remote / basename). */
15
+ projectId: string;
16
+ projectIdBasis: ProjectIdBasis;
17
+ projectIdSource: string;
18
+ /** Legacy path-hash key; still dual-tagged during migration. */
19
+ repoKey: string;
20
+ sessionId: string;
21
+ projectBankId: string;
22
+ liveDocumentId: string;
23
+ baseTags: string[];
24
+ projectRecallTags: string[];
25
+ globalRecallTags: string[];
26
+ }
27
+
28
+ export function uniqueTags(tags: string[]): string[] {
29
+ return [...new Set(tags.filter(Boolean))];
30
+ }
31
+
32
+ export function mergeBaseAndExtraTags(base: string[], extra: string[] | undefined): string[] {
33
+ return uniqueTags([...base, ...(extra ?? [])]);
34
+ }
35
+
36
+ export function createMemoryIdentity(
37
+ cwd: string,
38
+ config: ResolvedConfig,
39
+ sessionFile?: string,
40
+ ): MemoryIdentity {
41
+ const sessionId = stableSessionId(sessionFile, cwd);
42
+ const project = resolveProjectIdentity(cwd, config);
43
+ return {
44
+ cwd,
45
+ ...(sessionFile ? { sessionFile } : {}),
46
+ projectId: project.projectId,
47
+ projectIdBasis: project.basis,
48
+ projectIdSource: project.source,
49
+ repoKey: project.legacyRepoKey,
50
+ sessionId,
51
+ projectBankId: deriveProjectBankId(cwd, config),
52
+ liveDocumentId: liveDocumentId(sessionFile, cwd),
53
+ baseTags: baseTags(cwd, sessionId, config),
54
+ projectRecallTags: recallScopeTags(cwd, config),
55
+ globalRecallTags: ["source:pi"],
56
+ };
57
+ }
58
+
59
+ export function explicitRetainTags(
60
+ cwd: string,
61
+ sessionFile: string | undefined,
62
+ extraTags: string[] | undefined,
63
+ config?: ResolvedConfig,
64
+ ): string[] {
65
+ return mergeBaseAndExtraTags(baseTags(cwd, stableSessionId(sessionFile, cwd), config), extraTags);
66
+ }
67
+
68
+ export { importDocumentId, liveDocumentId, stableSessionId };
@@ -0,0 +1,71 @@
1
+ import type { MemoryOperationsDeps } from "./memory-operation-types.js";
2
+ import {
3
+ importMemoryChatTranscript,
4
+ importMemoryProjectSessions,
5
+ importMemorySession,
6
+ } from "../imports/import-sessions.js";
7
+ import { createBankTemplateOperations } from "./memory-bank-template-operations.js";
8
+ import { createConfigOperations } from "./memory-config-operations.js";
9
+ import { createControlOperations } from "./memory-control-operations.js";
10
+ import { createDiagnosticsOperations } from "./memory-diagnostics-operations.js";
11
+ import { createQueueOperations } from "../queue/queue-operations.js";
12
+ import { createRecallOperations } from "./memory-recall-operations.js";
13
+ import { createRetainOperations } from "./memory-retain-operations.js";
14
+ import { createSessionOperations } from "./memory-session-operations.js";
15
+ import type { ResolvedConfig } from "../types.js";
16
+ import type { ImportProgressReporter } from "../imports/import-sessions.js";
17
+
18
+ export type { ConfigureMemoryArgs, MemoryOperationsDeps } from "./memory-operation-types.js";
19
+
20
+ function createImportOperations(deps: MemoryOperationsDeps) {
21
+ return {
22
+ async importSession(args: {
23
+ sessionFile: string;
24
+ cwd?: string;
25
+ bank?: string;
26
+ dryRun?: boolean;
27
+ includeBranches?: ResolvedConfig["import"]["includeBranches"];
28
+ onProgress?: ImportProgressReporter;
29
+ }) {
30
+ return importMemorySession(args, deps);
31
+ },
32
+
33
+ async importChatTranscript(args: {
34
+ sourceFile: string;
35
+ cwd: string;
36
+ bank?: string;
37
+ dryRun?: boolean;
38
+ onProgress?: ImportProgressReporter;
39
+ }) {
40
+ return importMemoryChatTranscript(args, deps);
41
+ },
42
+
43
+ async importProjectSessions(args: {
44
+ cwd: string;
45
+ currentSessionFile?: string;
46
+ searchDir?: string;
47
+ bank?: string;
48
+ dryRun?: boolean;
49
+ includeBranches?: ResolvedConfig["import"]["includeBranches"];
50
+ onProgress?: ImportProgressReporter;
51
+ }) {
52
+ return importMemoryProjectSessions(args, deps);
53
+ },
54
+ };
55
+ }
56
+
57
+ export function createMemoryOperations(deps: MemoryOperationsDeps) {
58
+ return {
59
+ ...createRecallOperations(deps),
60
+ ...createRetainOperations(deps),
61
+ ...createConfigOperations(deps),
62
+ ...createImportOperations(deps),
63
+ ...createQueueOperations(deps),
64
+ ...createSessionOperations(),
65
+ ...createDiagnosticsOperations(deps),
66
+ ...createBankTemplateOperations(deps),
67
+ ...createControlOperations(deps),
68
+ };
69
+ }
70
+
71
+ export type MemoryOperations = ReturnType<typeof createMemoryOperations>;
@@ -0,0 +1,13 @@
1
+ import type { HindsightLikeClient, ResolvedConfig } from "../types.js";
2
+ import type { ProjectConfigPatchInput } from "../config/config-writer.js";
3
+ import type { InitHealth } from "../lifecycle/memory-lifecycle.js";
4
+
5
+ export interface MemoryOperationsDeps {
6
+ getClient(): HindsightLikeClient;
7
+ getConfig(): ResolvedConfig;
8
+ getProjectBankId(): string;
9
+ getInitHealth?(): InitHealth | undefined;
10
+ reloadConfig?(cwd: string): void;
11
+ }
12
+
13
+ export type ConfigureMemoryArgs = ProjectConfigPatchInput;
@@ -0,0 +1,162 @@
1
+ import type { MemoryOperationsDeps } from "./memory-operation-types.js";
2
+ import { composeScopedTagFilter, scopeTagsForBank } from "./memory-scope.js";
3
+ import { resolveOperationBank } from "../banks/bank-selection.js";
4
+ import { readLastRecallSnapshot, resolveLastRecallPath } from "../lifecycle/recall-visibility.js";
5
+ import {
6
+ pruneTranscriptRecallBlocks,
7
+ scanTranscriptForRecallBlocks,
8
+ } from "../lifecycle/recall-cleanup.js";
9
+ import {
10
+ getEffectiveSessionMemoryMode,
11
+ readSessionMemoryMeta,
12
+ } from "../utils/session-memory-meta.js";
13
+ import type { HindsightTagGroup, TagsMatch } from "../types.js";
14
+ import type { MinScores } from "@vectorize-io/hindsight-client";
15
+
16
+ interface ExplicitRecallFilters {
17
+ budget?: import("../types.js").Budget;
18
+ maxTokens?: number;
19
+ queryTimestamp?: string;
20
+ types?: string[];
21
+ preferObservations?: boolean;
22
+ minScores?: MinScores;
23
+ trace?: boolean;
24
+ includeEntities?: boolean;
25
+ maxEntityTokens?: number;
26
+ includeChunks?: boolean;
27
+ maxChunkTokens?: number;
28
+ includeSourceFacts?: boolean;
29
+ maxSourceFactsTokens?: number;
30
+ tags?: string[];
31
+ tagsMatch?: TagsMatch;
32
+ tagGroups?: HindsightTagGroup[];
33
+ /** Override config.scope.includeSharedObservations for this call when set. */
34
+ includeSharedObservations?: boolean;
35
+ signal?: AbortSignal;
36
+ }
37
+
38
+ interface ExplicitReflectFilters extends Omit<ExplicitRecallFilters, "queryTimestamp" | "types"> {
39
+ includeFacts?: boolean;
40
+ includeToolCalls?: boolean;
41
+ includeToolCallOutput?: boolean;
42
+ factTypes?: Array<"world" | "experience" | "observation">;
43
+ excludeMentalModels?: boolean;
44
+ excludeMentalModelIds?: string[];
45
+ }
46
+
47
+ export function createRecallOperations(deps: MemoryOperationsDeps) {
48
+ return {
49
+ async recall(
50
+ cwd: string,
51
+ query: string,
52
+ bank?: string,
53
+ sessionFile?: string,
54
+ filters: ExplicitRecallFilters = {},
55
+ ) {
56
+ const meta = await readSessionMemoryMeta(cwd, sessionFile);
57
+ if (!getEffectiveSessionMemoryMode(meta).recall)
58
+ throw new Error("Hindsight recall is disabled for this session");
59
+ const config = deps.getConfig();
60
+ const bankId = resolveOperationBank({
61
+ requestedBank: bank,
62
+ config,
63
+ projectBankId: deps.getProjectBankId(),
64
+ });
65
+ const scopeTags = scopeTagsForBank(cwd, config, bankId);
66
+ const includeShared =
67
+ filters.includeSharedObservations ?? config.scope.includeSharedObservations;
68
+ const result = await deps.getClient().recall(bankId, query, {
69
+ budget: filters.budget ?? config.recall.budget,
70
+ maxTokens: filters.maxTokens ?? config.recall.maxTokens,
71
+ ...(filters.queryTimestamp || config.recall.queryTimestamp
72
+ ? { queryTimestamp: filters.queryTimestamp ?? config.recall.queryTimestamp }
73
+ : {}),
74
+ ...(filters.types ? { types: filters.types } : {}),
75
+ preferObservations: config.recall.preferObservations,
76
+ ...(filters.preferObservations !== undefined
77
+ ? { preferObservations: filters.preferObservations }
78
+ : {}),
79
+ ...(filters.minScores !== undefined ? { minScores: filters.minScores } : {}),
80
+ ...(filters.trace !== undefined ? { trace: filters.trace } : {}),
81
+ ...(filters.includeEntities !== undefined
82
+ ? { includeEntities: filters.includeEntities }
83
+ : {}),
84
+ ...(filters.maxEntityTokens !== undefined
85
+ ? { maxEntityTokens: filters.maxEntityTokens }
86
+ : {}),
87
+ ...(filters.includeChunks !== undefined ? { includeChunks: filters.includeChunks } : {}),
88
+ ...(filters.maxChunkTokens !== undefined ? { maxChunkTokens: filters.maxChunkTokens } : {}),
89
+ ...(filters.includeSourceFacts !== undefined
90
+ ? { includeSourceFacts: filters.includeSourceFacts }
91
+ : {}),
92
+ ...(filters.maxSourceFactsTokens !== undefined
93
+ ? { maxSourceFactsTokens: filters.maxSourceFactsTokens }
94
+ : {}),
95
+ ...composeScopedTagFilter(scopeTags, {
96
+ ...filters,
97
+ includeSharedObservations: includeShared,
98
+ }),
99
+ ...(filters.signal ? { signal: filters.signal } : {}),
100
+ });
101
+ return { bankId, result };
102
+ },
103
+
104
+ async reflect(
105
+ cwd: string,
106
+ query: string,
107
+ context?: string,
108
+ bank?: string,
109
+ responseSchema?: Record<string, unknown>,
110
+ filters: ExplicitReflectFilters = {},
111
+ ) {
112
+ const config = deps.getConfig();
113
+ const bankId = resolveOperationBank({
114
+ requestedBank: bank,
115
+ config,
116
+ projectBankId: deps.getProjectBankId(),
117
+ });
118
+ const scopeTags = scopeTagsForBank(cwd, config, bankId);
119
+ const includeShared =
120
+ filters.includeSharedObservations ?? config.scope.includeSharedObservations;
121
+ const result = await deps.getClient().reflect(bankId, query, {
122
+ ...(context ? { context } : {}),
123
+ budget: filters.budget ?? config.recall.budget,
124
+ ...(filters.maxTokens !== undefined ? { maxTokens: filters.maxTokens } : {}),
125
+ ...(responseSchema ? { responseSchema } : {}),
126
+ ...(filters.includeFacts !== undefined ? { includeFacts: filters.includeFacts } : {}),
127
+ ...(filters.includeToolCalls !== undefined
128
+ ? { includeToolCalls: filters.includeToolCalls }
129
+ : {}),
130
+ ...(filters.includeToolCallOutput !== undefined
131
+ ? { includeToolCallOutput: filters.includeToolCallOutput }
132
+ : {}),
133
+ ...(filters.factTypes ? { factTypes: filters.factTypes } : {}),
134
+ ...(filters.excludeMentalModels !== undefined
135
+ ? { excludeMentalModels: filters.excludeMentalModels }
136
+ : {}),
137
+ ...(filters.excludeMentalModelIds
138
+ ? { excludeMentalModelIds: filters.excludeMentalModelIds }
139
+ : {}),
140
+ ...composeScopedTagFilter(scopeTags, {
141
+ ...filters,
142
+ includeSharedObservations: includeShared,
143
+ }),
144
+ ...(filters.signal ? { signal: filters.signal } : {}),
145
+ });
146
+ return { bankId, result };
147
+ },
148
+
149
+ async lastRecall(cwd: string) {
150
+ const config = deps.getConfig();
151
+ const path = resolveLastRecallPath(cwd, config.recall.lastRecallPath);
152
+ const snapshot = await readLastRecallSnapshot(cwd, config.recall.lastRecallPath);
153
+ return { path, snapshot };
154
+ },
155
+
156
+ async recallCleanup(sessionFile: string, prune: boolean) {
157
+ return prune
158
+ ? pruneTranscriptRecallBlocks(sessionFile)
159
+ : scanTranscriptForRecallBlocks(sessionFile);
160
+ },
161
+ };
162
+ }
@@ -0,0 +1,131 @@
1
+ import type { MemoryOperationsDeps } from "./memory-operation-types.js";
2
+ import { flushRetain } from "../queue/queue.js";
3
+ import { resolveOperationBank } from "../banks/bank-selection.js";
4
+ import { explicitMemoryDocumentId } from "../utils/session.js";
5
+ import { createMemoryIdentity, explicitRetainTags } from "./memory-identity.js";
6
+ import { expandObservationScopes } from "../lifecycle/observation-scopes.js";
7
+ import { retainDurably } from "../lifecycle/retain.js";
8
+ import { appendRetainReceipt, listRetainReceipts } from "../lifecycle/retain-receipts.js";
9
+ import {
10
+ getEffectiveSessionMemoryMode,
11
+ readSessionMemoryMeta,
12
+ } from "../utils/session-memory-meta.js";
13
+ import type { HindsightObservationScopes, ResolvedConfig, UpdateMode } from "../types.js";
14
+
15
+ const RESERVED_EXPLICIT_RETAIN_METADATA_KEYS = new Set([
16
+ "cwd",
17
+ "pi_session_file",
18
+ "source",
19
+ "retainSource",
20
+ ]);
21
+
22
+ function callerMetadata(
23
+ metadata: Record<string, string> | undefined,
24
+ ): Record<string, string> | undefined {
25
+ if (!metadata) return undefined;
26
+ const entries = Object.entries(metadata).filter(
27
+ ([key]) => !RESERVED_EXPLICIT_RETAIN_METADATA_KEYS.has(key),
28
+ );
29
+ return entries.length ? Object.fromEntries(entries) : undefined;
30
+ }
31
+
32
+ export function createRetainOperations(deps: MemoryOperationsDeps) {
33
+ return {
34
+ async retainExplicit(args: {
35
+ cwd: string;
36
+ sessionFile?: string;
37
+ content: string;
38
+ context: string;
39
+ bank?: string;
40
+ tags?: string[];
41
+ entities?: ResolvedConfig["retain"]["entities"];
42
+ documentId?: string;
43
+ timestamp?: string;
44
+ metadata?: Record<string, string>;
45
+ updateMode?: UpdateMode;
46
+ observationScopes?: HindsightObservationScopes;
47
+ documentTags?: string[];
48
+ async?: boolean;
49
+ }) {
50
+ const meta = await readSessionMemoryMeta(args.cwd, args.sessionFile);
51
+ if (!getEffectiveSessionMemoryMode(meta).retain)
52
+ throw new Error("Hindsight retain is disabled for this session");
53
+ const config = deps.getConfig();
54
+ const bankId = resolveOperationBank({
55
+ requestedBank: args.bank,
56
+ config,
57
+ projectBankId: deps.getProjectBankId(),
58
+ });
59
+ const tags = explicitRetainTags(args.cwd, args.sessionFile, [
60
+ ...(args.tags ?? []),
61
+ ...meta.tags,
62
+ ]);
63
+ const identity = createMemoryIdentity(args.cwd, config, args.sessionFile);
64
+ const defaultObservationScopes = config.observations.enabled
65
+ ? expandObservationScopes(config.observations.scopes, {
66
+ ...identity,
67
+ projectBankId: bankId,
68
+ })
69
+ : [];
70
+ const observationScopes = args.observationScopes ?? defaultObservationScopes;
71
+ const result = await retainDurably({
72
+ cwd: args.cwd,
73
+ config,
74
+ client: deps.getClient(),
75
+ bankId,
76
+ content: args.content,
77
+ context: args.context,
78
+ tags,
79
+ updateMode: args.updateMode ?? "replace",
80
+ documentId:
81
+ args.documentId ??
82
+ explicitMemoryDocumentId({
83
+ cwd: args.cwd,
84
+ ...(args.sessionFile ? { sessionFile: args.sessionFile } : {}),
85
+ bankId,
86
+ content: args.content,
87
+ context: args.context,
88
+ }),
89
+ metadata: {
90
+ ...callerMetadata(args.metadata),
91
+ cwd: args.cwd,
92
+ ...(args.sessionFile ? { pi_session_file: args.sessionFile } : {}),
93
+ },
94
+ ...(args.timestamp ? { timestamp: args.timestamp } : {}),
95
+ source: "tool",
96
+ ...(hasObservationScopes(observationScopes) ? { observationScopes } : {}),
97
+ ...(args.documentTags?.length ? { documentTags: args.documentTags } : {}),
98
+ ...(args.entities?.length ? { entities: args.entities } : {}),
99
+ ...(args.async !== undefined ? { async: args.async } : {}),
100
+ });
101
+ const response = { ...result, tags, queued: result.enqueued };
102
+ await appendRetainReceipt(
103
+ args.cwd,
104
+ {
105
+ bankId: result.bankId,
106
+ documentId: result.documentId,
107
+ queueJobId: result.queueJobId,
108
+ updateMode: result.updateMode,
109
+ source: "tool",
110
+ context: args.context,
111
+ tags,
112
+ ...(result.outcome ? { outcome: result.outcome } : {}),
113
+ },
114
+ { redactSecrets: config.retain.redactSecrets },
115
+ );
116
+ return response;
117
+ },
118
+
119
+ async listRetainReceipts(cwd: string, limit?: number) {
120
+ return listRetainReceipts(cwd, limit);
121
+ },
122
+
123
+ async flush(cwd: string) {
124
+ return flushRetain(cwd, deps.getConfig(), deps.getClient());
125
+ },
126
+ };
127
+ }
128
+
129
+ function hasObservationScopes(scopes: HindsightObservationScopes): boolean {
130
+ return typeof scopes === "string" ? scopes.length > 0 : scopes.length > 0;
131
+ }
@@ -0,0 +1,104 @@
1
+ import type { HindsightTagGroup, TagsMatch, ResolvedConfig } from "../types.js";
2
+ import { recallScopeTags } from "../banks/banking.js";
3
+ import { createMemoryIdentity } from "./memory-identity.js";
4
+
5
+ export interface MemoryRecallScope {
6
+ kind: "project" | "global";
7
+ bankId: string;
8
+ tagGroups: HindsightTagGroup[];
9
+ }
10
+
11
+ export function scopeTagsForBank(cwd: string, config: ResolvedConfig, bankId: string): string[] {
12
+ return config.banks.user.enabled && bankId === config.banks.user.bankId
13
+ ? ["source:pi"]
14
+ : recallScopeTags(cwd, config);
15
+ }
16
+
17
+ export interface ScopedTagFilterInput {
18
+ tags?: string[];
19
+ tagsMatch?: TagsMatch;
20
+ tagGroups?: HindsightTagGroup[];
21
+ /**
22
+ * When true, OR exact-empty (shared/untagged) observations with the project scope filter.
23
+ * Default follows config.scope.includeSharedObservations when composed via recall paths.
24
+ */
25
+ includeSharedObservations?: boolean;
26
+ }
27
+
28
+ /** Hindsight exact-empty leaf: only untagged/shared observation-scope memories. */
29
+ export const SHARED_UNTAGGED_TAG_GROUP: HindsightTagGroup = { tags: [], match: "exact" };
30
+
31
+ /**
32
+ * OR project/user scope isolation with exact-empty shared observations.
33
+ * Used when includeSharedObservations is opted in.
34
+ */
35
+ export function withSharedObservations(scopeGroup: HindsightTagGroup): HindsightTagGroup {
36
+ return { or: [scopeGroup, SHARED_UNTAGGED_TAG_GROUP] };
37
+ }
38
+
39
+ export function composeScopedTagFilter(
40
+ scopeTags: string[],
41
+ filters: ScopedTagFilterInput = {},
42
+ ): { tagGroups: HindsightTagGroup[] } | Record<string, never> {
43
+ const includeShared = filters.includeSharedObservations === true;
44
+ const groups: HindsightTagGroup[] = [];
45
+
46
+ if (filters.tags?.length && filters.tagsMatch === "exact") {
47
+ // "exact" is set-equality: a memory's tag set must equal this group's tags exactly.
48
+ // AND-ing it with a separate mandatory scope-tag group (any_strict) would require the
49
+ // memory to have the scope tags AND have exactly the caller's tags, which is
50
+ // unsatisfiable unless the caller already knows the opaque scope tags. Fold the scope
51
+ // tags into the exact set instead so scope isolation is preserved and the filter stays
52
+ // satisfiable.
53
+ const exactLeaf: HindsightTagGroup = {
54
+ tags: [...new Set([...scopeTags, ...filters.tags])],
55
+ match: "exact",
56
+ };
57
+ groups.push(includeShared ? withSharedObservations(exactLeaf) : exactLeaf);
58
+ } else {
59
+ if (scopeTags.length) {
60
+ const scopeLeaf: HindsightTagGroup = { tags: scopeTags, match: "any_strict" };
61
+ groups.push(includeShared ? withSharedObservations(scopeLeaf) : scopeLeaf);
62
+ } else if (includeShared) {
63
+ // No project scope tags (unusual) but shared opt-in: only untagged.
64
+ groups.push(SHARED_UNTAGGED_TAG_GROUP);
65
+ }
66
+ if (filters.tags?.length)
67
+ groups.push({ tags: filters.tags, match: filters.tagsMatch ?? "any_strict" });
68
+ }
69
+ if (filters.tagGroups?.length) groups.push(...filters.tagGroups);
70
+ return groups.length ? { tagGroups: groups } : {};
71
+ }
72
+
73
+ function scopeTagGroups(scopeTags: string[], includeShared: boolean): HindsightTagGroup[] {
74
+ const composed = composeScopedTagFilter(scopeTags, {
75
+ includeSharedObservations: includeShared,
76
+ });
77
+ return "tagGroups" in composed ? composed.tagGroups : [];
78
+ }
79
+
80
+ export function selectMemoryScopes(cwd: string, config: ResolvedConfig): MemoryRecallScope[] {
81
+ const identity = createMemoryIdentity(cwd, config);
82
+ const scopes: MemoryRecallScope[] = [];
83
+ // Shared observations apply only to the coding/project bank (cross-project prefs
84
+ // inside one bank). Life/user bank keeps source:pi isolation only.
85
+ const includeShared = config.scope.includeSharedObservations === true;
86
+
87
+ if (config.banks.project.enabled) {
88
+ scopes.push({
89
+ kind: "project",
90
+ bankId: identity.projectBankId,
91
+ tagGroups: scopeTagGroups(identity.projectRecallTags, includeShared),
92
+ });
93
+ }
94
+
95
+ if (config.banks.user.enabled && config.banks.user.bankId) {
96
+ scopes.push({
97
+ kind: "global",
98
+ bankId: config.banks.user.bankId,
99
+ tagGroups: scopeTagGroups(identity.globalRecallTags, false),
100
+ });
101
+ }
102
+
103
+ return scopes;
104
+ }