@pi-harness/pi-harness 0.1.3 → 0.1.4

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 (167) hide show
  1. package/apps/web/dist/assets/{index-BoEwZu6r.css → index-CihATCjR.css} +1 -1
  2. package/apps/web/dist/assets/{index-alZn4u37.js → index-NzapJoGa.js} +1 -1
  3. package/apps/web/dist/index.html +2 -2
  4. package/apps/web/package.json +6 -6
  5. package/apps/web/src/style.css +14 -0
  6. package/package.json +6 -6
  7. package/packages/api-gateway/dist/marketplace-entries/official/agent-teams.json +20 -5
  8. package/packages/api-gateway/dist/marketplace-entries/official/anchored-standard.json +18 -5
  9. package/packages/api-gateway/dist/marketplace-entries/official/annotation.json +17 -5
  10. package/packages/api-gateway/dist/marketplace-entries/official/archify.json +20 -5
  11. package/packages/api-gateway/dist/marketplace-entries/official/at-file.json +17 -5
  12. package/packages/api-gateway/dist/marketplace-entries/official/auto-mode.json +10 -3
  13. package/packages/api-gateway/dist/marketplace-entries/official/better-sidebar.json +21 -5
  14. package/packages/api-gateway/dist/marketplace-entries/official/browser-fetch.json +17 -5
  15. package/packages/api-gateway/dist/marketplace-entries/official/browser-session.json +18 -5
  16. package/packages/api-gateway/dist/marketplace-entries/official/canvas-draw.json +18 -5
  17. package/packages/api-gateway/dist/marketplace-entries/official/change-verifier.json +19 -5
  18. package/packages/api-gateway/dist/marketplace-entries/official/cleaner.json +18 -5
  19. package/packages/api-gateway/dist/marketplace-entries/official/cli-notifier.json +19 -5
  20. package/packages/api-gateway/dist/marketplace-entries/official/code2skill.json +18 -5
  21. package/packages/api-gateway/dist/marketplace-entries/official/colleague-skill.json +19 -5
  22. package/packages/api-gateway/dist/marketplace-entries/official/context-doctor.json +11 -3
  23. package/packages/api-gateway/dist/marketplace-entries/official/context.json +17 -5
  24. package/packages/api-gateway/dist/marketplace-entries/official/cost-meter.json +20 -5
  25. package/packages/api-gateway/dist/marketplace-entries/official/dependency-checker.json +20 -5
  26. package/packages/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +18 -5
  27. package/packages/api-gateway/dist/marketplace-entries/official/fail-logger.json +18 -5
  28. package/packages/api-gateway/dist/marketplace-entries/official/genui.json +17 -5
  29. package/packages/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +19 -5
  30. package/packages/api-gateway/dist/marketplace-entries/official/graph-memory.json +18 -5
  31. package/packages/api-gateway/dist/marketplace-entries/official/history-compressor.json +11 -3
  32. package/packages/api-gateway/dist/marketplace-entries/official/hol-guard.json +18 -5
  33. package/packages/api-gateway/dist/marketplace-entries/official/i18n-pair.json +18 -5
  34. package/packages/api-gateway/dist/marketplace-entries/official/image-compressor.json +18 -5
  35. package/packages/api-gateway/dist/marketplace-entries/official/llm-verifier.json +21 -5
  36. package/packages/api-gateway/dist/marketplace-entries/official/mcp-client.json +18 -5
  37. package/packages/api-gateway/dist/marketplace-entries/official/mcp-panel.json +18 -5
  38. package/packages/api-gateway/dist/marketplace-entries/official/memory.json +17 -5
  39. package/packages/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +19 -5
  40. package/packages/api-gateway/dist/marketplace-entries/official/mock-server.json +18 -5
  41. package/packages/api-gateway/dist/marketplace-entries/official/modlens.json +17 -5
  42. package/packages/api-gateway/dist/marketplace-entries/official/module-search.json +19 -5
  43. package/packages/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +18 -5
  44. package/packages/api-gateway/dist/marketplace-entries/official/openpets.json +18 -5
  45. package/packages/api-gateway/dist/marketplace-entries/official/plan-execute.json +18 -5
  46. package/packages/api-gateway/dist/marketplace-entries/official/plugin-check.json +18 -5
  47. package/packages/api-gateway/dist/marketplace-entries/official/plugin-dev.json +18 -5
  48. package/packages/api-gateway/dist/marketplace-entries/official/plugin-finder.json +21 -5
  49. package/packages/api-gateway/dist/marketplace-entries/official/plugin-radar.json +17 -5
  50. package/packages/api-gateway/dist/marketplace-entries/official/plugin-stars.json +18 -5
  51. package/packages/api-gateway/dist/marketplace-entries/official/prompt-guard.json +17 -5
  52. package/packages/api-gateway/dist/marketplace-entries/official/prompt-library.json +19 -5
  53. package/packages/api-gateway/dist/marketplace-entries/official/readme-gen.json +20 -5
  54. package/packages/api-gateway/dist/marketplace-entries/official/recall-unread.json +18 -5
  55. package/packages/api-gateway/dist/marketplace-entries/official/reverse-skill.json +19 -5
  56. package/packages/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +10 -3
  57. package/packages/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +21 -5
  58. package/packages/api-gateway/dist/marketplace-entries/official/secure-audit.json +19 -5
  59. package/packages/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +19 -5
  60. package/packages/api-gateway/dist/marketplace-entries/official/session-bridge.json +19 -5
  61. package/packages/api-gateway/dist/marketplace-entries/official/session-compare.json +19 -5
  62. package/packages/api-gateway/dist/marketplace-entries/official/session-export.json +19 -5
  63. package/packages/api-gateway/dist/marketplace-entries/official/session-insights.json +18 -5
  64. package/packages/api-gateway/dist/marketplace-entries/official/session-search.json +19 -5
  65. package/packages/api-gateway/dist/marketplace-entries/official/skill-catalog.json +20 -5
  66. package/packages/api-gateway/dist/marketplace-entries/official/skill-guard.json +18 -5
  67. package/packages/api-gateway/dist/marketplace-entries/official/sql-lens.json +18 -5
  68. package/packages/api-gateway/dist/marketplace-entries/official/synapse.json +17 -5
  69. package/packages/api-gateway/dist/marketplace-entries/official/tab-manager.json +18 -5
  70. package/packages/api-gateway/dist/marketplace-entries/official/taskboard.json +18 -5
  71. package/packages/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +18 -5
  72. package/packages/api-gateway/dist/marketplace-entries/official/test-harness.json +18 -5
  73. package/packages/api-gateway/dist/marketplace-entries/official/theme-studio.json +18 -5
  74. package/packages/api-gateway/dist/marketplace-entries/official/token-guard.json +21 -5
  75. package/packages/api-gateway/dist/marketplace-entries/official/turn-rewind.json +10 -3
  76. package/packages/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +17 -5
  77. package/packages/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +18 -5
  78. package/packages/api-gateway/dist/marketplace-entries/official/web-research.json +18 -5
  79. package/packages/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +21 -5
  80. package/packages/api-gateway/dist/marketplace-entries/official/workspace-search.json +18 -5
  81. package/packages/api-gateway/dist/marketplace-entries/official/yaml-validator.json +18 -5
  82. package/packages/api-gateway/package.json +3 -3
  83. package/packages/api-gateway/src/marketplace-entries/official/agent-teams.json +20 -5
  84. package/packages/api-gateway/src/marketplace-entries/official/anchored-standard.json +18 -5
  85. package/packages/api-gateway/src/marketplace-entries/official/annotation.json +17 -5
  86. package/packages/api-gateway/src/marketplace-entries/official/archify.json +20 -5
  87. package/packages/api-gateway/src/marketplace-entries/official/at-file.json +17 -5
  88. package/packages/api-gateway/src/marketplace-entries/official/auto-mode.json +10 -3
  89. package/packages/api-gateway/src/marketplace-entries/official/better-sidebar.json +21 -5
  90. package/packages/api-gateway/src/marketplace-entries/official/browser-fetch.json +17 -5
  91. package/packages/api-gateway/src/marketplace-entries/official/browser-session.json +18 -5
  92. package/packages/api-gateway/src/marketplace-entries/official/canvas-draw.json +18 -5
  93. package/packages/api-gateway/src/marketplace-entries/official/change-verifier.json +19 -5
  94. package/packages/api-gateway/src/marketplace-entries/official/cleaner.json +18 -5
  95. package/packages/api-gateway/src/marketplace-entries/official/cli-notifier.json +19 -5
  96. package/packages/api-gateway/src/marketplace-entries/official/code2skill.json +18 -5
  97. package/packages/api-gateway/src/marketplace-entries/official/colleague-skill.json +19 -5
  98. package/packages/api-gateway/src/marketplace-entries/official/context-doctor.json +11 -3
  99. package/packages/api-gateway/src/marketplace-entries/official/context.json +17 -5
  100. package/packages/api-gateway/src/marketplace-entries/official/cost-meter.json +20 -5
  101. package/packages/api-gateway/src/marketplace-entries/official/dependency-checker.json +20 -5
  102. package/packages/api-gateway/src/marketplace-entries/official/docker-sandbox.json +18 -5
  103. package/packages/api-gateway/src/marketplace-entries/official/fail-logger.json +18 -5
  104. package/packages/api-gateway/src/marketplace-entries/official/genui.json +17 -5
  105. package/packages/api-gateway/src/marketplace-entries/official/git-time-capsule.json +19 -5
  106. package/packages/api-gateway/src/marketplace-entries/official/graph-memory.json +18 -5
  107. package/packages/api-gateway/src/marketplace-entries/official/history-compressor.json +11 -3
  108. package/packages/api-gateway/src/marketplace-entries/official/hol-guard.json +18 -5
  109. package/packages/api-gateway/src/marketplace-entries/official/i18n-pair.json +18 -5
  110. package/packages/api-gateway/src/marketplace-entries/official/image-compressor.json +18 -5
  111. package/packages/api-gateway/src/marketplace-entries/official/llm-verifier.json +21 -5
  112. package/packages/api-gateway/src/marketplace-entries/official/mcp-client.json +18 -5
  113. package/packages/api-gateway/src/marketplace-entries/official/mcp-panel.json +18 -5
  114. package/packages/api-gateway/src/marketplace-entries/official/memory.json +17 -5
  115. package/packages/api-gateway/src/marketplace-entries/official/mirage-bridge.json +19 -5
  116. package/packages/api-gateway/src/marketplace-entries/official/mock-server.json +18 -5
  117. package/packages/api-gateway/src/marketplace-entries/official/modlens.json +17 -5
  118. package/packages/api-gateway/src/marketplace-entries/official/module-search.json +19 -5
  119. package/packages/api-gateway/src/marketplace-entries/official/obsidian-sync.json +18 -5
  120. package/packages/api-gateway/src/marketplace-entries/official/openpets.json +18 -5
  121. package/packages/api-gateway/src/marketplace-entries/official/plan-execute.json +18 -5
  122. package/packages/api-gateway/src/marketplace-entries/official/plugin-check.json +18 -5
  123. package/packages/api-gateway/src/marketplace-entries/official/plugin-dev.json +18 -5
  124. package/packages/api-gateway/src/marketplace-entries/official/plugin-finder.json +21 -5
  125. package/packages/api-gateway/src/marketplace-entries/official/plugin-radar.json +17 -5
  126. package/packages/api-gateway/src/marketplace-entries/official/plugin-stars.json +18 -5
  127. package/packages/api-gateway/src/marketplace-entries/official/prompt-guard.json +17 -5
  128. package/packages/api-gateway/src/marketplace-entries/official/prompt-library.json +19 -5
  129. package/packages/api-gateway/src/marketplace-entries/official/readme-gen.json +20 -5
  130. package/packages/api-gateway/src/marketplace-entries/official/recall-unread.json +18 -5
  131. package/packages/api-gateway/src/marketplace-entries/official/reverse-skill.json +19 -5
  132. package/packages/api-gateway/src/marketplace-entries/official/reviewer-bot.json +10 -3
  133. package/packages/api-gateway/src/marketplace-entries/official/runtime-doctor.json +21 -5
  134. package/packages/api-gateway/src/marketplace-entries/official/secure-audit.json +19 -5
  135. package/packages/api-gateway/src/marketplace-entries/official/session-bookmarks.json +19 -5
  136. package/packages/api-gateway/src/marketplace-entries/official/session-bridge.json +19 -5
  137. package/packages/api-gateway/src/marketplace-entries/official/session-compare.json +19 -5
  138. package/packages/api-gateway/src/marketplace-entries/official/session-export.json +19 -5
  139. package/packages/api-gateway/src/marketplace-entries/official/session-insights.json +18 -5
  140. package/packages/api-gateway/src/marketplace-entries/official/session-search.json +19 -5
  141. package/packages/api-gateway/src/marketplace-entries/official/skill-catalog.json +20 -5
  142. package/packages/api-gateway/src/marketplace-entries/official/skill-guard.json +18 -5
  143. package/packages/api-gateway/src/marketplace-entries/official/sql-lens.json +18 -5
  144. package/packages/api-gateway/src/marketplace-entries/official/synapse.json +17 -5
  145. package/packages/api-gateway/src/marketplace-entries/official/tab-manager.json +18 -5
  146. package/packages/api-gateway/src/marketplace-entries/official/taskboard.json +18 -5
  147. package/packages/api-gateway/src/marketplace-entries/official/telemetry-blocker.json +18 -5
  148. package/packages/api-gateway/src/marketplace-entries/official/test-harness.json +18 -5
  149. package/packages/api-gateway/src/marketplace-entries/official/theme-studio.json +18 -5
  150. package/packages/api-gateway/src/marketplace-entries/official/token-guard.json +21 -5
  151. package/packages/api-gateway/src/marketplace-entries/official/turn-rewind.json +10 -3
  152. package/packages/api-gateway/src/marketplace-entries/official/undo-savepoint.json +17 -5
  153. package/packages/api-gateway/src/marketplace-entries/official/vision-toolkit.json +18 -5
  154. package/packages/api-gateway/src/marketplace-entries/official/web-research.json +18 -5
  155. package/packages/api-gateway/src/marketplace-entries/official/workspace-navigator.json +21 -5
  156. package/packages/api-gateway/src/marketplace-entries/official/workspace-search.json +18 -5
  157. package/packages/api-gateway/src/marketplace-entries/official/yaml-validator.json +18 -5
  158. package/packages/api-gateway/test/release-version.test.ts +71 -0
  159. package/packages/bundle-web-app/package.json +2 -2
  160. package/packages/cli/package.json +2 -2
  161. package/packages/client-web/dist/react-room.d.ts.map +1 -1
  162. package/packages/client-web/dist/react-room.js +3 -3
  163. package/packages/client-web/dist/react-room.js.map +1 -1
  164. package/packages/client-web/package.json +1 -1
  165. package/packages/client-web/src/react-room.tsx +5 -3
  166. package/packages/core/package.json +1 -1
  167. package/packages/host-webserver/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "theme-studio",
