@pi-harness/pi-harness 0.1.24 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/apps/web/dist/assets/{index-BcLXLKqO.js → index-BCeWdgv2.js} +3 -2
- package/apps/web/dist/index.html +1 -1
- package/apps/web/package.json +6 -6
- package/node_modules/@pi-harness/api-gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/index.js +67 -47
- package/node_modules/@pi-harness/api-gateway/dist/index.js.map +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/agent-teams.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/anchored-standard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/annotation.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/at-file.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/auto-mode.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/better-sidebar.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-fetch.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/canvas-draw.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/change-verifier.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cleaner.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cli-notifier.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/colleague-skill.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context-doctor.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/dependency-checker.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/fail-logger.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/genui.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/history-compressor.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/hol-guard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/image-compressor.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/llm-verifier.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-client.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mock-server.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/openpets.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plan-execute.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-dev.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-finder.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-radar.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-stars.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-guard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reverse-skill.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-insights.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-guard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/sql-lens.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/synapse.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/test-harness.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/theme-studio.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/token-guard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/turn-rewind.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/web-research.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-search.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -1
- package/node_modules/@pi-harness/api-gateway/package.json +1 -1
- package/node_modules/@pi-harness/cli/package.json +1 -1
- package/node_modules/@pi-harness/host-webserver/dist/index.d.ts.map +1 -1
- package/node_modules/@pi-harness/host-webserver/dist/index.js +4 -2
- package/node_modules/@pi-harness/host-webserver/dist/index.js.map +1 -1
- package/node_modules/@pi-harness/host-webserver/package.json +1 -1
- package/node_modules/@pi-harness/web-app/package.json +1 -1
- package/package.json +6 -6
- package/packages/api-gateway/dist/index.d.ts.map +1 -1
- package/packages/api-gateway/dist/index.js +67 -47
- package/packages/api-gateway/dist/index.js.map +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/agent-teams.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/anchored-standard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/annotation.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/at-file.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/auto-mode.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/better-sidebar.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/browser-fetch.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/canvas-draw.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/change-verifier.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/cleaner.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/cli-notifier.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/colleague-skill.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/context-doctor.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/context.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/dependency-checker.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/fail-logger.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/genui.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/history-compressor.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/hol-guard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/image-compressor.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/llm-verifier.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/mcp-client.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/mock-server.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/openpets.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/plan-execute.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-dev.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-finder.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-radar.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-stars.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/prompt-guard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/reverse-skill.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-insights.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/skill-guard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/sql-lens.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/synapse.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/test-harness.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/theme-studio.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/token-guard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/turn-rewind.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/web-research.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/workspace-search.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -1
- package/packages/api-gateway/package.json +1 -1
- package/packages/api-gateway/src/index.ts +100 -66
- package/packages/api-gateway/src/marketplace-entries/official/agent-teams.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/anchored-standard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/annotation.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/archify.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/at-file.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/auto-mode.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/better-sidebar.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/browser-fetch.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/browser-session.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/canvas-draw.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/change-verifier.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/cleaner.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/cli-notifier.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/code2skill.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/colleague-skill.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/context-doctor.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/context.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/cost-meter.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/dependency-checker.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/docker-sandbox.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/fail-logger.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/genui.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/git-time-capsule.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/graph-memory.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/history-compressor.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/hol-guard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/i18n-pair.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/image-compressor.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/llm-verifier.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/mcp-client.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/mcp-panel.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/memory.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/mirage-bridge.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/mock-server.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/modlens.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/module-search.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/obsidian-sync.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/openpets.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/plan-execute.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/plugin-check.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/plugin-dev.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/plugin-finder.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/plugin-radar.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/plugin-stars.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/prompt-guard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/prompt-library.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/readme-gen.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/recall-unread.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/reverse-skill.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/reviewer-bot.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/runtime-doctor.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/secure-audit.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-bookmarks.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-bridge.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-compare.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-export.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-insights.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-search.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/skill-catalog.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/skill-guard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/sql-lens.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/synapse.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/tab-manager.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/taskboard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/telemetry-blocker.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/test-harness.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/theme-studio.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/token-guard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/turn-rewind.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/undo-savepoint.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/vision-toolkit.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/web-research.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/workspace-navigator.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/workspace-search.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/yaml-validator.json +1 -1
- package/packages/api-gateway/test/index.test.ts +220 -2
- package/packages/api-gateway/test/release-contract.test.ts +7 -2
- package/packages/api-gateway/test/release-package.test.ts +16 -0
- package/packages/bundle-web-app/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/host-webserver/dist/index.d.ts.map +1 -1
- package/packages/host-webserver/dist/index.js +4 -2
- package/packages/host-webserver/dist/index.js.map +1 -1
- package/packages/host-webserver/package.json +1 -1
- package/packages/host-webserver/src/index.ts +4 -2
- package/packages/host-webserver/test/index.test.ts +22 -0
package/apps/web/dist/index.html
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
<link rel="apple-touch-icon" href="/icons/app/apple-touch-icon-180.png" sizes="180x180" />
|
|
16
16
|
<link rel="manifest" href="/manifest.webmanifest" />
|
|
17
17
|
<title>Pi Harness / Control Room</title>
|
|
18
|
-
<script type="module" crossorigin src="/assets/index-
|
|
18
|
+
<script type="module" crossorigin src="/assets/index-BCeWdgv2.js"></script>
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/assets/react-vendor-BxoMtjVy.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/markdown-vendor-DUdMWn0M.js">
|
|
21
21
|
<link rel="stylesheet" crossorigin href="/assets/index-xF647pQJ.css">
|
package/apps/web/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/web",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.26",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Browser application entry for Pi Harness",
|
|
6
6
|
"type": "module",
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
"dev": "vp dev"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@pi-harness/api-gateway": "0.1.
|
|
14
|
-
"@pi-harness/client-web": "0.1.
|
|
15
|
-
"@pi-harness/core": "0.1.
|
|
16
|
-
"@pi-harness/host-webserver": "0.1.
|
|
17
|
-
"@pi-harness/web-app": "0.1.
|
|
13
|
+
"@pi-harness/api-gateway": "0.1.26",
|
|
14
|
+
"@pi-harness/client-web": "0.1.26",
|
|
15
|
+
"@pi-harness/core": "0.1.26",
|
|
16
|
+
"@pi-harness/host-webserver": "0.1.26",
|
|
17
|
+
"@pi-harness/web-app": "0.1.26"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@tailwindcss/vite": "^4.3.3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;;;;mBA6sBlC,OAAO;;AAHxB,wBAu4CE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
|
-
import { mkdir, mkdtemp, readFile, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
|
|
3
|
-
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
2
|
+
import { mkdir, mkdtemp, readFile, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { SessionManager } from "@earendil-works/pi-coding-agent";
|
|
6
6
|
import { atomicWriteFile } from "@pi-harness/core";
|
|
@@ -14,6 +14,8 @@ const IMPORT_BODY_LIMIT_BYTES = 16 * 1024 * 1024;
|
|
|
14
14
|
// Retained trajectory events are replayed to every SSE client and returned by /api/session, so the array must stay bounded.
|
|
15
15
|
const MAX_RETAINED_EVENTS = 2000;
|
|
16
16
|
const GIT_TIMEOUT_MS = 15_000;
|
|
17
|
+
// Mutating commands run user hooks (pre-commit, lint-staged, test suites) and may stage large trees; killing them part-way leaves index.lock and a half-finished operation behind, so they get a far more generous bound than read-only queries.
|
|
18
|
+
const GIT_MUTATION_TIMEOUT_MS = 120_000;
|
|
17
19
|
class PayloadTooLargeError extends Error {
|
|
18
20
|
constructor() {
|
|
19
21
|
super("Request body is too large");
|
|
@@ -127,7 +129,7 @@ function piConfig(services) {
|
|
|
127
129
|
function sessionMetadataFile(manager) {
|
|
128
130
|
return resolve(manager.getSessionDir(), ".pi-harness-session-meta.json");
|
|
129
131
|
}
|
|
130
|
-
// A missing file is the normal first-run state.
|
|
132
|
+
// A missing file is the normal first-run state. A parse or shape failure means the file exists but is unusable; it is renamed aside so the wreckage survives for recovery and the next write cannot silently replace the only copy. Any other read error (EMFILE, EBUSY, EISDIR, permissions) says nothing about the content, so it propagates and the caller's write is skipped instead of replacing a valid map with an empty one.
|
|
131
133
|
async function readSessionMetadata(manager, logger) {
|
|
132
134
|
const file = sessionMetadataFile(manager);
|
|
133
135
|
let raw;
|
|
@@ -137,8 +139,7 @@ async function readSessionMetadata(manager, logger) {
|
|
|
137
139
|
catch (error) {
|
|
138
140
|
if (error.code === "ENOENT")
|
|
139
141
|
return {};
|
|
140
|
-
|
|
141
|
-
return {};
|
|
142
|
+
throw error;
|
|
142
143
|
}
|
|
143
144
|
try {
|
|
144
145
|
const parsed = JSON.parse(raw);
|
|
@@ -165,25 +166,33 @@ async function writeSessionMetadata(manager, metadata) {
|
|
|
165
166
|
await mkdir(manager.getSessionDir(), { recursive: true });
|
|
166
167
|
await atomicWriteFile(sessionMetadataFile(manager), JSON.stringify(metadata, null, 2) + "\n", { encoding: "utf8" });
|
|
167
168
|
}
|
|
168
|
-
// Every
|
|
169
|
+
// Every access to the metadata file runs through this chain so concurrent requests cannot interleave and drop each other's updates. Plain reads take the lock too: a read that finds corrupt bytes quarantines the file, and doing that outside the lock could rename away a valid map that a concurrent mutation had just written.
|
|
169
170
|
let sessionMetadataQueue = Promise.resolve();
|
|
171
|
+
function withSessionMetadataLock(operation) {
|
|
172
|
+
const next = sessionMetadataQueue.catch(() => undefined).then(operation);
|
|
173
|
+
sessionMetadataQueue = next;
|
|
174
|
+
return next;
|
|
175
|
+
}
|
|
176
|
+
function readSessionMetadataLocked(manager, logger) {
|
|
177
|
+
return withSessionMetadataLock(() => readSessionMetadata(manager, logger));
|
|
178
|
+
}
|
|
170
179
|
function mutateSessionMetadata(manager, logger, mutate) {
|
|
171
|
-
|
|
172
|
-
.catch(() => undefined)
|
|
173
|
-
.then(async () => {
|
|
180
|
+
return withSessionMetadataLock(async () => {
|
|
174
181
|
const metadata = await readSessionMetadata(manager, logger);
|
|
175
182
|
const result = await mutate(metadata);
|
|
176
183
|
await writeSessionMetadata(manager, metadata);
|
|
177
184
|
return result;
|
|
178
185
|
});
|
|
179
|
-
|
|
180
|
-
|
|
186
|
+
}
|
|
187
|
+
// True when a path.relative() result points outside the directory it was computed from. All containment checks share this predicate so they agree on every platform separator.
|
|
188
|
+
function escapesRoot(relativePath) {
|
|
189
|
+
return isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(".." + sep);
|
|
181
190
|
}
|
|
182
191
|
function sessionPathInDirectory(path, manager) {
|
|
183
192
|
const root = resolve(manager.getSessionDir());
|
|
184
193
|
const target = resolve(path);
|
|
185
194
|
const relativePath = relative(root, target);
|
|
186
|
-
return relativePath !== "" && !
|
|
195
|
+
return relativePath !== "" && !escapesRoot(relativePath) && target.endsWith(".jsonl");
|
|
187
196
|
}
|
|
188
197
|
const webSessionUi = {
|
|
189
198
|
select: (_title, options) => Promise.resolve(options[0]),
|
|
@@ -484,22 +493,37 @@ function gitTermination(error) {
|
|
|
484
493
|
return "timeout";
|
|
485
494
|
return undefined;
|
|
486
495
|
}
|
|
487
|
-
function gitTerminationMessage(command, termination) {
|
|
496
|
+
function gitTerminationMessage(command, termination, timeoutMs = GIT_TIMEOUT_MS) {
|
|
488
497
|
return termination === "timeout"
|
|
489
|
-
? `git ${command} timed out after ${
|
|
498
|
+
? `git ${command} timed out after ${timeoutMs / 1000} seconds`
|
|
490
499
|
: `git ${command} produced more output than the buffer limit allows`;
|
|
491
500
|
}
|
|
492
|
-
// `-z` is
|
|
493
|
-
function
|
|
501
|
+
// `-z` output is NUL-separated and never C-quoted, so non-ASCII names arrive verbatim and a rename carries its original path as the following field instead of an `old -> new` pair. The paths are relative to the repository root regardless of cwd, so they are rebased onto the cwd prefix to keep the contract with /api/files/diff, /api/files/commit and /api/files/revert, which resolve paths against the same cwd.
|
|
502
|
+
function parseGitStatus(output, prefix) {
|
|
503
|
+
const fields = output.split("\0");
|
|
504
|
+
const entries = [];
|
|
505
|
+
for (let index = 0; index < fields.length; index += 1) {
|
|
506
|
+
const field = fields[index] ?? "";
|
|
507
|
+
if (field.length < 4)
|
|
508
|
+
continue;
|
|
509
|
+
const code = field.slice(0, 2);
|
|
510
|
+
const path = field.slice(3);
|
|
511
|
+
if (code.startsWith("R") || code.startsWith("C"))
|
|
512
|
+
index += 1;
|
|
513
|
+
entries.push({ path: prefix === "" ? path : posix.relative("/" + prefix, "/" + path), status: code.trim() || "??" });
|
|
514
|
+
}
|
|
515
|
+
return entries;
|
|
516
|
+
}
|
|
517
|
+
function gitStatusOutput(cwd) {
|
|
494
518
|
return new Promise((resolveStatus, rejectStatus) => {
|
|
495
|
-
execFile("git", ["status", "--
|
|
519
|
+
execFile("git", ["status", "--porcelain", "-z", "--untracked-files=all"], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 512 * 1024 }, (error, stdout, stderr) => {
|
|
496
520
|
if (error === null) {
|
|
497
521
|
resolveStatus({ output: stdout, truncated: false });
|
|
498
522
|
return;
|
|
499
523
|
}
|
|
500
524
|
const termination = gitTermination(error);
|
|
501
525
|
if (termination === "output-limit") {
|
|
502
|
-
// Keep the complete
|
|
526
|
+
// Keep the complete entries that arrived before the kill; the final entry may have been cut mid-path.
|
|
503
527
|
resolveStatus({ output: stdout.slice(0, stdout.lastIndexOf("\0") + 1), truncated: true });
|
|
504
528
|
return;
|
|
505
529
|
}
|
|
@@ -511,14 +535,21 @@ function gitStatus(cwd) {
|
|
|
511
535
|
});
|
|
512
536
|
});
|
|
513
537
|
}
|
|
538
|
+
async function gitStatus(cwd) {
|
|
539
|
+
const { output, truncated } = await gitStatusOutput(cwd);
|
|
540
|
+
if (output === "")
|
|
541
|
+
return { entries: [], truncated };
|
|
542
|
+
const prefix = await gitCommand(cwd, ["rev-parse", "--show-prefix"]);
|
|
543
|
+
return { entries: parseGitStatus(output, prefix.code === 0 ? prefix.stdout.trim() : ""), truncated };
|
|
544
|
+
}
|
|
514
545
|
function gitDiff(cwd, path) {
|
|
515
546
|
return new Promise((resolveOutput) => {
|
|
516
547
|
execFile("git", ["diff", "--no-ext-diff", "--", path], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 1024 * 1024 }, (error, stdout) => resolveOutput(error && stdout.length === 0 ? "" : stdout));
|
|
517
548
|
});
|
|
518
549
|
}
|
|
519
|
-
function gitCommand(cwd, args) {
|
|
550
|
+
function gitCommand(cwd, args, timeoutMs = GIT_TIMEOUT_MS) {
|
|
520
551
|
return new Promise((resolveResult) => {
|
|
521
|
-
execFile("git", [...args], { cwd, timeout:
|
|
552
|
+
execFile("git", [...args], { cwd, timeout: timeoutMs, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
522
553
|
const code = error && typeof error.code === "number" ? error.code : error ? 1 : 0;
|
|
523
554
|
resolveResult({ stdout, stderr, code, terminated: gitTermination(error) });
|
|
524
555
|
});
|
|
@@ -594,7 +625,7 @@ function workspacePaths(root, paths) {
|
|
|
594
625
|
const requested = path;
|
|
595
626
|
const absolute = resolve(root, requested);
|
|
596
627
|
const relativePath = relative(root, absolute);
|
|
597
|
-
if (
|
|
628
|
+
if (escapesRoot(relativePath))
|
|
598
629
|
return new Error("path must stay inside the workspace");
|
|
599
630
|
normalized.push(relativePath);
|
|
600
631
|
}
|
|
@@ -757,8 +788,8 @@ export default {
|
|
|
757
788
|
sendJson(response, 400, { error: "settings source must contain a JSON object" });
|
|
758
789
|
return;
|
|
759
790
|
}
|
|
760
|
-
|
|
761
|
-
|
|
791
|
+
// Replace the file atomically so an interrupted write never leaves a truncated settings.json behind; keep the existing permission bits. The rename must land on the resolved target, otherwise a symlinked settings.json (dotfiles repositories) would be replaced by a detached regular file.
|
|
792
|
+
const path = await realpath(join(services.launch.agentDir, "settings.json")).catch(() => join(services.launch.agentDir, "settings.json"));
|
|
762
793
|
const mode = await stat(path).then((info) => info.mode & 0o777, () => 0o644);
|
|
763
794
|
await atomicWriteFile(path, JSON.stringify(parsed, null, 2) + "\n", { encoding: "utf8", mode });
|
|
764
795
|
await services.runtime.session.settingsManager.reload();
|
|
@@ -1286,22 +1317,11 @@ export default {
|
|
|
1286
1317
|
sendJson(response, 500, { error: errorText(error) });
|
|
1287
1318
|
return;
|
|
1288
1319
|
}
|
|
1289
|
-
const
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
continue;
|
|
1295
|
-
const code = record.slice(0, 2).trim() || "??";
|
|
1296
|
-
// Rename and copy records carry the original path in a second NUL-terminated field, which is not a workspace change of its own.
|
|
1297
|
-
if (code.startsWith("R") || code.startsWith("C"))
|
|
1298
|
-
index += 1;
|
|
1299
|
-
items.push({
|
|
1300
|
-
path: record.slice(3),
|
|
1301
|
-
status: code,
|
|
1302
|
-
label: code === "??" ? "untracked" : code.includes("D") ? "deleted" : code.includes("A") ? "added" : "modified",
|
|
1303
|
-
});
|
|
1304
|
-
}
|
|
1320
|
+
const items = status.entries.map((entry) => ({
|
|
1321
|
+
path: entry.path,
|
|
1322
|
+
status: entry.status,
|
|
1323
|
+
label: entry.status === "??" ? "untracked" : entry.status.includes("D") ? "deleted" : entry.status.includes("A") ? "added" : "modified",
|
|
1324
|
+
}));
|
|
1305
1325
|
sendJson(response, 200, { items, ...(status.truncated ? { truncated: true } : {}) });
|
|
1306
1326
|
},
|
|
1307
1327
|
});
|
|
@@ -1321,7 +1341,7 @@ export default {
|
|
|
1321
1341
|
const root = resolve(activeCwd(services));
|
|
1322
1342
|
const absolute = resolve(root, requested);
|
|
1323
1343
|
const relativePath = relative(root, absolute);
|
|
1324
|
-
if (
|
|
1344
|
+
if (escapesRoot(relativePath)) {
|
|
1325
1345
|
sendJson(response, 400, { error: "path must stay inside the workspace" });
|
|
1326
1346
|
return;
|
|
1327
1347
|
}
|
|
@@ -1347,18 +1367,18 @@ export default {
|
|
|
1347
1367
|
return;
|
|
1348
1368
|
}
|
|
1349
1369
|
const root = resolve(activeCwd(services));
|
|
1350
|
-
const add = await gitCommand(root, ["add", "-A", "--", ...paths]);
|
|
1370
|
+
const add = await gitCommand(root, ["add", "-A", "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
|
|
1351
1371
|
if (add.terminated) {
|
|
1352
|
-
sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated) });
|
|
1372
|
+
sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated, GIT_MUTATION_TIMEOUT_MS) });
|
|
1353
1373
|
return;
|
|
1354
1374
|
}
|
|
1355
1375
|
if (add.code !== 0) {
|
|
1356
1376
|
sendJson(response, 409, { error: add.stderr.trim() || "Unable to stage workspace files" });
|
|
1357
1377
|
return;
|
|
1358
1378
|
}
|
|
1359
|
-
const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths]);
|
|
1379
|
+
const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
|
|
1360
1380
|
if (commit.terminated) {
|
|
1361
|
-
sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated) });
|
|
1381
|
+
sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated, GIT_MUTATION_TIMEOUT_MS) });
|
|
1362
1382
|
return;
|
|
1363
1383
|
}
|
|
1364
1384
|
if (commit.code !== 0) {
|
|
@@ -1414,9 +1434,9 @@ export default {
|
|
|
1414
1434
|
return;
|
|
1415
1435
|
}
|
|
1416
1436
|
if (trackedPaths.length > 0) {
|
|
1417
|
-
const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths]);
|
|
1437
|
+
const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths], GIT_MUTATION_TIMEOUT_MS);
|
|
1418
1438
|
if (restore.terminated) {
|
|
1419
|
-
sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated) });
|
|
1439
|
+
sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated, GIT_MUTATION_TIMEOUT_MS) });
|
|
1420
1440
|
return;
|
|
1421
1441
|
}
|
|
1422
1442
|
if (restore.code !== 0) {
|
|
@@ -1970,7 +1990,7 @@ export default {
|
|
|
1970
1990
|
const page = Math.max(0, Number.parseInt(url.searchParams.get("page") ?? "0", 10) || 0);
|
|
1971
1991
|
const pageSize = Math.min(100, Math.max(1, Number.parseInt(url.searchParams.get("pageSize") ?? "50", 10) || 50));
|
|
1972
1992
|
const includeArchived = url.searchParams.get("includeArchived") === "true";
|
|
1973
|
-
const metadata = await
|
|
1993
|
+
const metadata = await readSessionMetadataLocked(manager, context.logger);
|
|
1974
1994
|
const items = typeof manager.isPersisted === "function" && manager.isPersisted() ? await SessionManager.list(services.launch.cwd, manager.getSessionDir()) : [];
|
|
1975
1995
|
const filtered = items.filter((item) => includeArchived || metadata[item.path]?.archived !== true);
|
|
1976
1996
|
const sorted = filtered.sort((a, b) => Number(metadata[b.path]?.pinned === true) - Number(metadata[a.path]?.pinned === true) || b.modified.getTime() - a.modified.getTime());
|