@pi-harness/pi-harness 0.1.30 → 0.1.32

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 (288) hide show
  1. package/README.md +1 -1
  2. package/apps/web/dist/assets/index-BqOM0elx.css +2 -0
  3. package/apps/web/dist/assets/index-x2UhIAWm.js +25 -0
  4. package/apps/web/dist/index.html +2 -2
  5. package/apps/web/package.json +1 -1
  6. package/apps/web/profile/cordis.yml +0 -221
  7. package/apps/web/server-dist/bin.js +11 -3
  8. package/apps/web/server-dist/bin.js.map +1 -1
  9. package/apps/web/src/server/bin.ts +10 -2
  10. package/apps/web/src/style.css +30 -1
  11. package/node_modules/@pi-harness/api-gateway/dist/index.d.ts.map +1 -1
  12. package/node_modules/@pi-harness/api-gateway/dist/index.js +70 -18
  13. package/node_modules/@pi-harness/api-gateway/dist/index.js.map +1 -1
  14. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/agent-teams.json +1 -1
  15. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/anchored-standard.json +1 -1
  16. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/annotation.json +1 -1
  17. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
  18. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/at-file.json +1 -9
  19. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/auto-mode.json +1 -1
  20. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/better-sidebar.json +1 -1
  21. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-fetch.json +1 -8
  22. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -8
  23. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/canvas-draw.json +2 -2
  24. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/change-verifier.json +1 -1
  25. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cleaner.json +1 -9
  26. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cli-notifier.json +1 -1
  27. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
  28. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/colleague-skill.json +1 -1
  29. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context-doctor.json +1 -8
  30. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context.json +1 -7
  31. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cordis-group.json +1 -1
  32. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cordis-logger-console.json +1 -1
  33. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cordis-timer.json +1 -1
  34. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
  35. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/dependency-checker.json +2 -10
  36. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +1 -9
  37. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/fail-logger.json +1 -8
  38. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/genui.json +1 -1
  39. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -8
  40. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
  41. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/history-compressor.json +2 -2
  42. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/hol-guard.json +2 -2
  43. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -7
  44. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/image-compressor.json +2 -2
  45. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/llm-verifier.json +1 -1
  46. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-client.json +2 -8
  47. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
  48. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
  49. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +1 -1
  50. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mock-server.json +1 -1
  51. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
  52. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
  53. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +1 -1
  54. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/openpets.json +2 -8
  55. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plan-execute.json +1 -1
  56. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
  57. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-dev.json +1 -1
  58. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-finder.json +1 -1
  59. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-radar.json +1 -1
  60. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-stars.json +1 -8
  61. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-guard.json +2 -2
  62. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
  63. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -9
  64. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -8
  65. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reverse-skill.json +2 -2
  66. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +1 -1
  67. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +1 -1
  68. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
  69. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +1 -1
  70. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -9
  71. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
  72. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
  73. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-insights.json +1 -9
  74. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
  75. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
  76. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-guard.json +2 -9
  77. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/sql-lens.json +1 -8
  78. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/synapse.json +1 -1
  79. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
  80. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
  81. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +1 -1
  82. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/test-harness.json +2 -10
  83. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/theme-studio.json +1 -1
  84. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/token-guard.json +1 -9
  85. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/turn-rewind.json +1 -8
  86. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
  87. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +1 -7
  88. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/web-research.json +1 -1
  89. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +1 -1
  90. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-search.json +2 -2
  91. package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -7
  92. package/node_modules/@pi-harness/api-gateway/dist/marketplace.d.ts +18 -2
  93. package/node_modules/@pi-harness/api-gateway/dist/marketplace.d.ts.map +1 -1
  94. package/node_modules/@pi-harness/api-gateway/dist/marketplace.js +93 -10
  95. package/node_modules/@pi-harness/api-gateway/dist/marketplace.js.map +1 -1
  96. package/node_modules/@pi-harness/api-gateway/package.json +1 -27
  97. package/node_modules/@pi-harness/cli/dist/main.d.ts.map +1 -1
  98. package/node_modules/@pi-harness/cli/dist/main.js +19 -3
  99. package/node_modules/@pi-harness/cli/dist/main.js.map +1 -1
  100. package/node_modules/@pi-harness/cli/package.json +1 -1
  101. package/node_modules/@pi-harness/cli/profiles/default/cordis.yml +0 -87
  102. package/node_modules/@pi-harness/host-webserver/package.json +1 -1
  103. package/node_modules/@pi-harness/web-app/package.json +1 -1
  104. package/package.json +6 -79
  105. package/packages/api-gateway/dist/index.d.ts.map +1 -1
  106. package/packages/api-gateway/dist/index.js +70 -18
  107. package/packages/api-gateway/dist/index.js.map +1 -1
  108. package/packages/api-gateway/dist/marketplace-entries/official/agent-teams.json +1 -1
  109. package/packages/api-gateway/dist/marketplace-entries/official/anchored-standard.json +1 -1
  110. package/packages/api-gateway/dist/marketplace-entries/official/annotation.json +1 -1
  111. package/packages/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
  112. package/packages/api-gateway/dist/marketplace-entries/official/at-file.json +1 -9
  113. package/packages/api-gateway/dist/marketplace-entries/official/auto-mode.json +1 -1
  114. package/packages/api-gateway/dist/marketplace-entries/official/better-sidebar.json +1 -1
  115. package/packages/api-gateway/dist/marketplace-entries/official/browser-fetch.json +1 -8
  116. package/packages/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -8
  117. package/packages/api-gateway/dist/marketplace-entries/official/canvas-draw.json +2 -2
  118. package/packages/api-gateway/dist/marketplace-entries/official/change-verifier.json +1 -1
  119. package/packages/api-gateway/dist/marketplace-entries/official/cleaner.json +1 -9
  120. package/packages/api-gateway/dist/marketplace-entries/official/cli-notifier.json +1 -1
  121. package/packages/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
  122. package/packages/api-gateway/dist/marketplace-entries/official/colleague-skill.json +1 -1
  123. package/packages/api-gateway/dist/marketplace-entries/official/context-doctor.json +1 -8
  124. package/packages/api-gateway/dist/marketplace-entries/official/context.json +1 -7
  125. package/packages/api-gateway/dist/marketplace-entries/official/cordis-group.json +1 -1
  126. package/packages/api-gateway/dist/marketplace-entries/official/cordis-logger-console.json +1 -1
  127. package/packages/api-gateway/dist/marketplace-entries/official/cordis-timer.json +1 -1
  128. package/packages/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
  129. package/packages/api-gateway/dist/marketplace-entries/official/dependency-checker.json +2 -10
  130. package/packages/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +1 -9
  131. package/packages/api-gateway/dist/marketplace-entries/official/fail-logger.json +1 -8
  132. package/packages/api-gateway/dist/marketplace-entries/official/genui.json +1 -1
  133. package/packages/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -8
  134. package/packages/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
  135. package/packages/api-gateway/dist/marketplace-entries/official/history-compressor.json +2 -2
  136. package/packages/api-gateway/dist/marketplace-entries/official/hol-guard.json +2 -2
  137. package/packages/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -7
  138. package/packages/api-gateway/dist/marketplace-entries/official/image-compressor.json +2 -2
  139. package/packages/api-gateway/dist/marketplace-entries/official/llm-verifier.json +1 -1
  140. package/packages/api-gateway/dist/marketplace-entries/official/mcp-client.json +2 -8
  141. package/packages/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
  142. package/packages/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
  143. package/packages/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +1 -1
  144. package/packages/api-gateway/dist/marketplace-entries/official/mock-server.json +1 -1
  145. package/packages/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
  146. package/packages/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
  147. package/packages/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +1 -1
  148. package/packages/api-gateway/dist/marketplace-entries/official/openpets.json +2 -8
  149. package/packages/api-gateway/dist/marketplace-entries/official/plan-execute.json +1 -1
  150. package/packages/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
  151. package/packages/api-gateway/dist/marketplace-entries/official/plugin-dev.json +1 -1
  152. package/packages/api-gateway/dist/marketplace-entries/official/plugin-finder.json +1 -1
  153. package/packages/api-gateway/dist/marketplace-entries/official/plugin-radar.json +1 -1
  154. package/packages/api-gateway/dist/marketplace-entries/official/plugin-stars.json +1 -8
  155. package/packages/api-gateway/dist/marketplace-entries/official/prompt-guard.json +2 -2
  156. package/packages/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
  157. package/packages/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -9
  158. package/packages/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -8
  159. package/packages/api-gateway/dist/marketplace-entries/official/reverse-skill.json +2 -2
  160. package/packages/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +1 -1
  161. package/packages/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +1 -1
  162. package/packages/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
  163. package/packages/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +1 -1
  164. package/packages/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -9
  165. package/packages/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
  166. package/packages/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
  167. package/packages/api-gateway/dist/marketplace-entries/official/session-insights.json +1 -9
  168. package/packages/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
  169. package/packages/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
  170. package/packages/api-gateway/dist/marketplace-entries/official/skill-guard.json +2 -9
  171. package/packages/api-gateway/dist/marketplace-entries/official/sql-lens.json +1 -8
  172. package/packages/api-gateway/dist/marketplace-entries/official/synapse.json +1 -1
  173. package/packages/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
  174. package/packages/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
  175. package/packages/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +1 -1
  176. package/packages/api-gateway/dist/marketplace-entries/official/test-harness.json +2 -10
  177. package/packages/api-gateway/dist/marketplace-entries/official/theme-studio.json +1 -1
  178. package/packages/api-gateway/dist/marketplace-entries/official/token-guard.json +1 -9
  179. package/packages/api-gateway/dist/marketplace-entries/official/turn-rewind.json +1 -8
  180. package/packages/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
  181. package/packages/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +1 -7
  182. package/packages/api-gateway/dist/marketplace-entries/official/web-research.json +1 -1
  183. package/packages/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +1 -1
  184. package/packages/api-gateway/dist/marketplace-entries/official/workspace-search.json +2 -2
  185. package/packages/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -7
  186. package/packages/api-gateway/dist/marketplace.d.ts +18 -2
  187. package/packages/api-gateway/dist/marketplace.d.ts.map +1 -1
  188. package/packages/api-gateway/dist/marketplace.js +93 -10
  189. package/packages/api-gateway/dist/marketplace.js.map +1 -1
  190. package/packages/api-gateway/package.json +1 -27
  191. package/packages/api-gateway/src/index.ts +85 -23
  192. package/packages/api-gateway/src/marketplace-entries/official/agent-teams.json +1 -1
  193. package/packages/api-gateway/src/marketplace-entries/official/anchored-standard.json +1 -1
  194. package/packages/api-gateway/src/marketplace-entries/official/annotation.json +1 -1
  195. package/packages/api-gateway/src/marketplace-entries/official/archify.json +1 -1
  196. package/packages/api-gateway/src/marketplace-entries/official/at-file.json +1 -9
  197. package/packages/api-gateway/src/marketplace-entries/official/auto-mode.json +1 -1
  198. package/packages/api-gateway/src/marketplace-entries/official/better-sidebar.json +1 -1
  199. package/packages/api-gateway/src/marketplace-entries/official/browser-fetch.json +1 -8
  200. package/packages/api-gateway/src/marketplace-entries/official/browser-session.json +1 -8
  201. package/packages/api-gateway/src/marketplace-entries/official/canvas-draw.json +2 -2
  202. package/packages/api-gateway/src/marketplace-entries/official/change-verifier.json +1 -1
  203. package/packages/api-gateway/src/marketplace-entries/official/cleaner.json +1 -9
  204. package/packages/api-gateway/src/marketplace-entries/official/cli-notifier.json +1 -1
  205. package/packages/api-gateway/src/marketplace-entries/official/code2skill.json +1 -1
  206. package/packages/api-gateway/src/marketplace-entries/official/colleague-skill.json +1 -1
  207. package/packages/api-gateway/src/marketplace-entries/official/context-doctor.json +1 -8
  208. package/packages/api-gateway/src/marketplace-entries/official/context.json +1 -7
  209. package/packages/api-gateway/src/marketplace-entries/official/cordis-group.json +1 -1
  210. package/packages/api-gateway/src/marketplace-entries/official/cordis-logger-console.json +1 -1
  211. package/packages/api-gateway/src/marketplace-entries/official/cordis-timer.json +1 -1
  212. package/packages/api-gateway/src/marketplace-entries/official/cost-meter.json +1 -1
  213. package/packages/api-gateway/src/marketplace-entries/official/dependency-checker.json +2 -10
  214. package/packages/api-gateway/src/marketplace-entries/official/docker-sandbox.json +1 -9
  215. package/packages/api-gateway/src/marketplace-entries/official/fail-logger.json +1 -8
  216. package/packages/api-gateway/src/marketplace-entries/official/genui.json +1 -1
  217. package/packages/api-gateway/src/marketplace-entries/official/git-time-capsule.json +1 -8
  218. package/packages/api-gateway/src/marketplace-entries/official/graph-memory.json +1 -1
  219. package/packages/api-gateway/src/marketplace-entries/official/history-compressor.json +2 -2
  220. package/packages/api-gateway/src/marketplace-entries/official/hol-guard.json +2 -2
  221. package/packages/api-gateway/src/marketplace-entries/official/i18n-pair.json +1 -7
  222. package/packages/api-gateway/src/marketplace-entries/official/image-compressor.json +2 -2
  223. package/packages/api-gateway/src/marketplace-entries/official/llm-verifier.json +1 -1
  224. package/packages/api-gateway/src/marketplace-entries/official/mcp-client.json +2 -8
  225. package/packages/api-gateway/src/marketplace-entries/official/mcp-panel.json +1 -1
  226. package/packages/api-gateway/src/marketplace-entries/official/memory.json +1 -1
  227. package/packages/api-gateway/src/marketplace-entries/official/mirage-bridge.json +1 -1
  228. package/packages/api-gateway/src/marketplace-entries/official/mock-server.json +1 -1
  229. package/packages/api-gateway/src/marketplace-entries/official/modlens.json +1 -1
  230. package/packages/api-gateway/src/marketplace-entries/official/module-search.json +1 -1
  231. package/packages/api-gateway/src/marketplace-entries/official/obsidian-sync.json +1 -1
  232. package/packages/api-gateway/src/marketplace-entries/official/openpets.json +2 -8
  233. package/packages/api-gateway/src/marketplace-entries/official/plan-execute.json +1 -1
  234. package/packages/api-gateway/src/marketplace-entries/official/plugin-check.json +1 -1
  235. package/packages/api-gateway/src/marketplace-entries/official/plugin-dev.json +1 -1
  236. package/packages/api-gateway/src/marketplace-entries/official/plugin-finder.json +1 -1
  237. package/packages/api-gateway/src/marketplace-entries/official/plugin-radar.json +1 -1
  238. package/packages/api-gateway/src/marketplace-entries/official/plugin-stars.json +1 -8
  239. package/packages/api-gateway/src/marketplace-entries/official/prompt-guard.json +2 -2
  240. package/packages/api-gateway/src/marketplace-entries/official/prompt-library.json +1 -1
  241. package/packages/api-gateway/src/marketplace-entries/official/readme-gen.json +1 -9
  242. package/packages/api-gateway/src/marketplace-entries/official/recall-unread.json +1 -8
  243. package/packages/api-gateway/src/marketplace-entries/official/reverse-skill.json +2 -2
  244. package/packages/api-gateway/src/marketplace-entries/official/reviewer-bot.json +1 -1
  245. package/packages/api-gateway/src/marketplace-entries/official/runtime-doctor.json +1 -1
  246. package/packages/api-gateway/src/marketplace-entries/official/secure-audit.json +1 -1
  247. package/packages/api-gateway/src/marketplace-entries/official/session-bookmarks.json +1 -1
  248. package/packages/api-gateway/src/marketplace-entries/official/session-bridge.json +1 -9
  249. package/packages/api-gateway/src/marketplace-entries/official/session-compare.json +1 -1
  250. package/packages/api-gateway/src/marketplace-entries/official/session-export.json +1 -1
  251. package/packages/api-gateway/src/marketplace-entries/official/session-insights.json +1 -9
  252. package/packages/api-gateway/src/marketplace-entries/official/session-search.json +1 -1
  253. package/packages/api-gateway/src/marketplace-entries/official/skill-catalog.json +1 -1
  254. package/packages/api-gateway/src/marketplace-entries/official/skill-guard.json +2 -9
  255. package/packages/api-gateway/src/marketplace-entries/official/sql-lens.json +1 -8
  256. package/packages/api-gateway/src/marketplace-entries/official/synapse.json +1 -1
  257. package/packages/api-gateway/src/marketplace-entries/official/tab-manager.json +1 -1
  258. package/packages/api-gateway/src/marketplace-entries/official/taskboard.json +1 -1
  259. package/packages/api-gateway/src/marketplace-entries/official/telemetry-blocker.json +1 -1
  260. package/packages/api-gateway/src/marketplace-entries/official/test-harness.json +2 -10
  261. package/packages/api-gateway/src/marketplace-entries/official/theme-studio.json +1 -1
  262. package/packages/api-gateway/src/marketplace-entries/official/token-guard.json +1 -9
  263. package/packages/api-gateway/src/marketplace-entries/official/turn-rewind.json +1 -8
  264. package/packages/api-gateway/src/marketplace-entries/official/undo-savepoint.json +1 -1
  265. package/packages/api-gateway/src/marketplace-entries/official/vision-toolkit.json +1 -7
  266. package/packages/api-gateway/src/marketplace-entries/official/web-research.json +1 -1
  267. package/packages/api-gateway/src/marketplace-entries/official/workspace-navigator.json +1 -1
  268. package/packages/api-gateway/src/marketplace-entries/official/workspace-search.json +2 -2
  269. package/packages/api-gateway/src/marketplace-entries/official/yaml-validator.json +1 -7
  270. package/packages/api-gateway/src/marketplace.ts +113 -12
  271. package/packages/api-gateway/test/index.test.ts +297 -5
  272. package/packages/api-gateway/test/marketplace-schema.test.ts +12 -0
  273. package/packages/api-gateway/test/marketplace.test.ts +172 -240
  274. package/packages/api-gateway/test/packed-package.test.ts +18 -6
  275. package/packages/api-gateway/test/release-contract.test.ts +8 -4
  276. package/packages/bundle-web-app/package.json +1 -1
  277. package/packages/cli/dist/main.d.ts.map +1 -1
  278. package/packages/cli/dist/main.js +19 -3
  279. package/packages/cli/dist/main.js.map +1 -1
  280. package/packages/cli/package.json +1 -1
  281. package/packages/cli/profiles/default/cordis.yml +0 -87
  282. package/packages/cli/src/main.ts +18 -3
  283. package/packages/cli/test/cli.test.ts +20 -0
  284. package/packages/cli/test/profiles/plugins/cordis.yml +122 -0
  285. package/packages/cli/test/profiles.integration.test.ts +40 -23
  286. package/packages/host-webserver/package.json +1 -1
  287. package/apps/web/dist/assets/index-B7pwZ76Z.js +0 -25
  288. package/apps/web/dist/assets/index-xF647pQJ.css +0 -2