3
3
  "packageName": "@pi-harness/core/plugins/theme-studio",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Theme Studio",
6
6
  "description": "Apply bounded Light, Midnight, Paper, and High Contrast presets to the Pi Harness web surface.",
7
7
  "author": "Pi Harness",
@@ -9,11 +9,24 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "interface", "label": "界面增强" },
13
- "capabilities": ["theme presets", "contrast modes", "session persistence"],
14
- "hooks": ["session lifecycle", "React root tokens", "plugin UI"],
12
+ "category": {
13
+ "id": "interface",
14
+ "label": "界面增强"
15
+ },
16
+ "capabilities": [
17
+ "theme presets",
18
+ "contrast modes",
19
+ "session persistence"
20
+ ],
21
+ "hooks": [
22
+ "session lifecycle",
23
+ "React root tokens",
24
+ "plugin UI"
25
+ ],
15
26
  "profile": {
16
27
  "name": "@pi-harness/core/plugins/theme-studio",
17
- "config": { "theme": "light" }
28
+ "config": {
29
+ "theme": "light"
30
+ }
18
31
  }
19
32
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "token-guard",
3
3
  "packageName": "@pi-harness/core/plugins/token-guard",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Token Guard",
6
6
  "description": "Monitor context usage and stop runs when the configured token budget threshold is reached.",
