@selesai/code 0.2.1 → 0.3.1

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 (284) hide show
  1. package/dist/config.d.ts +4 -15
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +5 -45
  4. package/dist/config.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +1 -0
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +8 -0
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/diagnostics.d.ts +1 -0
  10. package/dist/core/diagnostics.d.ts.map +1 -1
  11. package/dist/core/diagnostics.js.map +1 -1
  12. package/dist/core/model-registry.d.ts +4 -1
  13. package/dist/core/model-registry.d.ts.map +1 -1
  14. package/dist/core/model-registry.js +101 -51
  15. package/dist/core/model-registry.js.map +1 -1
  16. package/dist/core/package-manager.d.ts +10 -0
  17. package/dist/core/package-manager.d.ts.map +1 -1
  18. package/dist/core/package-manager.js +93 -8
  19. package/dist/core/package-manager.js.map +1 -1
  20. package/dist/core/package-manager.test.d.ts +2 -0
  21. package/dist/core/package-manager.test.d.ts.map +1 -0
  22. package/dist/core/package-manager.test.js +20 -0
  23. package/dist/core/package-manager.test.js.map +1 -0
  24. package/dist/core/resource-loader.d.ts +3 -0
  25. package/dist/core/resource-loader.d.ts.map +1 -1
  26. package/dist/core/resource-loader.js +10 -0
  27. package/dist/core/resource-loader.js.map +1 -1
  28. package/dist/core/settings-manager.d.ts +1 -0
  29. package/dist/core/settings-manager.d.ts.map +1 -1
  30. package/dist/core/settings-manager.js.map +1 -1
  31. package/dist/defaults/models.json +64 -113
  32. package/dist/extensions/caveman/caveman-instructions.cjs +39 -0
  33. package/dist/extensions/caveman/index.js +116 -0
  34. package/dist/extensions/caveman/package.json +8 -0
  35. package/dist/extensions/caveman/test/extension.test.js +185 -0
  36. package/dist/extensions/caveman/test/helpers.test.js +67 -0
  37. package/dist/extensions/copy-turn.ts +2 -2
  38. package/dist/extensions/pi-intercom/broker/broker.ts +2 -3
  39. package/dist/extensions/pi-intercom/broker/paths.ts +10 -5
  40. package/dist/extensions/pi-intercom/broker/spawn.ts +2 -3
  41. package/dist/extensions/pi-intercom/config.ts +2 -2
  42. package/dist/extensions/pi-intercom/index.ts +2 -2
  43. package/dist/extensions/pi-intercom/package.json +2 -2
  44. package/dist/extensions/pi-intercom/ui/compose.ts +3 -3
  45. package/dist/extensions/pi-intercom/ui/inline-message.ts +3 -3
  46. package/dist/extensions/pi-intercom/ui/session-list.ts +3 -3
  47. package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +2 -2
  48. package/dist/extensions/pi-powerline-footer/bash-mode/history.ts +2 -1
  49. package/dist/extensions/pi-powerline-footer/index.ts +40 -47
  50. package/dist/extensions/pi-powerline-footer/package.json +2 -2
  51. package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +10 -10
  52. package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +1 -1
  53. package/dist/extensions/pi-powerline-footer/tests/working-vibes.test.ts +2 -2
  54. package/dist/extensions/pi-powerline-footer/theme.ts +6 -6
  55. package/dist/extensions/pi-powerline-footer/tps.ts +1 -1
  56. package/dist/extensions/pi-powerline-footer/types.ts +7 -7
  57. package/dist/extensions/pi-powerline-footer/welcome.ts +23 -16
  58. package/dist/extensions/pi-powerline-footer/working-vibes.ts +52 -59
  59. package/dist/extensions/pi-rewind-hook/index.ts +1 -1
  60. package/dist/extensions/pi-rewind-hook/package.json +1 -1
  61. package/dist/extensions/pi-subagents/README.md +224 -52
  62. package/dist/extensions/pi-subagents/agents/architect.md +188 -0
  63. package/dist/extensions/pi-subagents/agents/builder.md +120 -0
  64. package/dist/extensions/pi-subagents/agents/commentator.md +131 -0
  65. package/dist/extensions/pi-subagents/agents/explorer.md +51 -0
  66. package/dist/extensions/pi-subagents/agents/recapper.md +21 -0
  67. package/dist/extensions/pi-subagents/install.mjs +93 -0
  68. package/dist/extensions/pi-subagents/package.json +4 -5
  69. package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +1 -1
  70. package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +1 -1
  71. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +76 -13
  72. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +179 -2
  73. package/dist/extensions/pi-subagents/src/agents/agent-memory.ts +254 -0
  74. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +11 -0
  75. package/dist/extensions/pi-subagents/src/agents/agents.ts +193 -19
  76. package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +27 -2
  77. package/dist/extensions/pi-subagents/src/extension/config.ts +27 -4
  78. package/dist/extensions/pi-subagents/src/extension/doctor.ts +1 -7
  79. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +3 -2
  80. package/dist/extensions/pi-subagents/src/extension/index.ts +73 -71
  81. package/dist/extensions/pi-subagents/src/extension/rpc.ts +369 -0
  82. package/dist/extensions/pi-subagents/src/extension/schemas.ts +54 -10
  83. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +200 -0
  84. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +21 -253
  85. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +519 -0
  86. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +1 -1
  87. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +195 -105
  88. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +88 -2
  89. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +67 -10
  90. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +34 -4
  91. package/dist/extensions/pi-subagents/src/runs/background/completion-batcher.ts +166 -0
  92. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +156 -1
  93. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +515 -0
  94. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +161 -44
  95. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +1 -2
  96. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +3 -2
  97. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +167 -6
  98. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +514 -0
  99. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +28 -1
  100. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +873 -204
  101. package/dist/extensions/pi-subagents/src/runs/background/wait.ts +353 -0
  102. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +123 -27
  103. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +174 -70
  104. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +569 -81
  105. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +45 -22
  106. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +3 -1
  107. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +2 -2
  108. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +172 -21
  109. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +128 -0
  110. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +89 -0
  111. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +50 -1
  112. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +35 -4
  113. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +63 -45
  114. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +2 -0
  115. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +125 -5
  116. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +74 -0
  117. package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +52 -0
  118. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +28 -5
  119. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +16 -1
  120. package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +15 -2
  121. package/dist/extensions/pi-subagents/src/shared/child-transcript.ts +212 -0
  122. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +133 -22
  123. package/dist/extensions/pi-subagents/src/shared/settings.ts +3 -1
  124. package/dist/extensions/pi-subagents/src/shared/types.ts +197 -4
  125. package/dist/extensions/pi-subagents/src/shared/utils.ts +108 -17
  126. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +330 -0
  127. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +135 -4
  128. package/dist/extensions/pi-subagents/src/tui/render.ts +32 -12
  129. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +94 -0
  130. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +2772 -0
  131. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +1107 -0
  132. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +463 -0
  133. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +274 -0
  134. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +1535 -0
  135. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +242 -0
  136. package/dist/extensions/pi-subagents/test/integration/doctor-executor.test.ts +128 -0
  137. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +252 -0
  138. package/dist/extensions/pi-subagents/test/integration/foreground-result-size.test.ts +188 -0
  139. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +1306 -0
  140. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +1033 -0
  141. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +397 -0
  142. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +583 -0
  143. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +691 -0
  144. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +892 -0
  145. package/dist/extensions/pi-subagents/test/integration/session-tokens.test.ts +62 -0
  146. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1824 -0
  147. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1284 -0
  148. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +127 -0
  149. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +299 -0
  150. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +37 -0
  151. package/dist/extensions/pi-subagents/test/support/helpers.ts +189 -0
  152. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +335 -0
  153. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +129 -0
  154. package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +184 -0
  155. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +285 -0
  156. package/dist/extensions/pi-subagents/test/support/register-loader.mjs +15 -0
  157. package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +108 -0
  158. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +421 -0
  159. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +213 -0
  160. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +343 -0
  161. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +1199 -0
  162. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +556 -0
  163. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +420 -0
  164. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +579 -0
  165. package/dist/extensions/pi-subagents/test/unit/agent-scope.test.ts +20 -0
  166. package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +88 -0
  167. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +24 -0
  168. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +86 -0
  169. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +221 -0
  170. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +98 -0
  171. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +285 -0
  172. package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +112 -0
  173. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +206 -0
  174. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +159 -0
  175. package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +229 -0
  176. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +225 -0
  177. package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +101 -0
  178. package/dist/extensions/pi-subagents/test/unit/completion-batcher.test.ts +228 -0
  179. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +36 -0
  180. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +152 -0
  181. package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +72 -0
  182. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +327 -0
  183. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +161 -0
  184. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +159 -0
  185. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +217 -0
  186. package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +88 -0
  187. package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +68 -0
  188. package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +78 -0
  189. package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +415 -0
  190. package/dist/extensions/pi-subagents/test/unit/get-final-output.test.ts +126 -0
  191. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +271 -0
  192. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +173 -0
  193. package/dist/extensions/pi-subagents/test/unit/jsonl-writer.test.ts +119 -0
  194. package/dist/extensions/pi-subagents/test/unit/live-async-resume.test.ts +170 -0
  195. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +346 -0
  196. package/dist/extensions/pi-subagents/test/unit/model-info.test.ts +62 -0
  197. package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +87 -0
  198. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +145 -0
  199. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +162 -0
  200. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +470 -0
  201. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +329 -0
  202. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +319 -0
  203. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +70 -0
  204. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +247 -0
  205. package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +113 -0
  206. package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +94 -0
  207. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +803 -0
  208. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +209 -0
  209. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +238 -0
  210. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +118 -0
  211. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +299 -0
  212. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +408 -0
  213. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +134 -0
  214. package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +257 -0
  215. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +209 -0
  216. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +226 -0
  217. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +294 -0
  218. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +147 -0
  219. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +997 -0
  220. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +478 -0
  221. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +562 -0
  222. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +213 -0
  223. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +438 -0
  224. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +54 -0
  225. package/dist/extensions/pi-subagents/test/unit/slash-chain-groups.test.ts +464 -0
  226. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +255 -0
  227. package/dist/extensions/pi-subagents/test/unit/status-format.test.ts +19 -0
  228. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +245 -0
  229. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +517 -0
  230. package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +72 -0
  231. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +52 -0
  232. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +237 -0
  233. package/dist/extensions/pi-subagents/test/unit/total-cost.test.ts +60 -0
  234. package/dist/extensions/pi-subagents/test/unit/ts-loader.test.ts +33 -0
  235. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +202 -0
  236. package/dist/extensions/pi-subagents/test/unit/types-fork-preamble.test.ts +23 -0
  237. package/dist/extensions/pi-subagents/test/unit/wait.test.ts +398 -0
  238. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +88 -0
  239. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +26 -0
  240. package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +134 -0
  241. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +479 -0
  242. package/dist/extensions/pi-web-agent/package.json +2 -2
  243. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +2 -2
  244. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +5 -2
  245. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +1 -1
  246. package/dist/extensions/pi-web-agent/src/extension.ts +1 -1
  247. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +6 -4
  248. package/dist/extensions/question/helpers.ts +3 -3
  249. package/dist/extensions/question/index.ts +2 -2
  250. package/dist/extensions/question/navigation.ts +2 -2
  251. package/dist/extensions/question/package.json +2 -2
  252. package/dist/extensions/question/question-list.ts +2 -2
  253. package/dist/extensions/question/tests/question-list.test.ts +2 -2
  254. package/dist/extensions/question/tui-adapter.ts +2 -2
  255. package/dist/extensions/question/types.ts +2 -2
  256. package/dist/extensions/question/ui-protocol.ts +2 -2
  257. package/dist/extensions/rtk.ts +2 -2
  258. package/dist/extensions/tokenin-onboarding.ts +2 -2
  259. package/dist/extensions/undo.ts +1 -1
  260. package/dist/extensions/web-agent-onboarding.ts +3 -3
  261. package/dist/extensions/workflow/adapter.ts +16 -8
  262. package/dist/extensions/workflow/extension.ts +1 -1
  263. package/dist/extensions/workflow/package.json +1 -1
  264. package/dist/main.d.ts.map +1 -1
  265. package/dist/main.js +4 -0
  266. package/dist/main.js.map +1 -1
  267. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/assistant-message.js +2 -0
  269. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  270. package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
  271. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/first-time-setup.js +19 -5
  273. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  274. package/dist/skills/caveman/SKILL.md +49 -0
  275. package/dist/skills/handoff-text/SKILL.md +13 -0
  276. package/dist/utils/thinking-tags.d.ts +7 -0
  277. package/dist/utils/thinking-tags.d.ts.map +1 -0
  278. package/dist/utils/thinking-tags.js +63 -0
  279. package/dist/utils/thinking-tags.js.map +1 -0
  280. package/docs/docs.json +4 -0
  281. package/docs/extensions.md +2 -0
  282. package/docs/settings.md +15 -0
  283. package/docs/shared-host-extensions.md +109 -0
  284. package/package.json +2 -2
