gsd-pi 2.64.0 → 2.65.0-dev.5c8557b

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 (363) hide show
  1. package/dist/headless.js +3 -1
  2. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +22 -7
  3. package/dist/resources/extensions/bg-shell/process-manager.js +6 -1
  4. package/dist/resources/extensions/gsd/auto-dashboard.js +5 -5
  5. package/dist/resources/extensions/gsd/auto-post-unit.js +98 -1
  6. package/dist/resources/extensions/gsd/auto-verification.js +138 -1
  7. package/dist/resources/extensions/gsd/auto.js +5 -0
  8. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +24 -13
  9. package/dist/resources/extensions/gsd/bootstrap/notify-interceptor.js +28 -0
  10. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +8 -0
  11. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +16 -0
  12. package/dist/resources/extensions/gsd/bootstrap/system-context.js +20 -0
  13. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  14. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  15. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +104 -0
  16. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  17. package/dist/resources/extensions/gsd/notification-overlay.js +256 -0
  18. package/dist/resources/extensions/gsd/notification-store.js +273 -0
  19. package/dist/resources/extensions/gsd/notification-widget.js +56 -0
  20. package/dist/resources/extensions/gsd/post-execution-checks.js +407 -0
  21. package/dist/resources/extensions/gsd/pre-execution-checks.js +464 -0
  22. package/dist/resources/extensions/gsd/preferences-types.js +4 -0
  23. package/dist/resources/extensions/gsd/preferences-validation.js +33 -0
  24. package/dist/resources/extensions/gsd/preferences.js +4 -0
  25. package/dist/resources/extensions/gsd/verification-evidence.js +18 -0
  26. package/dist/resources/extensions/gsd/workflow-logger.js +8 -0
  27. package/dist/web/standalone/.next/BUILD_ID +1 -1
  28. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -15
  29. package/dist/web/standalone/.next/build-manifest.json +3 -3
  30. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  31. package/dist/web/standalone/.next/required-server-files.json +4 -4
  32. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  33. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  34. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  36. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  44. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  46. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  47. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  48. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  50. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  60. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  72. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/notifications/route.js +3 -0
  92. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -0
  93. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -0
  94. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  103. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  109. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  123. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  125. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  127. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  129. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/index.html +1 -1
  139. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  140. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  142. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  144. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/page.js +2 -2
  146. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -15
  148. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  149. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  150. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  151. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/middleware.js +2 -2
  153. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  155. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  156. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  157. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  158. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-8805a20e15762c3c.js +1 -0
  159. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  160. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-8805a20e15762c3c.js +1 -0
  161. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-8805a20e15762c3c.js +1 -0
  162. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-8805a20e15762c3c.js +1 -0
  163. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-8805a20e15762c3c.js +1 -0
  164. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-8805a20e15762c3c.js +1 -0
  165. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-8805a20e15762c3c.js +1 -0
  166. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-8805a20e15762c3c.js +1 -0
  167. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-8805a20e15762c3c.js +1 -0
  168. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-8805a20e15762c3c.js +1 -0
  169. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-8805a20e15762c3c.js +1 -0
  170. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-8805a20e15762c3c.js +1 -0
  171. package/dist/web/standalone/.next/static/chunks/app/api/files/route-8805a20e15762c3c.js +1 -0
  172. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-8805a20e15762c3c.js +1 -0
  173. package/dist/web/standalone/.next/static/chunks/app/api/git/route-8805a20e15762c3c.js +1 -0
  174. package/dist/web/standalone/.next/static/chunks/app/api/history/route-8805a20e15762c3c.js +1 -0
  175. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-8805a20e15762c3c.js +1 -0
  176. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-8805a20e15762c3c.js +1 -0
  177. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-8805a20e15762c3c.js +1 -0
  178. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-8805a20e15762c3c.js +1 -0
  179. package/dist/web/standalone/.next/static/chunks/app/api/notifications/route-8805a20e15762c3c.js +1 -0
  180. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-8805a20e15762c3c.js +1 -0
  181. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-8805a20e15762c3c.js +1 -0
  182. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-8805a20e15762c3c.js +1 -0
  183. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-8805a20e15762c3c.js +1 -0
  184. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-8805a20e15762c3c.js +1 -0
  185. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-8805a20e15762c3c.js +1 -0
  186. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-8805a20e15762c3c.js +1 -0
  187. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-8805a20e15762c3c.js +1 -0
  188. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-8805a20e15762c3c.js +1 -0
  189. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-8805a20e15762c3c.js +1 -0
  190. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-8805a20e15762c3c.js +1 -0
  191. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-8805a20e15762c3c.js +1 -0
  192. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-8805a20e15762c3c.js +1 -0
  193. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-8805a20e15762c3c.js +1 -0
  194. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-8805a20e15762c3c.js +1 -0
  195. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-8805a20e15762c3c.js +1 -0
  196. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-8805a20e15762c3c.js +1 -0
  197. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-8805a20e15762c3c.js +1 -0
  198. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-8805a20e15762c3c.js +1 -0
  199. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-8805a20e15762c3c.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/app/api/update/route-8805a20e15762c3c.js +1 -0
  201. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-8805a20e15762c3c.js +1 -0
  202. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  203. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  204. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-8805a20e15762c3c.js +1 -0
  206. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-8805a20e15762c3c.js +1 -0
  207. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  208. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-8805a20e15762c3c.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-8805a20e15762c3c.js +1 -0
  210. package/dist/web/standalone/.next/static/qq3YfHPfyqvh3DIMVmsRH/_buildManifest.js +1 -0
  211. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  212. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  213. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  214. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  215. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  216. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  217. package/dist/web/standalone/server.js +1 -1
  218. package/package.json +1 -1
  219. package/packages/pi-agent-core/dist/agent-loop.js +26 -9
  220. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  221. package/packages/pi-agent-core/src/agent-loop.test.ts +100 -4
  222. package/packages/pi-agent-core/src/agent-loop.ts +43 -12
  223. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts +2 -0
  224. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +38 -0
  226. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -0
  227. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/agent-session.js +11 -0
  229. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts +2 -0
  231. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts.map +1 -0
  232. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +24 -0
  233. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -0
  234. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  235. package/packages/pi-coding-agent/dist/core/resource-loader.js +4 -1
  236. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  237. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
  238. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  239. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -0
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +6 -0
  242. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  243. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +36 -0
  244. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  245. package/packages/pi-coding-agent/package.json +1 -1
  246. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +64 -0
  247. package/packages/pi-coding-agent/src/core/agent-session.ts +10 -0
  248. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +42 -0
  249. package/packages/pi-coding-agent/src/core/resource-loader.ts +5 -1
  250. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +9 -0
  251. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +33 -0
  252. package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts +2 -0
  253. package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts.map +1 -0
  254. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +66 -0
  255. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -0
  256. package/packages/pi-tui/dist/components/loader.d.ts +4 -2
  257. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  258. package/packages/pi-tui/dist/components/loader.js +27 -9
  259. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  260. package/packages/pi-tui/dist/components/text.d.ts.map +1 -1
  261. package/packages/pi-tui/dist/components/text.js +2 -0
  262. package/packages/pi-tui/dist/components/text.js.map +1 -1
  263. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  264. package/packages/pi-tui/dist/overlay-layout.js +12 -1
  265. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  266. package/packages/pi-tui/dist/tui.d.ts +4 -0
  267. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  268. package/packages/pi-tui/dist/tui.js +35 -0
  269. package/packages/pi-tui/dist/tui.js.map +1 -1
  270. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +82 -0
  271. package/packages/pi-tui/src/components/loader.ts +27 -10
  272. package/packages/pi-tui/src/components/text.ts +1 -0
  273. package/packages/pi-tui/src/overlay-layout.ts +13 -1
  274. package/packages/pi-tui/src/tui.ts +34 -0
  275. package/pkg/package.json +1 -1
  276. package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +19 -7
  277. package/src/resources/extensions/bg-shell/process-manager.ts +8 -2
  278. package/src/resources/extensions/gsd/auto-dashboard.ts +5 -4
  279. package/src/resources/extensions/gsd/auto-post-unit.ts +122 -0
  280. package/src/resources/extensions/gsd/auto-verification.ts +190 -2
  281. package/src/resources/extensions/gsd/auto.ts +4 -0
  282. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +25 -13
  283. package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
  284. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +8 -0
  285. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +20 -0
  286. package/src/resources/extensions/gsd/bootstrap/system-context.ts +28 -0
  287. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  288. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  289. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +140 -0
  290. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  291. package/src/resources/extensions/gsd/notification-overlay.ts +295 -0
  292. package/src/resources/extensions/gsd/notification-store.ts +293 -0
  293. package/src/resources/extensions/gsd/notification-widget.ts +68 -0
  294. package/src/resources/extensions/gsd/post-execution-checks.ts +539 -0
  295. package/src/resources/extensions/gsd/pre-execution-checks.ts +573 -0
  296. package/src/resources/extensions/gsd/preferences-types.ts +28 -0
  297. package/src/resources/extensions/gsd/preferences-validation.ts +33 -0
  298. package/src/resources/extensions/gsd/preferences.ts +4 -0
  299. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +50 -0
  300. package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +36 -0
  301. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +76 -0
  302. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +526 -0
  303. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +73 -0
  304. package/src/resources/extensions/gsd/tests/notification-store.test.ts +282 -0
  305. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +312 -0
  306. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +813 -0
  307. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +999 -0
  308. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +266 -0
  309. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +457 -0
  310. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +163 -0
  311. package/src/resources/extensions/gsd/verification-evidence.ts +68 -0
  312. package/src/resources/extensions/gsd/workflow-logger.ts +13 -0
  313. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
  314. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
  315. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
  316. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  317. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  318. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
  319. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
  320. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
  321. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
  322. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
  323. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
  324. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
  325. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
  326. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
  327. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
  328. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
  329. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
  330. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
  331. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
  332. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
  333. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
  334. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
  335. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
  336. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
  337. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
  338. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
  339. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
  340. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
  341. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
  342. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
  343. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
  344. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
  345. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
  346. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
  347. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
  348. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  349. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
  350. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  351. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
  352. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
  353. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
  354. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
  355. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  356. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  357. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
  358. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
  359. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  360. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
  361. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
  362. package/dist/web/standalone/.next/static/eebXKteM9EaWyseHKTjqp/_buildManifest.js +0 -1
  363. /package/dist/web/standalone/.next/static/{eebXKteM9EaWyseHKTjqp → qq3YfHPfyqvh3DIMVmsRH}/_ssgManifest.js +0 -0