7
7
  "author": "Pi Harness",
@@ -9,8 +9,24 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "observability", "label": "可观测性" },
13
- "capabilities": ["token budget", "per-run token budget", "context monitoring"],
14
- "hooks": ["session event", "plugin UI"],
15
- "profile": { "name": "@pi-harness/core/plugins/token-guard", "config": { "maxPercent": 90, "maxRunTokens": 0 } }
12
+ "category": {
13
+ "id": "observability",
14
+ "label": "可观测性"
15
+ },
16
+ "capabilities": [
17
+ "token budget",
18
+ "per-run token budget",
19
+ "context monitoring"
20
+ ],
21
+ "hooks": [
22
+ "session event",
23
+ "plugin UI"
24
+ ],
25
+ "profile": {
26
+ "name": "@pi-harness/core/plugins/token-guard",
27
+ "config": {
28
+ "maxPercent": 90,
29
+ "maxRunTokens": 0
30
+ }
31
+ }
16
32
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "turn-rewind",
3
3
  "packageName": "@pi-harness/core/plugins/turn-rewind",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Turn Rewind",
6
6
  "description": "Navigate the native Pi session tree back to a prior user turn while preserving the abandoned branch.",
7
7
  "author": "Pi Harness",
@@ -13,8 +13,15 @@
13
13
  "id": "workflow",
14
14
  "label": "工作流"
15
15
  },