@@ -15,10 +15,10 @@
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-B7pwZ76Z.js"></script>
18
+ <script type="module" crossorigin src="/assets/index-x2UhIAWm.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
- <link rel="stylesheet" crossorigin href="/assets/index-xF647pQJ.css">
21
+ <link rel="stylesheet" crossorigin href="/assets/index-BqOM0elx.css">
22
22
  </head>
23
23
  <body>
24
24
  <main id="root"></main>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/web",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
4
4
  "private": true,
5
5
  "description": "Browser application entry for Pi Harness",
6
6
  "type": "module",
@@ -26,231 +26,10 @@
26
26
  - bash
27
27
  - edit
28
28
  - write
29
- - id: agent-teams
30
- name: "@pi-harness/plugin-agent-teams"
31
- config: {}
32
- - id: modlens
33
- name: "@pi-harness/plugin-modlens"
34
- config: {}
35
- - id: git-time-capsule
36
- name: "@pi-harness/plugin-git-time-capsule"
37
- config: {}
38
- - id: dependency-checker
39
- name: "@pi-harness/plugin-dependency-checker"
40
- config: {}
41
- - id: at-file
42
- name: "@pi-harness/plugin-at-file"
43
- config: {}
44
- - id: test-harness
45
- name: "@pi-harness/plugin-test-harness"
46
- config: {}
47
- - id: session-insights
48
- name: "@pi-harness/plugin-session-insights"
49
- config: {}
50
- - id: readme-gen
51
- name: "@pi-harness/plugin-readme-gen"
52
- config: {}
53
- - id: i18n-pair
54
- name: "@pi-harness/plugin-i18n-pair"
55
- config: {}
56
- - id: cleaner
57
- name: "@pi-harness/plugin-cleaner"
58
- config: {}
59
- - id: sql-lens
60
- name: "@pi-harness/plugin-sql-lens"
61
- config: {}
62
- - id: docker-sandbox
63
- name: "@pi-harness/plugin-docker-sandbox"
64
- config: {}
65
- - id: mcp-client
66
- name: "@pi-harness/plugin-mcp-client"
67
- config: {}
68
- - id: mcp-panel
69
- name: "@pi-harness/plugin-mcp-panel"
70
- config: {}
71
- - id: browser-fetch
72
- name: "@pi-harness/plugin-browser-fetch"
73
- config: {}
74
- - id: web-research
75
- name: "@pi-harness/plugin-web-research"
76
- config: {}
77
- - id: browser-session
78
- name: "@pi-harness/plugin-browser-session"
79
- config: {}
80
- - id: yaml-validator
81
- name: "@pi-harness/plugin-yaml-validator"
82
- config: {}
83
- - id: mock-server
84
- name: "@pi-harness/plugin-mock-server"
85
- config: {}
86
- - id: cli-notifier
87
- name: "@pi-harness/plugin-cli-notifier"
88
- config: {}
89
- - id: obsidian-sync
90
- name: "@pi-harness/plugin-obsidian-sync"
91
- config: {}
92
- - id: context-doctor
93
- name: "@pi-harness/plugin-context-doctor"
94
- config: {}
95
- - id: history-compressor
96
- name: "@pi-harness/plugin-history-compressor"
97
- config: {}
98
- - id: reviewer-bot
99
- name: "@pi-harness/plugin-reviewer-bot"
100
- config: {}
101
- - id: auto-mode
102
- name: "@pi-harness/plugin-auto-mode"
103
- config: {}
104
- - id: plan-execute
105
- name: "@pi-harness/plugin-plan-execute"
106
- config: {}
107
- - id: plugin-finder
108
- name: "@pi-harness/plugin-plugin-finder"
109
- config: {}
110
- - id: memory
111
- name: "@pi-harness/plugin-memory"
112
- config: {}
113
- - id: graph-memory
114
- name: "@pi-harness/plugin-graph-memory"
115
- config: {}
116
- - id: taskboard
117
- name: "@pi-harness/plugin-taskboard"
118
- config: {}
119
- - id: synapse
120
- name: "@pi-harness/plugin-synapse"
121
- config: {}
122
- - id: hol-guard
123
- name: "@pi-harness/plugin-hol-guard"
124
- config: {}
125
- - id: plugin-radar
126
- name: "@pi-harness/plugin-plugin-radar"
127
- config: {}
128
- - id: plugin-stars
129
- name: "@pi-harness/plugin-plugin-stars"
130
- config: {}
131
- - id: plugin-check
132
- name: "@pi-harness/plugin-plugin-check"
133
- config: {}
134
- - id: annotation
135
- name: "@pi-harness/plugin-annotation"
136
- config: {}
137
- - id: cost-meter
138
- name: "@pi-harness/plugin-cost-meter"
139
- config:
140
- dailyBudget: 0
141
- - id: undo-savepoint
142
- name: "@pi-harness/plugin-undo-savepoint"
143
- config: {}
144
- - id: skill-catalog
145
- name: "@pi-harness/plugin-skill-catalog"
146
- config: {}
147
- - id: canvas-draw
148
- name: "@pi-harness/plugin-canvas-draw"
149
- config: {}
150
- - id: image-compressor
151
- name: "@pi-harness/plugin-image-compressor"
152
- config: {}
153
- - id: workspace-search
154
- name: "@pi-harness/plugin-workspace-search"
155
- config: {}
156
- - id: prompt-guard
157
- name: "@pi-harness/plugin-prompt-guard"
158
- config: {}
159
- - id: code2skill
160
- name: "@pi-harness/plugin-code2skill"
161
- config: {}
162
- - id: tab-manager
163
- name: "@pi-harness/plugin-tab-manager"
164
- config: {}
165
- - id: genui
166
- name: "@pi-harness/plugin-genui"
167
- config: {}
168
- - id: anchored-standard
169
- name: "@pi-harness/plugin-anchored-standard"
170
- config: {}
171
- - id: telemetry-blocker
172
- name: "@pi-harness/plugin-telemetry-blocker"
173
- config: {}
174
- - id: change-verifier
175
- name: "@pi-harness/plugin-change-verifier"
176
- config: {}
177
- - id: context
178
- name: "@pi-harness/plugin-context"
179
- config: {}
180
29
  - id: runtime
