@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
@@ -6,7 +6,7 @@ import { tmpdir } from "node:os";
6
6
  import type { Context } from "@deepseek-ai/cordis";
7
7
  import { SessionManager, type AgentSessionEvent, type ExtensionUIContext } from "@earendil-works/pi-coding-agent";
8
8
  import type Loader from "@deepseek-ai/cordis-plugin-loader";
9
- import { atomicWriteFile } from "@pi-harness/core";
9
+ import { atomicWriteFile, isPiToolRegistryLeasedError } from "@pi-harness/core";
10
10
  import type { PiPluginUiRegistry, PiRuntimeService, PiModelsService, PiHarnessLaunch } from "@pi-harness/core";
11
11
  import type { WebServer } from "@pi-harness/host-webserver";
12
12
  import {
@@ -32,7 +32,10 @@ interface ApiServices {
32
32
  readonly pluginUi: PiPluginUiRegistry | undefined;
33
33
  }
34
34
 
35
- const loadMarketplaceStatistics = createMarketplaceStatisticsLoader();
35
+ // 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.
36
+ const { readCached: readCachedMarketplaceStatistics } = createMarketplaceStatisticsLoader();
37
+
38
+ const RUNTIME_ENTRY_NAME = "@pi-harness/core/plugins/runtime";
36
39
 
37
40
  const DEFAULT_BODY_LIMIT_BYTES = 64 * 1024;
38
41
  const IMPORT_CONTENT_LIMIT_BYTES = 10 * 1024 * 1024;
@@ -41,6 +44,8 @@ const IMPORT_BODY_LIMIT_BYTES = 16 * 1024 * 1024;
41
44
  // Retained trajectory events are replayed to every SSE client and returned by /api/session, so the array must stay bounded.
42
45
  const MAX_RETAINED_EVENTS = 2000;
43
46
  const GIT_TIMEOUT_MS = 15_000;
47
+ const PROCESS_FAILURE_TEXT_LIMIT = 400;
48
+ const PROCESS_TIMEOUT_MS = 120_000;
44
49
  // 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.
45
50
  const GIT_MUTATION_TIMEOUT_MS = 120_000;
46
51
 
@@ -93,10 +98,14 @@ function jsonSafe(value: unknown, seen = new WeakSet<object>()): unknown {
93
98
  }
94
99
  }
95
100
 