16
- "capabilities": ["session rewind", "branching", "recovery"],
17
- "hooks": ["session tree", "plugin UI"],
16
+ "capabilities": [
17
+ "session rewind",
18
+ "branching",
19
+ "recovery"
20
+ ],
21
+ "hooks": [
22
+ "session tree",
23
+ "plugin UI"
24
+ ],
18
25
  "profile": {
19
26
  "name": "@pi-harness/core/plugins/turn-rewind",
20
27
  "config": {}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "undo-savepoint",
3
3
  "packageName": "@pi-harness/core/plugins/undo-savepoint",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Undo Savepoints",
6
6
  "description": "Create inspectable savepoints before agent changes so the workspace can be restored safely.",
7
7
  "author": "Pi Harness",
@@ -9,8 +9,20 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "workflow", "label": "工作流" },
13
- "capabilities": ["savepoint", "recovery"],
14
- "hooks": ["tool execution", "plugin UI"],
15
- "profile": { "name": "@pi-harness/core/plugins/undo-savepoint", "config": {} }
12
+ "category": {
13
+ "id": "workflow",
14
+ "label": "工作流"
15
+ },
16
+ "capabilities": [
17
+ "savepoint",
18
+ "recovery"
19
+ ],
20
+ "hooks": [
21
+ "tool execution",
22
+ "plugin UI"
23
+ ],
24
+ "profile": {
25
+ "name": "@pi-harness/core/plugins/undo-savepoint",
26
+ "config": {}
27
+ }
16
28
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "vision-toolkit",
3
3
  "packageName": "@pi-harness/core/plugins/vision-toolkit",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Vision Toolkit",
6
6
  "description": "Catalog workspace images and inspect safe metadata such as MIME type, size, and dimensions.",
7
7
  "author": "Pi Harness",
@@ -9,8 +9,21 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "multimodal", "label": "视觉与多模态" },
13
- "capabilities": ["image catalog", "metadata", "vision"],
14
- "hooks": ["workspace access", "plugin UI"],
15
- "profile": { "name": "@pi-harness/core/plugins/vision-toolkit", "config": {} }
12
+ "category": {
13
+ "id": "multimodal",
14
+ "label": "视觉与多模态"
15
+ },
16
+ "capabilities": [
17
+ "image catalog",
18
+ "metadata",
19
+ "vision"
20
+ ],
21
+ "hooks": [
22
+ "workspace access",
23
+ "plugin UI"
24
+ ],
25
+ "profile": {
26
+ "name": "@pi-harness/core/plugins/vision-toolkit",
27
+ "config": {}
28
+ }
16
29
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "web-research",
3
3
  "packageName": "@pi-harness/core/plugins/web-research",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Web Research",
6
6
  "description": "Search the public web through a configurable provider and return bounded, cited source evidence.",
7
7
  "author": "Pi Harness",
@@ -9,8 +9,21 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "web", "label": "网页与研究" },
13
- "capabilities": ["web search", "citations", "research"],
14
- "hooks": ["network request", "plugin UI"],
15
- "profile": { "name": "@pi-harness/core/plugins/web-research", "config": {} }
12
+ "category": {
13
+ "id": "web",
14
+ "label": "网页与研究"
15
+ },
16
+ "capabilities": [
17
+ "web search",
18
+ "citations",
19
+ "research"
20
+ ],
21
+ "hooks": [
22
+ "network request",
23
+ "plugin UI"
24
+ ],
25
+ "profile": {
26
+ "name": "@pi-harness/core/plugins/web-research",
27
+ "config": {}
28
+ }
16
29
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "workspace-navigator",
3
3
  "packageName": "@pi-harness/core/plugins/workspace-navigator",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Workspace Navigator",
6
6
  "description": "Show a bounded workspace tree and read-only Git status for a high-signal coding sidebar.",
7
7
  "author": "Pi Harness",
@@ -9,8 +9,24 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "developer", "label": "开发工具" },
13
- "capabilities": ["workspace navigation", "directory tree", "Git status", "sidebar context"],
14
- "hooks": ["workspace files", "bounded scan", "read-only Git", "plugin UI"],
15
- "profile": { "name": "@pi-harness/core/plugins/workspace-navigator", "config": {} }
12
+ "category": {
13
+ "id": "developer",
14
+ "label": "开发工具"
15
+ },
16
+ "capabilities": [
17
+ "workspace navigation",
18
+ "directory tree",
19
+ "Git status",
20
+ "sidebar context"
21
+ ],
22
+ "hooks": [
23
+ "workspace files",
24
+ "bounded scan",
25
+ "read-only Git",
26
+ "plugin UI"
27
+ ],
28
+ "profile": {
29
+ "name": "@pi-harness/core/plugins/workspace-navigator",
30
+ "config": {}
31
+ }
16
32
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "workspace-search",
3
3
  "packageName": "@pi-harness/core/plugins/workspace-search",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "Workspace Search",
6
6
  "description": "Search bounded text files in the active workspace with ignored directories and binary content excluded.",
7
7
  "author": "Pi Harness",
@@ -9,8 +9,21 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "context", "label": "上下文" },
13
- "capabilities": ["workspace search", "file discovery", "context lookup"],
14
- "hooks": ["workspace files", "plugin UI"],
15
- "profile": { "name": "@pi-harness/core/plugins/workspace-search", "config": {} }
12
+ "category": {
13
+ "id": "context",
14
+ "label": "上下文"
15
+ },
16
+ "capabilities": [
17
+ "workspace search",
18
+ "file discovery",
19
+ "context lookup"
20
+ ],
21
+ "hooks": [
22
+ "workspace files",
23
+ "plugin UI"
24
+ ],
25
+ "profile": {
26
+ "name": "@pi-harness/core/plugins/workspace-search",
27
+ "config": {}
28
+ }
16
29
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "yaml-validator",
3
3
  "packageName": "@pi-harness/core/plugins/yaml-validator",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "name": "YAML Validator",
6
6
  "description": "Validate bounded YAML configuration files and return precise parse errors without rewriting the source.",
7
7
  "author": "Pi Harness",
@@ -9,8 +9,21 @@
9
9
  "license": "MIT",
10
10
  "source": "official",
11
11
  "status": "verified",