@@ -3,10 +3,9 @@
3
3
  // Uses module-level state (matching powerline-footer pattern).
4
4
 
5
5
  import { complete, type Context } from "@earendil-works/pi-ai";
6
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
6
+ import { getAgentDir, getSettingsPath, type ExtensionContext } from "@selesai/code";
7
7
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
8
8
  import { join, dirname } from "node:path";
9
- import { homedir } from "node:os";
10
9
 
11
10
  type VibeMode = "generate" | "file";
12
11
 
@@ -76,11 +75,6 @@ let recentVibes: string[] = [];
76
75
  // Configuration Management
77
76
  // ═══════════════════════════════════════════════════════════════════════════
78
77
 
79
- function getSettingsPath(): string {
80
- const homeDir = process.env.HOME || process.env.USERPROFILE || homedir();
81
- return join(homeDir, ".pi", "agent", "settings.json");
82
- }
83
-
84
78
  function isRecord(value: unknown): value is Record<string, unknown> {
85
79
  return typeof value === "object" && value !== null && !Array.isArray(value);
86
80
  }
@@ -208,8 +202,7 @@ function saveModelConfig(): boolean {
208
202
  // ═══════════════════════════════════════════════════════════════════════════
209
203
 
210
204
  function getVibesDir(): string {
211
- const homeDir = process.env.HOME || process.env.USERPROFILE || homedir();
212
- return join(homeDir, ".pi", "agent", "vibes");
205
+ return join(getAgentDir(), "vibes");
213
206
  }
214
207
 
215
208
  function toVibeFileSlug(theme: string): string {
@@ -231,7 +224,7 @@ function getVibeFilePath(theme: string): string {
231
224
  function loadVibesFromFile(theme: string): string[] {
232
225
  const filePath = getVibeFilePath(theme);
233
226
  if (!existsSync(filePath)) return [];
234
-
227
+
235
228
  try {
236
229
  const content = readFileSync(filePath, "utf-8");
237
230
  return content
@@ -247,12 +240,12 @@ function loadVibesFromFile(theme: string): string[] {
247
240
  function saveVibesToFile(theme: string, vibes: string[]): void {
248
241
  const vibesDir = getVibesDir();
249
242
  const filePath = getVibeFilePath(theme);
250
-
243
+
251
244
  // Ensure directory exists
252
245
  if (!existsSync(vibesDir)) {
253
246
  mkdirSync(vibesDir, { recursive: true });
254
247
  }
255
-
248
+
256
249
  writeFileSync(filePath, vibes.join("\n"));
257
250
  }
258
251
 
@@ -269,26 +262,26 @@ function mulberry32(seed: number): () => number {
269
262
  // Get vibe at index using seeded shuffle (no-repeat until all used)
270
263
  function getVibeAtIndex(vibes: string[], index: number, seed: number): string {
271
264
  if (vibes.length === 0) return `${config.fallback}...`;
272
-
265
+
273
266
  // For small lists or when we've cycled through, just use modulo
274
267
  const effectiveIndex = index % vibes.length;
275
-
268
+
276
269
  // Create deterministic shuffle using seed
277
270
  const rng = mulberry32(seed);
278
271
  const indices = Array.from({ length: vibes.length }, (_, i) => i);
279
-
272
+
280
273
  // Fisher-Yates shuffle with seeded RNG
281
274
  for (let i = indices.length - 1; i > 0; i--) {
282
275
  const j = Math.floor(rng() * (i + 1));
283
276
  [indices[i], indices[j]] = [indices[j], indices[i]];
284
277
  }
285
-
278
+
286
279
  return vibes[indices[effectiveIndex]];
287
280
  }
288
281
 
289
282
  function getNextVibeFromFile(): string {
290
283
  if (!config.theme) return `${config.fallback}...`;
291
-
284
+
292
285
  // Load/reload cache if theme changed
293
286
  if (vibeCacheTheme !== config.theme) {
294
287
  vibeCache = loadVibesFromFile(config.theme);
@@ -296,11 +289,11 @@ function getNextVibeFromFile(): string {
296
289
  vibeSeed = Date.now(); // New seed for new theme
297
290
  vibeIndex = 0;
298
291
  }
299
-
292
+
300
293
  if (vibeCache.length === 0) {
301
294
  return `${config.fallback}...`;
302
295
  }
303
-
296
+
304
297
  const vibe = getVibeAtIndex(vibeCache, vibeIndex, vibeSeed);
305
298
  vibeIndex++;
306
299
  return vibe;
@@ -313,12 +306,12 @@ function getNextVibeFromFile(): string {
313
306
  function buildVibePrompt(ctx: VibeGenContext): string {
314
307
  // Truncate user prompt to save tokens (most context in first 100 chars)
315
308
  const task = ctx.userPrompt.slice(0, 100);
316
-
309
+
317
310
  // Build exclusion list from recent vibes
318
- const exclude = recentVibes.length > 0
311
+ const exclude = recentVibes.length > 0
319
312
  ? `Don't use: ${recentVibes.join(", ")}`
320
313
  : "";
321
-
314
+
322
315
  // Use configured template with variable substitution
323
316
  return config.promptTemplate
324
317
  .replace(/\{theme\}/g, ctx.theme)
@@ -328,28 +321,28 @@ function buildVibePrompt(ctx: VibeGenContext): string {
328
321
 
329
322
  function parseVibeResponse(response: string, fallback: string): string {
330
323
  if (!response) return `${fallback}...`;
331
-
324
+
332
325
  // Take only the first line (AI sometimes adds explanations)
333
326
  let vibe = response.trim().split('\n')[0].trim();
334
-
327
+
335
328
  // Remove quotes if model wrapped the response
336
329
  vibe = vibe.replace(/^["']|["']$/g, "");
337
-
330
+
338
331
  // Ensure ellipsis
339
332
  if (!vibe.endsWith("...")) {
340
333
  vibe = vibe.replace(/\.+$/, "") + "...";
341
334
  }
342
-
335
+
343
336
  // Enforce length limit (configurable, default 65 chars)
344
337
  if (vibe.length > config.maxLength) {
345
338
  vibe = vibe.slice(0, config.maxLength - 3) + "...";
346
339
  }
347
-
340
+
348
341
  // Final validation
349
342
  if (!vibe || vibe === "...") {
350
343
  return `${fallback}...`;
351
344
  }
352
-
345
+
353
346
  return vibe;
354
347
  }
355
348
 
@@ -375,7 +368,7 @@ async function generateVibe(
375
368
  if (!extensionCtx) {
376
369
  return `${config.fallback}...`;
377
370
  }
378
-
371
+
379
372
  // Parse model spec (provider/modelId format, where modelId may contain slashes)
380
373
  const slashIndex = config.modelSpec.indexOf("/");
381
374
  if (slashIndex === -1) {
@@ -386,23 +379,23 @@ async function generateVibe(
386
379
  if (!provider || !modelId) {
387
380
  return `${config.fallback}...`;
388
381
  }
389
-
382
+
390
383
  // Resolve model from registry
391
384
  const model = extensionCtx.modelRegistry.find(provider, modelId);
392
385
  if (!model) {
393
386
  console.debug(`[working-vibes] Model not found: ${config.modelSpec}`);
394
387
  return `${config.fallback}...`;
395
388
  }
396
-
389
+
397
390
  // Get auth
398
391
  const auth = await extensionCtx.modelRegistry.getApiKeyAndHeaders(model);
399
392
  if (!auth.ok) {
400
393
  console.debug(`[working-vibes] Auth failed for ${provider}: ${auth.error}`);
401
394
  return `${config.fallback}...`;
402
395
  }
403
-
396
+
404
397
  const aiContext = buildAiContext(buildVibePrompt(ctx));
405
-
398
+
406
399
  const response = await complete(model, aiContext, { apiKey: auth.apiKey, headers: auth.headers, signal });
407
400
 
408
401
  const textContent = response.content.find(c => c.type === "text");
@@ -415,7 +408,7 @@ async function generateVibe(
415
408
  function trackRecentVibe(vibe: string): void {
416
409
  // Don't track fallback messages
417
410
  if (vibe === `${config.fallback}...`) return;
418
-
411
+
419
412
  // Add to front, remove duplicates
420
413
  recentVibes = [vibe, ...recentVibes.filter(v => v !== vibe)].slice(0, MAX_RECENT_VIBES);
421
414
  }
@@ -425,7 +418,7 @@ function updateVibeFromFile(setWorkingMessage: (msg?: string) => void): void {
425
418
  }
426
419
 
427
420
  async function generateAndUpdate(
428
- prompt: string,
421
+ prompt: string,
429
422
  setWorkingMessage: (msg?: string) => void,
430
423
  ): Promise<void> {
431
424
  // File mode: instant, no API call
@@ -433,27 +426,27 @@ async function generateAndUpdate(
433
426
  updateVibeFromFile(setWorkingMessage);
434
427
  return;
435
428
  }
436
-
429
+
437
430
  // Generate mode: API call with abort handling
438
431
  // Cancel any in-flight generation and create new controller
439
432
  // Capture in local variable to avoid race condition with subsequent calls
440
433
  const controller = new AbortController();
441
434
  currentGeneration?.abort();
442
435
  currentGeneration = controller;
443
-
436
+
444
437
  // Create timeout signal (3 seconds)
445
438
  const timeoutSignal = AbortSignal.timeout(config.timeout);
446
439
  const combinedSignal = AbortSignal.any([
447
440
  controller.signal,
448
441
  timeoutSignal,
449
442
  ]);
450
-
443
+
451
444
  try {
452
445
  const vibe = await generateVibe(
453
446
  { theme: config.theme!, userPrompt: prompt },
454
447
  combinedSignal,
455
448
  );
456
-
449
+
457
450
  // Only update if still streaming and THIS generation wasn't aborted
458
451
  if (isStreaming && !controller.signal.aborted) {
459
452
  trackRecentVibe(vibe);
@@ -499,19 +492,19 @@ export function setVibeModel(modelSpec: string): boolean {
499
492
  }
500
493
 
501
494
  export function onVibeBeforeAgentStart(
502
- prompt: string,
495
+ prompt: string,
503
496
  setWorkingMessage: (msg?: string) => void,
504
497
  ): void {
505
498
  // Skip if no theme configured or no extensionCtx
506
499
  if (!config.theme || !extensionCtx) return;
507
-
500
+
508
501
  // Queue themed placeholder BEFORE agent_start creates the loader
509
502
  // This sets pendingWorkingMessage which is applied when loader is created
510
503
  setWorkingMessage(`Channeling ${config.theme}...`);
511
-
504
+
512
505
  // Mark vibe generation time for rate limiting
513
506
  lastVibeTime = Date.now();
514
-
507
+
515
508
  // Async: generate and update (fire-and-forget, don't await)
516
509
  generateAndUpdate(prompt, setWorkingMessage);
517
510
  }
@@ -528,11 +521,11 @@ export function onVibeToolCall(
528
521
  ): void {
529
522
  // Skip if no theme, not streaming, or no extensionCtx
530
523
  if (!config.theme || !extensionCtx || !isStreaming) return;
531
-
524
+
532
525
  // Rate limit: skip if not enough time has passed
533
526
  const now = Date.now();
534
527
  if (now - lastVibeTime < config.refreshInterval) return;
535
-
528
+
536
529
  // Prefer agent context if provided (richer, more contextual)
537
530
  // Fall back to tool-based hint
538
531
  let hint: string;
@@ -553,7 +546,7 @@ export function onVibeToolCall(
553
546
  hint = `running command: ${cmd}`;
554
547
  }
555
548
  }
556
-
549
+
557
550
  // Update time and generate new vibe
558
551
  lastVibeTime = now;
559
552
  generateAndUpdate(hint, setWorkingMessage);
@@ -613,11 +606,11 @@ export async function generateVibesBatch(
613
606
  ): Promise<GenerateVibesResult> {
614
607
  const filePath = getVibeFilePath(theme);
615
608
  const safeCount = Number.isFinite(count) ? Math.min(Math.max(Math.floor(count), 1), 500) : 100;
616
-
609
+
617
610
  if (!extensionCtx) {
618
611
  return { success: false, count: 0, filePath, error: "Extension not initialized" };
619
612
  }
620
-
613
+
621
614
  // Parse model spec
622
615
  const slashIndex = config.modelSpec.indexOf("/");
623
616
  if (slashIndex === -1) {
@@ -625,31 +618,31 @@ export async function generateVibesBatch(
625
618
  }
626
619
  const provider = config.modelSpec.slice(0, slashIndex);
627
620
  const modelId = config.modelSpec.slice(slashIndex + 1);
628
-
621
+
629
622
  // Resolve model
630
623
  const model = extensionCtx.modelRegistry.find(provider, modelId);
631
624
  if (!model) {
632
625
  return { success: false, count: 0, filePath, error: `Model not found: ${config.modelSpec}` };
633
626
  }
634
-
627
+
635
628
  // Get auth
636
629
  const auth = await extensionCtx.modelRegistry.getApiKeyAndHeaders(model);
637
630
  if (!auth.ok) {
638
631
  return { success: false, count: 0, filePath, error: auth.error };
639
632
  }
640
-
633
+
641
634
  // Build batch prompt
642
635
  const prompt = BATCH_PROMPT
643
636
  .replace(/\{theme\}/g, theme)
644
637
  .replace(/\{count\}/g, String(safeCount));
645
-
638
+
646
639
  const aiContext = buildAiContext(prompt);
647
-
640
+
648
641
  try {
649
642
  // Use longer timeout for batch generation (30 seconds)
650
643
  const signal = AbortSignal.timeout(30000);
651
644
  const response = await complete(model, aiContext, { apiKey: auth.apiKey, headers: auth.headers, signal });
652
-
645
+
653
646
  const textContent = response.content.find(c => c.type === "text");
654
647
  if (!textContent?.text) {
655
648
  const error = response.stopReason === "error" && response.errorMessage
@@ -657,7 +650,7 @@ export async function generateVibesBatch(
657
650
  : "Empty response from model";
658
651
  return { success: false, count: 0, filePath, error };
659
652
  }
660
-
653
+
661
654
  // Parse response: one vibe per line
662
655
  const vibes = textContent.text
663
656
  .split("\n")
@@ -673,20 +666,20 @@ export async function generateVibesBatch(
673
666
  return vibe;
674
667
  })
675
668
  .filter(vibe => vibe.length > 3 && vibe !== "..."); // Filter invalid
676
-
669
+
677
670
  if (vibes.length === 0) {
678
671
  return { success: false, count: 0, filePath, error: "No valid vibes generated" };
679
672
  }
680
-
673
+
681
674
  // Save to file
682
675
  saveVibesToFile(theme, vibes);
683
-
676
+
684
677
  // Clear cache so next use loads fresh
685
678
  if (vibeCacheTheme === theme) {
686
679
  vibeCache = [];
687
680
  vibeCacheTheme = null;
688
681
  }
689
-
682
+
690
683
  return { success: true, count: vibes.length, filePath };
691
684
  } catch (error) {
692
685
  const message = error instanceof Error ? error.message : "Unknown error";
@@ -1,4 +1,4 @@
1
- import { getAgentDir, type ExtensionAPI, type ExtensionContext } from "@mariozechner/pi-coding-agent";
1
+ import { getAgentDir, type ExtensionAPI, type ExtensionContext } from "@selesai/code";
2
2
  import { exec as execCb } from "child_process";
3
3
  import { existsSync, readFileSync, realpathSync } from "fs";
4
4
  import { mkdtemp, readdir, readFile, rm, stat } from "fs/promises";
@@ -24,6 +24,6 @@
24
24
  "test": "npx --yes tsx --tsconfig tsconfig.test.json --test index.test.ts"
25
25
  },
26
26
  "devDependencies": {
27
- "@mariozechner/pi-coding-agent": "^0.51.0"
27
+ "@selesai/code": "*"
28
28
  }
29
29
  }