101
+ // 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.
102
+ const PROCESS_STARTED_AT = new Date(Date.now() - Math.round(process.uptime() * 1000)).toISOString();
103
+
96
104
  function createStatus(services: ApiServices, events: readonly AgentSessionEvent[]) {
97
105
  const activeModel = services.runtime.session.model ?? services.models.model;
98
106
  const cwd = activeCwd(services);
99
107
  return {
108
+ processStartedAt: PROCESS_STARTED_AT,
100
109
  status: services.runtime.session.isStreaming ? "running" : "ready",
101
110
  model: activeModel.provider + "/" + activeModel.id,
102
111
  messages: services.runtime.session.messages.length,
@@ -468,11 +477,28 @@ function registerPluginPanels(context: Context, services: ApiServices): () => vo
468
477
  return () => disposers.reverse().forEach((dispose) => dispose());
469
478
  }
470
479
 
480
+ // 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.
481
+ const PROCESS_FAILURE_NOISE = /^npm (error|ERR!) A complete log of this run can be found in:/u;
482
+
483
+ // 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.
484
+ function processFailureText(executable: string, stderr: string, error: ExecFileException): string {
485
+ const text = stderr
486
+ .split(/\r?\n/u)
487
+ .map((line) => line.trim())
488
+ .filter((line) => line !== "" && !PROCESS_FAILURE_NOISE.test(line))
489
+ .join(" ");
490
+ if (text === "")
491
+ return error.killed === true
492
+ ? `${executable} was stopped after ${PROCESS_TIMEOUT_MS / 1000}s`
493
+ : `${executable} exited with code ${error.code ?? "unknown"} and reported nothing`;
494
+ return text.length <= PROCESS_FAILURE_TEXT_LIMIT ? text : text.slice(0, PROCESS_FAILURE_TEXT_LIMIT) + "…";
495
+ }
496
+
471
497
  function runProcess(executable: string, args: readonly string[], cwd: string): Promise<{ stdout: string; stderr: string }> {
472
498
  return new Promise((resolveProcess, rejectProcess) => {
473
- execFile(executable, [...args], { cwd, timeout: 120_000, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
499
+ execFile(executable, [...args], { cwd, timeout: PROCESS_TIMEOUT_MS, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
474
500
  if (error) {
475
- rejectProcess(new Error(`${executable} ${args.join(" ")} failed: ${stderr || error.message}`, { cause: error }));
501
+ rejectProcess(new Error(processFailureText(executable, stderr, error), { cause: { command: `${executable} ${args.join(" ")}`, error } }));
476
502
  return;
477
503
  }
478
504
  resolveProcess({ stdout, stderr });
@@ -480,14 +506,24 @@ function runProcess(executable: string, args: readonly string[], cwd: string): P
480
506
  });
481
507
  }
482
508
 
483
- async function appendMarketplaceProfile(configPath: string, plugin: MarketplacePlugin): Promise<string> {
509
+ // 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.
510
+ function marketplaceProfileEntry(plugin: MarketplacePlugin, indent: string): string {
511
+ const child = `${indent} `;
512
+ const group = plugin.profile.group === true ? `\n${child}group: true` : "";
513
+ return `${indent}- id: marketplace-${plugin.id}\n${child}name: ${JSON.stringify(plugin.packageName)}${group}\n${child}config: ${JSON.stringify(plugin.profile.config)}\n`;
514
+ }
515
+
516
+ async function appendMarketplaceProfile(configPath: string, plugin: MarketplacePlugin, beforeEntryId?: string): Promise<string> {
484
517
  const source = await readFile(configPath, "utf8");
485
518
  if (source.includes(`name: ${JSON.stringify(plugin.packageName)}`)) return source;
486
- const entryId = `marketplace-${plugin.id}`;
487
- const config = JSON.stringify(plugin.profile.config);
488
- const group = plugin.profile.group === true ? "\n group: true" : "";
489
- const entry = `\n- id: ${entryId}\n name: ${JSON.stringify(plugin.packageName)}${group}\n config: ${config}\n`;
490
- await writeFile(configPath, source.replace(/\s*$/, "") + entry, "utf8");
519
+ const anchor =
520
+ beforeEntryId === undefined ? null : source.match(new RegExp(`^([ \\t]*)- id: ${beforeEntryId.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")}[ \\t]*$`, "mu"));
521
+ if (anchor === null) {
522
+ await writeFile(configPath, `${source.replace(/\s*$/u, "")}\n${marketplaceProfileEntry(plugin, "")}`, "utf8");
523
+ return source;
524
+ }
525
+ const start = anchor.index ?? 0;
526
+ await writeFile(configPath, source.slice(0, start) + marketplaceProfileEntry(plugin, anchor[1] ?? "") + source.slice(start), "utf8");
491
527
  return source;
492
528
  }
493
529
 
@@ -683,6 +719,17 @@ async function marketplaceInstallDirectory(configPath: string, fallback: string)
683
719
  return fallback;
684
720
  }
685
721
 
722
+ // 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.
723
+ function runtimePlacement(loader: Loader): { groupEntryId: string | null; position: number; beforeEntryId: string } | undefined {
724
+ const entries = [...loader.entries()];
725
+ const runtime = entries.find((entry) => entry.options.name === RUNTIME_ENTRY_NAME);
726
+ if (runtime === undefined) return undefined;
727
+ const group = entries.find((entry) => entry.subgroup === runtime.parent);
728
+ const position = runtime.parent.data.indexOf(runtime.options);
729
+ // The loader addresses a nested group by its qualified id (`profile:agent`), while the profile file names the entry by its own id.
730
+ return { groupEntryId: group?.id ?? null, position: position < 0 ? Infinity : position, beforeEntryId: runtime.options.id };
731
+ }
732
+
686
733
  function pickDirectory(): Promise<string> {
687
734
  return new Promise((resolvePath, reject) => {
688
735
  execFile(
@@ -1073,7 +1120,7 @@ export default {
1073
1120
  });
1074
1121
  const disposeMarketplace = services.webServer.register({
1075
1122
  path: "/api/marketplace",
1076
- async handler(request, response) {
1123
+ handler(request, response) {
1077
1124
  if (request.method !== "GET") {
1078
1125
  sendJson(response, 405, { error: "Method not allowed" });
1079
1126
  return;
@@ -1100,10 +1147,10 @@ export default {
1100
1147
  return;
1101
1148
  }
1102
1149
  const filtered = searchMarketplace(query, capability, category);
1150
+ const cached = readCachedMarketplaceStatistics(MARKETPLACE_PLUGINS);
1151
+ // 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.
1103
1152
  const items =
1104
- sort === "recommended"
1105
- ? sortMarketplaceByRecommendation(attachMarketplaceStatistics(filtered, await loadMarketplaceStatistics(MARKETPLACE_PLUGINS)))
1106
- : filtered;
1153
+ sort === "recommended" && cached.ready ? sortMarketplaceByRecommendation(attachMarketplaceStatistics(filtered, cached.statistics)) : filtered;
1107
1154
  sendJson(response, 200, {
1108
1155
  ...paginateMarketplace(items, page, pageSize),
1109
1156
  capabilities: MARKETPLACE_CAPABILITIES,
@@ -1151,24 +1198,34 @@ export default {
1151
1198
  const packageLockPath = join(installDirectory, "package-lock.json");
1152
1199
  const packageJsonBefore = await readFile(packageJsonPath, "utf8").catch(() => undefined);
1153
1200
  const packageLockBefore = await readFile(packageLockPath, "utf8").catch(() => undefined);
1201
+ const placement = runtimePlacement(loader);
1154
1202
  let profileBefore: string | undefined;
1155
1203
  let entryId: string | undefined;
1156
1204
  try {
1157
1205
  const specifier = `${marketplaceNpmPackageName(plugin.packageName)}@${plugin.version}`;
1158
1206
  await runProcess("npm", ["install", "--save-exact", "--package-lock=false", specifier], installDirectory);
1159
- profileBefore = await appendMarketplaceProfile(configPath, plugin);
1160
- entryId = await loader.create({
1161
- id: `marketplace-${plugin.id}`,
1162
- name: plugin.packageName,
1163
- ...(plugin.profile.group === true ? { group: true } : {}),
1164
- config: plugin.profile.config,
1165
- } as never);
1207
+ profileBefore = await appendMarketplaceProfile(configPath, plugin, placement?.beforeEntryId);
1208
+ entryId = await loader.create(
1209
+ {
1210
+ id: `marketplace-${plugin.id}`,
1211
+ name: plugin.packageName,
1212
+ ...(plugin.profile.group === true ? { group: true } : {}),
1213
+ config: plugin.profile.config,
1214
+ } as never,
1215
+ placement?.groupEntryId ?? null,
1216
+ placement?.position ?? Infinity,
1217
+ );
1166
1218
  const entry = loader.resolve(entryId);
1167
1219
  if (entry.fiber === undefined) throw new Error(`Plugin ${plugin.packageName} did not create a runtime fiber`);
1168
1220
  await entry.fiber.await();
1169
- sendJson(response, 200, { plugin, installed: true });
1221
+ sendJson(response, 200, { plugin, installed: true, restartRequired: false });
1170
1222
  } catch (error) {
1171
1223
  if (entryId !== undefined) await loader.remove(entryId).catch(() => {});
1224
+ // 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.
1225
+ if (isPiToolRegistryLeasedError(error)) {
1226
+ sendJson(response, 200, { plugin, installed: true, restartRequired: true });
1227
+ return;
1228
+ }
1172
1229
  if (profileBefore !== undefined) await writeFile(configPath, profileBefore, "utf8").catch(() => {});
1173
1230
  // A manifest npm created for this install is removed rather than left behind; restoring is only possible when one existed before.
1174
1231
  if (packageJsonBefore === undefined) await unlink(packageJsonPath).catch(() => {});
@@ -1222,8 +1279,13 @@ export default {
1222
1279
  const before = await updateMarketplaceProfile(configPath, profileEntryId, { disabled: !payload.enabled });
1223
1280
  try {
1224
1281
  await entry.update({ disabled: !payload.enabled });
1225
- sendJson(response, 200, { plugin: pluginSummary(entry) });
1282
+ sendJson(response, 200, { plugin: pluginSummary(entry), restartRequired: false });
1226
1283
  } catch (error) {
1284
+ // 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.
1285
+ if (isPiToolRegistryLeasedError(error)) {
1286
+ sendJson(response, 200, { plugin: pluginSummary(entry), restartRequired: true });
1287
+ return;
1288
+ }
1227
1289
  await writeFile(configPath, before, "utf8").catch(() => {});
1228
1290
  sendJson(response, 502, { error: errorText(error) });
1229
1291
  }
@@ -13,7 +13,7 @@
13
13
  "id": "collaboration",
14
14
  "label": "会话协作"
15
15
  },
16
- "capabilities": ["collaboration ledger", "tasks", "mailbox notes", "dependency graph", "cycle detection"],
16
+ "capabilities": ["read-only", "session-data"],
17
17
  "hooks": ["session lifecycle", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-agent-teams",
@@ -13,7 +13,7 @@
13
13
  "id": "security",
14
14
  "label": "安全"
15
15
  },
16
- "capabilities": ["trajectory audit", "tool allowlist", "run anchoring"],
16
+ "capabilities": ["read-only"],
17
17
  "hooks": ["session events", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-anchored-standard",
@@ -13,7 +13,7 @@
13
13
  "id": "context",
14
14
  "label": "上下文管理"
15
15
  },
16
- "capabilities": ["annotations", "context"],
16
+ "capabilities": ["read-only"],
17
17
  "hooks": ["plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-annotation",
@@ -13,7 +13,7 @@
13
13
  "id": "developer",
14
14
  "label": "开发工具"
15
15
  },
16
- "capabilities": ["architecture map", "workspace scan", "dependency map", "Mermaid"],
16
+ "capabilities": ["reads-files", "runs-commands"],
17
17
  "hooks": ["workspace files", "package manifest", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-archify",
@@ -13,15 +13,7 @@
13
13
  "id": "context",
14
14
  "label": "上下文管理"
15
15
  },
16
- "capabilities": [
17
- "256 KiB strict UTF-8 text attachments",
18
- "canonical workspace path confinement",
19
- "no-follow regular-file reads",
20
- "untrusted context framing",
21
- "closing-tag neutralization",
22
- "cancellable sequential execution",
23
- "descriptor-safe normalized panel"
24
- ],
16
+ "capabilities": ["read-only", "reads-files"],
25
17
  "hooks": ["file context tool", "workspace file read", "plugin UI"],
26
18
  "profile": {
27
19
  "name": "@pi-harness/plugin-at-file",
@@ -13,7 +13,7 @@
13
13
  "id": "security",
14
14
  "label": "安全"
15
15
  },
16
- "capabilities": ["command policy", "confirmation gate", "safe execution"],
16
+ "capabilities": ["reads-files", "runs-commands"],
17
17
  "hooks": ["argv execution", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-auto-mode",
@@ -13,7 +13,7 @@
13
13
  "id": "developer",
14
14
  "label": "开发工具"
15
15
  },
16
- "capabilities": ["workspace overview", "Git status", "session context", "sidebar UI"],
16
+ "capabilities": ["session-data", "reads-files", "runs-commands"],
17
17
  "hooks": ["workspace scan", "read-only Git", "session manager", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-better-sidebar",
@@ -13,14 +13,7 @@
13
13
  "id": "web",
14
14
  "label": "网页与研究"
15
15
  },
16
- "capabilities": [
17
- "bounded textual HTTP fetch",
18
- "DNS rebinding protection",
19
- "per-hop SSRF validation",
20
- "cancellable request lifecycle",
21
- "bounded browser preview",
22
- "validated fail-closed panel reporting"
23
- ],
16
+ "capabilities": ["network-access"],
24
17
  "hooks": ["network request", "plugin UI"],
25
18
  "profile": {
26
19
  "name": "@pi-harness/plugin-browser-fetch",
@@ -13,14 +13,7 @@
13
13
  "id": "web",
14
14
  "label": "网页与研究"
15
15
  },
16
- "capabilities": [
17
- "loopback-only CDP endpoint",
18
- "bounded tab discovery",
19
- "navigation read click and screenshot tools",
20
- "cancellable request lifecycle",
21
- "bounded panel previews",
22
- "validated fail-closed panel reporting"
23
- ],
16
+ "capabilities": ["network-access"],
24
17
  "hooks": ["browser session tools", "Chrome DevTools Protocol", "plugin UI"],
25
18
  "profile": {
26
19
  "name": "@pi-harness/plugin-browser-session",
@@ -11,9 +11,9 @@
11
11
  "status": "verified",
12
12
  "category": {
13
13
  "id": "multimodal",
14
- "label": "多模态"
14
+ "label": "视觉与多模态"
15
15
  },
16
- "capabilities": ["Mermaid flowchart", "nodes and edges", "visual planning"],
16
+ "capabilities": ["read-only"],
17
17
  "hooks": ["plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-canvas-draw",
@@ -13,7 +13,7 @@
13
13
  "id": "workflow",
14
14
  "label": "工作流"
15
15
  },
16
- "capabilities": ["verification gate", "test orchestration", "change review"],
16
+ "capabilities": ["read-only"],
17
17
  "hooks": ["project scripts", "Git diff", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-change-verifier",
@@ -13,15 +13,7 @@
13
13
  "id": "developer",
14
14
  "label": "开发工具"
15
15
  },
16
- "capabilities": [
17
- "strict configuration and parameters",
18
- "bounded capsule inventory",
19
- "display-safe capsule filtering",
20
- "confirmed retention cleanup",
21
- "symlink and replacement defenses",
22
- "cancellable serialized cleanup",
23
- "fail-closed normalized panel"
24
- ],
16
+ "capabilities": ["reads-files", "writes-files"],
25
17
  "hooks": ["capsule cleanup tool", "agent capsule directory", "plugin UI"],
26
18
  "profile": {
27
19
  "name": "@pi-harness/plugin-cleaner",
@@ -13,7 +13,7 @@
13
13
  "id": "workflow",
14
14
  "label": "工作流"
15
15
  },
16
- "capabilities": ["desktop notification", "completion notice", "failure and abort notice"],
16
+ "capabilities": ["runs-commands"],
17
17
  "hooks": ["agent end", "compaction error", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-cli-notifier",
@@ -13,7 +13,7 @@
13
13
  "id": "tools",
14
14
  "label": "工具"
15
15
  },
16
- "capabilities": ["bounded skill packaging", "source file preservation", "SKILL.md generation"],
16
+ "capabilities": ["reads-files", "writes-files"],
17
17
  "hooks": ["workspace files", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-code2skill",
@@ -13,7 +13,7 @@
13
13
  "id": "workflow",
14
14
  "label": "工作流"
15
15
  },
16
- "capabilities": ["role handoff", "acceptance criteria", "durable session context"],
16
+ "capabilities": ["read-only", "session-data"],
17
17
  "hooks": ["session storage", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-colleague-skill",
@@ -13,14 +13,7 @@
13
13
  "id": "observability",
14
14
  "label": "可观测性"
15
15
  },
16
- "capabilities": [
17
- "descriptor-safe bounded context audit",
18
- "pressure oversized uninspectable and tool-error diagnostics",
19
- "confirmed settled-session compaction",
20
- "dedicated compaction cancellation",
21
- "single-flight bounded operation status",
22
- "cached normalized panel"
23
- ],
16
+ "capabilities": ["read-only", "session-data"],
24
17
  "hooks": ["context doctor tool", "session messages and usage", "Pi session lifecycle", "manual compaction", "plugin UI"],
25
18
  "profile": {
26
19
  "name": "@pi-harness/plugin-context-doctor",
@@ -13,13 +13,7 @@
13
13
  "id": "context",
14
14
  "label": "上下文管理"
15
15
  },
16
- "capabilities": [
17
- "descriptor-safe bounded message composition",
18
- "resilient context usage inspection",
19
- "active-session lifecycle counters",
20
- "cached session-aware panel",
21
- "bounded normalized browser view"
22
- ],
16
+ "capabilities": ["read-only", "session-data"],
23
17
  "hooks": ["context inspection tool", "active runtime session", "Pi session lifecycle", "plugin UI"],
24
18
  "profile": {
25
19
  "name": "@pi-harness/plugin-context",
@@ -10,7 +10,7 @@
10
10
  "source": "official",
11
11
  "status": "verified",
12
12
  "category": { "id": "composition", "label": "组合编排" },
13
- "capabilities": ["nested plugin composition", "transactional rollback", "lifecycle ownership"],
13
+ "capabilities": ["read-only"],
14
14
  "hooks": ["loader entry tree"],
15
15
  "profile": { "name": "@deepseek-ai/cordis-plugin-group", "group": true, "config": [] }
16
16
  }
@@ -10,7 +10,7 @@
10
10
  "source": "official",
11
11
  "status": "verified",
12
12
  "category": { "id": "observability", "label": "可观测性" },
13
- "capabilities": ["bounded console logging", "per-logger severity filtering", "safe recent-log panel"],
13
+ "capabilities": ["read-only"],
14
14
  "hooks": ["Cordis logger exporter", "plugin UI"],
15
15
  "profile": { "name": "@deepseek-ai/cordis-plugin-logger-console", "config": { "levels": { "default": 2 }, "maxLength": 8192 } }
16
16
  }
@@ -10,7 +10,7 @@
10
10
  "source": "official",
11
11
  "status": "verified",
12
12
  "category": { "id": "runtime", "label": "运行时" },
13
- "capabilities": ["scheduling", "lifecycle-owned cancellation", "async interval iteration", "throttle and debounce"],
13
+ "capabilities": ["read-only"],
14
14
  "hooks": ["Cordis timer service", "plugin UI"],
15
15
  "profile": { "name": "@deepseek-ai/cordis-plugin-timer", "config": {} }
16
16
  }
@@ -13,7 +13,7 @@
13
13
  "id": "observability",
14
14
  "label": "可观测性"
15
15
  },
16
- "capabilities": ["UTC daily cost ledger", "session cost snapshots", "daily budget monitoring", "bounded local persistence"],
16
+ "capabilities": ["session-data", "reads-files", "writes-files"],
17
17
  "hooks": ["agent end", "cost report tool", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-cost-meter",
@@ -11,17 +11,9 @@
11
11
  "status": "verified",
12
12
  "category": {
13
13
  "id": "developer",
14
- "label": "开发效率"
14
+ "label": "开发工具"
15
15
  },
16
- "capabilities": [
17
- "2000-declaration local presence scan",
18
- "4096-entry workspace-contained virtualenv scan",
19
- "npm common-intersection conflict detection",
20
- "bounded Python numeric constraint analysis",
21
- "unresolved constraint and directive reporting",
22
- "optional dependency reporting",
23
- "descriptor-safe normalized panel"
24
- ],
16
+ "capabilities": ["read-only", "reads-files"],
25
17
  "hooks": ["dependency check tool", "workspace manifest read", "plugin UI"],
26
18
  "profile": {
27
19
  "name": "@pi-harness/plugin-dependency-checker",
@@ -13,15 +13,7 @@
13
13
  "id": "security",
14
14
  "label": "安全"
15
15
  },
16
- "capabilities": [
17
- "local-only image execution",
18
- "no-network containers",
19
- "read-only workspace by default",
20
- "CPU memory and PID limits",
21
- "sanitized bounded output",
22
- "strict panel reporting",
23
- "cancellation cleanup"
24
- ],
16
+ "capabilities": ["reads-files", "writes-files", "runs-commands"],
25
17
  "hooks": ["sandbox execution tool", "Docker CLI", "plugin UI"],
26
18
  "profile": {
27
19
  "name": "@pi-harness/plugin-docker-sandbox",
@@ -13,14 +13,7 @@
13
13
  "id": "observability",
14
14
  "label": "可观测性"
15
15
  },
16
- "capabilities": [
17
- "bounded failure aggregation",
18
- "descriptor-safe event inspection",
19
- "abort-aware compaction diagnostics",
20
- "occurrence counting",
21
- "safe diagnostic summaries",
22
- "capacity visibility"
23
- ],
16
+ "capabilities": ["read-only"],
24
17
  "hooks": ["extension error", "agent end", "compaction end", "plugin UI"],
25
18
  "profile": {
26
19
  "name": "@pi-harness/plugin-fail-logger",
@@ -13,7 +13,7 @@
13
13
  "id": "interface",
14
14
  "label": "界面增强"
15
15
  },
16
- "capabilities": ["bounded structured cards", "typed text badge and progress blocks", "decimal progress validation", "plain-text HTML handling"],
16
+ "capabilities": ["read-only"],
17
17
  "hooks": ["GenUI render tool", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-genui",
@@ -13,14 +13,7 @@
13
13
  "id": "workflow",
14
14
  "label": "工作流"
15
15
  },
16
- "capabilities": [
17
- "byte-exact validated unstaged diff capture",
18
- "exclusive no-clobber capsule publication",
19
- "confirmed deterministic reverse apply",
20
- "bounded 256-capsule inventory",
21
- "cancellable serialized Git operations",
22
- "descriptor-safe normalized panel"
23
- ],
16
+ "capabilities": ["reads-files", "writes-files", "runs-commands"],
24
17
  "hooks": ["Git snapshot tool", "Git restore tool", "plugin UI"],
25
18
  "profile": {
26
19
  "name": "@pi-harness/plugin-git-time-capsule",
@@ -13,7 +13,7 @@
13
13
  "id": "memory",
14
14
  "label": "记忆与上下文"
15
15
  },
16
- "capabilities": ["bounded typed nodes", "validated directed relations", "ranked graph search", "atomic locked persistence"],
16
+ "capabilities": ["reads-files", "writes-files"],
17
17
  "hooks": ["graph memory tools", "local graph file", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-graph-memory",
@@ -11,9 +11,9 @@
11
11
  "status": "verified",
12
12
  "category": {
13
13
  "id": "context",
14
- "label": "上下文"
14
+ "label": "上下文管理"
15
15
  },
16
- "capabilities": ["history compaction", "context budget", "automatic cleanup"],
16
+ "capabilities": ["read-only", "session-data"],
17
17
  "hooks": ["agent end", "context usage", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-history-compressor",
@@ -11,9 +11,9 @@
11
11
  "status": "verified",
12
12
  "category": {
13
13
  "id": "security",
14
- "label": "安全防护"
14
+ "label": "安全"
15
15
  },
16
- "capabilities": ["command safety", "credential detection", "audit", "advisory"],
16
+ "capabilities": ["read-only"],
17
17
  "hooks": ["tool execution", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-hol-guard",
@@ -13,13 +13,7 @@
13
13
  "id": "workflow",
14
14
  "label": "工作流"
15
15
  },
16
- "capabilities": [
17
- "collision-safe locale key parity",
18
- "strict bounded workspace-only JSON reads",
19
- "no-follow symbolic-link safety",
20
- "stable sequential cancellable inspection",
21
- "validated bounded panel reporting"
22
- ],
16
+ "capabilities": ["read-only", "reads-files"],
23
17
  "hooks": ["i18n check tool", "workspace locale files", "plugin UI"],
24
18
  "profile": {
25
19
  "name": "@pi-harness/plugin-i18n-pair",
@@ -11,9 +11,9 @@
11
11
  "status": "verified",
12
12
  "category": {
13
13
  "id": "multimodal",
14
- "label": "多模态"
14
+ "label": "视觉与多模态"
15
15
  },
16
- "capabilities": ["image compression", "context hygiene", "asset safety"],
16
+ "capabilities": ["reads-files", "writes-files"],
17
17
  "hooks": ["workspace files", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-image-compressor",
@@ -13,7 +13,7 @@
13
13
  "id": "testing",
14
14
  "label": "测试与质量"
15
15
  },
16
- "capabilities": ["model verification", "batch verification", "evidence review", "audit history", "release confidence"],
16
+ "capabilities": ["model-calls"],
17
17
  "hooks": ["model runtime", "structured verdict", "plugin UI"],
18
18
  "profile": {
19
19
  "name": "@pi-harness/plugin-llm-verifier",