@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,175 @@
1
+ import type { ResolvedConfig } from "../types.js";
2
+
3
+ interface JsonlEntry {
4
+ type?: string;
5
+ id?: string;
6
+ parentId?: string | null;
7
+ timestamp?: string;
8
+ cwd?: string;
9
+ parentSession?: unknown;
10
+ message?: unknown;
11
+ }
12
+
13
+ export interface ParsedMessage {
14
+ id?: string;
15
+ parentId: string | null;
16
+ timestamp?: string;
17
+ data: Record<string, unknown>;
18
+ }
19
+
20
+ export interface ParsedSession {
21
+ cwd?: string;
22
+ sessionId?: string;
23
+ parentSessionId?: string;
24
+ parentSessionFile?: string;
25
+ sessionTimestamp?: string;
26
+ malformedLineCount: number;
27
+ messages: ParsedMessage[];
28
+ }
29
+
30
+ function isRecord(value: unknown): value is Record<string, unknown> {
31
+ return typeof value === "object" && value !== null && !Array.isArray(value);
32
+ }
33
+
34
+ function stringField(record: Record<string, unknown>, keys: string[]): string | undefined {
35
+ for (const key of keys) {
36
+ const value = record[key];
37
+ if (typeof value === "string" && value.trim()) return value;
38
+ }
39
+ return undefined;
40
+ }
41
+
42
+ function parentSessionInfo(value: unknown): { id?: string; file?: string } {
43
+ if (typeof value === "string" && value.trim()) return { file: value };
44
+ if (!isRecord(value)) return {};
45
+ const id = stringField(value, ["id", "sessionId"]);
46
+ const file = stringField(value, ["file", "path", "sessionFile"]);
47
+ return { ...(id ? { id } : {}), ...(file ? { file } : {}) };
48
+ }
49
+
50
+ export function parseImportSessionJsonl(text: string): ParsedSession {
51
+ const messages: ParsedMessage[] = [];
52
+ let cwd: string | undefined;
53
+ let sessionId: string | undefined;
54
+ let parentSessionId: string | undefined;
55
+ let parentSessionFile: string | undefined;
56
+ let sessionTimestamp: string | undefined;
57
+ let malformedLineCount = 0;
58
+ for (const line of text.split("\n")) {
59
+ if (!line.trim()) continue;
60
+ let entry: JsonlEntry;
61
+ try {
62
+ const parsed = JSON.parse(line) as unknown;
63
+ if (!isRecord(parsed)) {
64
+ malformedLineCount += 1;
65
+ continue;
66
+ }
67
+ entry = parsed as JsonlEntry;
68
+ } catch {
69
+ malformedLineCount += 1;
70
+ continue;
71
+ }
72
+ if (entry.type === "session") {
73
+ if (typeof entry.cwd === "string") cwd = entry.cwd;
74
+ if (typeof entry.id === "string") sessionId = entry.id;
75
+ const parent = parentSessionInfo(entry.parentSession);
76
+ if (parent.id) parentSessionId = parent.id;
77
+ if (parent.file) parentSessionFile = parent.file;
78
+ if (typeof entry.timestamp === "string") sessionTimestamp = entry.timestamp;
79
+ }
80
+ if (entry.type !== "message" || !isRecord(entry.message)) continue;
81
+ messages.push({
82
+ ...(typeof entry.id === "string" ? { id: entry.id } : {}),
83
+ parentId: entry.parentId ?? null,
84
+ ...(typeof entry.timestamp === "string" ? { timestamp: entry.timestamp } : {}),
85
+ data: {
86
+ ...entry.message,
87
+ ...(typeof entry.id === "string" ? { id: entry.id } : {}),
88
+ parentId: entry.parentId ?? null,
89
+ ...(typeof entry.timestamp === "string" ? { timestamp: entry.timestamp } : {}),
90
+ },
91
+ });
92
+ }
93
+ return {
94
+ ...(cwd ? { cwd } : {}),
95
+ ...(sessionId ? { sessionId } : {}),
96
+ ...(parentSessionId ? { parentSessionId } : {}),
97
+ ...(parentSessionFile ? { parentSessionFile } : {}),
98
+ ...(sessionTimestamp ? { sessionTimestamp } : {}),
99
+ malformedLineCount,
100
+ messages,
101
+ };
102
+ }
103
+
104
+ export function parsePiSessionJsonl(text: string): {
105
+ cwd?: string;
106
+ malformedLineCount: number;
107
+ messages: Record<string, unknown>[];
108
+ } {
109
+ const parsed = parseImportSessionJsonl(text);
110
+ return {
111
+ ...(parsed.cwd ? { cwd: parsed.cwd } : {}),
112
+ malformedLineCount: parsed.malformedLineCount,
113
+ messages: parsed.messages.map((message) => message.data),
114
+ };
115
+ }
116
+
117
+ export interface ImportBranch {
118
+ leafId: string;
119
+ messages: ParsedMessage[];
120
+ }
121
+
122
+ function fallbackLeafId(messages: ParsedMessage[]): string {
123
+ const last = messages.at(-1);
124
+ if (last?.id) return last.id;
125
+ return "root";
126
+ }
127
+
128
+ export function leafIds(messages: ParsedMessage[]): string[] {
129
+ const ids = new Set(
130
+ messages.map((message) => message.id).filter((id): id is string => typeof id === "string"),
131
+ );
132
+ const parents = new Set(
133
+ messages
134
+ .map((message) => message.parentId)
135
+ .filter((id): id is string => typeof id === "string"),
136
+ );
137
+ const leaves = [...ids].filter((id) => !parents.has(id));
138
+ return leaves.length ? leaves : [fallbackLeafId(messages)];
139
+ }
140
+
141
+ function messagesForLeaf(messages: ParsedMessage[], leafId: string): ParsedMessage[] {
142
+ const byId = new Map(
143
+ messages
144
+ .map((message) => [message.id, message])
145
+ .filter((entry): entry is [string, ParsedMessage] => typeof entry[0] === "string"),
146
+ );
147
+ const path: ParsedMessage[] = [];
148
+ const seen = new Set<string>();
149
+ let current: string | null | undefined = leafId;
150
+
151
+ while (current) {
152
+ if (seen.has(current)) break;
153
+ seen.add(current);
154
+ const message = byId.get(current);
155
+ if (!message) break;
156
+ path.push(message);
157
+ current = message.parentId;
158
+ }
159
+
160
+ if (!path.length && messages.length === 1) return messages;
161
+ return path.reverse();
162
+ }
163
+
164
+ export function selectImportBranches(
165
+ parsed: ParsedSession,
166
+ includeBranches: ResolvedConfig["import"]["includeBranches"],
167
+ ): ImportBranch[] {
168
+ const leaves = leafIds(parsed.messages);
169
+ const selectedLeaves =
170
+ includeBranches === "all-leaves" ? leaves : [fallbackLeafId(parsed.messages)];
171
+ return selectedLeaves.map((leafId) => ({
172
+ leafId,
173
+ messages: messagesForLeaf(parsed.messages, leafId),
174
+ }));
175
+ }
@@ -0,0 +1,425 @@
1
+ import type { ImportMode, ImportQualityProfile, ResolvedConfig, UpdateMode } from "../types.js";
2
+ import { createHash } from "node:crypto";
3
+ import { dirname, isAbsolute, join, resolve } from "node:path";
4
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
5
+ import { stableSessionId } from "../utils/session.js";
6
+ import {
7
+ type ImportBranch,
8
+ leafIds,
9
+ type ParsedSession,
10
+ selectImportBranches,
11
+ } from "./import-parse.js";
12
+
13
+ type ImportToolResults = ResolvedConfig["import"]["toolResults"];
14
+
15
+ export type ImportDocumentStatus = "pending" | "queued" | "completed" | "failed" | "skipped";
16
+
17
+ export interface ImportCheckpointDocument {
18
+ documentId: string;
19
+ leafId: string;
20
+ contentHash: string;
21
+ messageCount: number;
22
+ importMode?: ImportMode;
23
+ toolResults?: ImportToolResults;
24
+ importQualityProfile?: ImportQualityProfile;
25
+ projectionVersion?: string;
26
+ importProfile?: string;
27
+ chunkIndex?: number;
28
+ messageRange?: { start: number; end: number };
29
+ status: ImportDocumentStatus;
30
+ skipReason?: "already-imported" | "empty-curated-projection";
31
+ updatedAt: string;
32
+ error?: string;
33
+ }
34
+
35
+ export interface ImportCheckpoint {
36
+ version: 1;
37
+ runId: string;
38
+ sourceFile: string;
39
+ bankId: string;
40
+ sessionId: string;
41
+ cwd: string;
42
+ includeBranches: "current-only" | "all-leaves";
43
+ importMode?: ImportMode;
44
+ toolResults?: ImportToolResults;
45
+ importQualityProfile?: ImportQualityProfile;
46
+ importProfile?: string;
47
+ updateMode: UpdateMode;
48
+ startedAt: string;
49
+ updatedAt: string;
50
+ documents: Record<string, ImportCheckpointDocument>;
51
+ }
52
+
53
+ export interface ImportCheckpointReadResult {
54
+ checkpoint?: ImportCheckpoint;
55
+ error: string | null;
56
+ action: string | null;
57
+ }
58
+
59
+ export function resolveImportCheckpointPath(cwd: string, checkpointPath: string): string {
60
+ return isAbsolute(checkpointPath) ? checkpointPath : join(cwd, checkpointPath);
61
+ }
62
+
63
+ export function importRunId(args: {
64
+ sourceFile: string;
65
+ bankId: string;
66
+ sessionId: string;
67
+ includeBranches: "current-only" | "all-leaves";
68
+ importMode?: ImportMode;
69
+ updateMode: UpdateMode;
70
+ }): string {
71
+ return [
72
+ "pi-import",
73
+ args.bankId,
74
+ args.sessionId,
75
+ args.includeBranches,
76
+ args.importMode ?? "legacy",
77
+ args.updateMode,
78
+ args.sourceFile,
79
+ ]
80
+ .join(":")
81
+ .replace(/\s+/g, "_");
82
+ }
83
+
84
+ function isPlainRecord(value: unknown): value is Record<string, unknown> {
85
+ return typeof value === "object" && value !== null && !Array.isArray(value);
86
+ }
87
+
88
+ function isImportMode(value: unknown): value is ImportMode {
89
+ return value === "curated" || value === "raw" || value === "forensic";
90
+ }
91
+
92
+ function isImportToolResults(value: unknown): value is ImportToolResults {
93
+ return value === "errors-only" || value === "summary" || value === "content";
94
+ }
95
+
96
+ function isImportQualityProfile(value: unknown): value is ImportQualityProfile {
97
+ return value === "compatible" || value === "strict";
98
+ }
99
+
100
+ function isUpdateMode(value: unknown): value is UpdateMode {
101
+ return value === "append" || value === "replace";
102
+ }
103
+
104
+ function isSkipReason(value: unknown): value is ImportCheckpointDocument["skipReason"] {
105
+ return value === "already-imported" || value === "empty-curated-projection";
106
+ }
107
+
108
+ function isMessageRange(value: unknown): value is { start: number; end: number } {
109
+ return isPlainRecord(value) && typeof value.start === "number" && typeof value.end === "number";
110
+ }
111
+
112
+ function hasValidCheckpointRunFields(value: Record<string, unknown>): boolean {
113
+ return (
114
+ (value.includeBranches === undefined ||
115
+ value.includeBranches === "current-only" ||
116
+ value.includeBranches === "all-leaves") &&
117
+ (value.importMode === undefined || isImportMode(value.importMode)) &&
118
+ (value.toolResults === undefined || isImportToolResults(value.toolResults)) &&
119
+ (value.importQualityProfile === undefined ||
120
+ isImportQualityProfile(value.importQualityProfile)) &&
121
+ (value.updateMode === undefined || isUpdateMode(value.updateMode))
122
+ );
123
+ }
124
+
125
+ function isImportCheckpointDocument(value: unknown): value is ImportCheckpointDocument {
126
+ if (!isPlainRecord(value)) return false;
127
+ return (
128
+ typeof value.documentId === "string" &&
129
+ typeof value.leafId === "string" &&
130
+ typeof value.contentHash === "string" &&
131
+ typeof value.messageCount === "number" &&
132
+ (value.importMode === undefined || isImportMode(value.importMode)) &&
133
+ (value.toolResults === undefined || isImportToolResults(value.toolResults)) &&
134
+ (value.importQualityProfile === undefined ||
135
+ isImportQualityProfile(value.importQualityProfile)) &&
136
+ (value.projectionVersion === undefined || typeof value.projectionVersion === "string") &&
137
+ (value.importProfile === undefined || typeof value.importProfile === "string") &&
138
+ (value.chunkIndex === undefined || typeof value.chunkIndex === "number") &&
139
+ (value.messageRange === undefined || isMessageRange(value.messageRange)) &&
140
+ (value.status === "pending" ||
141
+ value.status === "queued" ||
142
+ value.status === "completed" ||
143
+ value.status === "failed" ||
144
+ value.status === "skipped") &&
145
+ (value.skipReason === undefined || isSkipReason(value.skipReason)) &&
146
+ typeof value.updatedAt === "string" &&
147
+ (value.error === undefined || typeof value.error === "string")
148
+ );
149
+ }
150
+
151
+ export async function readImportCheckpoint(path: string): Promise<ImportCheckpoint | undefined> {
152
+ try {
153
+ const parsed = JSON.parse(await readFile(path, "utf8")) as unknown;
154
+ if (!isPlainRecord(parsed)) throw new Error("import checkpoint must be a JSON object");
155
+ if (!hasValidCheckpointRunFields(parsed)) {
156
+ throw new Error("import checkpoint run fields are invalid");
157
+ }
158
+ const record = parsed as unknown as ImportCheckpoint;
159
+ if (record.documents !== undefined && !isPlainRecord(record.documents)) {
160
+ throw new Error("import checkpoint documents must be a JSON object");
161
+ }
162
+ const documents = record.documents ?? {};
163
+ for (const [documentId, document] of Object.entries(documents)) {
164
+ if (!isImportCheckpointDocument(document) || document.documentId !== documentId) {
165
+ throw new Error(`import checkpoint document ${documentId} is invalid`);
166
+ }
167
+ }
168
+ return { ...record, version: 1, documents };
169
+ } catch (error) {
170
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return undefined;
171
+ throw error;
172
+ }
173
+ }
174
+
175
+ export async function readImportCheckpointSafe(path: string): Promise<ImportCheckpointReadResult> {
176
+ try {
177
+ const checkpoint = await readImportCheckpoint(path);
178
+ return { ...(checkpoint ? { checkpoint } : {}), error: null, action: null };
179
+ } catch (error) {
180
+ return {
181
+ error: error instanceof Error ? error.message : String(error),
182
+ action: `Move or repair ${path}, then open /hindsight and press i to re-run import. The next successful import can recreate the checkpoint.`,
183
+ };
184
+ }
185
+ }
186
+
187
+ export async function writeImportCheckpoint(
188
+ path: string,
189
+ checkpoint: ImportCheckpoint,
190
+ ): Promise<void> {
191
+ await mkdir(dirname(path), { recursive: true });
192
+ const tmp = `${path}.tmp`;
193
+ await writeFile(tmp, `${JSON.stringify(checkpoint, null, 2)}\n`, "utf8");
194
+ await rename(tmp, path);
195
+ }
196
+
197
+ export function createImportCheckpoint(args: {
198
+ runId: string;
199
+ sourceFile: string;
200
+ bankId: string;
201
+ sessionId: string;
202
+ cwd: string;
203
+ includeBranches: "current-only" | "all-leaves";
204
+ importMode?: ImportMode;
205
+ toolResults?: ImportToolResults;
206
+ importQualityProfile?: ImportQualityProfile;
207
+ updateMode: UpdateMode;
208
+ now: string;
209
+ }): ImportCheckpoint {
210
+ return {
211
+ version: 1,
212
+ runId: args.runId,
213
+ sourceFile: args.sourceFile,
214
+ bankId: args.bankId,
215
+ sessionId: args.sessionId,
216
+ cwd: args.cwd,
217
+ includeBranches: args.includeBranches,
218
+ ...(args.importMode ? { importMode: args.importMode } : {}),
219
+ ...(args.toolResults ? { toolResults: args.toolResults } : {}),
220
+ ...(args.importQualityProfile ? { importQualityProfile: args.importQualityProfile } : {}),
221
+ updateMode: args.updateMode,
222
+ startedAt: args.now,
223
+ updatedAt: args.now,
224
+ documents: {},
225
+ };
226
+ }
227
+
228
+ export interface ImportManifestEntry {
229
+ documentId: string;
230
+ bankId: string;
231
+ sourceFile: string;
232
+ importedAt: string;
233
+ contentHash: string;
234
+ messageCount: number;
235
+ leafId: string;
236
+ sessionId: string;
237
+ cwd: string;
238
+ includeBranches: "current-only" | "all-leaves";
239
+ importMode?: ImportMode;
240
+ toolResults?: "errors-only" | "summary" | "content";
241
+ importQualityProfile?: ImportQualityProfile;
242
+ projectionVersion?: string;
243
+ importProfile?: string;
244
+ chunkIndex?: number;
245
+ messageRange?: { start: number; end: number };
246
+ updateMode: UpdateMode;
247
+ }
248
+
249
+ export interface ImportManifest {
250
+ version: 1;
251
+ imports: Record<string, ImportManifestEntry>;
252
+ }
253
+
254
+ export interface ImportManifestReadResult {
255
+ manifest: ImportManifest;
256
+ error: string | null;
257
+ action: string | null;
258
+ }
259
+
260
+ export function resolveImportManifestPath(cwd: string, manifestPath: string): string {
261
+ return isAbsolute(manifestPath) ? manifestPath : join(cwd, manifestPath);
262
+ }
263
+
264
+ export function hashImportContent(content: string): string {
265
+ return createHash("sha256").update(content).digest("hex");
266
+ }
267
+
268
+ function isImportManifestEntry(value: unknown): value is ImportManifestEntry {
269
+ if (!isPlainRecord(value)) return false;
270
+ return (
271
+ typeof value.documentId === "string" &&
272
+ typeof value.bankId === "string" &&
273
+ typeof value.sourceFile === "string" &&
274
+ typeof value.importedAt === "string" &&
275
+ typeof value.contentHash === "string" &&
276
+ typeof value.messageCount === "number" &&
277
+ typeof value.leafId === "string" &&
278
+ typeof value.sessionId === "string" &&
279
+ typeof value.cwd === "string" &&
280
+ (value.includeBranches === "current-only" || value.includeBranches === "all-leaves") &&
281
+ (value.importMode === undefined ||
282
+ value.importMode === "curated" ||
283
+ value.importMode === "raw" ||
284
+ value.importMode === "forensic") &&
285
+ (value.toolResults === undefined ||
286
+ value.toolResults === "errors-only" ||
287
+ value.toolResults === "summary" ||
288
+ value.toolResults === "content") &&
289
+ (value.importQualityProfile === undefined ||
290
+ value.importQualityProfile === "compatible" ||
291
+ value.importQualityProfile === "strict") &&
292
+ (value.updateMode === "append" || value.updateMode === "replace")
293
+ );
294
+ }
295
+
296
+ export async function readImportManifest(path: string): Promise<ImportManifest> {
297
+ try {
298
+ const parsed = JSON.parse(await readFile(path, "utf8")) as unknown;
299
+ if (!isPlainRecord(parsed)) throw new Error("manifest must be a JSON object");
300
+ const record = parsed as Partial<ImportManifest>;
301
+ if (record.imports !== undefined && !isPlainRecord(record.imports)) {
302
+ throw new Error("manifest imports must be a JSON object");
303
+ }
304
+ const imports = record.imports ?? {};
305
+ for (const [documentId, entry] of Object.entries(imports)) {
306
+ if (!isImportManifestEntry(entry) || entry.documentId !== documentId) {
307
+ throw new Error(`manifest import entry ${documentId} is invalid`);
308
+ }
309
+ }
310
+ return { version: 1, imports };
311
+ } catch (error) {
312
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return { version: 1, imports: {} };
313
+ throw error;
314
+ }
315
+ }
316
+
317
+ export async function readImportManifestSafe(path: string): Promise<ImportManifestReadResult> {
318
+ try {
319
+ return { manifest: await readImportManifest(path), error: null, action: null };
320
+ } catch (error) {
321
+ return {
322
+ manifest: { version: 1, imports: {} },
323
+ error: error instanceof Error ? error.message : String(error),
324
+ action: `Move or repair ${path}, then open /hindsight and press i to re-run import. New successful imports will recreate the manifest.`,
325
+ };
326
+ }
327
+ }
328
+
329
+ export async function writeImportManifest(path: string, manifest: ImportManifest): Promise<void> {
330
+ await mkdir(dirname(path), { recursive: true });
331
+ const tmp = `${path}.tmp`;
332
+ await writeFile(tmp, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
333
+ await rename(tmp, path);
334
+ }
335
+
336
+ export async function upsertImportManifestEntries(
337
+ path: string,
338
+ entries: ImportManifestEntry[],
339
+ ): Promise<ImportManifest> {
340
+ const manifest = (await readImportManifestSafe(path)).manifest;
341
+ for (const entry of entries) manifest.imports[entry.documentId] = entry;
342
+ await writeImportManifest(path, manifest);
343
+ return manifest;
344
+ }
345
+
346
+ export function importManifestSummary(manifest: ImportManifest): {
347
+ count: number;
348
+ latest?: ImportManifestEntry;
349
+ } {
350
+ const entries = Object.values(manifest.imports).sort((a, b) =>
351
+ b.importedAt.localeCompare(a.importedAt),
352
+ );
353
+ return { count: entries.length, ...(entries[0] ? { latest: entries[0] } : {}) };
354
+ }
355
+
356
+ export interface ImportPlan {
357
+ sessionFile: string;
358
+ bankId: string;
359
+ cwd: string;
360
+ sessionId: string;
361
+ leaves: string[];
362
+ includeBranches: ResolvedConfig["import"]["includeBranches"];
363
+ branches: ImportBranch[];
364
+ manifestPath: string;
365
+ checkpointPath: string;
366
+ updateMode: "append" | "replace";
367
+ runId: string;
368
+ importConfig: ResolvedConfig;
369
+ }
370
+
371
+ function sameCwd(left: string | undefined, right: string | undefined): boolean {
372
+ if (!left || !right) return false;
373
+ return resolve(left) === resolve(right);
374
+ }
375
+
376
+ export function buildImportPlan(args: {
377
+ sessionFile: string;
378
+ parsed: ParsedSession;
379
+ bankId: string;
380
+ config: ResolvedConfig;
381
+ cwd?: string;
382
+ requireMatchingCwd?: boolean;
383
+ includeBranches?: ResolvedConfig["import"]["includeBranches"];
384
+ }): ImportPlan {
385
+ if (args.cwd && args.requireMatchingCwd && !args.parsed.cwd) {
386
+ throw new Error(
387
+ `Refusing to import session without cwd; current cwd is ${args.cwd}. Use explicit file import for unscoped sessions.`,
388
+ );
389
+ }
390
+ if (args.cwd && args.parsed.cwd && !sameCwd(args.parsed.cwd, args.cwd)) {
391
+ throw new Error(
392
+ `Refusing to import session from cwd ${args.parsed.cwd}; current cwd is ${args.cwd}. Use project-scoped import from the matching repo.`,
393
+ );
394
+ }
395
+ const cwd = resolve(args.cwd ?? args.parsed.cwd ?? dirname(args.sessionFile));
396
+ const sessionId = args.parsed.sessionId ?? stableSessionId(args.sessionFile, cwd);
397
+ const leaves = leafIds(args.parsed.messages);
398
+ const includeBranches = args.includeBranches ?? args.config.import.includeBranches;
399
+ const branches = selectImportBranches(args.parsed, includeBranches);
400
+ const manifestPath = resolveImportManifestPath(cwd, args.config.import.manifestPath);
401
+ const checkpointPath = resolveImportCheckpointPath(cwd, args.config.import.checkpointPath);
402
+ const updateMode = args.config.import.replaceExistingImportedDocs ? "replace" : "append";
403
+ const runId = importRunId({
404
+ sourceFile: args.sessionFile,
405
+ bankId: args.bankId,
406
+ sessionId,
407
+ includeBranches,
408
+ importMode: args.config.import.mode,
409
+ updateMode,
410
+ });
411
+ return {
412
+ sessionFile: args.sessionFile,
413
+ bankId: args.bankId,
414
+ cwd,
415
+ sessionId,
416
+ leaves,
417
+ includeBranches,
418
+ branches,
419
+ manifestPath,
420
+ checkpointPath,
421
+ updateMode,
422
+ runId,
423
+ importConfig: { ...args.config, import: { ...args.config.import, includeBranches } },
424
+ };
425
+ }