@pi-harness/pi-harness 0.1.24 → 0.1.26

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 (256) hide show
  1. package/README.md +3 -0
  2. package/apps/web/dist/assets/{index-BcLXLKqO.js → index-BCeWdgv2.js} +3 -2
  3. package/apps/web/dist/index.html +1 -1
  4. package/apps/web/package.json +6 -6
  5. package/node_modules/@pi-harness/api-gateway/dist/index.d.ts.map +1 -1
  6. package/node_modules/@pi-harness/api-gateway/dist/index.js +67 -47
  7. package/node_modules/@pi-harness/api-gateway/dist/index.js.map +1 -1
  8. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/agent-teams.json +1 -1
  9. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/anchored-standard.json +1 -1
  10. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/annotation.json +1 -1
  11. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
  12. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/at-file.json +1 -1
  13. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/auto-mode.json +1 -1
  14. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/better-sidebar.json +1 -1
  15. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-fetch.json +1 -1
  16. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -1
  17. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/canvas-draw.json +1 -1
  18. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/change-verifier.json +1 -1
  19. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cleaner.json +1 -1
  20. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cli-notifier.json +1 -1
  21. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
  22. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/colleague-skill.json +1 -1
  23. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context-doctor.json +1 -1
  24. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context.json +1 -1
  25. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
  26. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/dependency-checker.json +1 -1
  27. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +1 -1
  28. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/fail-logger.json +1 -1
  29. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/genui.json +1 -1
  30. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -1
  31. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
  32. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/history-compressor.json +1 -1
  33. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/hol-guard.json +1 -1
  34. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -1
  35. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/image-compressor.json +1 -1
  36. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/llm-verifier.json +1 -1
  37. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-client.json +1 -1
  38. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
  39. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
  40. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +1 -1
  41. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mock-server.json +1 -1
  42. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
  43. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
  44. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +1 -1
  45. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/openpets.json +1 -1
  46. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plan-execute.json +1 -1
  47. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
  48. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-dev.json +1 -1
  49. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-finder.json +1 -1
  50. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-radar.json +1 -1
  51. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-stars.json +1 -1
  52. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-guard.json +1 -1
  53. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
  54. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -1
  55. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -1
  56. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reverse-skill.json +1 -1
  57. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +1 -1
  58. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +1 -1
  59. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
  60. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +1 -1
  61. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -1
  62. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
  63. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
  64. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-insights.json +1 -1
  65. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
  66. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
  67. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-guard.json +1 -1
  68. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/sql-lens.json +1 -1
  69. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/synapse.json +1 -1
  70. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
  71. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
  72. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +1 -1
  73. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/test-harness.json +1 -1
  74. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/theme-studio.json +1 -1
  75. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/token-guard.json +1 -1
  76. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/turn-rewind.json +1 -1
  77. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
  78. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +1 -1
  79. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/web-research.json +1 -1
  80. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +1 -1
  81. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-search.json +1 -1
  82. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -1
  83. package/node_modules/@pi-harness/api-gateway/package.json +1 -1
  84. package/node_modules/@pi-harness/cli/package.json +1 -1
  85. package/node_modules/@pi-harness/host-webserver/dist/index.d.ts.map +1 -1
  86. package/node_modules/@pi-harness/host-webserver/dist/index.js +4 -2
  87. package/node_modules/@pi-harness/host-webserver/dist/index.js.map +1 -1
  88. package/node_modules/@pi-harness/host-webserver/package.json +1 -1
  89. package/node_modules/@pi-harness/web-app/package.json +1 -1
  90. package/package.json +6 -6
  91. package/packages/api-gateway/dist/index.d.ts.map +1 -1
  92. package/packages/api-gateway/dist/index.js +67 -47
  93. package/packages/api-gateway/dist/index.js.map +1 -1
  94. package/packages/api-gateway/dist/marketplace-entries/official/agent-teams.json +1 -1
  95. package/packages/api-gateway/dist/marketplace-entries/official/anchored-standard.json +1 -1
  96. package/packages/api-gateway/dist/marketplace-entries/official/annotation.json +1 -1
  97. package/packages/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
  98. package/packages/api-gateway/dist/marketplace-entries/official/at-file.json +1 -1
  99. package/packages/api-gateway/dist/marketplace-entries/official/auto-mode.json +1 -1
  100. package/packages/api-gateway/dist/marketplace-entries/official/better-sidebar.json +1 -1
  101. package/packages/api-gateway/dist/marketplace-entries/official/browser-fetch.json +1 -1
  102. package/packages/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -1
  103. package/packages/api-gateway/dist/marketplace-entries/official/canvas-draw.json +1 -1
  104. package/packages/api-gateway/dist/marketplace-entries/official/change-verifier.json +1 -1
  105. package/packages/api-gateway/dist/marketplace-entries/official/cleaner.json +1 -1
  106. package/packages/api-gateway/dist/marketplace-entries/official/cli-notifier.json +1 -1
  107. package/packages/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
  108. package/packages/api-gateway/dist/marketplace-entries/official/colleague-skill.json +1 -1
  109. package/packages/api-gateway/dist/marketplace-entries/official/context-doctor.json +1 -1
  110. package/packages/api-gateway/dist/marketplace-entries/official/context.json +1 -1
  111. package/packages/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
  112. package/packages/api-gateway/dist/marketplace-entries/official/dependency-checker.json +1 -1
  113. package/packages/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +1 -1
  114. package/packages/api-gateway/dist/marketplace-entries/official/fail-logger.json +1 -1
  115. package/packages/api-gateway/dist/marketplace-entries/official/genui.json +1 -1
  116. package/packages/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -1
  117. package/packages/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
  118. package/packages/api-gateway/dist/marketplace-entries/official/history-compressor.json +1 -1
  119. package/packages/api-gateway/dist/marketplace-entries/official/hol-guard.json +1 -1
  120. package/packages/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -1
  121. package/packages/api-gateway/dist/marketplace-entries/official/image-compressor.json +1 -1
  122. package/packages/api-gateway/dist/marketplace-entries/official/llm-verifier.json +1 -1
  123. package/packages/api-gateway/dist/marketplace-entries/official/mcp-client.json +1 -1
  124. package/packages/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
  125. package/packages/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
  126. package/packages/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +1 -1
  127. package/packages/api-gateway/dist/marketplace-entries/official/mock-server.json +1 -1
  128. package/packages/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
  129. package/packages/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
  130. package/packages/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +1 -1
  131. package/packages/api-gateway/dist/marketplace-entries/official/openpets.json +1 -1
  132. package/packages/api-gateway/dist/marketplace-entries/official/plan-execute.json +1 -1
  133. package/packages/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
  134. package/packages/api-gateway/dist/marketplace-entries/official/plugin-dev.json +1 -1
  135. package/packages/api-gateway/dist/marketplace-entries/official/plugin-finder.json +1 -1
  136. package/packages/api-gateway/dist/marketplace-entries/official/plugin-radar.json +1 -1
  137. package/packages/api-gateway/dist/marketplace-entries/official/plugin-stars.json +1 -1
  138. package/packages/api-gateway/dist/marketplace-entries/official/prompt-guard.json +1 -1
  139. package/packages/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
  140. package/packages/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -1
  141. package/packages/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -1
  142. package/packages/api-gateway/dist/marketplace-entries/official/reverse-skill.json +1 -1
  143. package/packages/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +1 -1
  144. package/packages/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +1 -1
  145. package/packages/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
  146. package/packages/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +1 -1
  147. package/packages/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -1
  148. package/packages/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
  149. package/packages/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
  150. package/packages/api-gateway/dist/marketplace-entries/official/session-insights.json +1 -1
  151. package/packages/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
  152. package/packages/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
  153. package/packages/api-gateway/dist/marketplace-entries/official/skill-guard.json +1 -1
  154. package/packages/api-gateway/dist/marketplace-entries/official/sql-lens.json +1 -1
  155. package/packages/api-gateway/dist/marketplace-entries/official/synapse.json +1 -1
  156. package/packages/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
  157. package/packages/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
  158. package/packages/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +1 -1
  159. package/packages/api-gateway/dist/marketplace-entries/official/test-harness.json +1 -1
  160. package/packages/api-gateway/dist/marketplace-entries/official/theme-studio.json +1 -1
  161. package/packages/api-gateway/dist/marketplace-entries/official/token-guard.json +1 -1
  162. package/packages/api-gateway/dist/marketplace-entries/official/turn-rewind.json +1 -1
  163. package/packages/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
  164. package/packages/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +1 -1
  165. package/packages/api-gateway/dist/marketplace-entries/official/web-research.json +1 -1
  166. package/packages/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +1 -1
  167. package/packages/api-gateway/dist/marketplace-entries/official/workspace-search.json +1 -1
  168. package/packages/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -1
  169. package/packages/api-gateway/package.json +1 -1
  170. package/packages/api-gateway/src/index.ts +100 -66
  171. package/packages/api-gateway/src/marketplace-entries/official/agent-teams.json +1 -1
  172. package/packages/api-gateway/src/marketplace-entries/official/anchored-standard.json +1 -1
  173. package/packages/api-gateway/src/marketplace-entries/official/annotation.json +1 -1
  174. package/packages/api-gateway/src/marketplace-entries/official/archify.json +1 -1
  175. package/packages/api-gateway/src/marketplace-entries/official/at-file.json +1 -1
  176. package/packages/api-gateway/src/marketplace-entries/official/auto-mode.json +1 -1
  177. package/packages/api-gateway/src/marketplace-entries/official/better-sidebar.json +1 -1
  178. package/packages/api-gateway/src/marketplace-entries/official/browser-fetch.json +1 -1
  179. package/packages/api-gateway/src/marketplace-entries/official/browser-session.json +1 -1
  180. package/packages/api-gateway/src/marketplace-entries/official/canvas-draw.json +1 -1
  181. package/packages/api-gateway/src/marketplace-entries/official/change-verifier.json +1 -1
  182. package/packages/api-gateway/src/marketplace-entries/official/cleaner.json +1 -1
  183. package/packages/api-gateway/src/marketplace-entries/official/cli-notifier.json +1 -1
  184. package/packages/api-gateway/src/marketplace-entries/official/code2skill.json +1 -1
  185. package/packages/api-gateway/src/marketplace-entries/official/colleague-skill.json +1 -1
  186. package/packages/api-gateway/src/marketplace-entries/official/context-doctor.json +1 -1
  187. package/packages/api-gateway/src/marketplace-entries/official/context.json +1 -1
  188. package/packages/api-gateway/src/marketplace-entries/official/cost-meter.json +1 -1
  189. package/packages/api-gateway/src/marketplace-entries/official/dependency-checker.json +1 -1
  190. package/packages/api-gateway/src/marketplace-entries/official/docker-sandbox.json +1 -1
  191. package/packages/api-gateway/src/marketplace-entries/official/fail-logger.json +1 -1
  192. package/packages/api-gateway/src/marketplace-entries/official/genui.json +1 -1
  193. package/packages/api-gateway/src/marketplace-entries/official/git-time-capsule.json +1 -1
  194. package/packages/api-gateway/src/marketplace-entries/official/graph-memory.json +1 -1
  195. package/packages/api-gateway/src/marketplace-entries/official/history-compressor.json +1 -1
  196. package/packages/api-gateway/src/marketplace-entries/official/hol-guard.json +1 -1
  197. package/packages/api-gateway/src/marketplace-entries/official/i18n-pair.json +1 -1
  198. package/packages/api-gateway/src/marketplace-entries/official/image-compressor.json +1 -1
  199. package/packages/api-gateway/src/marketplace-entries/official/llm-verifier.json +1 -1
  200. package/packages/api-gateway/src/marketplace-entries/official/mcp-client.json +1 -1
  201. package/packages/api-gateway/src/marketplace-entries/official/mcp-panel.json +1 -1
  202. package/packages/api-gateway/src/marketplace-entries/official/memory.json +1 -1
  203. package/packages/api-gateway/src/marketplace-entries/official/mirage-bridge.json +1 -1
  204. package/packages/api-gateway/src/marketplace-entries/official/mock-server.json +1 -1
  205. package/packages/api-gateway/src/marketplace-entries/official/modlens.json +1 -1
  206. package/packages/api-gateway/src/marketplace-entries/official/module-search.json +1 -1
  207. package/packages/api-gateway/src/marketplace-entries/official/obsidian-sync.json +1 -1
  208. package/packages/api-gateway/src/marketplace-entries/official/openpets.json +1 -1
  209. package/packages/api-gateway/src/marketplace-entries/official/plan-execute.json +1 -1
  210. package/packages/api-gateway/src/marketplace-entries/official/plugin-check.json +1 -1
  211. package/packages/api-gateway/src/marketplace-entries/official/plugin-dev.json +1 -1
  212. package/packages/api-gateway/src/marketplace-entries/official/plugin-finder.json +1 -1
  213. package/packages/api-gateway/src/marketplace-entries/official/plugin-radar.json +1 -1
  214. package/packages/api-gateway/src/marketplace-entries/official/plugin-stars.json +1 -1
  215. package/packages/api-gateway/src/marketplace-entries/official/prompt-guard.json +1 -1
  216. package/packages/api-gateway/src/marketplace-entries/official/prompt-library.json +1 -1
  217. package/packages/api-gateway/src/marketplace-entries/official/readme-gen.json +1 -1
  218. package/packages/api-gateway/src/marketplace-entries/official/recall-unread.json +1 -1
  219. package/packages/api-gateway/src/marketplace-entries/official/reverse-skill.json +1 -1
  220. package/packages/api-gateway/src/marketplace-entries/official/reviewer-bot.json +1 -1
  221. package/packages/api-gateway/src/marketplace-entries/official/runtime-doctor.json +1 -1
  222. package/packages/api-gateway/src/marketplace-entries/official/secure-audit.json +1 -1
  223. package/packages/api-gateway/src/marketplace-entries/official/session-bookmarks.json +1 -1
  224. package/packages/api-gateway/src/marketplace-entries/official/session-bridge.json +1 -1
  225. package/packages/api-gateway/src/marketplace-entries/official/session-compare.json +1 -1
  226. package/packages/api-gateway/src/marketplace-entries/official/session-export.json +1 -1
  227. package/packages/api-gateway/src/marketplace-entries/official/session-insights.json +1 -1
  228. package/packages/api-gateway/src/marketplace-entries/official/session-search.json +1 -1
  229. package/packages/api-gateway/src/marketplace-entries/official/skill-catalog.json +1 -1
  230. package/packages/api-gateway/src/marketplace-entries/official/skill-guard.json +1 -1
  231. package/packages/api-gateway/src/marketplace-entries/official/sql-lens.json +1 -1
  232. package/packages/api-gateway/src/marketplace-entries/official/synapse.json +1 -1
  233. package/packages/api-gateway/src/marketplace-entries/official/tab-manager.json +1 -1
  234. package/packages/api-gateway/src/marketplace-entries/official/taskboard.json +1 -1
  235. package/packages/api-gateway/src/marketplace-entries/official/telemetry-blocker.json +1 -1
  236. package/packages/api-gateway/src/marketplace-entries/official/test-harness.json +1 -1
  237. package/packages/api-gateway/src/marketplace-entries/official/theme-studio.json +1 -1
  238. package/packages/api-gateway/src/marketplace-entries/official/token-guard.json +1 -1
  239. package/packages/api-gateway/src/marketplace-entries/official/turn-rewind.json +1 -1
  240. package/packages/api-gateway/src/marketplace-entries/official/undo-savepoint.json +1 -1
  241. package/packages/api-gateway/src/marketplace-entries/official/vision-toolkit.json +1 -1
  242. package/packages/api-gateway/src/marketplace-entries/official/web-research.json +1 -1
  243. package/packages/api-gateway/src/marketplace-entries/official/workspace-navigator.json +1 -1
  244. package/packages/api-gateway/src/marketplace-entries/official/workspace-search.json +1 -1
  245. package/packages/api-gateway/src/marketplace-entries/official/yaml-validator.json +1 -1
  246. package/packages/api-gateway/test/index.test.ts +220 -2
  247. package/packages/api-gateway/test/release-contract.test.ts +7 -2
  248. package/packages/api-gateway/test/release-package.test.ts +16 -0
  249. package/packages/bundle-web-app/package.json +1 -1
  250. package/packages/cli/package.json +1 -1
  251. package/packages/host-webserver/dist/index.d.ts.map +1 -1
  252. package/packages/host-webserver/dist/index.js +4 -2
  253. package/packages/host-webserver/dist/index.js.map +1 -1
  254. package/packages/host-webserver/package.json +1 -1
  255. package/packages/host-webserver/src/index.ts +4 -2
  256. package/packages/host-webserver/test/index.test.ts +22 -0