12
- "category": { "id": "developer", "label": "开发工具" },
13
- "capabilities": ["YAML validation", "config diagnostics", "parse errors"],
14
- "hooks": ["workspace files", "plugin UI"],
15
- "profile": { "name": "@pi-harness/core/plugins/yaml-validator", "config": {} }
12
+ "category": {
13
+ "id": "developer",
14
+ "label": "开发工具"
15
+ },
16
+ "capabilities": [
17
+ "YAML validation",
18
+ "config diagnostics",
19
+ "parse errors"
20
+ ],
21
+ "hooks": [
22
+ "workspace files",
23
+ "plugin UI"
24
+ ],
25
+ "profile": {
26
+ "name": "@pi-harness/core/plugins/yaml-validator",
27
+ "config": {}
28
+ }
16
29
  }
@@ -0,0 +1,71 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdtemp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { resolve } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { afterEach, describe, expect, it } from "vitest";
7
+
8
+ const execFileAsync = promisify(execFile);
9
+ const fixtures: string[] = [];
10
+ const repositoryRoot = resolve(import.meta.dirname, "../../..");
11
+
12
+ const writeJson = async (root: string, path: string, value: unknown): Promise<void> => {
13
+ const target = resolve(root, path);
14
+ await mkdir(resolve(target, ".."), { recursive: true });
15
+ await writeFile(target, `${JSON.stringify(value, undefined, 2)}\n`);
16
+ };
17
+
18
+ afterEach(async () => {
19
+ await Promise.all(fixtures.splice(0).map((fixture) => rm(fixture, { recursive: true, force: true })));
20
+ });
21
+
22
+ describe("release version preparation", () => {
23
+ it("synchronizes manifests, lock data, and internal marketplace entries without changing external versions", async () => {
24
+ const fixture = await mkdtemp(resolve(tmpdir(), "pi-harness-release-version-"));
25
+ fixtures.push(fixture);
26
+ await Promise.all([mkdir(resolve(fixture, "apps")), mkdir(resolve(fixture, "examples"))]);
27
+ await writeJson(fixture, "package.json", { name: "@pi-harness/pi-harness", version: "0.1.2", dependencies: { "@pi-harness/core": "0.1.2" } });
28
+ await writeJson(fixture, "packages/core/package.json", { name: "@pi-harness/core", version: "0.1.2" });
29
+ await writeJson(fixture, "packages/api-gateway/package.json", { name: "@pi-harness/api-gateway", version: "0.1.2" });
30
+ await writeJson(fixture, "package-lock.json", {
31
+ name: "@pi-harness/pi-harness",
32
+ version: "0.1.2",
33
+ lockfileVersion: 3,
34
+ packages: {
35
+ "": { name: "@pi-harness/pi-harness", version: "0.1.2", dependencies: { "@pi-harness/core": "0.1.2" } },
36
+ "packages/core": { name: "@pi-harness/core", version: "0.1.2" },
37
+ "packages/api-gateway": { name: "@pi-harness/api-gateway", version: "0.1.2" },
38
+ },
39
+ });
40
+ await writeJson(fixture, "packages/api-gateway/src/marketplace-entries/official/internal.json", {
41
+ packageName: "@pi-harness/core/plugins/example",
42
+ version: "0.1.2",
43
+ });
44
+ await writeJson(fixture, "packages/api-gateway/src/marketplace-entries/official/external.json", { packageName: "external-plugin", version: "4.5.6" });
45
+
46
+ await execFileAsync(process.execPath, [resolve(repositoryRoot, "scripts/set-release-version.mjs"), "0.1.3"], { cwd: fixture });
47
+
48
+ const rootManifest = JSON.parse(await readFile(resolve(fixture, "package.json"), "utf8")) as Record<string, unknown>;
49
+ const packageLock = JSON.parse(await readFile(resolve(fixture, "package-lock.json"), "utf8")) as Record<string, unknown>;
50
+ const internalEntry = JSON.parse(await readFile(resolve(fixture, "packages/api-gateway/src/marketplace-entries/official/internal.json"), "utf8")) as Record<
51
+ string,
52
+ unknown
53
+ >;
54
+ const externalEntry = JSON.parse(await readFile(resolve(fixture, "packages/api-gateway/src/marketplace-entries/official/external.json"), "utf8")) as Record<
55
+ string,
56
+ unknown
57
+ >;
58
+
59
+ expect(rootManifest).toMatchObject({ version: "0.1.3", dependencies: { "@pi-harness/core": "0.1.3" } });
60
+ expect(packageLock).toMatchObject({
61
+ version: "0.1.3",
62
+ packages: {
63
+ "": { version: "0.1.3", dependencies: { "@pi-harness/core": "0.1.3" } },
64
+ "packages/core": { version: "0.1.3" },
65
+ "packages/api-gateway": { version: "0.1.3" },
66
+ },
67
+ });
68
+ expect(internalEntry.version).toBe("0.1.3");
69
+ expect(externalEntry.version).toBe("4.5.6");
70
+ });
71
+ });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/web-app",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Patchable Web application bundle for Pi Harness",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@deepseek-ai/cordis": "4.0.1",
35
- "@pi-harness/host-webserver": "0.1.3"
35
+ "@pi-harness/host-webserver": "0.1.4"
36
36
  },
37
37
  "engines": {
38
38
  "node": ">=22.19.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Plugin-first Pi Harness CLI",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -27,7 +27,7 @@
27
27
  "typecheck": "tsc -p tsconfig.json"
28
28
  },
29
29
  "dependencies": {
30
- "@pi-harness/core": "0.1.3"
30
+ "@pi-harness/core": "0.1.4"
31
31
  },
