@pi-harness/pi-harness 0.1.21 → 0.1.23
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 +1 -1
- package/apps/web/dist/assets/index-Bo9CNI_U.js +22 -0
- package/apps/web/dist/index.html +1 -1
- package/apps/web/package.json +6 -6
- package/apps/web/server-dist/bin.js +18 -5
- package/apps/web/server-dist/bin.js.map +1 -1
- package/apps/web/src/server/bin.ts +18 -5
- package/apps/web/test/bin.test.ts +90 -0
- package/node_modules/@pi-harness/api-gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/index.js +204 -66
- 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 +3 -12
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/anchored-standard.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/annotation.json +3 -8
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/archify.json +3 -12
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/at-file.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/auto-mode.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/better-sidebar.json +3 -13
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-fetch.json +2 -5
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-session.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/canvas-draw.json +3 -9
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/change-verifier.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cleaner.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cli-notifier.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/code2skill.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/colleague-skill.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context-doctor.json +2 -8
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/context.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cost-meter.json +3 -12
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/dependency-checker.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/fail-logger.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/genui.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/graph-memory.json +3 -12
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/history-compressor.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/hol-guard.json +4 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/i18n-pair.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/image-compressor.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/llm-verifier.json +3 -13
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-client.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-panel.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/memory.json +3 -9
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mock-server.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/modlens.json +3 -9
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/module-search.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/openpets.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plan-execute.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-check.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-dev.json +3 -12
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-finder.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-radar.json +3 -9
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-stars.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-guard.json +3 -9
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-library.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/readme-gen.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/recall-unread.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reverse-skill.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +3 -13
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/secure-audit.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bridge.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-compare.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-export.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-insights.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-search.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-catalog.json +3 -12
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-guard.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/sql-lens.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/synapse.json +3 -9
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/tab-manager.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/taskboard.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/test-harness.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/theme-studio.json +3 -11
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/token-guard.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/turn-rewind.json +2 -7
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +3 -9
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +2 -6
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/web-research.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +3 -13
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-search.json +3 -10
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/yaml-validator.json +2 -6
- package/node_modules/@pi-harness/api-gateway/package.json +1 -1
- package/node_modules/@pi-harness/cli/dist/node-stdio.d.ts.map +1 -1
- package/node_modules/@pi-harness/cli/dist/node-stdio.js +3 -1
- package/node_modules/@pi-harness/cli/dist/node-stdio.js.map +1 -1
- package/node_modules/@pi-harness/cli/dist/relaunch.d.ts.map +1 -1
- package/node_modules/@pi-harness/cli/dist/relaunch.js +6 -1
- package/node_modules/@pi-harness/cli/dist/relaunch.js.map +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 +52 -3
- 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/dist/index.d.ts +3 -0
- package/node_modules/@pi-harness/web-app/dist/index.d.ts.map +1 -1
- package/node_modules/@pi-harness/web-app/dist/index.js +9 -5
- package/node_modules/@pi-harness/web-app/dist/index.js.map +1 -1
- package/node_modules/@pi-harness/web-app/package.json +1 -1
- package/package.json +7 -7
- package/packages/api-gateway/dist/index.d.ts.map +1 -1
- package/packages/api-gateway/dist/index.js +204 -66
- package/packages/api-gateway/dist/index.js.map +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/agent-teams.json +3 -12
- package/packages/api-gateway/dist/marketplace-entries/official/anchored-standard.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/annotation.json +3 -8
- package/packages/api-gateway/dist/marketplace-entries/official/archify.json +3 -12
- package/packages/api-gateway/dist/marketplace-entries/official/at-file.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/auto-mode.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/better-sidebar.json +3 -13
- package/packages/api-gateway/dist/marketplace-entries/official/browser-fetch.json +2 -5
- package/packages/api-gateway/dist/marketplace-entries/official/browser-session.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/canvas-draw.json +3 -9
- package/packages/api-gateway/dist/marketplace-entries/official/change-verifier.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/cleaner.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/cli-notifier.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/code2skill.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/colleague-skill.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/context-doctor.json +2 -8
- package/packages/api-gateway/dist/marketplace-entries/official/context.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/cost-meter.json +3 -12
- package/packages/api-gateway/dist/marketplace-entries/official/dependency-checker.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/docker-sandbox.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/fail-logger.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/genui.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/graph-memory.json +3 -12
- package/packages/api-gateway/dist/marketplace-entries/official/history-compressor.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/hol-guard.json +4 -11
- package/packages/api-gateway/dist/marketplace-entries/official/i18n-pair.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/image-compressor.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/llm-verifier.json +3 -13
- package/packages/api-gateway/dist/marketplace-entries/official/mcp-client.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/mcp-panel.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/memory.json +3 -9
- package/packages/api-gateway/dist/marketplace-entries/official/mirage-bridge.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/mock-server.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/modlens.json +3 -9
- package/packages/api-gateway/dist/marketplace-entries/official/module-search.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/obsidian-sync.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/openpets.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/plan-execute.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-check.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-dev.json +3 -12
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-finder.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-radar.json +3 -9
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-stars.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/prompt-guard.json +3 -9
- package/packages/api-gateway/dist/marketplace-entries/official/prompt-library.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/readme-gen.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/recall-unread.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/reverse-skill.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/reviewer-bot.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/runtime-doctor.json +3 -13
- package/packages/api-gateway/dist/marketplace-entries/official/secure-audit.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/session-bookmarks.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/session-bridge.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/session-compare.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/session-export.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/session-insights.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/session-search.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/skill-catalog.json +3 -12
- package/packages/api-gateway/dist/marketplace-entries/official/skill-guard.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/sql-lens.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/synapse.json +3 -9
- package/packages/api-gateway/dist/marketplace-entries/official/tab-manager.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/taskboard.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/telemetry-blocker.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/test-harness.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/theme-studio.json +3 -11
- package/packages/api-gateway/dist/marketplace-entries/official/token-guard.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/turn-rewind.json +2 -7
- package/packages/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +3 -9
- package/packages/api-gateway/dist/marketplace-entries/official/vision-toolkit.json +2 -6
- package/packages/api-gateway/dist/marketplace-entries/official/web-research.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/workspace-navigator.json +3 -13
- package/packages/api-gateway/dist/marketplace-entries/official/workspace-search.json +3 -10
- package/packages/api-gateway/dist/marketplace-entries/official/yaml-validator.json +2 -6
- package/packages/api-gateway/package.json +1 -1
- package/packages/api-gateway/src/index.ts +227 -68
- package/packages/api-gateway/src/marketplace-entries/official/agent-teams.json +3 -12
- package/packages/api-gateway/src/marketplace-entries/official/anchored-standard.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/annotation.json +3 -8
- package/packages/api-gateway/src/marketplace-entries/official/archify.json +3 -12
- package/packages/api-gateway/src/marketplace-entries/official/at-file.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/auto-mode.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/better-sidebar.json +3 -13
- package/packages/api-gateway/src/marketplace-entries/official/browser-fetch.json +2 -5
- package/packages/api-gateway/src/marketplace-entries/official/browser-session.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/canvas-draw.json +3 -9
- package/packages/api-gateway/src/marketplace-entries/official/change-verifier.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/cleaner.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/cli-notifier.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/code2skill.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/colleague-skill.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/context-doctor.json +2 -8
- package/packages/api-gateway/src/marketplace-entries/official/context.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/cost-meter.json +3 -12
- package/packages/api-gateway/src/marketplace-entries/official/dependency-checker.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/docker-sandbox.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/fail-logger.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/genui.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/git-time-capsule.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/graph-memory.json +3 -12
- package/packages/api-gateway/src/marketplace-entries/official/history-compressor.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/hol-guard.json +4 -11
- package/packages/api-gateway/src/marketplace-entries/official/i18n-pair.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/image-compressor.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/llm-verifier.json +3 -13
- package/packages/api-gateway/src/marketplace-entries/official/mcp-client.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/mcp-panel.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/memory.json +3 -9
- package/packages/api-gateway/src/marketplace-entries/official/mirage-bridge.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/mock-server.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/modlens.json +3 -9
- package/packages/api-gateway/src/marketplace-entries/official/module-search.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/obsidian-sync.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/openpets.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/plan-execute.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/plugin-check.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/plugin-dev.json +3 -12
- package/packages/api-gateway/src/marketplace-entries/official/plugin-finder.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/plugin-radar.json +3 -9
- package/packages/api-gateway/src/marketplace-entries/official/plugin-stars.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/prompt-guard.json +3 -9
- package/packages/api-gateway/src/marketplace-entries/official/prompt-library.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/readme-gen.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/recall-unread.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/reverse-skill.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/reviewer-bot.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/runtime-doctor.json +3 -13
- package/packages/api-gateway/src/marketplace-entries/official/secure-audit.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/session-bookmarks.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/session-bridge.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/session-compare.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/session-export.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/session-insights.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/session-search.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/skill-catalog.json +3 -12
- package/packages/api-gateway/src/marketplace-entries/official/skill-guard.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/sql-lens.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/synapse.json +3 -9
- package/packages/api-gateway/src/marketplace-entries/official/tab-manager.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/taskboard.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/telemetry-blocker.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/test-harness.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/theme-studio.json +3 -11
- package/packages/api-gateway/src/marketplace-entries/official/token-guard.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/turn-rewind.json +2 -7
- package/packages/api-gateway/src/marketplace-entries/official/undo-savepoint.json +3 -9
- package/packages/api-gateway/src/marketplace-entries/official/vision-toolkit.json +2 -6
- package/packages/api-gateway/src/marketplace-entries/official/web-research.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/workspace-navigator.json +3 -13
- package/packages/api-gateway/src/marketplace-entries/official/workspace-search.json +3 -10
- package/packages/api-gateway/src/marketplace-entries/official/yaml-validator.json +2 -6
- package/packages/api-gateway/test/index.test.ts +363 -1
- package/packages/api-gateway/test/marketplace-schema.test.ts +139 -0
- package/packages/api-gateway/test/release-contract.test.ts +77 -0
- package/packages/api-gateway/test/release-package.test.ts +1 -1
- package/packages/api-gateway/test/release-version.test.ts +6 -4
- package/packages/bundle-web-app/dist/index.d.ts +3 -0
- package/packages/bundle-web-app/dist/index.d.ts.map +1 -1
- package/packages/bundle-web-app/dist/index.js +9 -5
- package/packages/bundle-web-app/dist/index.js.map +1 -1
- package/packages/bundle-web-app/package.json +1 -1
- package/packages/bundle-web-app/src/index.ts +12 -5
- package/packages/bundle-web-app/test/index.test.ts +33 -2
- package/packages/cli/dist/node-stdio.d.ts.map +1 -1
- package/packages/cli/dist/node-stdio.js +3 -1
- package/packages/cli/dist/node-stdio.js.map +1 -1
- package/packages/cli/dist/relaunch.d.ts.map +1 -1
- package/packages/cli/dist/relaunch.js +6 -1
- package/packages/cli/dist/relaunch.js.map +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/node-stdio.ts +6 -3
- package/packages/cli/src/relaunch.ts +5 -1
- package/packages/cli/test/node-stdio.test.ts +43 -0
- package/packages/cli/test/relaunch.test.ts +35 -0
- package/packages/host-webserver/dist/index.d.ts.map +1 -1
- package/packages/host-webserver/dist/index.js +52 -3
- 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 +57 -3
- package/packages/host-webserver/test/index.test.ts +129 -1
- package/apps/web/dist/assets/index-e92yZuUr.js +0 -22
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-Bo9CNI_U.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-BVI_IS-R.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.23",
|
|
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.23",
|
|
14
|
+
"@pi-harness/client-web": "0.1.23",
|
|
15
|
+
"@pi-harness/core": "0.1.23",
|
|
16
|
+
"@pi-harness/host-webserver": "0.1.23",
|
|
17
|
+
"@pi-harness/web-app": "0.1.23"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@tailwindcss/vite": "^4.3.3",
|
|
@@ -4,7 +4,9 @@ import { join } from "node:path";
|
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { bootHarness, coreUpdateNotice, provideLaunchContext } from "@pi-harness/core";
|
|
6
6
|
import "@pi-harness/host-webserver";
|
|
7
|
-
|
|
7
|
+
// Accept the bracketed URL form of an IPv6 literal (e.g. "[::1]") but bind the bare address: net.Server.listen resolves the host through getaddrinfo, which rejects brackets with ENOTFOUND.
|
|
8
|
+
const rawHost = process.env.PI_HARNESS_HOST ?? "127.0.0.1";
|
|
9
|
+
const host = rawHost.startsWith("[") && rawHost.endsWith("]") ? rawHost.slice(1, -1) : rawHost;
|
|
8
10
|
const DEFAULT_PI_HARNESS_PORT = 3141;
|
|
9
11
|
const port = Number(process.env.PI_HARNESS_PORT ?? DEFAULT_PI_HARNESS_PORT);
|
|
10
12
|
if (!Number.isInteger(port) || port < 0 || port > 65_535)
|
|
@@ -33,6 +35,7 @@ const processExit = new Promise((resolve) => {
|
|
|
33
35
|
resolveExit = resolve;
|
|
34
36
|
});
|
|
35
37
|
let harness;
|
|
38
|
+
const exitCodeFor = (signal) => (signal === "SIGINT" ? 130 : signal === "SIGHUP" ? 129 : 143);
|
|
36
39
|
const formatStartupError = (error) => {
|
|
37
40
|
const message = error instanceof Error ? error.message : String(error);
|
|
38
41
|
if (!/Pi model is not registered: everyapi\//u.test(message))
|
|
@@ -46,23 +49,33 @@ const shutdown = async (signal) => {
|
|
|
46
49
|
startupAbort.abort(signal);
|
|
47
50
|
if (harness !== undefined) {
|
|
48
51
|
let disposed = false;
|
|
52
|
+
let watchdog;
|
|
49
53
|
await Promise.race([
|
|
50
54
|
harness.dispose().then(() => {
|
|
51
55
|
disposed = true;
|
|
52
56
|
}),
|
|
53
|
-
new Promise((resolve) =>
|
|
57
|
+
new Promise((resolve) => {
|
|
58
|
+
watchdog = setTimeout(resolve, 5_000);
|
|
59
|
+
}),
|
|
54
60
|
]);
|
|
61
|
+
// Once dispose settles the watchdog must not hold the event loop open for the remainder of the 5 s window.
|
|
62
|
+
clearTimeout(watchdog);
|
|
55
63
|
if (!disposed) {
|
|
56
64
|
process.stderr.write("Pi Harness web shutdown timed out\n");
|
|
57
|
-
process.exit(signal
|
|
65
|
+
process.exit(exitCodeFor(signal));
|
|
58
66
|
return;
|
|
59
67
|
}
|
|
60
68
|
}
|
|
61
|
-
process.exitCode = signal
|
|
69
|
+
process.exitCode = exitCodeFor(signal);
|
|
62
70
|
resolveExit?.();
|
|
63
71
|
};
|
|
64
72
|
for (const signal of signals) {
|
|
65
|
-
process.once
|
|
73
|
+
// Register with process.on rather than process.once: the Pi coding agent transitively loads signal-exit, which re-raises the signal with the default disposition (killing the process before dispose completes) whenever it finds no listener other than its own. A once-listener is removed before signal-exit runs, so it would trigger exactly that. A repeated signal during shutdown force-exits instead of waiting for the watchdog.
|
|
74
|
+
process.on(signal, () => {
|
|
75
|
+
if (shuttingDown) {
|
|
76
|
+
process.exit(exitCodeFor(signal));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
66
79
|
void shutdown(signal);
|
|
67
80
|
});
|
|
68
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/server/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,4BAA4B,CAAC;AAMpC,MAAM,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/server/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,9 @@ import type { WebServer } from "@pi-harness/host-webserver";
|
|
|
10
10
|
// Keep the host service declaration in the server entrypoint's type graph.
|
|
11
11
|
type HarnessWebServer = WebServer;
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
// Accept the bracketed URL form of an IPv6 literal (e.g. "[::1]") but bind the bare address: net.Server.listen resolves the host through getaddrinfo, which rejects brackets with ENOTFOUND.
|
|
14
|
+
const rawHost = process.env.PI_HARNESS_HOST ?? "127.0.0.1";
|
|
15
|
+
const host = rawHost.startsWith("[") && rawHost.endsWith("]") ? rawHost.slice(1, -1) : rawHost;
|
|
14
16
|
const DEFAULT_PI_HARNESS_PORT = 3141;
|
|
15
17
|
const port = Number(process.env.PI_HARNESS_PORT ?? DEFAULT_PI_HARNESS_PORT);
|
|
16
18
|
if (!Number.isInteger(port) || port < 0 || port > 65_535) throw new Error("PI_HARNESS_PORT must be an integer between 0 and 65535");
|
|
@@ -40,6 +42,7 @@ const processExit = new Promise<void>((resolve) => {
|
|
|
40
42
|
resolveExit = resolve;
|
|
41
43
|
});
|
|
42
44
|
let harness: Awaited<ReturnType<typeof bootHarness>> | undefined;
|
|
45
|
+
const exitCodeFor = (signal: NodeJS.Signals): number => (signal === "SIGINT" ? 130 : signal === "SIGHUP" ? 129 : 143);
|
|
43
46
|
const formatStartupError = (error: unknown): string => {
|
|
44
47
|
const message = error instanceof Error ? error.message : String(error);
|
|
45
48
|
if (!/Pi model is not registered: everyapi\//u.test(message)) return message;
|
|
@@ -51,23 +54,33 @@ const shutdown = async (signal: NodeJS.Signals): Promise<void> => {
|
|
|
51
54
|
startupAbort.abort(signal);
|
|
52
55
|
if (harness !== undefined) {
|
|
53
56
|
let disposed = false;
|
|
57
|
+
let watchdog: NodeJS.Timeout | undefined;
|
|
54
58
|
await Promise.race([
|
|
55
59
|
harness.dispose().then(() => {
|
|
56
60
|
disposed = true;
|
|
57
61
|
}),
|
|
58
|
-
new Promise<void>((resolve) =>
|
|
62
|
+
new Promise<void>((resolve) => {
|
|
63
|
+
watchdog = setTimeout(resolve, 5_000);
|
|
64
|
+
}),
|
|
59
65
|
]);
|
|
66
|
+
// Once dispose settles the watchdog must not hold the event loop open for the remainder of the 5 s window.
|
|
67
|
+
clearTimeout(watchdog);
|
|
60
68
|
if (!disposed) {
|
|
61
69
|
process.stderr.write("Pi Harness web shutdown timed out\n");
|
|
62
|
-
process.exit(signal
|
|
70
|
+
process.exit(exitCodeFor(signal));
|
|
63
71
|
return;
|
|
64
72
|
}
|
|
65
73
|
}
|
|
66
|
-
process.exitCode = signal
|
|
74
|
+
process.exitCode = exitCodeFor(signal);
|
|
67
75
|
resolveExit?.();
|
|
68
76
|
};
|
|
69
77
|
for (const signal of signals) {
|
|
70
|
-
process.once
|
|
78
|
+
// Register with process.on rather than process.once: the Pi coding agent transitively loads signal-exit, which re-raises the signal with the default disposition (killing the process before dispose completes) whenever it finds no listener other than its own. A once-listener is removed before signal-exit runs, so it would trigger exactly that. A repeated signal during shutdown force-exits instead of waiting for the watchdog.
|
|
79
|
+
process.on(signal, () => {
|
|
80
|
+
if (shuttingDown) {
|
|
81
|
+
process.exit(exitCodeFor(signal));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
71
84
|
void shutdown(signal);
|
|
72
85
|
});
|
|
73
86
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { afterEach, describe, expect, test } from "vitest";
|
|
6
|
+
|
|
7
|
+
const BIN = join(import.meta.dirname, "..", "server-dist", "bin.js");
|
|
8
|
+
|
|
9
|
+
interface LauncherRun {
|
|
10
|
+
readonly consoleUrl: string;
|
|
11
|
+
readonly code: number | null;
|
|
12
|
+
readonly signal: NodeJS.Signals | null;
|
|
13
|
+
readonly elapsedMs: number;
|
|
14
|
+
readonly stderr: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const directories: string[] = [];
|
|
18
|
+
|
|
19
|
+
afterEach(async () => {
|
|
20
|
+
await Promise.all(directories.splice(0).map(async (directory) => rm(directory, { recursive: true, force: true })));
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Boots the built launcher on an ephemeral port with an isolated agent directory, waits for the console URL, sends the signal, and reports how the process exited.
|
|
24
|
+
async function runLauncher(signal: NodeJS.Signals, extraEnv: Record<string, string> = {}): Promise<LauncherRun> {
|
|
25
|
+
const agentDir = await mkdtemp(join(tmpdir(), "pi-harness-web-bin-"));
|
|
26
|
+
directories.push(agentDir);
|
|
27
|
+
const child = spawn(process.execPath, [BIN], {
|
|
28
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
29
|
+
env: {
|
|
30
|
+
...process.env,
|
|
31
|
+
PI_HARNESS_PORT: "0",
|
|
32
|
+
PI_AGENT_DIR: agentDir,
|
|
33
|
+
PI_HARNESS_PROVIDER: "anthropic",
|
|
34
|
+
PI_HARNESS_MODEL: "claude-sonnet-4-5",
|
|
35
|
+
...extraEnv,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
let stdout = "";
|
|
39
|
+
let stderr = "";
|
|
40
|
+
child.stdout.setEncoding("utf8");
|
|
41
|
+
child.stderr.setEncoding("utf8");
|
|
42
|
+
child.stderr.on("data", (chunk: string) => {
|
|
43
|
+
stderr += chunk;
|
|
44
|
+
});
|
|
45
|
+
const exit = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) =>
|
|
46
|
+
child.once("exit", (code, exitSignal) => resolve({ code, signal: exitSignal })),
|
|
47
|
+
);
|
|
48
|
+
const consoleUrl = await new Promise<string>((resolve, reject) => {
|
|
49
|
+
const check = (chunk: string) => {
|
|
50
|
+
stdout += chunk;
|
|
51
|
+
const match = /Pi Harness web console: (\S+)/u.exec(stdout);
|
|
52
|
+
if (match?.[1] !== undefined) {
|
|
53
|
+
child.stdout.off("data", check);
|
|
54
|
+
resolve(match[1]);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
child.stdout.on("data", check);
|
|
58
|
+
void exit.then(({ code }) => reject(new Error("launcher exited before printing the console URL (code " + String(code) + "): " + stderr)));
|
|
59
|
+
});
|
|
60
|
+
const started = Date.now();
|
|
61
|
+
child.kill(signal);
|
|
62
|
+
const timeout = setTimeout(() => child.kill("SIGKILL"), 15_000);
|
|
63
|
+
const result = await exit;
|
|
64
|
+
clearTimeout(timeout);
|
|
65
|
+
return { consoleUrl, ...result, elapsedMs: Date.now() - started, stderr };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
describe("web launcher", () => {
|
|
69
|
+
test("completes graceful shutdown on SIGINT and exits with code 130 instead of dying by signal", async () => {
|
|
70
|
+
const run = await runLauncher("SIGINT");
|
|
71
|
+
expect(run.consoleUrl).toMatch(/^http:\/\/127\.0\.0\.1:\d+$/u);
|
|
72
|
+
expect(run.signal).toBeNull();
|
|
73
|
+
expect(run.code).toBe(130);
|
|
74
|
+
expect(run.stderr).not.toContain("shutdown timed out");
|
|
75
|
+
expect(run.elapsedMs).toBeLessThan(4_000);
|
|
76
|
+
}, 30_000);
|
|
77
|
+
|
|
78
|
+
test("maps SIGTERM to exit code 143", async () => {
|
|
79
|
+
const run = await runLauncher("SIGTERM");
|
|
80
|
+
expect(run.signal).toBeNull();
|
|
81
|
+
expect(run.code).toBe(143);
|
|
82
|
+
expect(run.stderr).not.toContain("shutdown timed out");
|
|
83
|
+
}, 30_000);
|
|
84
|
+
|
|
85
|
+
test("binds a bracketed IPv6 loopback host by stripping the brackets", async () => {
|
|
86
|
+
const run = await runLauncher("SIGINT", { PI_HARNESS_HOST: "[::1]" });
|
|
87
|
+
expect(run.consoleUrl).toMatch(/^http:\/\/\[::1\]:\d+$/u);
|
|
88
|
+
expect(run.code).toBe(130);
|
|
89
|
+
}, 30_000);
|
|
90
|
+
});
|
|
@@ -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;;;;mBAmoBlC,OAAO;;AAHxB,wBA+2CE"}
|