@@ -1,7 +1,7 @@
1
1
  import { execFile, type ExecFileException } from "node:child_process";
2
- import { mkdir, mkdtemp, readFile, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
2
+ import { mkdir, mkdtemp, readFile, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
3
3
  import type { IncomingMessage, ServerResponse } from "node:http";
4
- import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
+ import { basename, dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import type { Context } from "@deepseek-ai/cordis";
7
7
  import { SessionManager, type AgentSessionEvent, type ExtensionUIContext } from "@earendil-works/pi-coding-agent";
@@ -42,6 +42,8 @@ const IMPORT_BODY_LIMIT_BYTES = 16 * 1024 * 1024;
42
42
  // Retained trajectory events are replayed to every SSE client and returned by /api/session, so the array must stay bounded.
43
43
  const MAX_RETAINED_EVENTS = 2000;
44
44
  const GIT_TIMEOUT_MS = 15_000;
45
+ // Mutating commands run user hooks (pre-commit, lint-staged, test suites) and may stage large trees; killing them part-way leaves index.lock and a half-finished operation behind, so they get a far more generous bound than read-only queries.
46
+ const GIT_MUTATION_TIMEOUT_MS = 120_000;
45
47
 
46
48
  class PayloadTooLargeError extends Error {
47
49
  constructor() {
@@ -166,7 +168,7 @@ interface MetadataLogger {
166
168
  warn(message: string): void;
167
169
  }
168
170
 
169
- // A missing file is the normal first-run state. Any other read or parse failure means the file exists but is unusable; it is renamed aside so the wreckage survives for recovery and the next write cannot silently replace the only copy.
171
+ // A missing file is the normal first-run state. A parse or shape failure means the file exists but is unusable; it is renamed aside so the wreckage survives for recovery and the next write cannot silently replace the only copy. Any other read error (EMFILE, EBUSY, EISDIR, permissions) says nothing about the content, so it propagates and the caller's write is skipped instead of replacing a valid map with an empty one.
170
172
  async function readSessionMetadata(manager: SessionManager, logger: MetadataLogger): Promise<SessionMetadataMap> {
171
173
  const file = sessionMetadataFile(manager);
172
174
  let raw: string;
@@ -174,8 +176,7 @@ async function readSessionMetadata(manager: SessionManager, logger: MetadataLogg
174
176
  raw = await readFile(file, "utf8");
175
177
  } catch (error) {
176
178
  if ((error as NodeJS.ErrnoException).code === "ENOENT") return {};
177
- await quarantineSessionMetadata(file, logger, error);
178
- return {};
179
+ throw error;
179
180
  }
180
181
  try {
181
182
  const parsed: unknown = JSON.parse(raw);
@@ -202,27 +203,38 @@ async function writeSessionMetadata(manager: SessionManager, metadata: SessionMe
202
203
  await atomicWriteFile(sessionMetadataFile(manager), JSON.stringify(metadata, null, 2) + "\n", { encoding: "utf8" });
203
204
  }
204
205
 
205
- // Every read-modify-write of the metadata file runs through this chain so concurrent requests cannot interleave and drop each other's updates.
206
+ // Every access to the metadata file runs through this chain so concurrent requests cannot interleave and drop each other's updates. Plain reads take the lock too: a read that finds corrupt bytes quarantines the file, and doing that outside the lock could rename away a valid map that a concurrent mutation had just written.
206
207
  let sessionMetadataQueue: Promise<unknown> = Promise.resolve();
207
208
 
209
+ function withSessionMetadataLock<T>(operation: () => Promise<T>): Promise<T> {
210
+ const next = sessionMetadataQueue.catch(() => undefined).then(operation);
211
+ sessionMetadataQueue = next;
212
+ return next;
213
+ }
214
+
215
+ function readSessionMetadataLocked(manager: SessionManager, logger: MetadataLogger): Promise<SessionMetadataMap> {
216
+ return withSessionMetadataLock(() => readSessionMetadata(manager, logger));
217
+ }
218
+
208
219
  function mutateSessionMetadata<T>(manager: SessionManager, logger: MetadataLogger, mutate: (metadata: SessionMetadataMap) => Promise<T> | T): Promise<T> {
209
- const operation = sessionMetadataQueue
210
- .catch(() => undefined)
211
- .then(async () => {
212
- const metadata = await readSessionMetadata(manager, logger);
213
- const result = await mutate(metadata);
214
- await writeSessionMetadata(manager, metadata);
215
- return result;
216
- });
217
- sessionMetadataQueue = operation;
218
- return operation;
220
+ return withSessionMetadataLock(async () => {
221
+ const metadata = await readSessionMetadata(manager, logger);
222
+ const result = await mutate(metadata);
223
+ await writeSessionMetadata(manager, metadata);
224
+ return result;
225
+ });
226
+ }
227
+
228
+ // True when a path.relative() result points outside the directory it was computed from. All containment checks share this predicate so they agree on every platform separator.
229
+ function escapesRoot(relativePath: string): boolean {
230
+ return isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(".." + sep);
219
231
  }
220
232
 
221
233
  function sessionPathInDirectory(path: string, manager: SessionManager): boolean {
222
234
  const root = resolve(manager.getSessionDir());
223
235
  const target = resolve(path);
224
236
  const relativePath = relative(root, target);
225
- return relativePath !== "" && !isAbsolute(relativePath) && relativePath !== ".." && !relativePath.startsWith(".." + sep) && target.endsWith(".jsonl");
237
+ return relativePath !== "" && !escapesRoot(relativePath) && target.endsWith(".jsonl");
226
238
  }
227
239
 
228
240
  const webSessionUi = {
@@ -529,40 +541,71 @@ function gitTermination(error: ExecFileException | null): GitTermination | undef
529
541
  return undefined;
530
542
  }
531
543
 
532
- function gitTerminationMessage(command: string, termination: GitTermination): string {
544
+ function gitTerminationMessage(command: string, termination: GitTermination, timeoutMs = GIT_TIMEOUT_MS): string {
533
545
  return termination === "timeout"
534
- ? `git ${command} timed out after ${GIT_TIMEOUT_MS / 1000} seconds`
546
+ ? `git ${command} timed out after ${timeoutMs / 1000} seconds`
535
547
  : `git ${command} produced more output than the buffer limit allows`;
536
548
  }
537
549
 
550
+ interface GitStatusEntry {
551
+ readonly path: string;
552
+ readonly status: string;
553
+ }
554
+
538
555
  interface GitStatusResult {
539
- readonly output: string;
556
+ readonly entries: readonly GitStatusEntry[];
540
557
  readonly truncated: boolean;
541
558
  }
542
559
 
543
- // `-z` is what makes the paths usable: without it git wraps any path holding a space, a quote or a non-ASCII byte in C-style quoting, and the quoted form is not a pathspec git will accept back on diff, add or ls-files.
544
- function gitStatus(cwd: string): Promise<GitStatusResult> {
560
+ // `-z` output is NUL-separated and never C-quoted, so non-ASCII names arrive verbatim and a rename carries its original path as the following field instead of an `old -> new` pair. The paths are relative to the repository root regardless of cwd, so they are rebased onto the cwd prefix to keep the contract with /api/files/diff, /api/files/commit and /api/files/revert, which resolve paths against the same cwd.
561
+ function parseGitStatus(output: string, prefix: string): GitStatusEntry[] {
562
+ const fields = output.split("\0");
563
+ const entries: GitStatusEntry[] = [];
564
+ for (let index = 0; index < fields.length; index += 1) {
565
+ const field = fields[index] ?? "";
566
+ if (field.length < 4) continue;
567
+ const code = field.slice(0, 2);
568
+ const path = field.slice(3);
569
+ if (code.startsWith("R") || code.startsWith("C")) index += 1;
570
+ entries.push({ path: prefix === "" ? path : posix.relative("/" + prefix, "/" + path), status: code.trim() || "??" });
571
+ }
572
+ return entries;
573
+ }
574
+
575
+ function gitStatusOutput(cwd: string): Promise<{ output: string; truncated: boolean }> {
545
576
  return new Promise((resolveStatus, rejectStatus) => {
546
- execFile("git", ["status", "--short", "-z", "--untracked-files=all"], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 512 * 1024 }, (error, stdout, stderr) => {
547
- if (error === null) {
548
- resolveStatus({ output: stdout, truncated: false });
549
- return;
550
- }
551
- const termination = gitTermination(error);
552
- if (termination === "output-limit") {
553
- // Keep the complete records that arrived before the kill; the final one may have been cut mid-path.
554
- resolveStatus({ output: stdout.slice(0, stdout.lastIndexOf("\0") + 1), truncated: true });
555
- return;
556
- }
557
- if (termination === undefined && error.code === 128 && /not a git repository/i.test(stderr)) {
558
- resolveStatus({ output: "", truncated: false });
559
- return;
560
- }
561
- rejectStatus(new Error(termination ? gitTerminationMessage("status", termination) : stderr.trim() || error.message, { cause: error }));
562
- });
577
+ execFile(
578
+ "git",
579
+ ["status", "--porcelain", "-z", "--untracked-files=all"],
580
+ { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 512 * 1024 },
581
+ (error, stdout, stderr) => {
582
+ if (error === null) {
583
+ resolveStatus({ output: stdout, truncated: false });
584
+ return;
585
+ }
586
+ const termination = gitTermination(error);
587
+ if (termination === "output-limit") {
588
+ // Keep the complete entries that arrived before the kill; the final entry may have been cut mid-path.
589
+ resolveStatus({ output: stdout.slice(0, stdout.lastIndexOf("\0") + 1), truncated: true });
590
+ return;
591
+ }
592
+ if (termination === undefined && error.code === 128 && /not a git repository/i.test(stderr)) {
593
+ resolveStatus({ output: "", truncated: false });
594
+ return;
595
+ }
596
+ rejectStatus(new Error(termination ? gitTerminationMessage("status", termination) : stderr.trim() || error.message, { cause: error }));
597
+ },
598
+ );
563
599
  });
564
600
  }
565
601
 
602
+ async function gitStatus(cwd: string): Promise<GitStatusResult> {
603
+ const { output, truncated } = await gitStatusOutput(cwd);
604
+ if (output === "") return { entries: [], truncated };
605
+ const prefix = await gitCommand(cwd, ["rev-parse", "--show-prefix"]);
606
+ return { entries: parseGitStatus(output, prefix.code === 0 ? prefix.stdout.trim() : ""), truncated };
607
+ }
608
+
566
609
  function gitDiff(cwd: string, path: string): Promise<string> {
567
610
  return new Promise((resolveOutput) => {
568
611
  execFile("git", ["diff", "--no-ext-diff", "--", path], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 1024 * 1024 }, (error, stdout) =>
@@ -578,9 +621,9 @@ interface GitCommandResult {
578
621
  readonly terminated: GitTermination | undefined;
579
622
  }
580
623
 
581
- function gitCommand(cwd: string, args: readonly string[]): Promise<GitCommandResult> {
624
+ function gitCommand(cwd: string, args: readonly string[], timeoutMs = GIT_TIMEOUT_MS): Promise<GitCommandResult> {
582
625
  return new Promise((resolveResult) => {
583
- execFile("git", [...args], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
626
+ execFile("git", [...args], { cwd, timeout: timeoutMs, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
584
627
  const code = error && typeof error.code === "number" ? error.code : error ? 1 : 0;
585
628
  resolveResult({ stdout, stderr, code, terminated: gitTermination(error) });
586
629
  });
@@ -668,7 +711,7 @@ function workspacePaths(root: string, paths: unknown): string[] | Error {
668
711
  const requested = path as string;
669
712
  const absolute = resolve(root, requested);
670
713
  const relativePath = relative(root, absolute);
671
- if (isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith("../")) return new Error("path must stay inside the workspace");
714
+ if (escapesRoot(relativePath)) return new Error("path must stay inside the workspace");
672
715
  normalized.push(relativePath);
673
716
  }
674
717
  return [...new Set(normalized)];
@@ -821,8 +864,8 @@ export default {
821
864
  sendJson(response, 400, { error: "settings source must contain a JSON object" });
822
865
  return;
823
866
  }
824
- const path = join(services.launch.agentDir, "settings.json");
825
- // Replace the file atomically so an interrupted write never leaves a truncated settings.json behind; keep the existing permission bits.
867
+ // Replace the file atomically so an interrupted write never leaves a truncated settings.json behind; keep the existing permission bits. The rename must land on the resolved target, otherwise a symlinked settings.json (dotfiles repositories) would be replaced by a detached regular file.
868
+ const path = await realpath(join(services.launch.agentDir, "settings.json")).catch(() => join(services.launch.agentDir, "settings.json"));
826
869
  const mode = await stat(path).then(
827
870
  (info) => info.mode & 0o777,
828
871
  () => 0o644,
@@ -1347,20 +1390,11 @@ export default {
1347
1390
  sendJson(response, 500, { error: errorText(error) });
1348
1391
  return;
1349
1392
  }
1350
- const records = status.output.split("\0");
1351
- const items: { path: string; status: string; label: string }[] = [];
1352
- for (let index = 0; index < records.length; index += 1) {
1353
- const record = records[index] ?? "";
1354
- if (record.length < 4) continue;
1355
- const code = record.slice(0, 2).trim() || "??";
1356
- // Rename and copy records carry the original path in a second NUL-terminated field, which is not a workspace change of its own.
1357
- if (code.startsWith("R") || code.startsWith("C")) index += 1;
1358
- items.push({
1359
- path: record.slice(3),
1360
- status: code,
1361
- label: code === "??" ? "untracked" : code.includes("D") ? "deleted" : code.includes("A") ? "added" : "modified",
1362
- });
1363
- }
1393
+ const items = status.entries.map((entry) => ({
1394
+ path: entry.path,
1395
+ status: entry.status,
1396
+ label: entry.status === "??" ? "untracked" : entry.status.includes("D") ? "deleted" : entry.status.includes("A") ? "added" : "modified",
1397
+ }));
1364
1398
  sendJson(response, 200, { items, ...(status.truncated ? { truncated: true } : {}) });
1365
1399
  },
1366
1400
  });
@@ -1380,7 +1414,7 @@ export default {
1380
1414
  const root = resolve(activeCwd(services));
1381
1415
  const absolute = resolve(root, requested);
1382
1416
  const relativePath = relative(root, absolute);
1383
- if (isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(".." + sep)) {
1417
+ if (escapesRoot(relativePath)) {
1384
1418
  sendJson(response, 400, { error: "path must stay inside the workspace" });
1385
1419
  return;
1386
1420
  }
@@ -1406,18 +1440,18 @@ export default {
1406
1440
  return;
1407
1441
  }
1408
1442
  const root = resolve(activeCwd(services));
1409
- const add = await gitCommand(root, ["add", "-A", "--", ...paths]);
1443
+ const add = await gitCommand(root, ["add", "-A", "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
1410
1444
  if (add.terminated) {
1411
- sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated) });
1445
+ sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated, GIT_MUTATION_TIMEOUT_MS) });
1412
1446
  return;
1413
1447
  }
1414
1448
  if (add.code !== 0) {
1415
1449
  sendJson(response, 409, { error: add.stderr.trim() || "Unable to stage workspace files" });
1416
1450
  return;
1417
1451
  }
1418
- const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths]);
1452
+ const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
1419
1453
  if (commit.terminated) {
1420
- sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated) });
1454
+ sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated, GIT_MUTATION_TIMEOUT_MS) });
1421
1455
  return;
1422
1456
  }
1423
1457
  if (commit.code !== 0) {
@@ -1469,9 +1503,9 @@ export default {
1469
1503
  return;
1470
1504
  }
1471
1505
  if (trackedPaths.length > 0) {
1472
- const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths]);
1506
+ const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths], GIT_MUTATION_TIMEOUT_MS);
1473
1507
  if (restore.terminated) {
1474
- sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated) });
1508
+ sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated, GIT_MUTATION_TIMEOUT_MS) });
1475
1509
  return;