181
30
  name: "@pi-harness/core/plugins/runtime"
182
31
  config:
183
32
  thinkingLevel: medium
184
- - id: plugin-dev
185
- name: "@pi-harness/plugin-plugin-dev"
186
- config: {}
187
- - id: openpets
188
- name: "@pi-harness/plugin-openpets"
189
- config: {}
190
- - id: session-bridge
191
- name: "@pi-harness/plugin-session-bridge"
192
- config: {}
193
- - id: skill-guard
194
- name: "@pi-harness/plugin-skill-guard"
195
- config: {}
196
- - id: recall-unread
197
- name: "@pi-harness/plugin-recall-unread"
198
- config: {}
199
- - id: turn-rewind
200
- name: "@pi-harness/plugin-turn-rewind"
201
- config: {}
202
- - id: session-export
203
- name: "@pi-harness/plugin-session-export"
204
- config: {}
205
- - id: session-search
206
- name: "@pi-harness/plugin-session-search"
207
- config: {}
208
- - id: session-compare
209
- name: "@pi-harness/plugin-session-compare"
210
- config: {}
211
- - id: secure-audit
212
- name: "@pi-harness/plugin-secure-audit"
213
- config: {}
214
- - id: session-bookmarks
215
- name: "@pi-harness/plugin-session-bookmarks"
216
- config: {}
217
- - id: llm-verifier
218
- name: "@pi-harness/plugin-llm-verifier"
219
- config: {}
220
- - id: module-search
221
- name: "@pi-harness/plugin-module-search"
222
- config: {}
223
- - id: workspace-navigator
224
- name: "@pi-harness/plugin-workspace-navigator"
225
- config: {}
226
- - id: better-sidebar
227
- name: "@pi-harness/plugin-better-sidebar"
228
- config: {}
229
- - id: archify
230
- name: "@pi-harness/plugin-archify"
231
- config: {}
232
- - id: reverse-skill
233
- name: "@pi-harness/plugin-reverse-skill"
234
- config: {}
235
- - id: colleague-skill
236
- name: "@pi-harness/plugin-colleague-skill"
237
- config: {}
238
- - id: prompt-library
239
- name: "@pi-harness/plugin-prompt-library"
240
- config: {}
241
- - id: token-guard
242
- name: "@pi-harness/plugin-token-guard"
243
- config:
244
- maxPercent: 90
245
- - id: fail-logger
246
- name: "@pi-harness/plugin-fail-logger"
247
- config: {}
248
- - id: vision-toolkit
249
- name: "@pi-harness/plugin-vision-toolkit"
250
- config: {}
251
- - id: runtime-doctor
252
- name: "@pi-harness/plugin-runtime-doctor"
253
- config: {}
254
33
  - id: webserver
