@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
@@ -15,7 +15,7 @@
15
15
  <link rel="apple-touch-icon" href="/icons/app/apple-touch-icon-180.png" sizes="180x180" />
16
16
  <link rel="manifest" href="/manifest.webmanifest" />
17
17
  <title>Pi Harness / Control Room</title>
18
- <script type="module" crossorigin src="/assets/index-BcLXLKqO.js"></script>
18
+ <script type="module" crossorigin src="/assets/index-BCeWdgv2.js"></script>
19
19
  <link rel="modulepreload" crossorigin href="/assets/react-vendor-BxoMtjVy.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/markdown-vendor-DUdMWn0M.js">
21
21
  <link rel="stylesheet" crossorigin href="/assets/index-xF647pQJ.css">
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/web",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "private": true,
5
5
  "description": "Browser application entry for Pi Harness",
6
6
  "type": "module",
@@ -10,11 +10,11 @@
10
10
  "dev": "vp dev"
11
11
  },
12
12
  "dependencies": {
13
- "@pi-harness/api-gateway": "0.1.24",
14
- "@pi-harness/client-web": "0.1.24",
15
- "@pi-harness/core": "0.1.24",
16
- "@pi-harness/host-webserver": "0.1.24",
17
- "@pi-harness/web-app": "0.1.24"
13
+ "@pi-harness/api-gateway": "0.1.26",
14
+ "@pi-harness/client-web": "0.1.26",
15
+ "@pi-harness/core": "0.1.26",
16
+ "@pi-harness/host-webserver": "0.1.26",
17
+ "@pi-harness/web-app": "0.1.26"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@tailwindcss/vite": "^4.3.3",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;;;;mBAkqBlC,OAAO;;AAHxB,wBAg5CE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;;;;mBA6sBlC,OAAO;;AAHxB,wBAu4CE"}
@@ -1,6 +1,6 @@
1
1
  import { execFile } from "node:child_process";
