@tekmidian/pai 0.42.5 → 0.43.0

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 (297) hide show
  1. package/ARCHITECTURE.md +9 -9
  2. package/README.md +26 -8
  3. package/dist/{aibroker-client-BP74gGwD.mjs → aibroker-client-Bn9SnGMa.mjs} +3 -3
  4. package/dist/{aibroker-client-BP74gGwD.mjs.map → aibroker-client-Bn9SnGMa.mjs.map} +1 -1
  5. package/dist/{aibroker-client-C6m71p6O.mjs → aibroker-client-D5NT0S1N.mjs} +1 -1
  6. package/dist/{auto-route-_5zzJz5q.mjs → auto-route-CcD0OWWB.mjs} +4 -4
  7. package/dist/{auto-route-_5zzJz5q.mjs.map → auto-route-CcD0OWWB.mjs.map} +1 -1
  8. package/dist/{chain-DTII7xeL.mjs → chain-CEC1a5mX.mjs} +5 -4
  9. package/dist/{chain-DTII7xeL.mjs.map → chain-CEC1a5mX.mjs.map} +1 -1
  10. package/dist/cli/index.mjs +23 -21
  11. package/dist/cli/index.mjs.map +1 -1
  12. package/dist/cli/program.d.mts.map +1 -1
  13. package/dist/cli/program.mjs +23 -21
  14. package/dist/{clusters-j0ZuNYp9.mjs → clusters-Cw_P6lO-.mjs} +2 -2
  15. package/dist/{clusters-j0ZuNYp9.mjs.map → clusters-Cw_P6lO-.mjs.map} +1 -1
  16. package/dist/{config-B64vFg14.mjs → config-DCu8THKi.mjs} +41 -9
  17. package/dist/{config-B64vFg14.mjs.map → config-DCu8THKi.mjs.map} +1 -1
  18. package/dist/config-DeqFqa1N.mjs +3 -0
  19. package/dist/config-DxMZjpvY.mjs +1289 -0
  20. package/dist/config-DxMZjpvY.mjs.map +1 -0
  21. package/dist/context-handover-cache-B9NKSjwR.mjs +3242 -0
  22. package/dist/context-handover-cache-B9NKSjwR.mjs.map +1 -0
  23. package/dist/daemon/index.mjs +23 -22
  24. package/dist/daemon/index.mjs.map +1 -1
  25. package/dist/{daemon-B8N1egl0.mjs → daemon-BhldpFvO.mjs} +52 -38
  26. package/dist/daemon-BhldpFvO.mjs.map +1 -0
  27. package/dist/daemon-QIvCXB5f.mjs +24 -0
  28. package/dist/daemon-mcp/index.mjs +144 -117
  29. package/dist/daemon-mcp/index.mjs.map +1 -1
  30. package/dist/db-BOBfewFH.mjs +3 -0
  31. package/dist/{db-a1ixZQjr.mjs → db-DJ8rk0VM.mjs} +15 -6
  32. package/dist/{db-a1ixZQjr.mjs.map → db-DJ8rk0VM.mjs.map} +1 -1
  33. package/dist/db-DbY2O8QO.mjs +3 -0
  34. package/dist/{db-Ca5qfsMC.mjs → db-Ddns80yf.mjs} +15 -6
  35. package/dist/{db-Ca5qfsMC.mjs.map → db-Ddns80yf.mjs.map} +1 -1
  36. package/dist/{detect-CdaA48EI.mjs → detect-Bf2z-oKB.mjs} +1 -1
  37. package/dist/{detect-CdaA48EI.mjs.map → detect-Bf2z-oKB.mjs.map} +1 -1
  38. package/dist/detector-CkwkXuGh.mjs +5 -0
  39. package/dist/{detector-C73Nxm94.mjs → detector-DWXkeTlk.mjs} +2 -2
  40. package/dist/{detector-C73Nxm94.mjs.map → detector-DWXkeTlk.mjs.map} +1 -1
  41. package/dist/{embeddings-CEBGrzwu.mjs → embeddings-ClqKtLZ8.mjs} +1 -1
  42. package/dist/{embeddings-DOLZnT1X.mjs → embeddings-DvRKcQyt.mjs} +1 -1
  43. package/dist/{embeddings-DOLZnT1X.mjs.map → embeddings-DvRKcQyt.mjs.map} +1 -1
  44. package/dist/factory-47Qf_df7.mjs +3 -0
  45. package/dist/{factory-DEb9NmHJ.mjs → factory-DNYAqjH0.mjs} +8 -8
  46. package/dist/{factory-DEb9NmHJ.mjs.map → factory-DNYAqjH0.mjs.map} +1 -1
  47. package/dist/{fallback-oJl3BaIN.mjs → fallback-BQJ8PbCK.mjs} +185 -123
  48. package/dist/fallback-BQJ8PbCK.mjs.map +1 -0
  49. package/dist/{helpers-IjZkXBhj.mjs → helpers-crDEr6S2.mjs} +1 -1
  50. package/dist/{helpers-IjZkXBhj.mjs.map → helpers-crDEr6S2.mjs.map} +1 -1
  51. package/dist/hooks/capture-all-events.mjs +117 -34
  52. package/dist/hooks/capture-all-events.mjs.map +4 -4
  53. package/dist/hooks/capture-session-summary.mjs +110 -33
  54. package/dist/hooks/capture-session-summary.mjs.map +4 -4
  55. package/dist/hooks/capture-tool-output.mjs +105 -28
  56. package/dist/hooks/capture-tool-output.mjs.map +4 -4
  57. package/dist/hooks/cleanup-session-files.mjs +54 -13
  58. package/dist/hooks/cleanup-session-files.mjs.map +2 -2
  59. package/dist/hooks/context-compression-hook.mjs +7565 -122
  60. package/dist/hooks/context-compression-hook.mjs.map +4 -4
  61. package/dist/hooks/initialize-session.mjs +55 -14
  62. package/dist/hooks/initialize-session.mjs.map +2 -2
  63. package/dist/hooks/inject-observations.mjs +79 -18
  64. package/dist/hooks/inject-observations.mjs.map +3 -3
  65. package/dist/hooks/load-core-context.mjs +55 -14
  66. package/dist/hooks/load-core-context.mjs.map +2 -2
  67. package/dist/hooks/load-project-context.mjs +207 -122
  68. package/dist/hooks/load-project-context.mjs.map +4 -4
  69. package/dist/hooks/mcp-deferred-gate.mjs +54 -13
  70. package/dist/hooks/mcp-deferred-gate.mjs.map +2 -2
  71. package/dist/hooks/mcp-deferred-reminder.mjs +9 -0
  72. package/dist/hooks/mcp-deferred-reminder.mjs.map +3 -3
  73. package/dist/hooks/observe.mjs +54 -13
  74. package/dist/hooks/observe.mjs.map +2 -2
  75. package/dist/hooks/post-compact-inject.mjs +7419 -16
  76. package/dist/hooks/post-compact-inject.mjs.map +4 -4
  77. package/dist/hooks/route-agents-to-worker.mjs +7778 -171
  78. package/dist/hooks/route-agents-to-worker.mjs.map +4 -4
  79. package/dist/hooks/route-edits-to-worker.mjs +90 -0
  80. package/dist/hooks/route-edits-to-worker.mjs.map +7 -0
  81. package/dist/hooks/security-validator.mjs +147 -6
  82. package/dist/hooks/security-validator.mjs.map +4 -4
  83. package/dist/hooks/session-commands.mjs +9 -0
  84. package/dist/hooks/session-commands.mjs.map +3 -3
  85. package/dist/hooks/stop-hook.mjs +182 -105
  86. package/dist/hooks/stop-hook.mjs.map +4 -4
  87. package/dist/hooks/subagent-stop-hook.mjs +3 -0
  88. package/dist/hooks/subagent-stop-hook.mjs.map +1 -1
  89. package/dist/hooks/sync-todo-to-md.mjs +54 -13
  90. package/dist/hooks/sync-todo-to-md.mjs.map +2 -2
  91. package/dist/hooks/update-tab-on-action.mjs +3 -0
  92. package/dist/hooks/update-tab-on-action.mjs.map +1 -1
  93. package/dist/hooks/update-tab-titles.mjs +3 -0
  94. package/dist/hooks/update-tab-titles.mjs.map +1 -1
  95. package/dist/hooks/whisper-reinject.mjs +11 -0
  96. package/dist/hooks/whisper-reinject.mjs.map +3 -3
  97. package/dist/hooks/whisper-rules.mjs +134 -29
  98. package/dist/hooks/whisper-rules.mjs.map +4 -4
  99. package/dist/hooks/worker-proxy.mjs +7737 -117
  100. package/dist/hooks/worker-proxy.mjs.map +4 -4
  101. package/dist/hooks/worker-status-line.mjs +7883 -169
  102. package/dist/hooks/worker-status-line.mjs.map +4 -4
  103. package/dist/hooks/worker-supervision.mjs +7721 -115
  104. package/dist/hooks/worker-supervision.mjs.map +4 -4
  105. package/dist/index.d.mts +4 -2
  106. package/dist/index.d.mts.map +1 -1
  107. package/dist/index.mjs +10 -10
  108. package/dist/{indexer-backend-BPTzKFZU.mjs → indexer-backend-CdvCJCkD.mjs} +3 -3
  109. package/dist/{indexer-backend-BPTzKFZU.mjs.map → indexer-backend-CdvCJCkD.mjs.map} +1 -1
  110. package/dist/{ipc-client-BmypMNYk.mjs → ipc-client-C6NryMMb.mjs} +2 -2
  111. package/dist/{ipc-client-BmypMNYk.mjs.map → ipc-client-C6NryMMb.mjs.map} +1 -1
  112. package/dist/{kg-entity-r8duqhi9.mjs → kg-entity-BSjM5xZh.mjs} +1 -1
  113. package/dist/{kg-entity-r8duqhi9.mjs.map → kg-entity-BSjM5xZh.mjs.map} +1 -1
  114. package/dist/{latent-ideas-CtSca4qG.mjs → latent-ideas-BfL4nCQ3.mjs} +4 -4
  115. package/dist/{latent-ideas-CtSca4qG.mjs.map → latent-ideas-BfL4nCQ3.mjs.map} +1 -1
  116. package/dist/{link-boost-Bucnz3n8.mjs → link-boost-C5PaNdzm.mjs} +1 -1
  117. package/dist/{link-boost-Bucnz3n8.mjs.map → link-boost-C5PaNdzm.mjs.map} +1 -1
  118. package/dist/main-resolver-CnfnWa8C.mjs +7 -0
  119. package/dist/{main-resolver-DnkxPYkr.mjs → main-resolver-DvYu9jbl.mjs} +21 -11
  120. package/dist/main-resolver-DvYu9jbl.mjs.map +1 -0
  121. package/dist/{migrate-Cjzeefn9.mjs → migrate-CfERwXhY.mjs} +2 -2
  122. package/dist/{migrate-Cjzeefn9.mjs.map → migrate-CfERwXhY.mjs.map} +1 -1
  123. package/dist/{neighborhood-CM7Jgb51.mjs → neighborhood-CETR_P4y.mjs} +2 -2
  124. package/dist/{neighborhood-CM7Jgb51.mjs.map → neighborhood-CETR_P4y.mjs.map} +1 -1
  125. package/dist/{note-context-DCwE2A-M.mjs → note-context-DCcRWBoN.mjs} +1 -1
  126. package/dist/{note-context-DCwE2A-M.mjs.map → note-context-DCcRWBoN.mjs.map} +1 -1
  127. package/dist/pai-home-ChAOupZc.mjs +164 -0
  128. package/dist/pai-home-ChAOupZc.mjs.map +1 -0
  129. package/dist/{pai-marker-CHtbJMwJ.mjs → pai-marker-B20KqhA8.mjs} +1 -1
  130. package/dist/{pai-marker-CHtbJMwJ.mjs.map → pai-marker-B20KqhA8.mjs.map} +1 -1
  131. package/dist/{planner-D5Ui7DAm.mjs → planner-BlKGgpWI.mjs} +7 -6
  132. package/dist/{planner-D5Ui7DAm.mjs.map → planner-BlKGgpWI.mjs.map} +1 -1
  133. package/dist/{postgres-CtOzfoQU.mjs → postgres-CUSXWgTG.mjs} +2 -2
  134. package/dist/{postgres-CtOzfoQU.mjs.map → postgres-CUSXWgTG.mjs.map} +1 -1
  135. package/dist/{program-zpoYnJGz.mjs → program-C5jRQ1kg.mjs} +8880 -5913
  136. package/dist/program-C5jRQ1kg.mjs.map +1 -0
  137. package/dist/query-feedback-C7rSfiXU.mjs +3 -0
  138. package/dist/{query-feedback-Dqz-HC__.mjs → query-feedback-CYyOGi3y.mjs} +20 -6
  139. package/dist/query-feedback-CYyOGi3y.mjs.map +1 -0
  140. package/dist/{reranker-CwTCNsgA.mjs → reranker-B5qUTamW.mjs} +1 -1
  141. package/dist/{reranker-xPm04PXx.mjs → reranker-HHmhZk6v.mjs} +1 -1
  142. package/dist/{reranker-xPm04PXx.mjs.map → reranker-HHmhZk6v.mjs.map} +1 -1
  143. package/dist/router-CremHKTI.mjs +3 -0
  144. package/dist/{router-DD6D4j31.mjs → router-DBAZfE7X.mjs} +2 -2
  145. package/dist/{router-DD6D4j31.mjs.map → router-DBAZfE7X.mjs.map} +1 -1
  146. package/dist/{run-D7K5UALn.mjs → run-ByBKowN5.mjs} +980 -247
  147. package/dist/run-ByBKowN5.mjs.map +1 -0
  148. package/dist/{runtime-paths-rni52zHX.mjs → runtime-paths-B0P1TvUr.mjs} +1 -1
  149. package/dist/{runtime-paths-rni52zHX.mjs.map → runtime-paths-B0P1TvUr.mjs.map} +1 -1
  150. package/dist/{search-Rpk1cSBC.mjs → search-B69cQwDB.mjs} +3 -3
  151. package/dist/{search-Rpk1cSBC.mjs.map → search-B69cQwDB.mjs.map} +1 -1
  152. package/dist/{search-CfPpJAWQ.mjs → search-fb-5ovj4.mjs} +2 -2
  153. package/dist/{server-D4vAieF4.mjs → server-Ch99xt5K.mjs} +15 -14
  154. package/dist/server-Ch99xt5K.mjs.map +1 -0
  155. package/dist/skills/Advisor/SKILL.md +3 -3
  156. package/dist/skills/Providers/SKILL.md +30 -0
  157. package/dist/skills/Reconstruct/SKILL.md +1 -1
  158. package/dist/skills/VaultContext/SKILL.md +1 -1
  159. package/dist/skills/Whisper/SKILL.md +3 -3
  160. package/dist/skills/Worker/SKILL.md +1 -1
  161. package/dist/{sources-CS43CpuS.mjs → sources-KBGEA_E6.mjs} +2 -2
  162. package/dist/{sources-CS43CpuS.mjs.map → sources-KBGEA_E6.mjs.map} +1 -1
  163. package/dist/{sqlite-Cq3gJcq9.mjs → sqlite-By6r2YhZ.mjs} +3 -3
  164. package/dist/{sqlite-Cq3gJcq9.mjs.map → sqlite-By6r2YhZ.mjs.map} +1 -1
  165. package/dist/{state-CY6I-Hnc.mjs → state-DnYGRmS7.mjs} +1 -1
  166. package/dist/{state-BRdB-Bf1.mjs → state-PJrgfDLW.mjs} +1 -1
  167. package/dist/{state-BRdB-Bf1.mjs.map → state-PJrgfDLW.mjs.map} +1 -1
  168. package/dist/{stop-words-Hfu8u22w.mjs → stop-words-BaMEGVeY.mjs} +1 -1
  169. package/dist/{stop-words-Hfu8u22w.mjs.map → stop-words-BaMEGVeY.mjs.map} +1 -1
  170. package/dist/{sync-BWbe8JTg.mjs → sync-Btcb6xA4.mjs} +3 -3
  171. package/dist/{sync-BWbe8JTg.mjs.map → sync-Btcb6xA4.mjs.map} +1 -1
  172. package/dist/{themes-B7h9YDiy.mjs → themes-BVoAnLZj.mjs} +3 -3
  173. package/dist/{themes-B7h9YDiy.mjs.map → themes-BVoAnLZj.mjs.map} +1 -1
  174. package/dist/{tools-BW3NLMPk.mjs → tools-CAG2sUjf.mjs} +4 -3
  175. package/dist/{tools-LlzcV_eK.mjs → tools-DiRC5glA.mjs} +30 -233
  176. package/dist/tools-DiRC5glA.mjs.map +1 -0
  177. package/dist/{trace-u4hT-pLD.mjs → trace-Cy8quQTm.mjs} +1 -1
  178. package/dist/{trace-u4hT-pLD.mjs.map → trace-Cy8quQTm.mjs.map} +1 -1
  179. package/dist/{utils-DhMex3Ox.mjs → utils-BD8g8oSf.mjs} +1 -1
  180. package/dist/{utils-9Err2RBW.mjs → utils-CJymHkYm.mjs} +1 -1
  181. package/dist/{utils-9Err2RBW.mjs.map → utils-CJymHkYm.mjs.map} +1 -1
  182. package/dist/{vault-indexer-mata9S7b.mjs → vault-indexer-C5i-OAyr.mjs} +2 -2
  183. package/dist/{vault-indexer-mata9S7b.mjs.map → vault-indexer-C5i-OAyr.mjs.map} +1 -1
  184. package/dist/wakeup-BfElduEU.mjs +231 -0
  185. package/dist/wakeup-BfElduEU.mjs.map +1 -0
  186. package/dist/work-queue-worker-BA5IDBwQ.mjs +567 -0
  187. package/dist/work-queue-worker-BA5IDBwQ.mjs.map +1 -0
  188. package/dist/work-queue-worker-DLM2wlqM.mjs +14 -0
  189. package/dist/{zettelkasten-F0D_XfQ4.mjs → zettelkasten-BBjA7GcP.mjs} +4 -4
  190. package/dist/{zettelkasten-F0D_XfQ4.mjs.map → zettelkasten-BBjA7GcP.mjs.map} +1 -1
  191. package/docs/commands/README.md +32 -3
  192. package/docs/commands/audit.md +113 -0
  193. package/docs/commands/backup.md +2 -2
  194. package/docs/commands/clear-names.md +1 -1
  195. package/docs/commands/config.md +59 -0
  196. package/docs/commands/daemon.md +1 -1
  197. package/docs/commands/db.md +1 -1
  198. package/docs/commands/end.md +1 -1
  199. package/docs/commands/help.md +1 -1
  200. package/docs/commands/identity.md +1 -1
  201. package/docs/commands/kg.md +1 -1
  202. package/docs/commands/launch.md +45 -0
  203. package/docs/commands/mcp.md +1 -1
  204. package/docs/commands/memory.md +3 -3
  205. package/docs/commands/notify.md +1 -1
  206. package/docs/commands/observation.md +1 -1
  207. package/docs/commands/obsidian.md +1 -1
  208. package/docs/commands/pause.md +1 -1
  209. package/docs/commands/project.md +46 -1
  210. package/docs/commands/projects.md +46 -1
  211. package/docs/commands/registry.md +1 -1
  212. package/docs/commands/restore.md +1 -1
  213. package/docs/commands/session.md +1 -1
  214. package/docs/commands/sessions.md +1 -1
  215. package/docs/commands/setup.md +1 -1
  216. package/docs/commands/shell-init.md +1 -1
  217. package/docs/commands/skill.md +1 -1
  218. package/docs/commands/task.md +1 -1
  219. package/docs/commands/topic.md +1 -1
  220. package/docs/commands/update.md +1 -1
  221. package/docs/commands/worker.md +97 -6
  222. package/docs/commands/zettel.md +1 -1
  223. package/docs/provider-abstraction.md +1 -1
  224. package/docs/provider-independence-details.md +8 -5
  225. package/docs/task-bus.md +1 -1
  226. package/docs/worker.md +136 -83
  227. package/docs/workers-config.md +446 -0
  228. package/package.json +4 -2
  229. package/scripts/build-hooks.mjs +58 -3
  230. package/src/hooks/pre-compact.sh +5 -2
  231. package/src/hooks/session-stop.sh +29 -4
  232. package/src/hooks/ts/capture-all-events.ts +3 -3
  233. package/src/hooks/ts/lib/advisor-budget.test.ts +98 -0
  234. package/src/hooks/ts/lib/advisor-budget.ts +90 -0
  235. package/src/hooks/ts/lib/agent-gate.test.ts +101 -0
  236. package/src/hooks/ts/lib/agent-gate.ts +112 -0
  237. package/src/hooks/ts/lib/context-fill.ts +2 -2
  238. package/src/hooks/ts/lib/edit-gate.test.ts +52 -0
  239. package/src/hooks/ts/lib/edit-gate.ts +51 -0
  240. package/src/hooks/ts/lib/mcp-deferred-reminder.test.ts +8 -0
  241. package/src/hooks/ts/lib/pai-paths.test.ts +93 -0
  242. package/src/hooks/ts/lib/pai-paths.ts +168 -24
  243. package/src/hooks/ts/lib/project-utils/index.ts +1 -0
  244. package/src/hooks/ts/lib/project-utils/paths.ts +5 -4
  245. package/src/hooks/ts/lib/project-utils.ts +1 -0
  246. package/src/hooks/ts/post-tool-use/capture-tool-output.ts +2 -2
  247. package/src/hooks/ts/post-tool-use/whisper-reinject.test.ts +55 -0
  248. package/src/hooks/ts/post-tool-use/whisper-reinject.ts +3 -0
  249. package/src/hooks/ts/pre-compact/context-compression-hook.ts +1 -1
  250. package/src/hooks/ts/pre-tool-use/route-agents-to-worker.ts +46 -99
  251. package/src/hooks/ts/pre-tool-use/route-edits-to-worker.test.ts +47 -0
  252. package/src/hooks/ts/pre-tool-use/route-edits-to-worker.ts +96 -0
  253. package/src/hooks/ts/pre-tool-use/security-validator.ts +2 -1
  254. package/src/hooks/ts/session-end/capture-session-summary.ts +4 -4
  255. package/src/hooks/ts/session-start/initialize-session.ts +3 -3
  256. package/src/hooks/ts/session-start/inject-observations.test.ts +56 -0
  257. package/src/hooks/ts/session-start/inject-observations.ts +28 -8
  258. package/src/hooks/ts/session-start/load-core-context.ts +4 -4
  259. package/src/hooks/ts/session-start/load-project-context.ts +2 -2
  260. package/src/hooks/ts/session-start/mcp-deferred-reminder.ts +2 -0
  261. package/src/hooks/ts/session-start/session-commands.ts +4 -0
  262. package/src/hooks/ts/session-start/session-start-worker-guard.test.ts +36 -0
  263. package/src/hooks/ts/stop/stop-hook.ts +6 -11
  264. package/src/hooks/ts/user-prompt/whisper-rules.test.ts +49 -0
  265. package/src/hooks/ts/user-prompt/whisper-rules.ts +88 -47
  266. package/src/hooks/ztk-auto.sh +28 -0
  267. package/src/hooks/ztk-auto.test.ts +72 -0
  268. package/src/hooks/ztk-passthrough.mjs +71 -0
  269. package/statusline-command.sh +277 -116
  270. package/templates/agent-prefs.example.md +8 -8
  271. package/templates/claude-md.template.md +1 -1
  272. package/templates/voices.example.json +3 -3
  273. package/dist/config-C_ErGddD.mjs +0 -3
  274. package/dist/config-_lQI_W08.mjs +0 -640
  275. package/dist/config-_lQI_W08.mjs.map +0 -1
  276. package/dist/context-handover-cache-pNFdBNrU.mjs +0 -1548
  277. package/dist/context-handover-cache-pNFdBNrU.mjs.map +0 -1
  278. package/dist/daemon-B8N1egl0.mjs.map +0 -1
  279. package/dist/daemon-DHfyoTlk.mjs +0 -23
  280. package/dist/db-O-cyAPfS.mjs +0 -3
  281. package/dist/db-XEwJbuGO.mjs +0 -3
  282. package/dist/detector-C-7KRi42.mjs +0 -5
  283. package/dist/factory-Dbo8yNPi.mjs +0 -3
  284. package/dist/fallback-oJl3BaIN.mjs.map +0 -1
  285. package/dist/main-resolver-BAfOMppW.mjs +0 -7
  286. package/dist/main-resolver-DnkxPYkr.mjs.map +0 -1
  287. package/dist/program-zpoYnJGz.mjs.map +0 -1
  288. package/dist/query-feedback-DGoVRaWD.mjs +0 -3
  289. package/dist/query-feedback-Dqz-HC__.mjs.map +0 -1
  290. package/dist/router-BTIGZR2_.mjs +0 -3
  291. package/dist/run-D7K5UALn.mjs.map +0 -1
  292. package/dist/server-D4vAieF4.mjs.map +0 -1
  293. package/dist/tools-LlzcV_eK.mjs.map +0 -1
  294. package/dist/work-queue-worker-AEmfVE0F.mjs +0 -14
  295. package/dist/work-queue-worker-DIT-VLSh.mjs +0 -2136
  296. package/dist/work-queue-worker-DIT-VLSh.mjs.map +0 -1
  297. /package/dist/{indexer-D7MvSQPY.mjs → indexer-C5Le7XE7.mjs} +0 -0
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __paiCreateRequire } from 'node:module';
3
+ const require = __paiCreateRequire(import.meta.url);
4
+ if (!process.env.PAI_QUIET_NOTICES) process.env.PAI_QUIET_NOTICES = '1';
2
5
 