255
34
  name: "@pi-harness/host-webserver"
256
35
  config:
@@ -63,11 +63,19 @@ const processExit = new Promise((resolve) => {
63
63
  });
64
64
  let harness;
65
65
  const exitCodeFor = (signal) => (signal === "SIGINT" ? 130 : signal === "SIGHUP" ? 129 : 143);
66
+ // The Cordis loader wraps this failure in its own entry path and stack, none of which a user with an unprovisioned agent directory can act on, so the recognized case reports the remedy first and keeps exactly one line naming the model that is missing. Every other failure is still reported in full, because nothing here knows what it means.
67
+ const UNREGISTERED_EVERYAPI_MODEL = /Pi model is not registered: (everyapi\/[^\s"'`,;)\]]+)/u;
68
+ // This launcher takes no arguments and has no help output, so the one place a user can learn that the frames are still available is the failure that dropped them.
69
+ const DEBUG_HINT = "Set PI_HARNESS_DEBUG=1 and start again to keep the stack frames.";
66
70
  const formatStartupError = (error) => {
67
71
  const message = error instanceof Error ? error.message : String(error);
68
- if (!/Pi model is not registered: everyapi\//u.test(message))
69
- return message;
70
- return `${message}\n\nThe EveryAPI model catalog is not provisioned in PI_AGENT_DIR. Start with \`everyapi use pi-harness\`, or set PI_HARNESS_PROVIDER and PI_HARNESS_MODEL to a model already registered in that agent directory.`;
72
+ const debug = process.env.PI_HARNESS_DEBUG === "1";
73
+ const unregistered = UNREGISTERED_EVERYAPI_MODEL.exec(message);
74
+ if (unregistered === null)
75
+ return debug ? message : `${message}\n${DEBUG_HINT}`;
76
+ const remedy = `The EveryAPI model catalog is not provisioned in PI_AGENT_DIR. Start with \`everyapi use pi-harness\`, or set PI_HARNESS_PROVIDER and PI_HARNESS_MODEL to a model already registered in that agent directory.`;
77
+ // Under the debug flag the message already carries the frames bootHarness kept, and a reader who asked for them wants the remedy as well as the detail, not instead of it.
78
+ return debug ? `${remedy}\n${message}` : `${remedy}\nPi model is not registered: ${unregistered[1]}`;
71
79
  };
72
80
  const shutdown = async (signal) => {
73
81
  if (shuttingDown)
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/server/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC9G,OAAO,4BAA4B,CAAC;AAMpC,kSAAkS;AAClS,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACrC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAErC,6LAA6L;AAC7L,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,WAAW,CAAC;AAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/F,MAAM,uBAAuB,GAAG,IAAI,CAAC;AACrC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC;AAC5E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM;IAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AACpI,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1E,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG;IACzE,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;AACpH,qLAAqL;AACrL,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;KAC9D,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,uOAAuO;AACvO,MAAM,cAAc,GAAG,CAAC,KAAa,EAAW,EAAE;IAChD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACzG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;AAC9J,CAAC,CAAC;AACF,MAAM,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAChF,IAAI,kBAAkB,KAAK,SAAS;IAClC,MAAM,IAAI,KAAK,CAAC,0FAA0F,GAAG,kBAAkB,CAAC,CAAC;AACnI,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC1B,gQAAgQ;AAChQ,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;AAC5D,MAAM,QAAQ,GAAG,kBAAkB,KAAK,SAAS,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;AAC1J,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,MAAM,kBAAkB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5F,8PAA8P;AAC9P,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AACjG,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,SAAS,CAAC;AAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC;AACnC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,GAAG,EAAE,CAAC;IACxD,KAAK,gBAAgB,EAAE,CAAC,IAAI,CAC1B,CAAC,MAAM,EAAE,EAAE;QACT,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC,EACD,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;AACJ,CAAC;AACD,MAAM,OAAO,GAAqB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzH,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;AAC3C,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,IAAI,WAAqC,CAAC;AAC1C,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;IAChD,WAAW,GAAG,OAAO,CAAC;AACxB,CAAC,CAAC,CAAC;AACH,IAAI,OAA4D,CAAC;AACjE,MAAM,WAAW,GAAG,CAAC,MAAsB,EAAU,EAAE,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACtH,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAU,EAAE;IACpD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,CAAC,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7E,OAAO,GAAG,OAAO,mNAAmN,CAAC;AACvO,CAAC,CAAC;AACF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAsB,EAAiB,EAAE;IAC/D,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,IAAI,CAAC;IACpB,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,QAAoC,CAAC;QACzC,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1B,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC,CAAC;YACF,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC,CAAC;SACH,CAAC,CAAC;QACH,2GAA2G;QAC3G,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;IACH,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,EAAE,EAAE,CAAC;AAClB,CAAC,CAAC;AACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;IAC7B,2aAA2a;IAC3a,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AACD,IAAI,CAAC;IACH,OAAO,GAAG,MAAM,WAAW,CAAC;QAC1B,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,OAAO,CAAC,OAAO;YACb,oBAAoB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,KAAI,CAAC,EAAE,CAAC,CAAC;QACxG,CAAC;KACF,CAAC,CAAC;IACH,MAAM,SAAS,GAAI,OAAO,CAAC,OAAoE,CAAC,SAAS,CAAC;IAC1G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,GAAG,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACxE,MAAM,WAAW,CAAC;AACpB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/server/bin.ts"],"names":[],"mappings":"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"}
@@ -70,10 +70,18 @@ const processExit = new Promise<void>((resolve) => {
70
70
  });
71
71
  let harness: Awaited<ReturnType<typeof bootHarness>> | undefined;
72
72
  const exitCodeFor = (signal: NodeJS.Signals): number => (signal === "SIGINT" ? 130 : signal === "SIGHUP" ? 129 : 143);
73
+ // The Cordis loader wraps this failure in its own entry path and stack, none of which a user with an unprovisioned agent directory can act on, so the recognized case reports the remedy first and keeps exactly one line naming the model that is missing. Every other failure is still reported in full, because nothing here knows what it means.
74
+ const UNREGISTERED_EVERYAPI_MODEL = /Pi model is not registered: (everyapi\/[^\s"'`,;)\]]+)/u;
75
+ // This launcher takes no arguments and has no help output, so the one place a user can learn that the frames are still available is the failure that dropped them.
76
+ const DEBUG_HINT = "Set PI_HARNESS_DEBUG=1 and start again to keep the stack frames.";
73
77
  const formatStartupError = (error: unknown): string => {
74
78
  const message = error instanceof Error ? error.message : String(error);
75
- if (!/Pi model is not registered: everyapi\//u.test(message)) return message;
76
- return `${message}\n\nThe EveryAPI model catalog is not provisioned in PI_AGENT_DIR. Start with \`everyapi use pi-harness\`, or set PI_HARNESS_PROVIDER and PI_HARNESS_MODEL to a model already registered in that agent directory.`;
79
+ const debug = process.env.PI_HARNESS_DEBUG === "1";
80
+ const unregistered = UNREGISTERED_EVERYAPI_MODEL.exec(message);
81
+ if (unregistered === null) return debug ? message : `${message}\n${DEBUG_HINT}`;
82
+ const remedy = `The EveryAPI model catalog is not provisioned in PI_AGENT_DIR. Start with \`everyapi use pi-harness\`, or set PI_HARNESS_PROVIDER and PI_HARNESS_MODEL to a model already registered in that agent directory.`;
83
+ // Under the debug flag the message already carries the frames bootHarness kept, and a reader who asked for them wants the remedy as well as the detail, not instead of it.
84
+ return debug ? `${remedy}\n${message}` : `${remedy}\nPi model is not registered: ${unregistered[1]}`;
77
85
  };
78
86
  const shutdown = async (signal: NodeJS.Signals): Promise<void> => {
79
87
  if (shuttingDown) return;
@@ -557,6 +557,9 @@ button:disabled {
557
557
  .pending-turn .user-bubble {
558
558
  @apply [opacity:0.72];
559
559
  }
560
+ .turn-stopped {
561
+ @apply [display:inline-block] [margin:8px_0_0] [border:1px_solid_rgba(236,_19,_19,_0.24)] [border-radius:6px] [padding:1px_7px] [color:var(--color-red)] [font:10.5px_var(--font-mono)];
562
+ }
560
563
  .turn-markdown {
561
564
  @apply [margin:0] [min-width:0] [font-size:13.5px] [line-height:1.78];
562
565
  }
@@ -811,6 +814,10 @@ button:disabled {
811
814
  .tool-chip {
812
815
  @apply [padding:0_9px] [color:#61666b] [font-family:var(--font-sans)] [font-size:11.5px];
813
816
  }
817
+ /* Chrome and Safari drop pointer events on a disabled control and never show its title, so the chip's explanation of why it is dead sits on this wrapper instead. */
818
+ .tool-chip-hint {
819
+ @apply [display:inline-flex] [min-width:0];
820
+ }
814
821
  .composer-hint {
815
822
  @apply [flex:1] [color:#687381] [font:10px_var(--font-mono)] [text-align:right];
816
823
  }
@@ -1652,7 +1659,7 @@ button:disabled {
1652
1659
  .main-header .active-heading small {
1653
1660
  @apply [display:none];
1654
1661
  }
1655
- .run-indicator {
1662
+ .run-indicator > span:not(.run-dot) {
1656
1663
  @apply [display:none];
1657
1664
  }
1658
1665
  .view-tab {
@@ -1890,6 +1897,25 @@ button:disabled {
1890
1897
  .marketplace-count {
1891
1898
  @apply [margin-left:auto] [color:var(--color-faint)] [font:10.5px_var(--font-mono)];
1892
1899
  }
1900
+ .marketplace-toolbar-message {
1901
+ @apply [display:grid] [min-width:0] [flex-basis:100%] [gap:6px];
1902
+ }
1903
+ /* The region has to stay in the accessibility tree between messages, or the screen reader has nothing to attach the next announcement to, so an empty one is collapsed to nothing instead of being removed with display:none. */
1904
+ .marketplace-toolbar-message:empty {
1905
+ @apply [flex-basis:0] [gap:0];
1906
+ }
1907
+ .marketplace-message {
1908
+ @apply [display:flex] [min-width:0] [flex-wrap:wrap] [align-items:center] [gap:8px] [border-radius:8px] [padding:8px_10px] [font-size:11.5px] [line-height:1.7];
1909
+ }
1910
+ .marketplace-message.notice {
1911
+ @apply [border:1px_solid_rgba(65,_118,_230,_0.28)] [background:#f4f8ff] [color:#3565c5];
1912
+ }
1913
+ .marketplace-message.error {
1914
+ @apply [border:1px_solid_rgba(185,_28,_28,_0.24)] [background:#fff5f5] [color:var(--color-red)];
1915
+ }
1916
+ .marketplace-message-dismiss {
1917
+ @apply [flex:none] [margin-left:auto] [border:1px_solid_currentColor] [border-radius:6px] [padding:2px_8px] [font-size:11px];
1918
+ }
1893
1919
  .marketplace-categories {
1894
1920
  @apply [display:flex] [min-width:0] [flex:1] [flex-wrap:nowrap] [gap:4px] [overflow-x:auto] [padding:8px_48px_8px_24px] [background:#fff] [scrollbar-width:none];
1895
1921
  }
@@ -2041,6 +2067,9 @@ button:disabled {
2041
2067
  .plugin-action-error {
2042
2068
  @apply [margin:10px_0_0_37px] [color:var(--color-red)] [font-size:11px];
2043
2069
  }
2070
+ .plugin-action-notice {
2071
+ @apply [margin:10px_0_0_37px] [color:#8a5a00] [font-size:11px];
2072
+ }
2044
2073
  .plugin-confirm-backdrop {
2045
2074
  @apply [position:fixed] [inset:0] [z-index:60] [display:grid] [place-items:center] [padding:24px] [background:rgba(15,_23,_42,_0.32)] [backdrop-filter:blur(6px)];
2046
2075
  }
@@ -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;;;;mBA4sBlC,OAAO;;AAHxB,wBAg4CE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;;;;mBA2vBlC,OAAO;;AAHxB,wBA+4CE"}
@@ -3,10 +3,12 @@ import { mkdir, mkdtemp, readFile, realpath, rename, rm, stat, unlink, writeFile
3
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
- import { atomicWriteFile } from "@pi-harness/core";
6
+ import { atomicWriteFile, isPiToolRegistryLeasedError } from "@pi-harness/core";
7
7
  import { MARKETPLACE_CAPABILITIES, MARKETPLACE_CATEGORIES, MARKETPLACE_PLUGINS, attachMarketplaceStatistics, createMarketplaceStatisticsLoader, paginateMarketplace, searchMarketplace, marketplaceNpmPackageName, sortMarketplaceByRecommendation, } from "./marketplace.js";
8
8
  import { parseGitWorktrees } from "./workspaces.js";
9
- const loadMarketplaceStatistics = createMarketplaceStatisticsLoader();
9
+ // The first paint waits for every console endpoint to answer, so the catalogue is sorted from whatever npm statistics are already cached and the misses are warmed in the background instead of held on to.
10
+ const { readCached: readCachedMarketplaceStatistics } = createMarketplaceStatisticsLoader();
11
+ const RUNTIME_ENTRY_NAME = "@pi-harness/core/plugins/runtime";
10
12
  const DEFAULT_BODY_LIMIT_BYTES = 64 * 1024;
11
13
  const IMPORT_CONTENT_LIMIT_BYTES = 10 * 1024 * 1024;
12
14
  // The import body carries the JSONL content as a JSON string, so quotes and newlines are escaped; leave headroom above the content limit for that overhead.
@@ -14,6 +16,8 @@ const IMPORT_BODY_LIMIT_BYTES = 16 * 1024 * 1024;
14
16
  // Retained trajectory events are replayed to every SSE client and returned by /api/session, so the array must stay bounded.
15
17
  const MAX_RETAINED_EVENTS = 2000;
16
18
  const GIT_TIMEOUT_MS = 15_000;
19
+ const PROCESS_FAILURE_TEXT_LIMIT = 400;
20
+ const PROCESS_TIMEOUT_MS = 120_000;
17
21
  // 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
22
  const GIT_MUTATION_TIMEOUT_MS = 120_000;
19
23
  class PayloadTooLargeError extends Error {
@@ -70,10 +74,13 @@ function jsonSafe(value, seen = new WeakSet()) {
70
74
  seen.delete(value);
71
75
  }
72
76
  }
77
+ // A plugin that contributes tools only joins on the next start, so the console remembers what it installed until then. That memory is about one particular process, and the console cannot tell a restart from a reconnect on its own, so the identity of this process rides along with the status it already polls.
78
+ const PROCESS_STARTED_AT = new Date(Date.now() - Math.round(process.uptime() * 1000)).toISOString();
73
79
  function createStatus(services, events) {
74
80
  const activeModel = services.runtime.session.model ?? services.models.model;
75
81
  const cwd = activeCwd(services);
76
82
  return {
83
+ processStartedAt: PROCESS_STARTED_AT,
77
84
  status: services.runtime.session.isStreaming ? "running" : "ready",
78
85
  model: activeModel.provider + "/" + activeModel.id,
79
86
  messages: services.runtime.session.messages.length,
@@ -423,26 +430,49 @@ function registerPluginPanels(context, services) {
423
430
  ];
424
431
  return () => disposers.reverse().forEach((dispose) => dispose());
425
432
  }
433
+ // npm ends every failure with the path to a debug log inside its own cache, which the reader of this console has no reason to open and no easy way to reach.
434
+ const PROCESS_FAILURE_NOISE = /^npm (error|ERR!) A complete log of this run can be found in:/u;
435
+ // npm reports a failure over many lines and the whole text is shown to someone who never typed the command, so the lines are joined up to a character budget and the command itself stays on the cause for diagnostics. Node's own message is never used as the fallback: it reads `Command failed: <the whole command line>`, which is exactly what this is removing.
436
+ function processFailureText(executable, stderr, error) {
437
+ const text = stderr
438
+ .split(/\r?\n/u)
439
+ .map((line) => line.trim())
440
+ .filter((line) => line !== "" && !PROCESS_FAILURE_NOISE.test(line))
441
+ .join(" ");
442
+ if (text === "")
443
+ return error.killed === true
444
+ ? `${executable} was stopped after ${PROCESS_TIMEOUT_MS / 1000}s`
445
+ : `${executable} exited with code ${error.code ?? "unknown"} and reported nothing`;
446
+ return text.length <= PROCESS_FAILURE_TEXT_LIMIT ? text : text.slice(0, PROCESS_FAILURE_TEXT_LIMIT) + "…";
447
+ }
426
448
  function runProcess(executable, args, cwd) {
427
449
  return new Promise((resolveProcess, rejectProcess) => {
428
- execFile(executable, [...args], { cwd, timeout: 120_000, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
450
+ execFile(executable, [...args], { cwd, timeout: PROCESS_TIMEOUT_MS, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
429
451
  if (error) {
430
- rejectProcess(new Error(`${executable} ${args.join(" ")} failed: ${stderr || error.message}`, { cause: error }));
452
+ rejectProcess(new Error(processFailureText(executable, stderr, error), { cause: { command: `${executable} ${args.join(" ")}`, error } }));
431
453
  return;
432
454
  }
433
455
  resolveProcess({ stdout, stderr });
434
456
  });
435
457
  });
436
458
  }
437
- async function appendMarketplaceProfile(configPath, plugin) {
459
+ // A plugin registers its tools before pi-runtime acquires the tool registry, so an installed entry has to sit in the runtime's own group ahead of the runtime. Appended at the end of the profile it would load after the runtime and fail on every subsequent start.
460
+ function marketplaceProfileEntry(plugin, indent) {
461
+ const child = `${indent} `;
462
+ const group = plugin.profile.group === true ? `\n${child}group: true` : "";
463
+ return `${indent}- id: marketplace-${plugin.id}\n${child}name: ${JSON.stringify(plugin.packageName)}${group}\n${child}config: ${JSON.stringify(plugin.profile.config)}\n`;
464
+ }
465
+ async function appendMarketplaceProfile(configPath, plugin, beforeEntryId) {
438
466
  const source = await readFile(configPath, "utf8");
439
467
  if (source.includes(`name: ${JSON.stringify(plugin.packageName)}`))
440
468
  return source;
441
- const entryId = `marketplace-${plugin.id}`;
442
- const config = JSON.stringify(plugin.profile.config);
443
- const group = plugin.profile.group === true ? "\n group: true" : "";
444
- const entry = `\n- id: ${entryId}\n name: ${JSON.stringify(plugin.packageName)}${group}\n config: ${config}\n`;
445
- await writeFile(configPath, source.replace(/\s*$/, "") + entry, "utf8");
469
+ const anchor = beforeEntryId === undefined ? null : source.match(new RegExp(`^([ \\t]*)- id: ${beforeEntryId.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")}[ \\t]*$`, "mu"));
470
+ if (anchor === null) {
471
+ await writeFile(configPath, `${source.replace(/\s*$/u, "")}\n${marketplaceProfileEntry(plugin, "")}`, "utf8");
472
+ return source;
473
+ }
474
+ const start = anchor.index ?? 0;
475
+ await writeFile(configPath, source.slice(0, start) + marketplaceProfileEntry(plugin, anchor[1] ?? "") + source.slice(start), "utf8");
446
476
  return source;
447
477
  }
448
478
  async function updateMarketplaceProfile(configPath, entryId, update) {
@@ -602,6 +632,17 @@ async function marketplaceInstallDirectory(configPath, fallback) {
602
632
  }
603
633
  return fallback;
604
634
  }
635
+ // Where an installed plugin belongs in the running loader: inside the group that owns pi-runtime, immediately ahead of it. A profile without a runtime entry (the stdio CLI profile does have one, a hand-written profile may not) places the entry at the end of the root instead.
636
+ function runtimePlacement(loader) {
637
+ const entries = [...loader.entries()];
638
+ const runtime = entries.find((entry) => entry.options.name === RUNTIME_ENTRY_NAME);
639
+ if (runtime === undefined)
640
+ return undefined;
641
+ const group = entries.find((entry) => entry.subgroup === runtime.parent);
642
+ const position = runtime.parent.data.indexOf(runtime.options);
643
+ // The loader addresses a nested group by its qualified id (`profile:agent`), while the profile file names the entry by its own id.
644
+ return { groupEntryId: group?.id ?? null, position: position < 0 ? Infinity : position, beforeEntryId: runtime.options.id };
645
+ }
605
646
  function pickDirectory() {
606
647
  return new Promise((resolvePath, reject) => {
607
648
  execFile("osascript", ["-e", 'POSIX path of (choose folder with prompt "选择 Pi 工作区")'], { timeout: 120_000, maxBuffer: 64 * 1024 }, (error, stdout, stderr) => {
@@ -982,7 +1023,7 @@ export default {
982
1023
  });
983
1024
  const disposeMarketplace = services.webServer.register({
984
1025
  path: "/api/marketplace",
985
- async handler(request, response) {
1026
+ handler(request, response) {
986
1027
  if (request.method !== "GET") {
987
1028
  sendJson(response, 405, { error: "Method not allowed" });
988
1029
  return;
@@ -1007,9 +1048,9 @@ export default {
1007
1048
  return;
1008
1049
  }
1009
1050
  const filtered = searchMarketplace(query, capability, category);
1010
- const items = sort === "recommended"
1011
- ? sortMarketplaceByRecommendation(attachMarketplaceStatistics(filtered, await loadMarketplaceStatistics(MARKETPLACE_PLUGINS)))
1012
- : filtered;
1051
+ const cached = readCachedMarketplaceStatistics(MARKETPLACE_PLUGINS);
1052
+ // Recommendation is only applied once the whole catalogue has been looked up. Scoring a half-warm cache would reorder the grid under the reader's cursor on every poll as the background lookups land, which costs more than the few seconds the first sort is delayed.
1053
+ const items = sort === "recommended" && cached.ready ? sortMarketplaceByRecommendation(attachMarketplaceStatistics(filtered, cached.statistics)) : filtered;
1013
1054
  sendJson(response, 200, {
1014
1055
  ...paginateMarketplace(items, page, pageSize),
1015
1056
  capabilities: MARKETPLACE_CAPABILITIES,
@@ -1057,27 +1098,33 @@ export default {
1057
1098
  const packageLockPath = join(installDirectory, "package-lock.json");
1058
1099
  const packageJsonBefore = await readFile(packageJsonPath, "utf8").catch(() => undefined);
1059
1100
  const packageLockBefore = await readFile(packageLockPath, "utf8").catch(() => undefined);
1101
+ const placement = runtimePlacement(loader);
1060
1102
  let profileBefore;
1061
1103
  let entryId;
1062
1104
  try {
1063
1105
  const specifier = `${marketplaceNpmPackageName(plugin.packageName)}@${plugin.version}`;
1064
1106
  await runProcess("npm", ["install", "--save-exact", "--package-lock=false", specifier], installDirectory);
1065
- profileBefore = await appendMarketplaceProfile(configPath, plugin);
1107
+ profileBefore = await appendMarketplaceProfile(configPath, plugin, placement?.beforeEntryId);
1066
1108
  entryId = await loader.create({
1067
1109
  id: `marketplace-${plugin.id}`,
1068
1110
  name: plugin.packageName,
1069
1111
  ...(plugin.profile.group === true ? { group: true } : {}),
1070
1112
  config: plugin.profile.config,
1071
- });
1113
+ }, placement?.groupEntryId ?? null, placement?.position ?? Infinity);
1072
1114
  const entry = loader.resolve(entryId);
1073
1115
  if (entry.fiber === undefined)
1074
1116
  throw new Error(`Plugin ${plugin.packageName} did not create a runtime fiber`);
1075
1117
  await entry.fiber.await();
1076
- sendJson(response, 200, { plugin, installed: true });
1118
+ sendJson(response, 200, { plugin, installed: true, restartRequired: false });
1077
1119
  }
1078
1120
  catch (error) {
1079
1121
  if (entryId !== undefined)
1080
1122
  await loader.remove(entryId).catch(() => { });
1123
+ // The runtime holds the tool registry for its whole life and snapshots the tool set when it takes it, so a plugin that contributes tools cannot join a harness that is already running. The package and its profile entry stay in place and the plugin arrives on the next start; rolling the install back would leave the user unable to install it at all.
1124
+ if (isPiToolRegistryLeasedError(error)) {
1125
+ sendJson(response, 200, { plugin, installed: true, restartRequired: true });
1126
+ return;
1127
+ }
1081
1128
  if (profileBefore !== undefined)
1082
1129
  await writeFile(configPath, profileBefore, "utf8").catch(() => { });
1083
1130
  // A manifest npm created for this install is removed rather than left behind; restoring is only possible when one existed before.
@@ -1138,9 +1185,14 @@ export default {
1138
1185
  const before = await updateMarketplaceProfile(configPath, profileEntryId, { disabled: !payload.enabled });
1139
1186
  try {
1140
1187
  await entry.update({ disabled: !payload.enabled });
1141
- sendJson(response, 200, { plugin: pluginSummary(entry) });
1188
+ sendJson(response, 200, { plugin: pluginSummary(entry), restartRequired: false });
1142
1189
  }
1143
1190
  catch (error) {
1191
+ // Re-enabling a plugin that contributes tools cannot take effect in a harness the runtime already leased, so the profile keeps the change and the plugin comes back on the next start. Reverting it would leave a plugin that can be switched off but never on again.
1192
+ if (isPiToolRegistryLeasedError(error)) {
1193
+ sendJson(response, 200, { plugin: pluginSummary(entry), restartRequired: true });
1194
+ return;
1195
+ }
1144
1196
  await writeFile(configPath, before, "utf8").catch(() => { });
1145
1197
  sendJson(response, 502, { error: errorText(error) });
1146
1198
  }