gsd-pi 2.34.0 → 2.35.0-dev.cd3b7ea

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 (418) hide show
  1. package/dist/resources/extensions/gsd/changelog.js +162 -0
  2. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  3. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -1
  4. package/dist/resources/extensions/gsd/commands.js +8 -1
  5. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  6. package/dist/resources/extensions/gsd/doctor-checks.js +113 -5
  7. package/dist/resources/extensions/gsd/doctor-proactive.js +22 -0
  8. package/dist/resources/extensions/gsd/doctor.js +36 -0
  9. package/dist/resources/extensions/gsd/guided-flow.js +4 -2
  10. package/dist/resources/extensions/gsd/preferences-validation.js +38 -0
  11. package/dist/resources/extensions/gsd/preferences.js +2 -0
  12. package/dist/resources/extensions/mcp-client/index.js +2 -1
  13. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  14. package/package.json +1 -1
  15. package/packages/native/dist/native.d.ts +0 -2
  16. package/packages/native/dist/native.js +0 -2
  17. package/packages/native/src/native.ts +0 -3
  18. package/packages/pi-agent-core/dist/agent-loop.d.ts +14 -0
  19. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  20. package/packages/pi-agent-core/dist/agent-loop.js +24 -27
  21. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  22. package/packages/pi-agent-core/dist/agent.d.ts +1 -0
  23. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  24. package/packages/pi-agent-core/dist/agent.js +11 -22
  25. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  26. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  27. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  28. package/packages/pi-agent-core/dist/proxy.js +3 -9
  29. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  30. package/packages/pi-agent-core/src/agent-loop.ts +30 -27
  31. package/packages/pi-agent-core/src/agent.ts +12 -23
  32. package/packages/pi-agent-core/src/proxy.ts +3 -9
  33. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  34. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  35. package/packages/pi-ai/dist/api-registry.js +0 -10
  36. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  37. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  38. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  39. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  40. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  41. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  42. package/packages/pi-ai/dist/providers/azure-openai-responses.js +5 -41
  43. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  44. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  45. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  46. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  47. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  48. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  49. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  50. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  51. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  52. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  53. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  54. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  55. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  56. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  57. package/packages/pi-ai/dist/providers/openai-completions.js +10 -73
  58. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  59. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  60. package/packages/pi-ai/dist/providers/openai-responses.js +8 -79
  61. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  62. package/packages/pi-ai/dist/providers/openai-shared.d.ts +65 -0
  63. package/packages/pi-ai/dist/providers/openai-shared.d.ts.map +1 -0
  64. package/packages/pi-ai/dist/providers/openai-shared.js +146 -0
  65. package/packages/pi-ai/dist/providers/openai-shared.js.map +1 -0
  66. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  67. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  68. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  69. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  70. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  71. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  72. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  73. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  74. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  75. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +7 -135
  76. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  77. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  78. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +7 -135
  79. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  80. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts +46 -0
  81. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts.map +1 -0
  82. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js +160 -0
  83. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js.map +1 -0
  84. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  85. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  86. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  87. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  88. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  89. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  90. package/packages/pi-ai/dist/utils/validation.js +0 -14
  91. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  92. package/packages/pi-ai/src/api-registry.ts +0 -12
  93. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  94. package/packages/pi-ai/src/providers/azure-openai-responses.ts +11 -45
  95. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  96. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  97. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  98. package/packages/pi-ai/src/providers/openai-completions.ts +16 -86
  99. package/packages/pi-ai/src/providers/openai-responses.ts +15 -95
  100. package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
  101. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  102. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  103. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +14 -162
  104. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +13 -161
  105. package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
  106. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  107. package/packages/pi-ai/src/utils/validation.ts +0 -15
  108. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  109. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  110. package/packages/pi-coding-agent/dist/config.js +4 -8
  111. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  112. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +16 -63
  113. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  114. package/packages/pi-coding-agent/dist/core/agent-session.js +104 -641
  115. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  116. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +0 -1
  117. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  118. package/packages/pi-coding-agent/dist/core/auth-storage.js +4 -35
  119. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  120. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  121. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +5 -43
  122. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  123. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  124. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +11 -69
  125. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  126. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +40 -0
  127. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  128. package/packages/pi-coding-agent/dist/core/compaction/utils.js +78 -0
  129. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  130. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +77 -0
  131. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -0
  132. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +331 -0
  133. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -0
  134. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  135. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  136. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  137. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  138. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +2 -2
  139. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  140. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  141. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  142. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +15 -5
  143. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  144. package/packages/pi-coding-agent/dist/core/extensions/runner.js +129 -256
  145. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  146. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +49 -42
  147. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  148. package/packages/pi-coding-agent/dist/core/extensions/types.js +2 -21
  149. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  150. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  151. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  152. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  153. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  154. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts +39 -0
  155. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts.map +1 -0
  156. package/packages/pi-coding-agent/dist/core/lock-utils.js +89 -0
  157. package/packages/pi-coding-agent/dist/core/lock-utils.js.map +1 -0
  158. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  159. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  161. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +1 -1
  163. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  164. package/packages/pi-coding-agent/dist/core/lsp/config.js +2 -6
  165. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  167. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  169. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  171. package/packages/pi-coding-agent/dist/core/lsp/index.js +52 -107
  172. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  173. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  174. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  175. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -22
  176. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts +0 -1
  178. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/lsp/types.js +0 -28
  180. package/packages/pi-coding-agent/dist/core/lsp/types.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  182. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  184. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  186. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  188. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  190. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  192. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  193. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  194. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  195. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  196. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/package-manager.js +2 -4
  199. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  200. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  201. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  203. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +2 -4
  205. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/resource-loader.js +33 -58
  207. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +87 -0
  209. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -0
  210. package/packages/pi-coding-agent/dist/core/retry-handler.js +295 -0
  211. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -0
  212. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -5
  213. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/session-manager.js +5 -32
  215. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +8 -12
  217. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/settings-manager.js +78 -168
  219. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/skills.js +1 -3
  222. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  224. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  225. package/packages/pi-coding-agent/dist/index.js +1 -1
  226. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  227. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  228. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  229. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  230. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  232. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  234. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts +1 -1
  236. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +9 -26
  238. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -13
  241. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts +44 -0
  243. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +61 -0
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +6 -9
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  250. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  252. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  254. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  257. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  258. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  260. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  262. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  263. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  264. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  265. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts +6 -0
  266. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts.map +1 -0
  267. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +15 -0
  268. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -0
  269. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/print-mode.js +2 -30
  271. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -28
  274. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts +19 -0
  276. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts.map +1 -0
  277. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js +45 -0
  278. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js.map +1 -0
  279. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  280. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  282. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  284. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  286. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/utils/error.d.ts +5 -0
  288. package/packages/pi-coding-agent/dist/utils/error.d.ts.map +1 -0
  289. package/packages/pi-coding-agent/dist/utils/error.js +7 -0
  290. package/packages/pi-coding-agent/dist/utils/error.js.map +1 -0
  291. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  292. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  293. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  294. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  296. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  298. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  299. package/packages/pi-coding-agent/package.json +1 -1
  300. package/packages/pi-coding-agent/src/config.ts +5 -10
  301. package/packages/pi-coding-agent/src/core/agent-session.ts +117 -745
  302. package/packages/pi-coding-agent/src/core/auth-storage.ts +4 -38
  303. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +7 -53
  304. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +14 -74
  305. package/packages/pi-coding-agent/src/core/compaction/utils.ts +100 -0
  306. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +424 -0
  307. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  308. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -21
  309. package/packages/pi-coding-agent/src/core/extensions/runner.ts +119 -256
  310. package/packages/pi-coding-agent/src/core/extensions/types.ts +50 -69
  311. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  312. package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
  313. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  314. package/packages/pi-coding-agent/src/core/lsp/config.ts +2 -10
  315. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  316. package/packages/pi-coding-agent/src/core/lsp/index.ts +83 -152
  317. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -23
  318. package/packages/pi-coding-agent/src/core/lsp/types.ts +0 -29
  319. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  320. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  321. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  322. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  323. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -4
  324. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  325. package/packages/pi-coding-agent/src/core/resource-loader.ts +43 -67
  326. package/packages/pi-coding-agent/src/core/retry-handler.ts +359 -0
  327. package/packages/pi-coding-agent/src/core/session-manager.ts +5 -34
  328. package/packages/pi-coding-agent/src/core/settings-manager.ts +87 -166
  329. package/packages/pi-coding-agent/src/core/skills.ts +1 -4
  330. package/packages/pi-coding-agent/src/index.ts +1 -7
  331. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  332. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  333. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +17 -29
  334. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -13
  335. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +81 -0
  336. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +14 -19
  337. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  338. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  339. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  340. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  341. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +14 -0
  342. package/packages/pi-coding-agent/src/modes/print-mode.ts +2 -30
  343. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -28
  344. package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
  345. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  346. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  347. package/packages/pi-coding-agent/src/utils/error.ts +6 -0
  348. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  349. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  350. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  351. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/editor.js +1 -1
  353. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  354. package/packages/pi-tui/dist/components/markdown.d.ts +5 -0
  355. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/components/markdown.js +25 -31
  357. package/packages/pi-tui/dist/components/markdown.js.map +1 -1
  358. package/packages/pi-tui/dist/keys.d.ts +0 -4
  359. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/keys.js +94 -162
  361. package/packages/pi-tui/dist/keys.js.map +1 -1
  362. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  363. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  364. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  365. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  366. package/packages/pi-tui/dist/tui.d.ts +0 -22
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +6 -272
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts +0 -7
  371. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  372. package/packages/pi-tui/dist/utils.js +0 -44
  373. package/packages/pi-tui/dist/utils.js.map +1 -1
  374. package/packages/pi-tui/src/components/editor.ts +1 -1
  375. package/packages/pi-tui/src/components/markdown.ts +25 -29
  376. package/packages/pi-tui/src/keys.ts +94 -173
  377. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  378. package/packages/pi-tui/src/tui.ts +11 -312
  379. package/packages/pi-tui/src/utils.ts +0 -43
  380. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  381. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  382. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  383. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  384. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  385. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  386. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  387. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  388. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  389. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  390. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  391. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  392. package/pkg/package.json +1 -1
  393. package/src/resources/extensions/gsd/changelog.ts +213 -0
  394. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  395. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +5 -1
  396. package/src/resources/extensions/gsd/commands.ts +9 -1
  397. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  398. package/src/resources/extensions/gsd/doctor-checks.ts +107 -5
  399. package/src/resources/extensions/gsd/doctor-proactive.ts +24 -0
  400. package/src/resources/extensions/gsd/doctor-types.ts +9 -1
  401. package/src/resources/extensions/gsd/doctor.ts +35 -0
  402. package/src/resources/extensions/gsd/guided-flow.ts +4 -2
  403. package/src/resources/extensions/gsd/preferences-validation.ts +38 -0
  404. package/src/resources/extensions/gsd/preferences.ts +2 -0
  405. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +98 -2
  406. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +59 -3
  407. package/src/resources/extensions/gsd/tests/preferences.test.ts +28 -0
  408. package/src/resources/extensions/mcp-client/index.ts +2 -1
  409. package/src/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  410. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  411. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  412. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  413. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  414. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  415. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  416. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  417. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  418. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