2
- import { mkdir, mkdtemp, readFile, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
3
- import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
2
+ import { mkdir, mkdtemp, readFile, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
4
4
  import { tmpdir } from "node:os";
5
5
  import { SessionManager } from "@earendil-works/pi-coding-agent";
6
6
  import { atomicWriteFile } from "@pi-harness/core";
@@ -14,6 +14,8 @@ const IMPORT_BODY_LIMIT_BYTES = 16 * 1024 * 1024;
14
14
  // Retained trajectory events are replayed to every SSE client and returned by /api/session, so the array must stay bounded.
15
15
  const MAX_RETAINED_EVENTS = 2000;
16
16
  const GIT_TIMEOUT_MS = 15_000;
17
+ // 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.
18
+ const GIT_MUTATION_TIMEOUT_MS = 120_000;
17
19
  class PayloadTooLargeError extends Error {
18
20
  constructor() {
19
21
  super("Request body is too large");
@@ -127,7 +129,7 @@ function piConfig(services) {
127
129
  function sessionMetadataFile(manager) {
128
130
  return resolve(manager.getSessionDir(), ".pi-harness-session-meta.json");
129
131
  }
130
- // 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.
132
+ // 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.
131
133
  async function readSessionMetadata(manager, logger) {
132
134
  const file = sessionMetadataFile(manager);
133
135
  let raw;
@@ -137,8 +139,7 @@ async function readSessionMetadata(manager, logger) {
137
139
  catch (error) {
138
140
  if (error.code === "ENOENT")
139
141
  return {};
140
- await quarantineSessionMetadata(file, logger, error);
141
- return {};
142
+ throw error;
142
143
  }
143
144
  try {
144
145
  const parsed = JSON.parse(raw);
@@ -165,25 +166,33 @@ async function writeSessionMetadata(manager, metadata) {
165
166
  await mkdir(manager.getSessionDir(), { recursive: true });
166
167
  await atomicWriteFile(sessionMetadataFile(manager), JSON.stringify(metadata, null, 2) + "\n", { encoding: "utf8" });
167
168
  }
168
- // Every read-modify-write of the metadata file runs through this chain so concurrent requests cannot interleave and drop each other's updates.
169
+ // 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.
169
170
  let sessionMetadataQueue = Promise.resolve();
171
+ function withSessionMetadataLock(operation) {
172
+ const next = sessionMetadataQueue.catch(() => undefined).then(operation);
173
+ sessionMetadataQueue = next;
174
+ return next;
175
+ }
176
+ function readSessionMetadataLocked(manager, logger) {
177
+ return withSessionMetadataLock(() => readSessionMetadata(manager, logger));
178
+ }
170
179
  function mutateSessionMetadata(manager, logger, mutate) {
171
- const operation = sessionMetadataQueue
172
- .catch(() => undefined)
173
- .then(async () => {
180
+ return withSessionMetadataLock(async () => {
174
181
  const metadata = await readSessionMetadata(manager, logger);
175
182
  const result = await mutate(metadata);
176
183
  await writeSessionMetadata(manager, metadata);
177
184
  return result;
178
185
  });
179
- sessionMetadataQueue = operation;
180
- return operation;
186
+ }
187
+ // 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.
188
+ function escapesRoot(relativePath) {
189
+ return isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(".." + sep);
181
190
  }
182
191
  function sessionPathInDirectory(path, manager) {
183
192
  const root = resolve(manager.getSessionDir());
184
193
  const target = resolve(path);
185
194
  const relativePath = relative(root, target);
186
- return relativePath !== "" && !isAbsolute(relativePath) && relativePath !== ".." && !relativePath.startsWith(".." + sep) && target.endsWith(".jsonl");
195
+ return relativePath !== "" && !escapesRoot(relativePath) && target.endsWith(".jsonl");
187
196
  }
188
197
  const webSessionUi = {
189
198
  select: (_title, options) => Promise.resolve(options[0]),
@@ -484,22 +493,37 @@ function gitTermination(error) {
484
493
  return "timeout";
485
494
  return undefined;
486
495
  }
487
- function gitTerminationMessage(command, termination) {
496
+ function gitTerminationMessage(command, termination, timeoutMs = GIT_TIMEOUT_MS) {
488
497
  return termination === "timeout"
489
- ? `git ${command} timed out after ${GIT_TIMEOUT_MS / 1000} seconds`
498
+ ? `git ${command} timed out after ${timeoutMs / 1000} seconds`
490
499
  : `git ${command} produced more output than the buffer limit allows`;
491
500
  }
492
- // `-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.
493
- function gitStatus(cwd) {
501
+ // `-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.
502
+ function parseGitStatus(output, prefix) {
503
+ const fields = output.split("\0");
504
+ const entries = [];
505
+ for (let index = 0; index < fields.length; index += 1) {
506
+ const field = fields[index] ?? "";
507
+ if (field.length < 4)
508
+ continue;
509
+ const code = field.slice(0, 2);
510
+ const path = field.slice(3);
511
+ if (code.startsWith("R") || code.startsWith("C"))
512
+ index += 1;
513
+ entries.push({ path: prefix === "" ? path : posix.relative("/" + prefix, "/" + path), status: code.trim() || "??" });
514
+ }
515
+ return entries;
516
+ }
517
+ function gitStatusOutput(cwd) {
494
518
  return new Promise((resolveStatus, rejectStatus) => {
495
- execFile("git", ["status", "--short", "-z", "--untracked-files=all"], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 512 * 1024 }, (error, stdout, stderr) => {
519
+ execFile("git", ["status", "--porcelain", "-z", "--untracked-files=all"], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 512 * 1024 }, (error, stdout, stderr) => {
496
520
  if (error === null) {
497
521
  resolveStatus({ output: stdout, truncated: false });
498
522
  return;
499
523
  }
500
524
  const termination = gitTermination(error);
501
525
  if (termination === "output-limit") {
502
- // Keep the complete records that arrived before the kill; the final one may have been cut mid-path.
526
+ // Keep the complete entries that arrived before the kill; the final entry may have been cut mid-path.
503
527
  resolveStatus({ output: stdout.slice(0, stdout.lastIndexOf("\0") + 1), truncated: true });
504
528
  return;
505
529
  }
@@ -511,14 +535,21 @@ function gitStatus(cwd) {
511
535
  });
512
536
  });
513
537
  }
538
+ async function gitStatus(cwd) {
539
+ const { output, truncated } = await gitStatusOutput(cwd);
540
+ if (output === "")
541
+ return { entries: [], truncated };
542
+ const prefix = await gitCommand(cwd, ["rev-parse", "--show-prefix"]);
543
+ return { entries: parseGitStatus(output, prefix.code === 0 ? prefix.stdout.trim() : ""), truncated };
544
+ }
514
545
  function gitDiff(cwd, path) {
515
546
  return new Promise((resolveOutput) => {
516
547
  execFile("git", ["diff", "--no-ext-diff", "--", path], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 1024 * 1024 }, (error, stdout) => resolveOutput(error && stdout.length === 0 ? "" : stdout));
517
548
  });
518
549
  }
519
- function gitCommand(cwd, args) {
550
+ function gitCommand(cwd, args, timeoutMs = GIT_TIMEOUT_MS) {
520
551
  return new Promise((resolveResult) => {
521
- execFile("git", [...args], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
552
+ execFile("git", [...args], { cwd, timeout: timeoutMs, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
522
553
  const code = error && typeof error.code === "number" ? error.code : error ? 1 : 0;
523
554
  resolveResult({ stdout, stderr, code, terminated: gitTermination(error) });
524
555
  });
@@ -594,7 +625,7 @@ function workspacePaths(root, paths) {
594
625
  const requested = path;
595
626
  const absolute = resolve(root, requested);
596
627
  const relativePath = relative(root, absolute);
597
- if (isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith("../"))
628
+ if (escapesRoot(relativePath))
598
629
  return new Error("path must stay inside the workspace");
599
630
  normalized.push(relativePath);
600
631
  }
@@ -757,8 +788,8 @@ export default {
757
788
  sendJson(response, 400, { error: "settings source must contain a JSON object" });
758
789
  return;
759
790
  }
760
- const path = join(services.launch.agentDir, "settings.json");
761
- // Replace the file atomically so an interrupted write never leaves a truncated settings.json behind; keep the existing permission bits.
791
+ // 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.
792
+ const path = await realpath(join(services.launch.agentDir, "settings.json")).catch(() => join(services.launch.agentDir, "settings.json"));
762
793
  const mode = await stat(path).then((info) => info.mode & 0o777, () => 0o644);
763
794
  await atomicWriteFile(path, JSON.stringify(parsed, null, 2) + "\n", { encoding: "utf8", mode });
764
795
  await services.runtime.session.settingsManager.reload();
@@ -1286,22 +1317,11 @@ export default {
1286
1317
  sendJson(response, 500, { error: errorText(error) });
1287
1318
  return;
1288
1319
  }
1289
- const records = status.output.split("\0");
1290
- const items = [];
1291
- for (let index = 0; index < records.length; index += 1) {
1292
- const record = records[index] ?? "";
1293
- if (record.length < 4)
1294
- continue;
1295
- const code = record.slice(0, 2).trim() || "??";
1296
- // Rename and copy records carry the original path in a second NUL-terminated field, which is not a workspace change of its own.
1297
- if (code.startsWith("R") || code.startsWith("C"))
1298
- index += 1;
1299
- items.push({
1300
- path: record.slice(3),
1301
- status: code,
1302
- label: code === "??" ? "untracked" : code.includes("D") ? "deleted" : code.includes("A") ? "added" : "modified",
1303
- });
1304
- }
1320
+ const items = status.entries.map((entry) => ({
1321
+ path: entry.path,
1322
+ status: entry.status,
1323
+ label: entry.status === "??" ? "untracked" : entry.status.includes("D") ? "deleted" : entry.status.includes("A") ? "added" : "modified",
1324
+ }));
1305
1325
  sendJson(response, 200, { items, ...(status.truncated ? { truncated: true } : {}) });
1306
1326
  },
1307
1327
  });
@@ -1321,7 +1341,7 @@ export default {
1321
1341
  const root = resolve(activeCwd(services));
1322
1342
  const absolute = resolve(root, requested);
1323
1343
  const relativePath = relative(root, absolute);
1324
- if (isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(".." + sep)) {
1344
+ if (escapesRoot(relativePath)) {
1325
1345
  sendJson(response, 400, { error: "path must stay inside the workspace" });
1326
1346
  return;
1327
1347
  }
@@ -1347,18 +1367,18 @@ export default {
1347
1367
  return;
1348
1368
  }
1349
1369
  const root = resolve(activeCwd(services));
1350
- const add = await gitCommand(root, ["add", "-A", "--", ...paths]);
1370
+ const add = await gitCommand(root, ["add", "-A", "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
1351
1371
  if (add.terminated) {
1352
- sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated) });
1372
+ sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated, GIT_MUTATION_TIMEOUT_MS) });
1353
1373
  return;
1354
1374
  }
1355
1375
  if (add.code !== 0) {
1356
1376
  sendJson(response, 409, { error: add.stderr.trim() || "Unable to stage workspace files" });
1357
1377
  return;
1358
1378
  }
1359
- const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths]);
1379
+ const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
1360
1380
  if (commit.terminated) {
1361
- sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated) });
1381
+ sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated, GIT_MUTATION_TIMEOUT_MS) });
1362
1382
  return;
1363
1383
  }
1364
1384
  if (commit.code !== 0) {
@@ -1414,9 +1434,9 @@ export default {
1414
1434
  return;
1415
1435
  }
1416
1436
  if (trackedPaths.length > 0) {
1417
- const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths]);
1437
+ const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths], GIT_MUTATION_TIMEOUT_MS);
1418
1438
  if (restore.terminated) {
1419
- sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated) });
1439
+ sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated, GIT_MUTATION_TIMEOUT_MS) });
1420
1440
  return;
1421
1441
  }
1422
1442
  if (restore.code !== 0) {
@@ -1970,7 +1990,7 @@ export default {
1970
1990
  const page = Math.max(0, Number.parseInt(url.searchParams.get("page") ?? "0", 10) || 0);
1971
1991
  const pageSize = Math.min(100, Math.max(1, Number.parseInt(url.searchParams.get("pageSize") ?? "50", 10) || 50));
1972
1992
  const includeArchived = url.searchParams.get("includeArchived") === "true";
1973
- const metadata = await readSessionMetadata(manager, context.logger);
1993
+ const metadata = await readSessionMetadataLocked(manager, context.logger);
1974
1994
  const items = typeof manager.isPersisted === "function" && manager.isPersisted() ? await SessionManager.list(services.launch.cwd, manager.getSessionDir()) : [];
1975
1995
  const filtered = items.filter((item) => includeArchived || metadata[item.path]?.archived !== true);
1976
1996
  const sorted = filtered.sort((a, b) => Number(metadata[b.path]?.pinned === true) - Number(metadata[a.path]?.pinned === true) || b.modified.getTime() - a.modified.getTime());