@@ -0,0 +1,539 @@
1
+ /**
2
+ * Post-Execution Checks — Validate task output after execution completes.
3
+ *
4
+ * Runs these checks against a completed task's output:
5
+ * 1. Import resolution — verify relative imports in key_files resolve to existing files
6
+ * 2. Cross-task signatures — detect hallucination cascades (function exists in task output
7
+ * but doesn't match prior tasks' actual code)
8
+ * 3. Pattern consistency — warn on async style drift, naming convention inconsistencies
9
+ *
10
+ * Design principles:
11
+ * - Pure functions taking (taskRow, priorTasks, basePath) for testability
12
+ * - Import checks are blocking failures; pattern checks are warnings
13
+ * - No AST parsers — uses regex heuristics
14
+ */
15
+
16
+ import { existsSync, readFileSync } from "node:fs";
17
+ import { resolve, dirname, join, extname } from "node:path";
18
+ import type { TaskRow } from "./gsd-db.ts";
19
+
20
+ // ─── Result Types ────────────────────────────────────────────────────────────
21
+
22
+ export interface PostExecutionCheckJSON {
23
+ /** Check category: import, signature, pattern */
24
+ category: "import" | "signature" | "pattern";
25
+ /** What was checked (e.g., file path, function name) */
26
+ target: string;
27
+ /** Whether the check passed */
28
+ passed: boolean;
29
+ /** Human-readable message explaining the result */
30
+ message: string;
31
+ /** Whether this failure should block completion (only meaningful when passed=false) */
32
+ blocking?: boolean;
33
+ }
34
+
35
+ export interface PostExecutionResult {
36
+ /** Overall result: pass if no blocking failures, warn if non-blocking issues, fail if blocking issues */
37
+ status: "pass" | "warn" | "fail";
38
+ /** All check results */
39
+ checks: PostExecutionCheckJSON[];
40
+ /** Total duration in milliseconds */
41
+ durationMs: number;
42
+ }
43
+
44
+ // ─── Import Resolution Check ─────────────────────────────────────────────────
45
+
46
+ /**
47
+ * Extract relative import paths from TypeScript/JavaScript source code.
48
+ * Returns array of { importPath, lineNum } for relative imports.
49
+ */
50
+ export function extractRelativeImports(
51
+ source: string
52
+ ): Array<{ importPath: string; lineNum: number }> {
53
+ const imports: Array<{ importPath: string; lineNum: number }> = [];
54
+ const lines = source.split("\n");
55
+
56
+ // Match:
57
+ // import ... from './path'
58
+ // import ... from "../path"
59
+ // import './path'
60
+ // require('./path')
61
+ // require("../path")
62
+ const importPattern = /(?:import\s+(?:.*?\s+from\s+)?|require\s*\(\s*)(['"])(\.\.?\/[^'"]+)\1/g;
63
+
64
+ // Track if we're inside a block comment
65
+ let inBlockComment = false;
66
+
67
+ for (let i = 0; i < lines.length; i++) {
68
+ const line = lines[i];
69
+
70
+ // Handle block comment boundaries
71
+ if (inBlockComment) {
72
+ if (line.includes("*/")) {
73
+ inBlockComment = false;
74
+ }
75
+ continue;
76
+ }
77
+
78
+ // Check for block comment start (that doesn't end on same line)
79
+ const blockStart = line.indexOf("/*");
80
+ const blockEnd = line.indexOf("*/");
81
+ if (blockStart !== -1 && (blockEnd === -1 || blockEnd < blockStart)) {
82
+ inBlockComment = true;
83
+ continue;
84
+ }
85
+
86
+ // Skip single-line comments (// at start or after whitespace)
87
+ const trimmed = line.trimStart();
88
+ if (trimmed.startsWith("//")) {
89
+ continue;
90
+ }
91
+
92
+ // Skip JSDoc-style lines (e.g., " * import ...")
93
+ if (trimmed.startsWith("*")) {
94
+ continue;
95
+ }
96
+
97
+ let match: RegExpExecArray | null;
98
+
99
+ // Reset lastIndex for each line
100
+ importPattern.lastIndex = 0;
101
+
102
+ while ((match = importPattern.exec(line)) !== null) {
103
+ // Check if this match is after a // comment marker on the same line
104
+ const beforeMatch = line.substring(0, match.index);
105
+ if (beforeMatch.includes("//")) {
106
+ continue;
107
+ }
108
+
109
+ imports.push({
110
+ importPath: match[2],
111
+ lineNum: i + 1,
112
+ });
113
+ }
114
+ }
115
+
116
+ return imports;
117
+ }
118
+
119
+ /**
120
+ * Check if a relative import resolves to an existing file.
121
+ * Handles .ts, .tsx, .js, .jsx extensions and index files.
122
+ * Also handles TypeScript ESM convention where imports use .js but resolve to .ts.
123
+ */
124
+ export function resolveImportPath(
125
+ importPath: string,
126
+ sourceFile: string,
127
+ basePath: string
128
+ ): { exists: boolean; resolvedPath: string | null } {
129
+ const sourceDir = dirname(resolve(basePath, sourceFile));
130
+ const extensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
131
+
132
+ // Handle TypeScript ESM convention: .js imports resolve to .ts files
133
+ // e.g., import './types.js' -> ./types.ts
134
+ let normalizedPath = importPath;
135
+ if (importPath.endsWith(".js")) {
136
+ normalizedPath = importPath.slice(0, -3);
137
+ } else if (importPath.endsWith(".jsx")) {
138
+ normalizedPath = importPath.slice(0, -4);
139
+ } else if (importPath.endsWith(".mjs")) {
140
+ normalizedPath = importPath.slice(0, -4);
141
+ } else if (importPath.endsWith(".cjs")) {
142
+ normalizedPath = importPath.slice(0, -4);
143
+ }
144
+
145
+ // Try the normalized path with common extensions first
146
+ for (const ext of extensions) {
147
+ const fullPath = resolve(sourceDir, normalizedPath + ext);
148
+ if (existsSync(fullPath)) {
149
+ return { exists: true, resolvedPath: fullPath };
150
+ }
151
+ }
152
+
153
+ // Try as a directory with index file
154
+ for (const ext of extensions) {
155
+ const indexPath = resolve(sourceDir, normalizedPath, `index${ext}`);
156
+ if (existsSync(indexPath)) {
157
+ return { exists: true, resolvedPath: indexPath };
158
+ }
159
+ }
160
+
161
+ // Check if path already has extension (for .json, etc.)
162
+ const hasExt = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".json"].some(
163
+ (ext) => importPath.endsWith(ext)
164
+ );
165
+ if (hasExt) {
166
+ const fullPath = resolve(sourceDir, importPath);
167
+ if (existsSync(fullPath)) {
168
+ return { exists: true, resolvedPath: fullPath };
169
+ }
170
+ }
171
+
172
+ return { exists: false, resolvedPath: null };
173
+ }
174
+
175
+ /**
176
+ * Check that all relative imports in the task's key_files resolve to existing files.
177
+ * Reads modified files from task.key_files, extracts import statements via regex,
178
+ * verifies relative imports resolve to existing files.
179
+ */
180
+ export function checkImportResolution(
181
+ taskRow: TaskRow,
182
+ _priorTasks: TaskRow[],
183
+ basePath: string
184
+ ): PostExecutionCheckJSON[] {
185
+ const results: PostExecutionCheckJSON[] = [];
186
+
187
+ // Get files from key_files
188
+ const filesToCheck = taskRow.key_files.filter((f) => {
189
+ const ext = extname(f);
190
+ return [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"].includes(ext);
191
+ });
192
+
193
+ for (const file of filesToCheck) {
194
+ const absolutePath = resolve(basePath, file);
195
+
196
+ // Skip if file doesn't exist (might have been deleted or renamed)
197
+ if (!existsSync(absolutePath)) {
198
+ continue;
199
+ }
200
+
201
+ let source: string;
202
+ try {
203
+ source = readFileSync(absolutePath, "utf-8");
204
+ } catch {
205
+ continue;
206
+ }
207
+
208
+ const imports = extractRelativeImports(source);
209
+
210
+ for (const { importPath, lineNum } of imports) {
211
+ const resolution = resolveImportPath(importPath, file, basePath);
212
+
213
+ if (!resolution.exists) {
214
+ results.push({
215
+ category: "import",
216
+ target: `${file}:${lineNum}`,
217
+ passed: false,
218
+ message: `Import '${importPath}' in ${file}:${lineNum} does not resolve to an existing file`,
219
+ blocking: true,
220
+ });
221
+ }
222
+ }
223
+ }
224
+
225
+ return results;
226
+ }
227
+
228
+ // ─── Cross-Task Signature Check ──────────────────────────────────────────────
229
+
230
+ interface FunctionSignature {
231
+ name: string;
232
+ params: string;
233
+ returnType: string;
234
+ file: string;
235
+ lineNum: number;
236
+ }
237
+
238
+ /**
239
+ * Extract function signatures from TypeScript/JavaScript source code.
240
+ */
241
+ function extractFunctionSignatures(
242
+ source: string,
243
+ fileName: string
244
+ ): FunctionSignature[] {
245
+ const signatures: FunctionSignature[] = [];
246
+ const lines = source.split("\n");
247
+
248
+ // Match function declarations and exports
249
+ // Patterns:
250
+ // function name(params): ReturnType
251
+ // export function name(params): ReturnType
252
+ // export async function name(params): Promise<ReturnType>
253
+ // const name = (params): ReturnType =>
254
+ // export const name = (params): ReturnType =>
255
+ const funcPattern =
256
+ /(?:export\s+)?(?:async\s+)?(?:function\s+|const\s+)(\w+)(?:\s*=\s*)?\s*\(([^)]*)\)(?:\s*:\s*([^{=>\n]+))?/g;
257
+
258
+ for (let i = 0; i < lines.length; i++) {
259
+ const line = lines[i];
260
+ funcPattern.lastIndex = 0;
261
+
262
+ let match: RegExpExecArray | null;
263
+ while ((match = funcPattern.exec(line)) !== null) {
264
+ const [, name, params, returnType] = match;
265
+ signatures.push({
266
+ name,
267
+ params: normalizeParams(params),
268
+ returnType: normalizeType(returnType || "void"),
269
+ file: fileName,
270
+ lineNum: i + 1,
271
+ });
272
+ }
273
+ }
274
+
275
+ return signatures;
276
+ }
277
+
278
+ /**
279
+ * Normalize parameter list for comparison.
280
+ */
281
+ function normalizeParams(params: string): string {
282
+ return params
283
+ .replace(/\/\*[\s\S]*?\*\//g, "") // Remove block comments
284
+ .replace(/\/\/[^\n]*/g, "") // Remove line comments
285
+ .replace(/\s*=\s*[^,)]+/g, "") // Remove default values
286
+ .replace(/\s+/g, " ") // Normalize whitespace
287
+ .trim();
288
+ }
289
+
290
+ /**
291
+ * Normalize type for comparison.
292
+ */
293
+ function normalizeType(type: string): string {
294
+ return type.replace(/\s+/g, " ").trim();
295
+ }
296
+
297
+ /**
298
+ * Compare function signatures in current task's output against prior tasks' key_files
299
+ * to catch hallucination cascades — when a task references functions that don't exist
300
+ * or have different signatures than what was actually created.
301
+ */
302
+ export function checkCrossTaskSignatures(
303
+ taskRow: TaskRow,
304
+ priorTasks: TaskRow[],
305
+ basePath: string
306
+ ): PostExecutionCheckJSON[] {
307
+ const results: PostExecutionCheckJSON[] = [];
308
+
309
+ // Build map of functions from prior tasks' key_files
310
+ const priorSignatures = new Map<string, FunctionSignature[]>();
311
+
312
+ for (const task of priorTasks) {
313
+ for (const file of task.key_files) {
314
+ const ext = extname(file);
315
+ if (![".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"].includes(ext)) continue;
316
+
317
+ const absolutePath = resolve(basePath, file);
318
+ if (!existsSync(absolutePath)) continue;
319
+
320
+ try {
321
+ const source = readFileSync(absolutePath, "utf-8");
322
+ const sigs = extractFunctionSignatures(source, file);
323
+ for (const sig of sigs) {
324
+ const existing = priorSignatures.get(sig.name) || [];
325
+ existing.push(sig);
326
+ priorSignatures.set(sig.name, existing);
327
+ }
328
+ } catch {
329
+ // Skip unreadable files
330
+ }
331
+ }
332
+ }
333
+
334
+ // Extract function calls/references from current task's key_files
335
+ // and check they match prior definitions
336
+ for (const file of taskRow.key_files) {
337
+ const ext = extname(file);
338
+ if (![".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"].includes(ext)) continue;
339
+
340
+ const absolutePath = resolve(basePath, file);
341
+ if (!existsSync(absolutePath)) continue;
342
+
343
+ try {
344
+ const source = readFileSync(absolutePath, "utf-8");
345
+ const currentSigs = extractFunctionSignatures(source, file);
346
+
347
+ // Check each function in current task against prior definitions
348
+ for (const currentSig of currentSigs) {
349
+ const priorDefs = priorSignatures.get(currentSig.name);
350
+
351
+ // If this function was defined in a prior task, check for signature drift
352
+ if (priorDefs && priorDefs.length > 0) {
353
+ const priorDef = priorDefs[0]; // Use first definition
354
+
355
+ // Check parameter mismatch
356
+ if (currentSig.params !== priorDef.params) {
357
+ results.push({
358
+ category: "signature",
359
+ target: currentSig.name,
360
+ passed: false,
361
+ message: `Function '${currentSig.name}' in ${file}:${currentSig.lineNum} has parameters '${currentSig.params}' but prior definition in ${priorDef.file}:${priorDef.lineNum} has '${priorDef.params}'`,
362
+ blocking: false, // Warn only — may be intentional override
363
+ });
364
+ }
365
+
366
+ // Check return type mismatch
367
+ if (currentSig.returnType !== priorDef.returnType) {
368
+ results.push({
369
+ category: "signature",
370
+ target: currentSig.name,
371
+ passed: false,
372
+ message: `Function '${currentSig.name}' in ${file}:${currentSig.lineNum} returns '${currentSig.returnType}' but prior definition in ${priorDef.file}:${priorDef.lineNum} returns '${priorDef.returnType}'`,
373
+ blocking: false, // Warn only — may be intentional override
374
+ });
375
+ }
376
+ }
377
+ }
378
+ } catch {
379
+ // Skip unreadable files
380
+ }
381
+ }
382
+
383
+ return results;
384
+ }
385
+
386
+ // ─── Pattern Consistency Check ───────────────────────────────────────────────
387
+
388
+ /**
389
+ * Detect async style drift (mixing async/await with .then()) and
390
+ * naming convention inconsistencies within a task's key_files.
391
+ * Warn only — these are style issues, not correctness issues.
392
+ */
393
+ export function checkPatternConsistency(
394
+ taskRow: TaskRow,
395
+ _priorTasks: TaskRow[],
396
+ basePath: string
397
+ ): PostExecutionCheckJSON[] {
398
+ const results: PostExecutionCheckJSON[] = [];
399
+
400
+ for (const file of taskRow.key_files) {
401
+ const ext = extname(file);
402
+ if (![".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"].includes(ext)) continue;
403
+
404
+ const absolutePath = resolve(basePath, file);
405
+ if (!existsSync(absolutePath)) continue;
406
+
407
+ try {
408
+ const source = readFileSync(absolutePath, "utf-8");
409
+
410
+ // Check for async style drift
411
+ const asyncStyleResult = checkAsyncStyleDrift(source, file);
412
+ if (asyncStyleResult) {
413
+ results.push(asyncStyleResult);
414
+ }
415
+
416
+ // Check for naming convention inconsistencies
417
+ const namingResults = checkNamingConsistency(source, file);
418
+ results.push(...namingResults);
419
+ } catch {
420
+ // Skip unreadable files
421
+ }
422
+ }
423
+
424
+ return results;
425
+ }
426
+
427
+ /**
428
+ * Detect async style drift within a single file.
429
+ * Returns a warning if both async/await AND .then() promise chaining are used.
430
+ */
431
+ function checkAsyncStyleDrift(
432
+ source: string,
433
+ fileName: string
434
+ ): PostExecutionCheckJSON | null {
435
+ // Check for async/await usage
436
+ const hasAsyncAwait = /\basync\b[\s\S]*?\bawait\b/.test(source);
437
+
438
+ // Check for .then() promise chaining (excluding comments)
439
+ // Filter out common false positives like Array.prototype.then doesn't exist
440
+ const hasThenChaining = /\.\s*then\s*\(/.test(source);
441
+
442
+ // If both patterns are present, flag as style drift
443
+ if (hasAsyncAwait && hasThenChaining) {
444
+ return {
445
+ category: "pattern",
446
+ target: fileName,
447
+ passed: true, // Warning only
448
+ message: `File ${fileName} mixes async/await with .then() promise chaining — consider using consistent async style`,
449
+ blocking: false,
450
+ };
451
+ }
452
+
453
+ return null;
454
+ }
455
+
456
+ /**
457
+ * Check for naming convention inconsistencies within a file.
458
+ * Detects mixing of camelCase and snake_case for similar identifier types.
459
+ */
460
+ function checkNamingConsistency(
461
+ source: string,
462
+ fileName: string
463
+ ): PostExecutionCheckJSON[] {
464
+ const results: PostExecutionCheckJSON[] = [];
465
+
466
+ // Extract function names
467
+ const functionNames: string[] = [];
468
+ const funcPattern = /(?:function\s+|const\s+|let\s+|var\s+)(\w+)(?:\s*=\s*(?:async\s*)?\(|\s*\()/g;
469
+ let match: RegExpExecArray | null;
470
+
471
+ while ((match = funcPattern.exec(source)) !== null) {
472
+ functionNames.push(match[1]);
473
+ }
474
+
475
+ // Check for mixed naming conventions in functions
476
+ const camelCaseFuncs = functionNames.filter((n) => /^[a-z][a-zA-Z0-9]*$/.test(n) && /[A-Z]/.test(n));
477
+ const snakeCaseFuncs = functionNames.filter((n) => /^[a-z][a-z0-9]*(_[a-z0-9]+)+$/.test(n));
478
+
479
+ if (camelCaseFuncs.length > 0 && snakeCaseFuncs.length > 0) {
480
+ results.push({
481
+ category: "pattern",
482
+ target: fileName,
483
+ passed: true, // Warning only
484
+ message: `File ${fileName} mixes camelCase (${camelCaseFuncs.slice(0, 2).join(", ")}) and snake_case (${snakeCaseFuncs.slice(0, 2).join(", ")}) function names`,
485
+ blocking: false,
486
+ });
487
+ }
488
+
489
+ return results;
490
+ }
491
+
492
+ // ─── Main Entry Point ────────────────────────────────────────────────────────
493
+
494
+ /**
495
+ * Run all post-execution checks against a completed task.
496
+ *
497
+ * @param taskRow - The completed task row
498
+ * @param priorTasks - Array of TaskRow from prior completed tasks in the slice
499
+ * @param basePath - Base path for resolving file references
500
+ * @returns PostExecutionResult with status, checks, and duration
501
+ */
502
+ export function runPostExecutionChecks(
503
+ taskRow: TaskRow,
504
+ priorTasks: TaskRow[],
505
+ basePath: string
506
+ ): PostExecutionResult {
507
+ const startTime = Date.now();
508
+ const allChecks: PostExecutionCheckJSON[] = [];
509
+
510
+ // Run all checks
511
+ const importChecks = checkImportResolution(taskRow, priorTasks, basePath);
512
+ const signatureChecks = checkCrossTaskSignatures(taskRow, priorTasks, basePath);
513
+ const patternChecks = checkPatternConsistency(taskRow, priorTasks, basePath);
514
+
515
+ allChecks.push(...importChecks, ...signatureChecks, ...patternChecks);
516
+
517
+ const durationMs = Date.now() - startTime;
518
+
519
+ // Determine overall status
520
+ const hasBlockingFailure = allChecks.some((c) => !c.passed && c.blocking);
521
+ const hasNonBlockingIssue = allChecks.some(
522
+ (c) => (!c.passed && !c.blocking) || (c.passed && c.category === "pattern")
523
+ );
524
+
525
+ let status: "pass" | "warn" | "fail";
526
+ if (hasBlockingFailure) {
527
+ status = "fail";
528
+ } else if (hasNonBlockingIssue) {
529
+ status = "warn";
530
+ } else {
531
+ status = "pass";
532
+ }
533
+
534
+ return {
535
+ status,
536
+ checks: allChecks,
537
+ durationMs,
538
+ };
539
+ }