32
32
  "engines": {
33
33
  "node": ">=22.19.0"
@@ -1 +1 @@
1
- {"version":3,"file":"react-room.d.ts","sourceRoot":"","sources":["../src/react-room.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,SAAS,EAaf,MAAM,mBAAmB,CAAC;AAa3B,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AA8mLnD,wBAAgB,eAAe,CAAC,EAAE,GAAuB,EAAE,UAAU,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,2CAqlDhH"}
1
+ {"version":3,"file":"react-room.d.ts","sourceRoot":"","sources":["../src/react-room.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,SAAS,EAaf,MAAM,mBAAmB,CAAC;AAa3B,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAgnLnD,wBAAgB,eAAe,CAAC,EAAE,GAAuB,EAAE,UAAU,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,2CAqlDhH"}
@@ -1103,7 +1103,7 @@ function Plugins({ plugins, panels, catalog, onMarketplace, onOpenDetail, onToml
1103
1103
  const categoryLabel = metadata?.category.label ?? plugin.category?.label;
1104
1104
  const capabilityLabel = capability(plugin.name);
1105
1105
  const pluginTitle = metadata?.name ?? displayPluginName(plugin.name);
1106
- return (_jsxs("article", { className: "plugin-card", children: [_jsxs("div", { className: "plugin-card-head", children: [_jsx("span", { className: "plugin-icon", children: "\u25C8" }), _jsx("div", { className: "plugin-copy", children: _jsxs("div", { className: "plugin-heading", children: [_jsxs("div", { className: "plugin-title", children: [_jsx("strong", { children: pluginTitle }), _jsx("span", { className: `plugin-state ${plugin.enabled ? "active" : ""}`, children: plugin.enabled ? "运行中" : "已停用" }), categoryLabel && _jsx("span", { className: "capability", children: categoryLabel }), categoryLabel !== capabilityLabel && _jsx("span", { className: "capability", children: capabilityLabel })] }), _jsx("div", { className: "plugin-actions", children: plugin.removable ? (_jsxs(_Fragment, { children: [_jsx("button", { "aria-label": `${plugin.enabled ? "停用" : "启用"} ${pluginTitle}`, "aria-pressed": plugin.enabled, className: "plugin-switch-button", disabled: busyPlugin !== undefined, onClick: () => void runPluginAction(plugin, (item) => onToggle(item)), type: "button", children: _jsx("span", { "aria-hidden": "true", className: `switch ${plugin.enabled ? "on" : ""}`, children: _jsx("i", {}) }) }), _jsx("button", { className: "plugin-uninstall", disabled: busyPlugin !== undefined, onClick: () => {
1106
+ return (_jsxs("article", { className: "catalog-card plugin-card", children: [_jsxs("div", { className: "plugin-card-head", children: [_jsx("span", { className: "plugin-icon", children: "\u25C8" }), _jsx("div", { className: "plugin-copy", children: _jsxs("div", { className: "plugin-heading", children: [_jsxs("div", { className: "plugin-title", children: [_jsx("strong", { children: pluginTitle }), _jsx("span", { className: `plugin-state ${plugin.enabled ? "active" : ""}`, children: plugin.enabled ? "运行中" : "已停用" }), categoryLabel && _jsx("span", { className: "capability", children: categoryLabel }), categoryLabel !== capabilityLabel && _jsx("span", { className: "capability", children: capabilityLabel })] }), _jsx("div", { className: "plugin-actions", children: plugin.removable ? (_jsxs(_Fragment, { children: [_jsx("button", { "aria-label": `${plugin.enabled ? "停用" : "启用"} ${pluginTitle}`, "aria-pressed": plugin.enabled, className: "plugin-switch-button", disabled: busyPlugin !== undefined, onClick: () => void runPluginAction(plugin, (item) => onToggle(item)), type: "button", children: _jsx("span", { "aria-hidden": "true", className: `switch ${plugin.enabled ? "on" : ""}`, children: _jsx("i", {}) }) }), _jsx("button", { className: "plugin-uninstall", disabled: busyPlugin !== undefined, onClick: () => {
1107
1107
  setPluginError("");
1108
1108
  setPendingUninstall(plugin);
1109
1109
  }, type: "button", children: "\u5378\u8F7D" })] })) : (_jsx("span", { className: `switch ${plugin.enabled ? "on" : ""}`, children: _jsx("i", {}) })) })] }) })] }), _jsxs("div", { className: "plugin-card-body", children: [_jsx("code", { className: "plugin-package", children: plugin.name }), _jsx("p", { className: "plugin-description", children: plugin.enabled ? "由当前运行时加载并启用,能力与 hook 已注册。" : "由当前运行时加载但已停用。" }), _jsxs("div", { className: "hook-list", children: [_jsx("span", { children: "loader" }), _jsx("span", { children: plugin.state === "active" ? "active" : `state:${plugin.state}` })] })] }), _jsxs("footer", { className: "plugin-card-footer", children: [_jsx("a", { className: "plugin-detail-link", href: installedPluginDetailPath(plugin.name), onClick: (event) => {
@@ -1140,7 +1140,7 @@ function InstalledPluginDetail({ plugin, panel, metadata, onBack, onToggle, onUn
1140
1140
  return (_jsxs("section", { className: "marketplace-page flex min-w-0 flex-1 flex-col", children: [_jsxs("div", { className: "min-h-0 flex-1 overflow-auto", children: [_jsxs("div", { className: "subnav plugin-detail-subnav", children: [_jsx("a", { href: "?page=plugins", onClick: (event) => {
1141
1141
  event.preventDefault();
1142
1142
  onBack();
1143
- }, children: "\u2190 \u5DF2\u5B89\u88C5\u63D2\u4EF6" }), _jsx("span", { children: "\u63D2\u4EF6\u8BE6\u60C5" })] }), _jsxs("div", { className: "plugin-detail-content", children: [_jsxs("header", { className: "border-b border-[#e3e7ee] pb-7", children: [_jsxs("div", { className: "mb-4 flex flex-wrap items-center gap-2", children: [_jsx("span", { className: `rounded px-2 py-1 font-mono text-[10px] ${plugin.enabled ? "bg-[#e6faed] text-[#14733f]" : "bg-[#eef0f3] text-[#687381]"}`, children: plugin.enabled ? "运行中" : "已停用" }), _jsx("span", { className: "rounded bg-[#f2edff] px-2 py-1 text-[10px] text-[#6d4bc3]", children: plugin.category?.label ?? "运行时插件" }), _jsx("span", { className: "rounded bg-[#e4edfd] px-2 py-1 font-mono text-[10px] text-[#3565c5]", children: capability(plugin.name) })] }), _jsxs("div", { className: "flex flex-wrap items-end justify-between gap-5", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "mb-2 font-mono text-[11px] uppercase tracking-[0.14em] text-[#687381]", children: "PLUGIN DETAIL" }), _jsx("h1", { className: "text-3xl font-semibold tracking-[-0.03em] text-[#20252b]", children: title }), _jsxs("code", { className: "mt-3 block break-all text-[12px] text-[#687381]", children: [plugin.name, metadata ? ` · v${metadata.version}` : ""] })] }), plugin.removable ? (_jsxs("div", { className: "plugin-detail-actions", children: [_jsx("button", { className: "plugin-detail-action", disabled: busyAction !== undefined, onClick: () => void run("toggle", () => onToggle(plugin)), type: "button", children: busyAction === "toggle" ? "处理中…" : plugin.enabled ? "停用插件" : "启用插件" }), _jsx("button", { className: "plugin-detail-action danger", disabled: busyAction !== undefined, onClick: () => {
1143
+ }, children: "\u2190 \u5DF2\u5B89\u88C5\u63D2\u4EF6" }), _jsx("span", { children: "\u63D2\u4EF6\u8BE6\u60C5" })] }), _jsxs("div", { className: "plugin-detail-content", children: [_jsxs("header", { className: "border-b border-[#e3e7ee] pb-7", children: [_jsxs("div", { className: "mb-4 flex flex-wrap items-center gap-2", children: [_jsx("span", { className: `rounded px-2 py-1 font-mono text-[10px] ${plugin.enabled ? "bg-[#e6faed] text-[#14733f]" : "bg-[#eef0f3] text-[#687381]"}`, children: plugin.enabled ? "运行中" : "已停用" }), _jsx("span", { className: "rounded bg-[#f2edff] px-2 py-1 text-[10px] text-[#6d4bc3]", children: metadata?.category.label ?? plugin.category?.label ?? "运行时插件" }), _jsx("span", { className: "rounded bg-[#e4edfd] px-2 py-1 font-mono text-[10px] text-[#3565c5]", children: capability(plugin.name) })] }), _jsxs("div", { className: "flex flex-wrap items-end justify-between gap-5", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "mb-2 font-mono text-[11px] uppercase tracking-[0.14em] text-[#687381]", children: "PLUGIN DETAIL" }), _jsx("h1", { className: "text-3xl font-semibold tracking-[-0.03em] text-[#20252b]", children: title }), _jsxs("code", { className: "mt-3 block break-all text-[12px] text-[#687381]", children: [plugin.name, metadata ? ` · v${metadata.version}` : ""] })] }), plugin.removable ? (_jsxs("div", { className: "plugin-detail-actions", children: [_jsx("button", { className: "plugin-detail-action", disabled: busyAction !== undefined, onClick: () => void run("toggle", () => onToggle(plugin)), type: "button", children: busyAction === "toggle" ? "处理中…" : plugin.enabled ? "停用插件" : "启用插件" }), _jsx("button", { className: "plugin-detail-action danger", disabled: busyAction !== undefined, onClick: () => {
1144
1144
  setError("");
1145
1145
  setConfirmUninstall(true);
1146
1146
  }, type: "button", children: "\u5378\u8F7D\u63D2\u4EF6" })] })) : (_jsx("span", { className: "rounded-full bg-[#eef0f3] px-3 py-1.5 text-[11px] text-[#687381]", children: "\u5185\u7F6E\u7EC4\u4EF6" }))] }), _jsx("p", { className: "mt-5 max-w-3xl text-[14px] leading-7 text-[#59636e]", children: metadata?.description ?? (plugin.enabled ? "由当前运行时加载并启用,能力与 hook 已注册。" : "插件保留在运行配置中,但当前处于停用状态。") }), error && (_jsxs("p", { className: "mt-3 text-[12px] text-[#b42318]", role: "alert", children: ["\u64CD\u4F5C\u5931\u8D25\uFF1A", error] }))] }), _jsxs("div", { className: "grid gap-4 py-6 lg:grid-cols-[minmax(0,1fr)_280px]", children: [_jsxs("div", { className: "space-y-4", children: [_jsxs("section", { className: "rounded-[10px] border border-[#e3e7ee] bg-white p-5", children: [_jsx("h2", { className: "text-[13px] font-semibold text-[#20252b]", children: "\u63D2\u4EF6\u80FD\u529B" }), _jsx("div", { className: "mt-4 flex flex-wrap gap-2", children: (metadata?.capabilities.length ? metadata.capabilities : [capability(plugin.name)]).map((item) => (_jsx("span", { className: "rounded-md bg-[#f1f4f9] px-2 py-1 font-mono text-[11px] text-[#61666b]", children: item }, item))) })] }), metadata?.hooks.length ? (_jsxs("section", { className: "rounded-[10px] border border-[#e3e7ee] bg-white p-5", children: [_jsx("h2", { className: "text-[13px] font-semibold text-[#20252b]", children: "\u6269\u5C55\u70B9" }), _jsx("div", { className: "mt-4 space-y-2", children: metadata.hooks.map((item) => (_jsx("div", { className: "rounded-md bg-[#f8f9fb] px-3 py-2 font-mono text-[11px] text-[#61666b]", children: item }, item))) })] })) : null, _jsxs("section", { className: "rounded-[10px] border border-[#e3e7ee] bg-white p-5", children: [_jsxs("div", { className: "mb-4 flex items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-[13px] font-semibold text-[#20252b]", children: "\u5B9E\u65F6\u8BE6\u60C5" }), _jsx("p", { className: "mt-1 text-[12px] text-[#687381]", children: "\u5F53\u524D\u672C\u673A\u4F1A\u8BDD\u4E2D\u7684\u63D2\u4EF6\u8FD0\u884C\u72B6\u6001\u3002" })] }), _jsx("span", { className: "font-mono text-[10px] uppercase tracking-[0.1em] text-[#687381]", children: "LIVE" })] }), panel ? _jsx(PluginPanelCard, { inline: true, panel: panel }) : _jsx("div", { className: "empty-state", children: "\u8FD9\u4E2A\u63D2\u4EF6\u6682\u672A\u63D0\u4F9B\u5B9E\u65F6\u9762\u677F\u3002" })] })] }), _jsxs("aside", { className: "h-fit rounded-[10px] border border-[#e3e7ee] bg-white p-5", children: [_jsx("h2", { className: "text-[13px] font-semibold text-[#20252b]", children: "\u63D2\u4EF6\u4FE1\u606F" }), _jsxs("dl", { className: "mt-4 divide-y divide-[#eef0f3] text-[12px]", children: [_jsxs("div", { className: "flex justify-between gap-4 py-3", children: [_jsx("dt", { className: "text-[#687381]", children: "\u8FD0\u884C\u72B6\u6001" }), _jsx("dd", { className: "font-mono text-[#3b424b]", children: plugin.state })] }), _jsxs("div", { className: "flex justify-between gap-4 py-3", children: [_jsx("dt", { className: "text-[#687381]", children: "\u914D\u7F6E\u6807\u8BC6" }), _jsx("dd", { className: "max-w-[150px] break-all text-right font-mono text-[#3b424b]", children: plugin.id })] }), _jsxs("div", { className: "flex justify-between gap-4 py-3", children: [_jsx("dt", { className: "text-[#687381]", children: "\u5206\u7C7B" }), _jsx("dd", { className: "text-right text-[#3b424b]", children: plugin.category?.label ?? "运行时插件" })] }), _jsxs("div", { className: "flex justify-between gap-4 py-3", children: [_jsx("dt", { className: "text-[#687381]", children: "\u7BA1\u7406\u65B9\u5F0F" }), _jsx("dd", { className: "text-right text-[#3b424b]", children: plugin.removable ? "可配置" : "随运行时加载" })] }), metadata ? (_jsxs("div", { className: "flex justify-between gap-4 py-3", children: [_jsx("dt", { className: "text-[#687381]", children: "\u7248\u672C" }), _jsx("dd", { className: "font-mono text-[#3b424b]", children: metadata.version })] })) : null] }), metadata ? (_jsx("a", { className: "mt-4 block border-t border-[#eef0f3] pt-4 text-[12px] text-[#3565c5]", href: metadata.repository, rel: "noreferrer", target: "_blank", children: "\u67E5\u770B\u6E90\u7801 \u2197" })) : null] })] })] })] }), confirmUninstall ? (_jsx(PluginUninstallDialog, { busy: busyAction === "uninstall", error: error, onCancel: () => setConfirmUninstall(false), onConfirm: () => void run("uninstall", () => onUninstall(plugin)).then((completed) => {
@@ -1175,7 +1175,7 @@ function Marketplace({ plugins, capabilities, categories, total, page, hasNext,
1175
1175
  }, children: "\u67E5\u770B\u8FD0\u884C\u914D\u7F6E" })] }), _jsxs("div", { className: "marketplace-toolbar", children: [_jsx("input", { className: "marketplace-search", "aria-label": "\u641C\u7D22\u63D2\u4EF6", onChange: (event) => onQueryChange(event.target.value), placeholder: "\u641C\u7D22\u540D\u79F0\u3001\u5305\u540D\u3001\u80FD\u529B\u2026", value: query }), _jsxs("select", { className: "marketplace-filter", "aria-label": "\u6309\u80FD\u529B\u7B5B\u9009", onChange: (event) => onCapabilityChange(event.target.value), value: capabilityFilter, children: [_jsx("option", { value: "", children: "\u5168\u90E8\u80FD\u529B" }), capabilities.map((item) => (_jsx("option", { value: item, children: item }, item)))] }), _jsxs("span", { className: "marketplace-count", children: [total, " \u4E2A\u5DF2\u5BA1\u6838\u6761\u76EE \u00B7 \u63A8\u8350\u6392\u5E8F"] })] }), _jsx("nav", { "aria-label": "\u63D2\u4EF6\u5206\u7C7B", className: "marketplace-categories", children: categoryTabs.map((category) => {
1176
1176
  const active = categoryFilter === category.id;
1177
1177
  return (_jsxs("button", { "aria-pressed": active, className: `marketplace-category ${active ? "active" : ""}`, onClick: () => onCategoryChange(category.id), type: "button", children: [_jsx("span", { children: category.label }), _jsx("span", { className: active ? "font-mono text-[10px] text-[#3565c5]" : "font-mono text-[10px] text-[#687381]", children: category.count })] }, category.id || "all"));
1178
- }) }), _jsxs("div", { className: "marketplace-scroll", children: [_jsxs("div", { className: "marketplace-grid", children: [plugins.map((plugin) => (_jsxs("article", { className: "marketplace-card", children: [_jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("div", { className: "marketplace-card-mark", children: "\u25C8" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [_jsx("strong", { className: "marketplace-title", children: plugin.name }), _jsx("span", { className: plugin.status === "verified"
1178
+ }) }), _jsxs("div", { className: "marketplace-scroll", children: [_jsxs("div", { className: "marketplace-grid", children: [plugins.map((plugin) => (_jsxs("article", { className: "catalog-card marketplace-card", children: [_jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("div", { className: "marketplace-card-mark", children: "\u25C8" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [_jsx("strong", { className: "marketplace-title", children: plugin.name }), _jsx("span", { className: plugin.status === "verified"
1179
1179
  ? "rounded bg-[#e6faed] px-1.5 py-px font-mono text-[10px] text-[#14733f]"
1180
1180
  : "rounded bg-[#fff5e7] px-1.5 py-px font-mono text-[10px] text-[#9a6700]", children: plugin.status === "verified" ? "已验证" : "实验性" }), _jsx("span", { className: plugin.source === "official"
1181
1181
  ? "rounded bg-[#e4edfd] px-1.5 py-px font-mono text-[10px] text-[#3565c5]"