3
6
  // src/hooks/ts/lib/worker-session.ts
4
7
  function isWorkerSession(env = process.env) {
@@ -6,28 +9,58 @@ function isWorkerSession(env = process.env) {
6
9
  }
7
10
 
8
11
  // src/hooks/ts/stop/stop-hook.ts
9
- import { readFileSync as readFileSync6, writeFileSync as writeFileSync4, mkdirSync as mkdirSync5, existsSync as existsSync7, unlinkSync } from "fs";
10
- import { join as join7, basename as basename4, dirname } from "path";
12
+ import { readFileSync as readFileSync7, writeFileSync as writeFileSync4, mkdirSync as mkdirSync6, existsSync as existsSync8, unlinkSync } from "fs";
13
+ import { join as join9, basename as basename4, dirname as dirname2 } from "path";
11
14
  import { connect } from "net";
12
15
  import { randomUUID } from "crypto";
13
16
 
14
17
  // src/hooks/ts/lib/project-utils/paths.ts
15
- import { existsSync as existsSync2, mkdirSync, readdirSync, linkSync, copyFileSync } from "fs";
16
- import { join as join2, basename } from "path";
18
+ import { existsSync as existsSync3, mkdirSync as mkdirSync2, readdirSync as readdirSync2, linkSync, copyFileSync as copyFileSync2 } from "fs";
19
+ import { join as join3, basename } from "path";
20
+
21
+ // src/hooks/ts/lib/pai-paths.ts
22
+ import { homedir as homedir2 } from "os";
23
+ import { resolve, join as join2 } from "path";
24
+ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
25
+
26
+ // src/config/pai-home.ts
27
+ import { existsSync, mkdirSync, readFileSync, copyFileSync, renameSync, readdirSync, statSync } from "node:fs";
28
+ import { homedir } from "node:os";
29
+ import { join, dirname } from "node:path";
30
+ function paiHomeDir() {
31
+ return process.env.PAI_HOME || join(homedir(), ".claude", "pai");
32
+ }
33
+ function paiHomePath(...segments) {
34
+ return join(paiHomeDir(), ...segments);
35
+ }
36
+ var noticesPrinted = /* @__PURE__ */ new Set();
37
+ function resolvePaiFile(newPath, oldCandidates, migrateHint) {
38
+ if (existsSync(newPath)) return newPath;
39
+ for (const old of oldCandidates) {
40
+ if (existsSync(old)) {
41
+ if (!noticesPrinted.has(newPath)) {
42
+ noticesPrinted.add(newPath);
43
+ process.stderr.write(
44
+ `pai: ${old} is at an old location \u2014 run \`${migrateHint}\` to move it to ${newPath}
45
+ `
46
+ );
47
+ }
48
+ return old;
49
+ }
50
+ }
51
+ return newPath;
52
+ }
17
53
 
18
54
  // src/hooks/ts/lib/pai-paths.ts
19
- import { homedir } from "os";
20
- import { resolve, join } from "path";
21
- import { existsSync, readFileSync } from "fs";
22
55
  function loadEnvFile() {
23
56
  const possiblePaths = [
24
- resolve(process.env.PAI_DIR || "", ".env"),
25
- resolve(homedir(), ".claude", ".env")
57
+ resolve(process.env.ADAPTER_DIR || process.env.PAI_DIR || "", ".env"),
58
+ resolve(homedir2(), ".claude", ".env")
26
59
  ];
27
60
  for (const envPath of possiblePaths) {
28
- if (existsSync(envPath)) {
61
+ if (existsSync2(envPath)) {
29
62
  try {
30
- const content = readFileSync(envPath, "utf-8");
63
+ const content = readFileSync2(envPath, "utf-8");
31
64
  for (const line of content.split("\n")) {
32
65
  const trimmed = line.trim();
33
66
  if (!trimmed || trimmed.startsWith("#")) continue;
@@ -38,8 +71,8 @@ function loadEnvFile() {
38
71
  if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
39
72
  value = value.slice(1, -1);
40
73
  }
41
- value = value.replace(/\$HOME/g, homedir());
42
- value = value.replace(/^~(?=\/|$)/, homedir());
74
+ value = value.replace(/\$HOME/g, homedir2());
75
+ value = value.replace(/^~(?=\/|$)/, homedir2());
43
76
  if (process.env[key] === void 0) {
44
77
  process.env[key] = value;
45
78
  }
@@ -52,29 +85,67 @@ function loadEnvFile() {
52
85
  }
53
86
  }
54
87
  loadEnvFile();
55
- var PAI_DIR = process.env.PAI_DIR ? resolve(process.env.PAI_DIR) : resolve(homedir(), ".claude");
56
- var HOOKS_DIR = join(PAI_DIR, "Hooks");
57
- var SKILLS_DIR = join(PAI_DIR, "Skills");
58
- var AGENTS_DIR = join(PAI_DIR, "Agents");
59
- var HISTORY_DIR = join(PAI_DIR, "History");
60
- var COMMANDS_DIR = join(PAI_DIR, "Commands");
88
+ function defaultAdapterDir() {
89
+ return resolve(homedir2(), ".claude");
90
+ }
91
+ function suppressDeprecationNotices() {
92
+ if (process.env.PAI_QUIET_NOTICES === "1") return true;
93
+ const idx = process.argv.indexOf("--output-format");
94
+ return idx !== -1 && process.argv[idx + 1] === "json";
95
+ }
96
+ function warnPaiDirDeprecatedOnce(message) {
97
+ const g = globalThis;
98
+ if (g.__paiDirNoticePrinted || suppressDeprecationNotices()) return;
99
+ g.__paiDirNoticePrinted = true;
100
+ process.stderr.write(`pai: ${message}
101
+ `);
102
+ }
103
+ function resolveAdapterDir() {
104
+ if (process.env.ADAPTER_DIR) {
105
+ const adapterDir = resolve(process.env.ADAPTER_DIR);
106
+ if (process.env.PAI_DIR) {
107
+ const paiDir = resolve(process.env.PAI_DIR);
108
+ if (paiDir !== adapterDir) {
109
+ warnPaiDirDeprecatedOnce(
110
+ `ADAPTER_DIR (${adapterDir}) and PAI_DIR (${paiDir}) are both set and differ \u2014 ADAPTER_DIR wins. PAI_DIR still works for one release.`
111
+ );
112
+ }
113
+ }
114
+ return adapterDir;
115
+ }
116
+ if (process.env.PAI_DIR) {
117
+ const paiDir = resolve(process.env.PAI_DIR);
118
+ if (paiDir !== defaultAdapterDir()) {
119
+ warnPaiDirDeprecatedOnce(
120
+ "PAI_DIR is deprecated \u2014 use ADAPTER_DIR for the harness adapter root (~/.claude). PAI_DIR still works for one release."
121
+ );
122
+ }
123
+ return paiDir;
124
+ }
125
+ return defaultAdapterDir();
126
+ }
127
+ var ADAPTER_DIR = resolveAdapterDir();
128
+ var HOOKS_DIR = join2(ADAPTER_DIR, "Hooks");
129
+ var SKILLS_DIR = join2(ADAPTER_DIR, "Skills");
130
+ var AGENTS_DIR = join2(ADAPTER_DIR, "Agents");
131
+ var COMMANDS_DIR = join2(ADAPTER_DIR, "Commands");
61
132
  function validatePAIStructure() {
62
- if (!existsSync(PAI_DIR)) {
63
- console.error(`PAI_DIR does not exist: ${PAI_DIR}`);
64
- console.error(` Expected ~/.claude or set PAI_DIR environment variable`);
133
+ if (!existsSync2(ADAPTER_DIR)) {
134
+ console.error(`ADAPTER_DIR does not exist: ${ADAPTER_DIR}`);
135
+ console.error(` Expected ~/.claude or set ADAPTER_DIR environment variable`);
65
136
  process.exit(1);
66
137
  }
67
- if (!existsSync(HOOKS_DIR)) {
138
+ if (!existsSync2(HOOKS_DIR)) {
68
139
  console.error(`PAI hooks directory not found: ${HOOKS_DIR}`);
69
- console.error(` Your PAI_DIR may be misconfigured`);
70
- console.error(` Current PAI_DIR: ${PAI_DIR}`);
140
+ console.error(` Your ADAPTER_DIR may be misconfigured`);
141
+ console.error(` Current ADAPTER_DIR: ${ADAPTER_DIR}`);
71
142
  process.exit(1);
72
143
  }
73
144
  }
74
145
  validatePAIStructure();
75
146
 
76
147
  // src/hooks/ts/lib/project-utils/paths.ts
77
- var PROJECTS_DIR = join2(PAI_DIR, "projects");
148
+ var PROJECTS_DIR = join3(ADAPTER_DIR, "projects");
78
149
  var PROBE_CWD_PATTERNS = [
79
150
  "/CodexBar/ClaudeProbe",
80
151
  "/ClaudeProbe"
@@ -88,56 +159,56 @@ function encodePath(path) {
88
159
  }
89
160
  function getProjectDir(cwd) {
90
161
  const encoded = encodePath(cwd);
91
- return join2(PROJECTS_DIR, encoded);
162
+ return join3(PROJECTS_DIR, encoded);
92
163
  }
93
164
  function getNotesDir(cwd) {
94
- return join2(getProjectDir(cwd), "Notes");
165
+ return join3(getProjectDir(cwd), "Notes");
95
166
  }
96
167
  function findNotesDir(cwd) {
97
168
  const cwdBasename = basename(cwd).toLowerCase();
98
- if (cwdBasename === "notes" && existsSync2(cwd)) {
169
+ if (cwdBasename === "notes" && existsSync3(cwd)) {
99
170
  return { path: cwd, isLocal: true };
100
171
  }
101
172
  const localPaths = [
102
- join2(cwd, "Notes"),
103
- join2(cwd, "notes"),
104
- join2(cwd, ".claude", "Notes")
173
+ join3(cwd, "Notes"),
174
+ join3(cwd, "notes"),
175
+ join3(cwd, ".claude", "Notes")
105
176
  ];
106
177
  for (const path of localPaths) {
107
- if (existsSync2(path)) {
178
+ if (existsSync3(path)) {
108
179
  return { path, isLocal: true };
109
180
  }
110
181
  }
111
182
  return { path: getNotesDir(cwd), isLocal: false };
112
183
  }
113
184
  function getSessionsDirFromProjectDir(projectDir) {
114
- return join2(projectDir, "sessions");
185
+ return join3(projectDir, "sessions");
115
186
  }
116
187
  function ensureSessionsDirFromProjectDir(projectDir) {
117
188
  const sessionsDir = getSessionsDirFromProjectDir(projectDir);
118
- if (!existsSync2(sessionsDir)) {
119
- mkdirSync(sessionsDir, { recursive: true });
189
+ if (!existsSync3(sessionsDir)) {
190
+ mkdirSync2(sessionsDir, { recursive: true });
120
191
  console.error(`Created sessions directory: ${sessionsDir}`);
121
192
  }
122
193
  return sessionsDir;
123
194
  }
124
195
  function archiveSessionFilesToSessionsDir(projectDir, excludeFile, silent = false) {
125
196
  const sessionsDir = ensureSessionsDirFromProjectDir(projectDir);
126
- if (!existsSync2(projectDir)) return 0;
127
- const files = readdirSync(projectDir);
197
+ if (!existsSync3(projectDir)) return 0;
198
+ const files = readdirSync2(projectDir);
128
199
  let archivedCount = 0;
129
200
  for (const file of files) {
130
201
  if (!file.endsWith(".jsonl") || file === excludeFile) continue;
131
- const sourcePath = join2(projectDir, file);
132
- const destPath = join2(sessionsDir, file);
133
- if (existsSync2(destPath)) continue;
202
+ const sourcePath = join3(projectDir, file);
203
+ const destPath = join3(sessionsDir, file);
204
+ if (existsSync3(destPath)) continue;
134
205
  try {
135
206
  linkSync(sourcePath, destPath);
136
207
  if (!silent) console.error(`Archived ${file} \u2192 sessions/ (still resumable)`);
137
208
  archivedCount++;
138
209
  } catch (error) {
139
210
  try {
140
- copyFileSync(sourcePath, destPath);
211
+ copyFileSync2(sourcePath, destPath);
141
212
  if (!silent) console.error(`Copied ${file} \u2192 sessions/ (hardlink unavailable)`);
142
213
  archivedCount++;
143
214
  } catch {
@@ -149,26 +220,26 @@ function archiveSessionFilesToSessionsDir(projectDir, excludeFile, silent = fals
149
220
  }
150
221
  function findTodoPath(cwd) {
151
222
  const localPaths = [
152
- join2(cwd, "TODO.md"),
153
- join2(cwd, "notes", "TODO.md"),
154
- join2(cwd, "Notes", "TODO.md"),
155
- join2(cwd, ".claude", "TODO.md")
223
+ join3(cwd, "TODO.md"),
224
+ join3(cwd, "notes", "TODO.md"),
225
+ join3(cwd, "Notes", "TODO.md"),
226
+ join3(cwd, ".claude", "TODO.md")
156
227
  ];
157
228
  for (const path of localPaths) {
158
- if (existsSync2(path)) return path;
229
+ if (existsSync3(path)) return path;
159
230
  }
160
- return join2(getNotesDir(cwd), "TODO.md");
231
+ return join3(getNotesDir(cwd), "TODO.md");
161
232
  }
162
233
 
163
234
  // src/hooks/ts/lib/project-utils/notify.ts
164
- import { existsSync as existsSync3, readFileSync as readFileSync2 } from "fs";
165
- import { join as join3 } from "path";
166
- import { homedir as homedir2 } from "os";
235
+ import { existsSync as existsSync4, readFileSync as readFileSync3 } from "fs";
236
+ import { join as join4 } from "path";
237
+ import { homedir as homedir3 } from "os";
167
238
  function isWhatsAppEnabled() {
168
239
  try {
169
- const settingsPath = join3(homedir2(), ".claude", "settings.json");
170
- if (!existsSync3(settingsPath)) return false;
171
- const settings = JSON.parse(readFileSync2(settingsPath, "utf-8"));
240
+ const settingsPath = join4(homedir3(), ".claude", "settings.json");
241
+ if (!existsSync4(settingsPath)) return false;
242
+ const settings = JSON.parse(readFileSync3(settingsPath, "utf-8"));
172
243
  const enabled = settings.enabledMcpjsonServers || [];
173
244
  return enabled.includes("aibroker") || enabled.includes("whazaa") || enabled.includes("telex");
174
245
  } catch {
@@ -213,40 +284,40 @@ async function sendNtfyNotification(message, retries = 2) {
213
284
  }
214
285
 
215
286
  // src/hooks/ts/lib/project-utils/session-notes.ts
216
- import { existsSync as existsSync4, mkdirSync as mkdirSync2, readdirSync as readdirSync2, readFileSync as readFileSync3, writeFileSync, renameSync } from "fs";
217
- import { join as join4, basename as basename2 } from "path";
287
+ import { existsSync as existsSync5, mkdirSync as mkdirSync3, readdirSync as readdirSync3, readFileSync as readFileSync4, writeFileSync, renameSync as renameSync2 } from "fs";
288
+ import { join as join5, basename as basename2 } from "path";
218
289
  function getCurrentNotePath(notesDir) {
219
- if (!existsSync4(notesDir)) return null;
290
+ if (!existsSync5(notesDir)) return null;
220
291
  const findLatestIn = (dir) => {
221
- if (!existsSync4(dir)) return null;
222
- const files = readdirSync2(dir).filter((f) => f.match(/^\d{3,4}[\s_-].*\.md$/)).sort((a, b) => {
292
+ if (!existsSync5(dir)) return null;
293
+ const files = readdirSync3(dir).filter((f) => f.match(/^\d{3,4}[\s_-].*\.md$/)).sort((a, b) => {
223
294
  const numA = parseInt(a.match(/^(\d+)/)?.[1] || "0", 10);
224
295
  const numB = parseInt(b.match(/^(\d+)/)?.[1] || "0", 10);
225
296
  return numA - numB;
226
297
  });
227
298
  if (files.length === 0) return null;
228
- return join4(dir, files[files.length - 1]);
299
+ return join5(dir, files[files.length - 1]);
229
300
  };
230
301
  const now = /* @__PURE__ */ new Date();
231
302
  const year = String(now.getFullYear());
232
303
  const month = String(now.getMonth() + 1).padStart(2, "0");
233
- const currentMonthDir = join4(notesDir, year, month);
304
+ const currentMonthDir = join5(notesDir, year, month);
234
305
  const found = findLatestIn(currentMonthDir);
235
306
  if (found) return found;
236
307
  const prevDate = new Date(now.getFullYear(), now.getMonth() - 1, 1);
237
308
  const prevYear = String(prevDate.getFullYear());
238
309
  const prevMonth = String(prevDate.getMonth() + 1).padStart(2, "0");
239
- const prevMonthDir = join4(notesDir, prevYear, prevMonth);
310
+ const prevMonthDir = join5(notesDir, prevYear, prevMonth);
240
311
  const prevFound = findLatestIn(prevMonthDir);
241
312
  if (prevFound) return prevFound;
242
313
  return findLatestIn(notesDir);
243
314
  }
244
315
  function addWorkToSessionNote(notePath, workItems, sectionTitle) {
245
- if (!existsSync4(notePath)) {
316
+ if (!existsSync5(notePath)) {
246
317
  console.error(`Note file not found: ${notePath}`);
247
318
  return;
248
319
  }
249
- let content = readFileSync3(notePath, "utf-8");
320
+ let content = readFileSync4(notePath, "utf-8");
250
321
  let workText = "";
251
322
  if (sectionTitle) workText += `
252
323
  ### ${sectionTitle}
@@ -335,8 +406,8 @@ function extractMeaningfulName(noteContent, summary) {
335
406
  return "";
336
407
  }
337
408
  function renameSessionNote(notePath, meaningfulName) {
338
- if (!meaningfulName || !existsSync4(notePath)) return notePath;
339
- const dir = join4(notePath, "..");
409
+ if (!meaningfulName || !existsSync5(notePath)) return notePath;
410
+ const dir = join5(notePath, "..");
340
411
  const oldFilename = basename2(notePath);
341
412
  const correctMatch = oldFilename.match(/^(\d{3,4}) - (\d{4}-\d{2}-\d{2}) - .*\.md$/);
342
413
  const legacyMatch = oldFilename.match(/^(\d{3,4})_(\d{4}-\d{2}-\d{2})_.*\.md$/);
@@ -346,10 +417,10 @@ function renameSessionNote(notePath, meaningfulName) {
346
417
  const titleCaseName = meaningfulName.split(/[\s_-]+/).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ").trim();
347
418
  const paddedNumber = noteNumber.padStart(4, "0");
348
419
  const newFilename = `${paddedNumber} - ${date} - ${titleCaseName}.md`;
349
- const newPath = join4(dir, newFilename);
420
+ const newPath = join5(dir, newFilename);
350
421
  if (newFilename === oldFilename) return notePath;
351
422
  try {
352
- renameSync(notePath, newPath);
423
+ renameSync2(notePath, newPath);
353
424
  console.error(`Renamed note: ${oldFilename} \u2192 ${newFilename}`);
354
425
  return newPath;
355
426
  } catch (error) {
@@ -358,11 +429,11 @@ function renameSessionNote(notePath, meaningfulName) {
358
429
  }
359
430
  }
360
431
  function finalizeSessionNote(notePath, summary) {
361
- if (!existsSync4(notePath)) {
432
+ if (!existsSync5(notePath)) {
362
433
  console.error(`Note file not found: ${notePath}`);
363
434
  return notePath;
364
435
  }
365
- let content = readFileSync3(notePath, "utf-8");
436
+ let content = readFileSync4(notePath, "utf-8");
366
437
  if (content.includes("**Status:** Completed")) {
367
438
  console.error(`Note already finalized: ${basename2(notePath)}`);
368
439
  return notePath;
@@ -398,20 +469,20 @@ ${summary || "Session completed."}`
398
469
  }
399
470
 
400
471
  // src/hooks/ts/lib/project-utils/todo.ts
401
- import { existsSync as existsSync6, mkdirSync as mkdirSync4, readFileSync as readFileSync5, writeFileSync as writeFileSync3 } from "fs";
402
- import { join as join6, basename as basename3 } from "path";
472
+ import { existsSync as existsSync7, mkdirSync as mkdirSync5, readFileSync as readFileSync6, writeFileSync as writeFileSync3 } from "fs";
473
+ import { join as join7, basename as basename3 } from "path";
403
474
 
404
475
  // src/session/checkpoint-block.ts
405
476
  import {
406
- existsSync as existsSync5,
407
- readFileSync as readFileSync4,
477
+ existsSync as existsSync6,
478
+ readFileSync as readFileSync5,
408
479
  writeFileSync as writeFileSync2,
409
- readdirSync as readdirSync3,
410
- renameSync as renameSync2,
411
- mkdirSync as mkdirSync3,
480
+ readdirSync as readdirSync4,
481
+ renameSync as renameSync3,
482
+ mkdirSync as mkdirSync4,
412
483
  realpathSync
413
484
  } from "node:fs";
414
- import { join as join5 } from "node:path";
485
+ import { join as join6 } from "node:path";
415
486
  var TODO_LOCATIONS = [
416
487
  "Notes/TODO.md",
417
488
  ".claude/Notes/TODO.md",
@@ -427,10 +498,10 @@ var ARCHIVE_LIMIT = 5;
427
498
  var CONTINUE_HEADING = "## Continue";
428
499
  function findProjectTodo(rootPath) {
429
500
  for (const rel of TODO_LOCATIONS) {
430
- const full = join5(rootPath, rel);
431
- if (existsSync5(full)) {
501
+ const full = join6(rootPath, rel);
502
+ if (existsSync6(full)) {
432
503
  try {
433
- return { path: full, content: readFileSync4(full, "utf8") };
504
+ return { path: full, content: readFileSync5(full, "utf8") };
434
505
  } catch {
435
506
  }
436
507
  }
@@ -440,15 +511,15 @@ function findProjectTodo(rootPath) {
440
511
  function resolveTodoTarget(rootPath, opts = {}) {
441
512
  const found = findProjectTodo(rootPath);
442
513
  if (found) return found;
443
- const notesDir = join5(rootPath, "Notes");
514
+ const notesDir = join6(rootPath, "Notes");
444
515
  if (opts.create !== false) {
445
516
  try {
446
- if (!existsSync5(notesDir)) mkdirSync3(notesDir, { recursive: true });
517
+ if (!existsSync6(notesDir)) mkdirSync4(notesDir, { recursive: true });
447
518
  } catch {
448
519
  return null;
449
520
  }
450
521
  }
451
- return { path: join5(notesDir, "TODO.md"), content: "" };
522
+ return { path: join6(notesDir, "TODO.md"), content: "" };
452
523
  }
453
524
  function parseMarker(line) {
454
525
  const trimmed = line.trim();
@@ -737,10 +808,10 @@ function applyContinue(opts) {
737
808
  const tmpPath = `${target.path}.continue.tmp`;
738
809
  try {
739
810
  writeFileSync2(tmpPath, newContent, "utf8");
740
- renameSync2(tmpPath, target.path);
811
+ renameSync3(tmpPath, target.path);
741
812
  } catch (err) {
742
813
  try {
743
- if (existsSync5(tmpPath)) renameSync2(tmpPath, `${tmpPath}.dead`);
814
+ if (existsSync6(tmpPath)) renameSync3(tmpPath, `${tmpPath}.dead`);
744
815
  } catch {
745
816
  }
746
817
  return {
@@ -756,9 +827,9 @@ function applyContinue(opts) {
756
827
  // src/hooks/ts/lib/project-utils/todo.ts
757
828
  function ensureTodoMd(cwd) {
758
829
  const todoPath = findTodoPath(cwd);
759
- if (!existsSync6(todoPath)) {
760
- const parentDir = join6(todoPath, "..");
761
- if (!existsSync6(parentDir)) mkdirSync4(parentDir, { recursive: true });
830
+ if (!existsSync7(todoPath)) {
831
+ const parentDir = join7(todoPath, "..");
832
+ if (!existsSync7(parentDir)) mkdirSync5(parentDir, { recursive: true });
762
833
  const content = `# TODO
763
834
 
764
835
  ## Current Session
@@ -813,7 +884,7 @@ function updateTodoContinue(cwd, noteFilename, state, tokenDisplay, sessionId) {
813
884
  try {
814
885
  const todoPath = result.path;
815
886
  const now = (/* @__PURE__ */ new Date()).toISOString();
816
- let content = readFileSync5(todoPath, "utf-8");
887
+ let content = readFileSync6(todoPath, "utf-8");
817
888
  content = content.replace(/(\n---\s*)*(\n\*Last updated:.*\*\s*)+$/g, "");
818
889
  content = content.trimEnd() + `
819
890
 
@@ -829,6 +900,17 @@ function updateTodoContinue(cwd, noteFilename, state, tokenDisplay, sessionId) {
829
900
  );
830
901
  }
831
902
 
903
+ // src/config/pai-files.ts
904
+ import { homedir as homedir4 } from "node:os";
905
+ import { join as join8 } from "node:path";
906
+ function oldSessionStateDir() {
907
+ return join8(homedir4(), ".config", "pai", "session-state");
908
+ }
909
+ function sessionStateDir() {
910
+ return resolvePaiFile(paiHomePath("session-state"), [oldSessionStateDir()], "pai config migrate");
911
+ }
912
+ var SESSION_STOP_LOCK_ABANDONED_AFTER_MS = 60 * 60 * 1e3;
913
+
832
914
  // src/hooks/ts/stop/stop-hook.ts
833
915
  var DAEMON_SOCKET = process.env.PAI_SOCKET ?? "/tmp/pai.sock";
834
916
  var DAEMON_TIMEOUT_MS = 800;
@@ -840,17 +922,11 @@ var AUTO_SAVE_INTERVAL = (() => {
840
922
  }
841
923
  return 15;
842
924
  })();
843
- var SESSION_STATE_DIR = join7(
844
- process.env.HOME ?? "/tmp",
845
- ".config",
846
- "pai",
847
- "session-state"
848
- );
849
925
  function readSessionState(sessionId) {
850
926
  try {
851
- const stateFile = join7(SESSION_STATE_DIR, `${sessionId}.json`);
852
- if (!existsSync7(stateFile)) return { humanMessageCount: 0 };
853
- const raw = readFileSync6(stateFile, "utf-8");
927
+ const stateFile = join9(sessionStateDir(), `${sessionId}.json`);
928
+ if (!existsSync8(stateFile)) return { humanMessageCount: 0 };
929
+ const raw = readFileSync7(stateFile, "utf-8");
854
930
  const parsed = JSON.parse(raw);
855
931
  return {
856
932
  humanMessageCount: typeof parsed.humanMessageCount === "number" ? parsed.humanMessageCount : 0
@@ -861,8 +937,9 @@ function readSessionState(sessionId) {
861
937
  }
862
938
  function writeSessionState(sessionId, state) {
863
939
  try {
864
- mkdirSync5(SESSION_STATE_DIR, { recursive: true });
865
- const stateFile = join7(SESSION_STATE_DIR, `${sessionId}.json`);
940
+ const dir = paiHomePath("session-state");
941
+ mkdirSync6(dir, { recursive: true });
942
+ const stateFile = join9(dir, `${sessionId}.json`);
866
943
  writeFileSync4(stateFile, JSON.stringify(state, null, 2), "utf-8");
867
944
  } catch (e) {
868
945
  console.error(`STOP-HOOK: Could not write session state: ${e}`);
@@ -870,8 +947,8 @@ function writeSessionState(sessionId, state) {
870
947
  }
871
948
  function deleteSessionState(sessionId) {
872
949
  try {
873
- const stateFile = join7(SESSION_STATE_DIR, `${sessionId}.json`);
874
- if (existsSync7(stateFile)) {
950
+ const stateFile = join9(sessionStateDir(), `${sessionId}.json`);
951
+ if (existsSync8(stateFile)) {
875
952
  unlinkSync(stateFile);
876
953
  }
877
954
  } catch {
@@ -1333,7 +1410,7 @@ async function executeDirectly(lines, transcriptPath, cwd, message, lastUserQuer
1333
1410
  console.error(`Could not finalize session note: ${noteError}`);
1334
1411
  }
1335
1412
  try {
1336
- const transcriptDir = dirname(transcriptPath);
1413
+ const transcriptDir = dirname2(transcriptPath);
1337
1414
  const archivedCount = archiveSessionFilesToSessionsDir(transcriptDir);
1338
1415
  if (archivedCount > 0) {
1339
1416
  console.error(`Archived ${archivedCount} session file(s) to sessions/`);
@@ -1392,7 +1469,7 @@ STOP-HOOK TRIGGERED AT ${timestamp}`);
1392
1469
  }
1393
1470
  let transcript;
1394
1471
  try {
1395
- transcript = readFileSync6(transcriptPath, "utf-8");
1472
+ transcript = readFileSync7(transcriptPath, "utf-8");
1396
1473
  debug(`Transcript loaded: ${transcript.split("\n").length} lines`);
1397
1474
  } catch (e) {
1398
1475
  console.error(`Error reading transcript: ${e}`);