1476
1510
  }
1477
1511
  if (restore.code !== 0) {
@@ -2019,7 +2053,7 @@ export default {
2019
2053
  const page = Math.max(0, Number.parseInt(url.searchParams.get("page") ?? "0", 10) || 0);
2020
2054
  const pageSize = Math.min(100, Math.max(1, Number.parseInt(url.searchParams.get("pageSize") ?? "50", 10) || 50));
2021
2055
  const includeArchived = url.searchParams.get("includeArchived") === "true";
2022
- const metadata = await readSessionMetadata(manager, context.logger);
2056
+ const metadata = await readSessionMetadataLocked(manager, context.logger);
2023
2057
  const items =
2024
2058
  typeof manager.isPersisted === "function" && manager.isPersisted() ? await SessionManager.list(services.launch.cwd, manager.getSessionDir()) : [];
2025
2059
  const filtered = items.filter((item) => includeArchived || metadata[item.path]?.archived !== true);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "agent-teams",
3
3
  "packageName": "@pi-harness/core/plugins/agent-teams",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Agent Team Board",
6
6
  "description": "Maintain a bounded, session-local collaboration ledger of named roles, dependency-aware tasks, and mailbox notes without spawning agents or sending external messages.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "anchored-standard",
3
3
  "packageName": "@pi-harness/core/plugins/anchored-standard",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Anchored Standard",
6
6
  "description": "Audit agent trajectories against an explicit tool-call allowlist and flag activity outside the anchored run.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "annotation",
3
3
  "packageName": "@pi-harness/core/plugins/annotation",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Annotations",
6
6
  "description": "Capture bounded selections and notes from the conversation for later agent context.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "archify",
3
3
  "packageName": "@pi-harness/core/plugins/archify",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Architecture Map",
6
6
  "description": "Build a bounded, read-only architecture map from workspace components and package dependencies.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "at-file",
3
3
  "packageName": "@pi-harness/core/plugins/at-file",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "@file Context",
6
6
  "description": "Attach a bounded 256 KiB strict UTF-8 workspace file using canonical workspace path confinement and no-follow regular-file reads, framing it as offline, read-only, untrusted model context with closing-tag neutralization and cancellable sequential execution.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "auto-mode",
3
3
  "packageName": "@pi-harness/core/plugins/auto-mode",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Auto Mode",
6
6
  "description": "Execute argv commands under a safe policy that blocks shell wrappers and requires confirmation for risky operations.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "better-sidebar",
3
3
  "packageName": "@pi-harness/core/plugins/better-sidebar",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Better Sidebar",
6
6
  "description": "Show a compact workspace, Git, and session overview beside the conversation without modifying files.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "browser-fetch",
3
3
  "packageName": "@pi-harness/core/plugins/browser-fetch",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Browser Fetch",
6
6
  "description": "Fetch public HTTP and HTTPS pages as bounded text with descriptor-safe inputs, DNS pinning, per-redirect private-network validation, textual MIME enforcement, cancellation, a whole-request timeout, and validated fail-closed panel reporting.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "browser-session",
3
3
  "packageName": "@pi-harness/core/plugins/browser-session",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Browser Session",
6
6
  "description": "Control a loopback-only Chrome DevTools session with descriptor-safe commands, bounded discovery, cancellable operations, screenshot metadata protection, and validated fail-closed panel previews.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "canvas-draw",
3
3
  "packageName": "@pi-harness/core/plugins/canvas-draw",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Canvas Draw",
6
6
  "description": "Generate validated, bounded Mermaid flowchart source from structured nodes and edges in the workspace UI.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "change-verifier",
3
3
  "packageName": "@pi-harness/core/plugins/change-verifier",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Change Verifier",
6
6
  "description": "Combine project tests and Git change review into one explicit verification gate before handoff.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "cleaner",
3
3
  "packageName": "@pi-harness/core/plugins/cleaner",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Cleaner",
6
6
  "description": "Strict descriptor-safe configuration and parameters, display-safe bounded Pi Harness Git capsule inventory, removal with explicit confirmation and retention controls, symlink and replacement defenses, cancellable serialization, and a fail-closed normalized panel.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "cli-notifier",
3
3
  "packageName": "@pi-harness/core/plugins/cli-notifier",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "CLI Notifier",
6
6
  "description": "Send local desktop notifications when an agent turn completes, fails, or is aborted, and when context compaction fails.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "code2skill",
3
3
  "packageName": "@pi-harness/core/plugins/code2skill",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Code2Skill",
6
6
  "description": "Package selected workspace source files into a bounded local Pi skill with a generated SKILL.md manifest and preserved references.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "colleague-skill",
3
3
  "packageName": "@pi-harness/core/plugins/colleague-skill",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Colleague Skill",
6
6
  "description": "Create durable, structured handoff packets for another role without hidden agents or external message delivery.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "context-doctor",
3
3
  "packageName": "@pi-harness/core/plugins/context-doctor",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Context Doctor",
6
6
  "description": "Descriptor-safe bounded context audits detect pressure, oversized or uninspectable messages, and tool errors. Compaction requests are queued until the agent has settled; confirmed model-backed compaction may incur cost and provides cancellable waits with dedicated cancellation.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "context-insights",
3
3
  "packageName": "@pi-harness/core/plugins/context",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Context Insights",
6
6
  "description": "Inspect context usage and descriptor-safe bounded message composition with cached active-session lifecycle counters and a fixed-limit normalized browser panel.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "cost-meter",
3
3
  "packageName": "@pi-harness/core/plugins/cost-meter",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Cost Meter",
6
6
  "description": "Track runtime-reported costs as UTC daily increments in a bounded local ledger, with session snapshots and optional daily budget monitoring; no model prices are guessed.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "dependency-checker",
3
3
  "packageName": "@pi-harness/core/plugins/dependency-checker",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Dependency Checker",
6
6
  "description": "Run a bounded, offline, read-only check of workspace package.json and requirements*.txt manifests for local package presence, duplicate declaration consistency, unresolved constraints, and unsupported Python directives.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "docker-sandbox",
3
3
  "packageName": "@pi-harness/core/plugins/docker-sandbox",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Docker Sandbox",
6
6
  "description": "Run descriptor-safe argv commands with local-only Docker images, no container network, a read-only workspace by default, fixed CPU, memory, and PID limits, sanitized output, strict panel reporting, and cancellation cleanup.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "fail-logger",
3
3
  "packageName": "@pi-harness/core/plugins/fail-logger",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Failure Logger",
6
6
  "description": "Aggregate bounded extension, Agent, and non-aborted compaction failures through descriptor-safe event inspection, safe diagnostic summaries, and occurrence counts without retaining full payloads.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "genui",
3
3
  "packageName": "@pi-harness/core/plugins/genui",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "GenUI",
6
6
  "description": "Render bounded structured cards with text, badge, and decimal progress blocks while displaying HTML and scripts as plain text.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "git-time-capsule",
3
3
  "packageName": "@pi-harness/core/plugins/git-time-capsule",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Git Time Capsule",
6
6
  "description": "Capture the current unstaged tracked Git diff as a byte-exact, validated undo capsule without external diff or textconv helpers, then reverse-apply it only after explicit confirmation.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "graph-memory",
3
3
  "packageName": "@pi-harness/core/plugins/graph-memory",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Graph Memory",
6
6
  "description": "Store bounded typed task, skill, and event nodes with validated directed relations, atomic locked persistence, and inspectable cross-session search.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "history-compressor",
3
3
  "packageName": "@pi-harness/core/plugins/history-compressor",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "History Compressor",
6
6
  "description": "Compact the current Pi session automatically when context usage approaches a configured threshold.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "hol-guard",
3
3
  "packageName": "@pi-harness/core/plugins/hol-guard",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "HOL Guard",
6
6
  "description": "Audit tool arguments and preflight text for destructive commands, sensitive paths, credentials, and remote exfiltration. Advisory only: reports risk, does not block execution.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "i18n-pair",
3
3
  "packageName": "@pi-harness/core/plugins/i18n-pair",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "I18n Pair",
6
6
  "description": "Strict read-only comparison of bounded JSON locale files from no-follow workspace paths, with collision-safe missing and extra keys, stable failures, cancellation, and validated panel status.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "image-compressor",
3
3
  "packageName": "@pi-harness/core/plugins/image-compressor",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "Image Compressor",
6
6
  "description": "Create bounded image copies for model context while preserving the original file and reporting saved bytes.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "llm-verifier",
3
3
  "packageName": "@pi-harness/core/plugins/llm-verifier",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "LLM Verifier",
6
6
  "description": "Ask a configured verifier model to judge a claim against bounded, untrusted evidence.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "mcp-client",
3
3
  "packageName": "@pi-harness/core/plugins/mcp-client",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "MCP Client",
6
6
  "description": "Connect to direct-argv MCP stdio servers with bounded pagination and protocol validation, tool, resource, and prompt bridging, cancellable queued requests, and lifecycle-owned process cleanup.",
7
7
  "author": "Pi Harness",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "mcp-panel",
3
3
  "packageName": "@pi-harness/core/plugins/mcp-panel",
4
- "version": "0.1.24",
4
+ "version": "0.1.26",
5
5
  "name": "MCP Panel",
6
6
  "description": "Inspect MCP server health and tools, preview profile patches, and apply changes only with an explicit confirmation and backup.",
7
7
  "author": "Pi Harness",