@@ -18,9 +18,9 @@ import {
18
18
  import { getOAuthApiKey, getOAuthProvider, getOAuthProviders } from "@gsd/pi-ai/oauth";
19
19
  import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
20
20
  import { dirname, join } from "path";
21
- import lockfile from "proper-lockfile";
22
21
  import { getAgentDir } from "../config.js";
23
22
  import { AUTH_LOCK_STALE_MS } from "./constants.js";
23
+ import { acquireLockAsync, acquireLockSyncWithRetry } from "./lock-utils.js";
24
24
  import { resolveConfigValue } from "./resolve-config-value.js";
25
25
 
26
26
  export type ApiKeyCredential = {
@@ -67,40 +67,13 @@ export class FileAuthStorageBackend implements AuthStorageBackend {
67
67
  }
68
68
  }
69
69
 
70
- private acquireLockSyncWithRetry(path: string): () => void {
71
- const maxAttempts = 10;
72
- const delayMs = 20;
73
- let lastError: unknown;
74
-
75
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
76
- try {
77
- return lockfile.lockSync(path, { realpath: false });
78
- } catch (error) {
79
- const code =
80
- typeof error === "object" && error !== null && "code" in error
81
- ? String((error as { code?: unknown }).code)
82
- : undefined;
83
- if (code !== "ELOCKED" || attempt === maxAttempts) {
84
- throw error;
85
- }
86
- lastError = error;
87
- const start = Date.now();
88
- while (Date.now() - start < delayMs) {
89
- // Sleep synchronously to avoid changing callers to async.
90
- }
91
- }
92
- }
93
-
94
- throw (lastError as Error) ?? new Error("Failed to acquire auth storage lock");
95
- }
96
-
97
70
  withLock<T>(fn: (current: string | undefined) => LockResult<T>): T {
98
71
  this.ensureParentDir();
99
72
  this.ensureFileExists();
100
73
 
101
74
  let release: (() => void) | undefined;
102
75
  try {
103
- release = this.acquireLockSyncWithRetry(this.authPath);
76
+ release = acquireLockSyncWithRetry(this.authPath);
104
77
  const current = existsSync(this.authPath) ? readFileSync(this.authPath, "utf-8") : undefined;
105
78
  const { result, next } = fn(current);
106
79
  if (next !== undefined) {
@@ -129,15 +102,8 @@ export class FileAuthStorageBackend implements AuthStorageBackend {
129
102
  };
130
103
 
131
104
  try {
132
- release = await lockfile.lock(this.authPath, {
133
- retries: {
134
- retries: 10,
135
- factor: 2,
136
- minTimeout: 100,
137
- maxTimeout: 10000,
138
- randomize: true,
139
- },
140
- stale: AUTH_LOCK_STALE_MS,
105
+ release = await acquireLockAsync(this.authPath, {
106
+ staleMs: AUTH_LOCK_STALE_MS,
141
107
  onCompromised: (err) => {
142
108
  lockCompromised = true;
143
109
  lockCompromisedError = err;
@@ -9,20 +9,18 @@ import type { AgentMessage } from "@gsd/pi-agent-core";
9
9
  import type { Model } from "@gsd/pi-ai";
10
10
  import { completeSimple } from "@gsd/pi-ai";
11
11
  import { COMPACTION_RESERVE_TOKENS } from "../constants.js";
12
- import {
13
- convertToLlm,
14
- createBranchSummaryMessage,
15
- createCompactionSummaryMessage,
16
- createCustomMessage,
17
- } from "../messages.js";
12
+ import { convertToLlm } from "../messages.js";
18
13
  import type { ReadonlySessionManager, SessionEntry } from "../session-manager.js";
19
14
  import { estimateTokens } from "./compaction.js";
20
15
  import {
21
16
  computeFileLists,
22
17
  createFileOps,
18
+ createSummarizationMessage,
23
19
  extractFileOpsFromMessage,
20
+ extractTextContent,
24
21
  type FileOperations,
25
22
  formatFileOperations,
23
+ getMessageFromEntry,
26
24
  SUMMARIZATION_SYSTEM_PROMPT,
27
25
  serializeConversation,
28
26
  } from "./utils.js";
@@ -134,39 +132,6 @@ export function collectEntriesForBranchSummary(
134
132
  return { entries, commonAncestorId };
135
133
  }
136
134
 
137
- // ============================================================================
138
- // Entry to Message Conversion
139
- // ============================================================================
140
-
141
- /**
142
- * Extract AgentMessage from a session entry.
143
- * Similar to getMessageFromEntry in compaction.ts but also handles compaction entries.
144
- */
145
- function getMessageFromEntry(entry: SessionEntry): AgentMessage | undefined {
146
- switch (entry.type) {
147
- case "message":
148
- // Skip tool results - context is in assistant's tool call
149
- if (entry.message.role === "toolResult") return undefined;
150
- return entry.message;
151
-
152
- case "custom_message":
153
- return createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp);
154
-
155
- case "branch_summary":
156
- return createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);
157
-
158
- case "compaction":
159
- return createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);
160
-
161
- // These don't contribute to conversation content
162
- case "thinking_level_change":
163
- case "model_change":
164
- case "custom":
165
- case "label":
166
- return undefined;
167
- }
168
- }
169
-
170
135
  /**
171
136
  * Prepare entries for summarization with token budget.
172
137
  *
@@ -206,7 +171,7 @@ export function prepareBranchEntries(entries: SessionEntry[], tokenBudget: numbe
206
171
  // Second pass: walk from newest to oldest, adding messages until token budget
207
172
  for (let i = entries.length - 1; i >= 0; i--) {
208
173
  const entry = entries[i];
209
- const message = getMessageFromEntry(entry);
174
+ const message = getMessageFromEntry(entry, /* skipToolResults */ true);
210
175
  if (!message) continue;
211
176
 
212
177
  // Extract file ops from assistant messages (tool calls)
@@ -310,18 +275,10 @@ export async function generateBranchSummary(
310
275
  }
311
276
  const promptText = `<conversation>\n${conversationText}\n</conversation>\n\n${instructions}`;
312
277
 
313
- const summarizationMessages = [
314
- {
315
- role: "user" as const,
316
- content: [{ type: "text" as const, text: promptText }],
317
- timestamp: Date.now(),
318
- },
319
- ];
320
-
321
278
  // Call LLM for summarization
322
279
  const response = await completeSimple(
323
280
  model,
324
- { systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: summarizationMessages },
281
+ { systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: createSummarizationMessage(promptText) },
325
282
  { apiKey, signal, maxTokens: 2048 },
326
283
  );
327
284
 
@@ -333,10 +290,7 @@ export async function generateBranchSummary(
333
290
  return { error: response.errorMessage || "Summarization failed" };
334
291
  }
335
292
 
336
- let summary = response.content
337
- .filter((c): c is { type: "text"; text: string } => c.type === "text")
338
- .map((c) => c.text)
339
- .join("\n");
293
+ let summary = extractTextContent(response.content);
340
294
 
341
295
  // Prepend preamble to provide context about the branch summary
342
296
  summary = BRANCH_SUMMARY_PREAMBLE + summary;
@@ -9,19 +9,18 @@ import type { AgentMessage } from "@gsd/pi-agent-core";
9
9
  import type { AssistantMessage, Model, Usage } from "@gsd/pi-ai";
10
10
  import { completeSimple } from "@gsd/pi-ai";
11
11
  import { COMPACTION_KEEP_RECENT_TOKENS, COMPACTION_RESERVE_TOKENS } from "../constants.js";
12
- import {
13
- convertToLlm,
14
- createBranchSummaryMessage,
15
- createCompactionSummaryMessage,
16
- createCustomMessage,
17
- } from "../messages.js";
12
+ import { convertToLlm } from "../messages.js";
18
13
  import type { CompactionEntry, SessionEntry } from "../session-manager.js";
19
14
  import {
15
+ collectMessages,
20
16
  computeFileLists,
21
17
  createFileOps,
18
+ createSummarizationMessage,
22
19
  extractFileOpsFromMessage,
20
+ extractTextContent,
23
21
  type FileOperations,
24
22
  formatFileOperations,
23
+ getMessageFromEntry,
25
24
  SUMMARIZATION_SYSTEM_PROMPT,
26
25
  serializeConversation,
27
26
  } from "./utils.js";
@@ -69,30 +68,6 @@ function extractFileOperations(
69
68
  return fileOps;
70
69
  }
71
70
 
72
- // ============================================================================
73
- // Message Extraction
74
- // ============================================================================
75
-
76
- /**
77
- * Extract AgentMessage from an entry if it produces one.
78
- * Returns undefined for entries that don't contribute to LLM context.
79
- */
80
- function getMessageFromEntry(entry: SessionEntry): AgentMessage | undefined {
81
- if (entry.type === "message") {
82
- return entry.message;
83
- }
84
- if (entry.type === "custom_message") {
85
- return createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp);
86
- }
87
- if (entry.type === "branch_summary") {
88
- return createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);
89
- }
90
- if (entry.type === "compaction") {
91
- return createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);
92
- }
93
- return undefined;
94
- }
95
-
96
71
  /** Result from compact() - SessionManager adds uuid/parentUuid when saving */
97
72
  export interface CompactionResult<T = unknown> {
98
73
  summary: string;
@@ -547,21 +522,13 @@ export async function generateSummary(
547
522
  }
548
523
  promptText += basePrompt;
549
524
 
550
- const summarizationMessages = [
551
- {
552
- role: "user" as const,
553
- content: [{ type: "text" as const, text: promptText }],
554
- timestamp: Date.now(),
555
- },
556
- ];
557
-
558
525
  const completionOptions = model.reasoning
559
526
  ? { maxTokens, signal, apiKey, reasoning: "high" as const }
560
527
  : { maxTokens, signal, apiKey };
561
528
 
562
529
  const response = await completeSimple(
563
530
  model,
564
- { systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: summarizationMessages },
531
+ { systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: createSummarizationMessage(promptText) },
565
532
  completionOptions,
566
533
  );
567
534
 
@@ -569,12 +536,7 @@ export async function generateSummary(
569
536
  throw new Error(`Summarization failed: ${response.errorMessage || "Unknown error"}`);
570
537
  }
571
538
 
572
- const textContent = response.content
573
- .filter((c): c is { type: "text"; text: string } => c.type === "text")
574
- .map((c) => c.text)
575
- .join("\n");
576
-
577
- return textContent;
539
+ return extractTextContent(response.content);
578
540
  }
579
541
 
580
542
  // ============================================================================
@@ -618,11 +580,7 @@ export function prepareCompaction(
618
580
  const boundaryEnd = pathEntries.length;
619
581
 
620
582
  const usageStart = prevCompactionIndex >= 0 ? prevCompactionIndex : 0;
621
- const usageMessages: AgentMessage[] = [];
622
- for (let i = usageStart; i < boundaryEnd; i++) {
623
- const msg = getMessageFromEntry(pathEntries[i]);
624
- if (msg) usageMessages.push(msg);
625
- }
583
+ const usageMessages = collectMessages(pathEntries, usageStart, boundaryEnd);
626
584
  const tokensBefore = estimateContextTokens(usageMessages).tokens;
627
585
 
628
586
  const cutPoint = findCutPoint(pathEntries, boundaryStart, boundaryEnd, settings.keepRecentTokens);
@@ -637,20 +595,12 @@ export function prepareCompaction(
637
595
  const historyEnd = cutPoint.isSplitTurn ? cutPoint.turnStartIndex : cutPoint.firstKeptEntryIndex;
638
596
 
639
597
  // Messages to summarize (will be discarded after summary)
640
- const messagesToSummarize: AgentMessage[] = [];
641
- for (let i = boundaryStart; i < historyEnd; i++) {
642
- const msg = getMessageFromEntry(pathEntries[i]);
643
- if (msg) messagesToSummarize.push(msg);
644
- }
598
+ const messagesToSummarize = collectMessages(pathEntries, boundaryStart, historyEnd);
645
599
 
646
600
  // Messages for turn prefix summary (if splitting a turn)
647
- const turnPrefixMessages: AgentMessage[] = [];
648
- if (cutPoint.isSplitTurn) {
649
- for (let i = cutPoint.turnStartIndex; i < cutPoint.firstKeptEntryIndex; i++) {
650
- const msg = getMessageFromEntry(pathEntries[i]);
651
- if (msg) turnPrefixMessages.push(msg);
652
- }
653
- }
601
+ const turnPrefixMessages = cutPoint.isSplitTurn
602
+ ? collectMessages(pathEntries, cutPoint.turnStartIndex, cutPoint.firstKeptEntryIndex)
603
+ : [];
654
604
 
655
605
  // Get previous summary for iterative update
656
606
  let previousSummary: string | undefined;
@@ -789,17 +739,10 @@ async function generateTurnPrefixSummary(
789
739
  const llmMessages = convertToLlm(messages);
790
740
  const conversationText = serializeConversation(llmMessages);
791
741
  const promptText = `<conversation>\n${conversationText}\n</conversation>\n\n${TURN_PREFIX_SUMMARIZATION_PROMPT}`;
792
- const summarizationMessages = [
793
- {
794
- role: "user" as const,
795
- content: [{ type: "text" as const, text: promptText }],
796
- timestamp: Date.now(),
797
- },
798
- ];
799
742
 
800
743
  const response = await completeSimple(
801
744
  model,
802
- { systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: summarizationMessages },
745
+ { systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: createSummarizationMessage(promptText) },
803
746
  { maxTokens, signal, apiKey },
804
747
  );
805
748
 
@@ -807,8 +750,5 @@ async function generateTurnPrefixSummary(
807
750
  throw new Error(`Turn prefix summarization failed: ${response.errorMessage || "Unknown error"}`);
808
751
  }
809
752
 
810
- return response.content
811
- .filter((c): c is { type: "text"; text: string } => c.type === "text")
812
- .map((c) => c.text)
813
- .join("\n");
753
+ return extractTextContent(response.content);
814
754
  }
@@ -5,6 +5,12 @@
5
5
  import type { AgentMessage } from "@gsd/pi-agent-core";
6
6
  import type { Message } from "@gsd/pi-ai";
7
7
  import { TOOL_RESULT_MAX_CHARS } from "../constants.js";
8
+ import {
9
+ createBranchSummaryMessage,
10
+ createCompactionSummaryMessage,
11
+ createCustomMessage,
12
+ } from "../messages.js";
13
+ import type { SessionEntry } from "../session-manager.js";
8
14
 
9
15
  // ============================================================================
10
16
  // File Operation Tracking
@@ -82,6 +88,100 @@ export function formatFileOperations(readFiles: string[], modifiedFiles: string[
82
88
  return `\n\n${sections.join("\n\n")}`;
83
89
  }
84
90
 
91
+ // ============================================================================
92
+ // Message Extraction
93
+ // ============================================================================
94
+
95
+ /**
96
+ * Extract AgentMessage from a session entry.
97
+ *
98
+ * Handles all entry types: message, custom_message, branch_summary, and compaction.
99
+ * Returns undefined for entries that don't contribute to LLM context (e.g., settings changes).
100
+ *
101
+ * @param skipToolResults - If true, skips toolResult messages (used by branch summarization
102
+ * where tool call context is sufficient). Default false.
103
+ */
104
+ export function getMessageFromEntry(entry: SessionEntry, skipToolResults = false): AgentMessage | undefined {
105
+ switch (entry.type) {
106
+ case "message":
107
+ if (skipToolResults && entry.message.role === "toolResult") return undefined;
108
+ return entry.message;
109
+
110
+ case "custom_message":
111
+ return createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp);
112
+
113
+ case "branch_summary":
114
+ return createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);
115
+
116
+ case "compaction":
117
+ return createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);
118
+
119
+ case "thinking_level_change":
120
+ case "model_change":
121
+ case "custom":
122
+ case "label":
123
+ return undefined;
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Collect AgentMessages from a range of session entries.
129
+ *
130
+ * @param entries - Session entries array
131
+ * @param startIndex - First index (inclusive)
132
+ * @param endIndex - Last index (exclusive)
133
+ * @param skipToolResults - If true, skips toolResult messages. Default false.
134
+ */
135
+ export function collectMessages(
136
+ entries: SessionEntry[],
137
+ startIndex: number,
138
+ endIndex: number,
139
+ skipToolResults = false,
140
+ ): AgentMessage[] {
141
+ const result: AgentMessage[] = [];
142
+ for (let i = startIndex; i < endIndex; i++) {
143
+ const msg = getMessageFromEntry(entries[i], skipToolResults);
144
+ if (msg) result.push(msg);
145
+ }
146
+ return result;
147
+ }
148
+
149
+ // ============================================================================
150
+ // Text Content Extraction
151
+ // ============================================================================
152
+
153
+ /**
154
+ * Extract text from an array of content blocks, filtering to text-type blocks.
155
+ * Replaces the recurring `.filter(c => c.type === "text").map(c => c.text).join(sep)` pattern.
156
+ */
157
+ export function extractTextContent(
158
+ content: Array<{ type: string; text?: string }>,
159
+ separator = "\n",
160
+ ): string {
161
+ return content
162
+ .filter((c): c is { type: "text"; text: string } => c.type === "text")
163
+ .map((c) => c.text)
164
+ .join(separator);
165
+ }
166
+
167
+ // ============================================================================
168
+ // Summarization Message Construction
169
+ // ============================================================================
170
+
171
+ /**
172
+ * Create a single-message array for summarization prompts.
173
+ * Wraps promptText in the standard `[{ role: "user", content: [{ type: "text", text }], timestamp }]` shape.
174
+ */
175
+ export function createSummarizationMessage(promptText: string): [{ role: "user"; content: [{ type: "text"; text: string }]; timestamp: number }] {
176
+ return [
177
+ {
178
+ role: "user" as const,
179
+ content: [{ type: "text" as const, text: promptText }],
180
+ timestamp: Date.now(),
181
+ },
182
+ ];
183
+ }
184
+
85
185
  // ============================================================================
86
186
  // Message Serialization
87
187
  // ============================================================================