@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { execFile, type ExecFileException } from "node:child_process";
|
|
2
|
-
import { mkdir, mkdtemp, readFile, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { mkdir, mkdtemp, readFile, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
|
|
3
3
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
4
|
-
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { basename, dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import type { Context } from "@deepseek-ai/cordis";
|
|
7
7
|
import { SessionManager, type AgentSessionEvent, type ExtensionUIContext } from "@earendil-works/pi-coding-agent";
|
|
@@ -42,6 +42,8 @@ const IMPORT_BODY_LIMIT_BYTES = 16 * 1024 * 1024;
|
|
|
42
42
|
// Retained trajectory events are replayed to every SSE client and returned by /api/session, so the array must stay bounded.
|
|
43
43
|
const MAX_RETAINED_EVENTS = 2000;
|
|
44
44
|
const GIT_TIMEOUT_MS = 15_000;
|
|
45
|
+
// 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.
|
|
46
|
+
const GIT_MUTATION_TIMEOUT_MS = 120_000;
|
|
45
47
|
|
|
46
48
|
class PayloadTooLargeError extends Error {
|
|
47
49
|
constructor() {
|
|
@@ -166,7 +168,7 @@ interface MetadataLogger {
|
|
|
166
168
|
warn(message: string): void;
|
|
167
169
|
}
|
|
168
170
|
|
|
169
|
-
// A missing file is the normal first-run state.
|
|
171
|
+
// 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.
|
|
170
172
|
async function readSessionMetadata(manager: SessionManager, logger: MetadataLogger): Promise<SessionMetadataMap> {
|
|
171
173
|
const file = sessionMetadataFile(manager);
|
|
172
174
|
let raw: string;
|
|
@@ -174,8 +176,7 @@ async function readSessionMetadata(manager: SessionManager, logger: MetadataLogg
|
|
|
174
176
|
raw = await readFile(file, "utf8");
|
|
175
177
|
} catch (error) {
|
|
176
178
|
if ((error as NodeJS.ErrnoException).code === "ENOENT") return {};
|
|
177
|
-
|
|
178
|
-
return {};
|
|
179
|
+
throw error;
|
|
179
180
|
}
|
|
180
181
|
try {
|
|
181
182
|
const parsed: unknown = JSON.parse(raw);
|
|
@@ -202,27 +203,38 @@ async function writeSessionMetadata(manager: SessionManager, metadata: SessionMe
|
|
|
202
203
|
await atomicWriteFile(sessionMetadataFile(manager), JSON.stringify(metadata, null, 2) + "\n", { encoding: "utf8" });
|
|
203
204
|
}
|
|
204
205
|
|
|
205
|
-
// Every
|
|
206
|
+
// 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.
|
|
206
207
|
let sessionMetadataQueue: Promise<unknown> = Promise.resolve();
|
|
207
208
|
|
|
209
|
+
function withSessionMetadataLock<T>(operation: () => Promise<T>): Promise<T> {
|
|
210
|
+
const next = sessionMetadataQueue.catch(() => undefined).then(operation);
|
|
211
|
+
sessionMetadataQueue = next;
|
|
212
|
+
return next;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function readSessionMetadataLocked(manager: SessionManager, logger: MetadataLogger): Promise<SessionMetadataMap> {
|
|
216
|
+
return withSessionMetadataLock(() => readSessionMetadata(manager, logger));
|
|
217
|
+
}
|
|
218
|
+
|
|
208
219
|
function mutateSessionMetadata<T>(manager: SessionManager, logger: MetadataLogger, mutate: (metadata: SessionMetadataMap) => Promise<T> | T): Promise<T> {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
220
|
+
return withSessionMetadataLock(async () => {
|
|
221
|
+
const metadata = await readSessionMetadata(manager, logger);
|
|
222
|
+
const result = await mutate(metadata);
|
|
223
|
+
await writeSessionMetadata(manager, metadata);
|
|
224
|
+
return result;
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// 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.
|
|
229
|
+
function escapesRoot(relativePath: string): boolean {
|
|
230
|
+
return isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(".." + sep);
|
|
219
231
|
}
|
|
220
232
|
|
|
221
233
|
function sessionPathInDirectory(path: string, manager: SessionManager): boolean {
|
|
222
234
|
const root = resolve(manager.getSessionDir());
|
|
223
235
|
const target = resolve(path);
|
|
224
236
|
const relativePath = relative(root, target);
|
|
225
|
-
return relativePath !== "" && !
|
|
237
|
+
return relativePath !== "" && !escapesRoot(relativePath) && target.endsWith(".jsonl");
|
|
226
238
|
}
|
|
227
239
|
|
|
228
240
|
const webSessionUi = {
|
|
@@ -529,40 +541,71 @@ function gitTermination(error: ExecFileException | null): GitTermination | undef
|
|
|
529
541
|
return undefined;
|
|
530
542
|
}
|
|
531
543
|
|
|
532
|
-
function gitTerminationMessage(command: string, termination: GitTermination): string {
|
|
544
|
+
function gitTerminationMessage(command: string, termination: GitTermination, timeoutMs = GIT_TIMEOUT_MS): string {
|
|
533
545
|
return termination === "timeout"
|
|
534
|
-
? `git ${command} timed out after ${
|
|
546
|
+
? `git ${command} timed out after ${timeoutMs / 1000} seconds`
|
|
535
547
|
: `git ${command} produced more output than the buffer limit allows`;
|
|
536
548
|
}
|
|
537
549
|
|
|
550
|
+
interface GitStatusEntry {
|
|
551
|
+
readonly path: string;
|
|
552
|
+
readonly status: string;
|
|
553
|
+
}
|
|
554
|
+
|
|
538
555
|
interface GitStatusResult {
|
|
539
|
-
readonly
|
|
556
|
+
readonly entries: readonly GitStatusEntry[];
|
|
540
557
|
readonly truncated: boolean;
|
|
541
558
|
}
|
|
542
559
|
|
|
543
|
-
// `-z` is
|
|
544
|
-
function
|
|
560
|
+
// `-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.
|
|
561
|
+
function parseGitStatus(output: string, prefix: string): GitStatusEntry[] {
|
|
562
|
+
const fields = output.split("\0");
|
|
563
|
+
const entries: GitStatusEntry[] = [];
|
|
564
|
+
for (let index = 0; index < fields.length; index += 1) {
|
|
565
|
+
const field = fields[index] ?? "";
|
|
566
|
+
if (field.length < 4) continue;
|
|
567
|
+
const code = field.slice(0, 2);
|
|
568
|
+
const path = field.slice(3);
|
|
569
|
+
if (code.startsWith("R") || code.startsWith("C")) index += 1;
|
|
570
|
+
entries.push({ path: prefix === "" ? path : posix.relative("/" + prefix, "/" + path), status: code.trim() || "??" });
|
|
571
|
+
}
|
|
572
|
+
return entries;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
function gitStatusOutput(cwd: string): Promise<{ output: string; truncated: boolean }> {
|
|
545
576
|
return new Promise((resolveStatus, rejectStatus) => {
|
|
546
|
-
execFile(
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
577
|
+
execFile(
|
|
578
|
+
"git",
|
|
579
|
+
["status", "--porcelain", "-z", "--untracked-files=all"],
|
|
580
|
+
{ cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 512 * 1024 },
|
|
581
|
+
(error, stdout, stderr) => {
|
|
582
|
+
if (error === null) {
|
|
583
|
+
resolveStatus({ output: stdout, truncated: false });
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
const termination = gitTermination(error);
|
|
587
|
+
if (termination === "output-limit") {
|
|
588
|
+
// Keep the complete entries that arrived before the kill; the final entry may have been cut mid-path.
|
|
589
|
+
resolveStatus({ output: stdout.slice(0, stdout.lastIndexOf("\0") + 1), truncated: true });
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
if (termination === undefined && error.code === 128 && /not a git repository/i.test(stderr)) {
|
|
593
|
+
resolveStatus({ output: "", truncated: false });
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
rejectStatus(new Error(termination ? gitTerminationMessage("status", termination) : stderr.trim() || error.message, { cause: error }));
|
|
597
|
+
},
|
|
598
|
+
);
|
|
563
599
|
});
|
|
564
600
|
}
|
|
565
601
|
|
|
602
|
+
async function gitStatus(cwd: string): Promise<GitStatusResult> {
|
|
603
|
+
const { output, truncated } = await gitStatusOutput(cwd);
|
|
604
|
+
if (output === "") return { entries: [], truncated };
|
|
605
|
+
const prefix = await gitCommand(cwd, ["rev-parse", "--show-prefix"]);
|
|
606
|
+
return { entries: parseGitStatus(output, prefix.code === 0 ? prefix.stdout.trim() : ""), truncated };
|
|
607
|
+
}
|
|
608
|
+
|
|
566
609
|
function gitDiff(cwd: string, path: string): Promise<string> {
|
|
567
610
|
return new Promise((resolveOutput) => {
|
|
568
611
|
execFile("git", ["diff", "--no-ext-diff", "--", path], { cwd, timeout: GIT_TIMEOUT_MS, maxBuffer: 1024 * 1024 }, (error, stdout) =>
|
|
@@ -578,9 +621,9 @@ interface GitCommandResult {
|
|
|
578
621
|
readonly terminated: GitTermination | undefined;
|
|
579
622
|
}
|
|
580
623
|
|
|
581
|
-
function gitCommand(cwd: string, args: readonly string[]): Promise<GitCommandResult> {
|
|
624
|
+
function gitCommand(cwd: string, args: readonly string[], timeoutMs = GIT_TIMEOUT_MS): Promise<GitCommandResult> {
|
|
582
625
|
return new Promise((resolveResult) => {
|
|
583
|
-
execFile("git", [...args], { cwd, timeout:
|
|
626
|
+
execFile("git", [...args], { cwd, timeout: timeoutMs, maxBuffer: 2 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
584
627
|
const code = error && typeof error.code === "number" ? error.code : error ? 1 : 0;
|
|
585
628
|
resolveResult({ stdout, stderr, code, terminated: gitTermination(error) });
|
|
586
629
|
});
|
|
@@ -668,7 +711,7 @@ function workspacePaths(root: string, paths: unknown): string[] | Error {
|
|
|
668
711
|
const requested = path as string;
|
|
669
712
|
const absolute = resolve(root, requested);
|
|
670
713
|
const relativePath = relative(root, absolute);
|
|
671
|
-
if (
|
|
714
|
+
if (escapesRoot(relativePath)) return new Error("path must stay inside the workspace");
|
|
672
715
|
normalized.push(relativePath);
|
|
673
716
|
}
|
|
674
717
|
return [...new Set(normalized)];
|
|
@@ -821,8 +864,8 @@ export default {
|
|
|
821
864
|
sendJson(response, 400, { error: "settings source must contain a JSON object" });
|
|
822
865
|
return;
|
|
823
866
|
}
|
|
824
|
-
|
|
825
|
-
|
|
867
|
+
// 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.
|
|
868
|
+
const path = await realpath(join(services.launch.agentDir, "settings.json")).catch(() => join(services.launch.agentDir, "settings.json"));
|
|
826
869
|
const mode = await stat(path).then(
|
|
827
870
|
(info) => info.mode & 0o777,
|
|
828
871
|
() => 0o644,
|
|
@@ -1347,20 +1390,11 @@ export default {
|
|
|
1347
1390
|
sendJson(response, 500, { error: errorText(error) });
|
|
1348
1391
|
return;
|
|
1349
1392
|
}
|
|
1350
|
-
const
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
const code = record.slice(0, 2).trim() || "??";
|
|
1356
|
-
// Rename and copy records carry the original path in a second NUL-terminated field, which is not a workspace change of its own.
|
|
1357
|
-
if (code.startsWith("R") || code.startsWith("C")) index += 1;
|
|
1358
|
-
items.push({
|
|
1359
|
-
path: record.slice(3),
|
|
1360
|
-
status: code,
|
|
1361
|
-
label: code === "??" ? "untracked" : code.includes("D") ? "deleted" : code.includes("A") ? "added" : "modified",
|
|
1362
|
-
});
|
|
1363
|
-
}
|
|
1393
|
+
const items = status.entries.map((entry) => ({
|
|
1394
|
+
path: entry.path,
|
|
1395
|
+
status: entry.status,
|
|
1396
|
+
label: entry.status === "??" ? "untracked" : entry.status.includes("D") ? "deleted" : entry.status.includes("A") ? "added" : "modified",
|
|
1397
|
+
}));
|
|
1364
1398
|
sendJson(response, 200, { items, ...(status.truncated ? { truncated: true } : {}) });
|
|
1365
1399
|
},
|
|
1366
1400
|
});
|
|
@@ -1380,7 +1414,7 @@ export default {
|
|
|
1380
1414
|
const root = resolve(activeCwd(services));
|
|
1381
1415
|
const absolute = resolve(root, requested);
|
|
1382
1416
|
const relativePath = relative(root, absolute);
|
|
1383
|
-
if (
|
|
1417
|
+
if (escapesRoot(relativePath)) {
|
|
1384
1418
|
sendJson(response, 400, { error: "path must stay inside the workspace" });
|
|
1385
1419
|
return;
|
|
1386
1420
|
}
|
|
@@ -1406,18 +1440,18 @@ export default {
|
|
|
1406
1440
|
return;
|
|
1407
1441
|
}
|
|
1408
1442
|
const root = resolve(activeCwd(services));
|
|
1409
|
-
const add = await gitCommand(root, ["add", "-A", "--", ...paths]);
|
|
1443
|
+
const add = await gitCommand(root, ["add", "-A", "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
|
|
1410
1444
|
if (add.terminated) {
|
|
1411
|
-
sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated) });
|
|
1445
|
+
sendJson(response, 500, { error: gitTerminationMessage("add", add.terminated, GIT_MUTATION_TIMEOUT_MS) });
|
|
1412
1446
|
return;
|
|
1413
1447
|
}
|
|
1414
1448
|
if (add.code !== 0) {
|
|
1415
1449
|
sendJson(response, 409, { error: add.stderr.trim() || "Unable to stage workspace files" });
|
|
1416
1450
|
return;
|
|
1417
1451
|
}
|
|
1418
|
-
const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths]);
|
|
1452
|
+
const commit = await gitCommand(root, ["commit", "-m", payload.message.trim(), "--", ...paths], GIT_MUTATION_TIMEOUT_MS);
|
|
1419
1453
|
if (commit.terminated) {
|
|
1420
|
-
sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated) });
|
|
1454
|
+
sendJson(response, 500, { error: gitTerminationMessage("commit", commit.terminated, GIT_MUTATION_TIMEOUT_MS) });
|
|
1421
1455
|
return;
|
|
1422
1456
|
}
|
|
1423
1457
|
if (commit.code !== 0) {
|
|
@@ -1469,9 +1503,9 @@ export default {
|
|
|
1469
1503
|
return;
|
|
1470
1504
|
}
|
|
1471
1505
|
if (trackedPaths.length > 0) {
|
|
1472
|
-
const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths]);
|
|
1506
|
+
const restore = await gitCommand(root, ["restore", "--worktree", "--staged", "--", ...trackedPaths], GIT_MUTATION_TIMEOUT_MS);
|
|
1473
1507
|
if (restore.terminated) {
|
|
1474
|
-
sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated) });
|
|
1508
|
+
sendJson(response, 500, { error: gitTerminationMessage("restore", restore.terminated, GIT_MUTATION_TIMEOUT_MS) });
|
|
1475
1509
|
return;
|
|
1476
1510
|
}
|
|
1477
1511
|
if (restore.code !== 0) {
|
|
@@ -2019,7 +2053,7 @@ export default {
|
|
|
2019
2053
|
const page = Math.max(0, Number.parseInt(url.searchParams.get("page") ?? "0", 10) || 0);
|
|
2020
2054
|
const pageSize = Math.min(100, Math.max(1, Number.parseInt(url.searchParams.get("pageSize") ?? "50", 10) || 50));
|
|
2021
2055
|
const includeArchived = url.searchParams.get("includeArchived") === "true";
|
|
2022
|
-
const metadata = await
|
|
2056
|
+
const metadata = await readSessionMetadataLocked(manager, context.logger);
|
|
2023
2057
|
const items =
|
|
2024
2058
|
typeof manager.isPersisted === "function" && manager.isPersisted() ? await SessionManager.list(services.launch.cwd, manager.getSessionDir()) : [];
|
|
2025
2059
|
const filtered = items.filter((item) => includeArchived || metadata[item.path]?.archived !== true);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "agent-teams",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/agent-teams",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Agent Team Board",
|
|
6
6
|
"description": "Maintain a bounded, session-local collaboration ledger of named roles, dependency-aware tasks, and mailbox notes without spawning agents or sending external messages.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "anchored-standard",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/anchored-standard",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Anchored Standard",
|
|
6
6
|
"description": "Audit agent trajectories against an explicit tool-call allowlist and flag activity outside the anchored run.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "annotation",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/annotation",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Annotations",
|
|
6
6
|
"description": "Capture bounded selections and notes from the conversation for later agent context.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "archify",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/archify",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Architecture Map",
|
|
6
6
|
"description": "Build a bounded, read-only architecture map from workspace components and package dependencies.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "at-file",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/at-file",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "@file Context",
|
|
6
6
|
"description": "Attach a bounded 256 KiB strict UTF-8 workspace file using canonical workspace path confinement and no-follow regular-file reads, framing it as offline, read-only, untrusted model context with closing-tag neutralization and cancellable sequential execution.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "auto-mode",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/auto-mode",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Auto Mode",
|
|
6
6
|
"description": "Execute argv commands under a safe policy that blocks shell wrappers and requires confirmation for risky operations.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "better-sidebar",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/better-sidebar",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Better Sidebar",
|
|
6
6
|
"description": "Show a compact workspace, Git, and session overview beside the conversation without modifying files.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "browser-fetch",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/browser-fetch",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Browser Fetch",
|
|
6
6
|
"description": "Fetch public HTTP and HTTPS pages as bounded text with descriptor-safe inputs, DNS pinning, per-redirect private-network validation, textual MIME enforcement, cancellation, a whole-request timeout, and validated fail-closed panel reporting.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "browser-session",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/browser-session",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Browser Session",
|
|
6
6
|
"description": "Control a loopback-only Chrome DevTools session with descriptor-safe commands, bounded discovery, cancellable operations, screenshot metadata protection, and validated fail-closed panel previews.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "canvas-draw",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/canvas-draw",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Canvas Draw",
|
|
6
6
|
"description": "Generate validated, bounded Mermaid flowchart source from structured nodes and edges in the workspace UI.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "change-verifier",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/change-verifier",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Change Verifier",
|
|
6
6
|
"description": "Combine project tests and Git change review into one explicit verification gate before handoff.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "cleaner",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/cleaner",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Cleaner",
|
|
6
6
|
"description": "Strict descriptor-safe configuration and parameters, display-safe bounded Pi Harness Git capsule inventory, removal with explicit confirmation and retention controls, symlink and replacement defenses, cancellable serialization, and a fail-closed normalized panel.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "cli-notifier",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/cli-notifier",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "CLI Notifier",
|
|
6
6
|
"description": "Send local desktop notifications when an agent turn completes, fails, or is aborted, and when context compaction fails.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "code2skill",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/code2skill",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Code2Skill",
|
|
6
6
|
"description": "Package selected workspace source files into a bounded local Pi skill with a generated SKILL.md manifest and preserved references.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "colleague-skill",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/colleague-skill",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Colleague Skill",
|
|
6
6
|
"description": "Create durable, structured handoff packets for another role without hidden agents or external message delivery.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "context-doctor",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/context-doctor",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Context Doctor",
|
|
6
6
|
"description": "Descriptor-safe bounded context audits detect pressure, oversized or uninspectable messages, and tool errors. Compaction requests are queued until the agent has settled; confirmed model-backed compaction may incur cost and provides cancellable waits with dedicated cancellation.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "context-insights",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/context",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Context Insights",
|
|
6
6
|
"description": "Inspect context usage and descriptor-safe bounded message composition with cached active-session lifecycle counters and a fixed-limit normalized browser panel.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "cost-meter",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/cost-meter",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Cost Meter",
|
|
6
6
|
"description": "Track runtime-reported costs as UTC daily increments in a bounded local ledger, with session snapshots and optional daily budget monitoring; no model prices are guessed.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dependency-checker",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/dependency-checker",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Dependency Checker",
|
|
6
6
|
"description": "Run a bounded, offline, read-only check of workspace package.json and requirements*.txt manifests for local package presence, duplicate declaration consistency, unresolved constraints, and unsupported Python directives.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "docker-sandbox",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/docker-sandbox",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Docker Sandbox",
|
|
6
6
|
"description": "Run descriptor-safe argv commands with local-only Docker images, no container network, a read-only workspace by default, fixed CPU, memory, and PID limits, sanitized output, strict panel reporting, and cancellation cleanup.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "fail-logger",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/fail-logger",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Failure Logger",
|
|
6
6
|
"description": "Aggregate bounded extension, Agent, and non-aborted compaction failures through descriptor-safe event inspection, safe diagnostic summaries, and occurrence counts without retaining full payloads.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "genui",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/genui",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "GenUI",
|
|
6
6
|
"description": "Render bounded structured cards with text, badge, and decimal progress blocks while displaying HTML and scripts as plain text.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "git-time-capsule",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/git-time-capsule",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Git Time Capsule",
|
|
6
6
|
"description": "Capture the current unstaged tracked Git diff as a byte-exact, validated undo capsule without external diff or textconv helpers, then reverse-apply it only after explicit confirmation.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "graph-memory",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/graph-memory",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Graph Memory",
|
|
6
6
|
"description": "Store bounded typed task, skill, and event nodes with validated directed relations, atomic locked persistence, and inspectable cross-session search.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "history-compressor",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/history-compressor",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "History Compressor",
|
|
6
6
|
"description": "Compact the current Pi session automatically when context usage approaches a configured threshold.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "hol-guard",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/hol-guard",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "HOL Guard",
|
|
6
6
|
"description": "Audit tool arguments and preflight text for destructive commands, sensitive paths, credentials, and remote exfiltration. Advisory only: reports risk, does not block execution.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "i18n-pair",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/i18n-pair",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "I18n Pair",
|
|
6
6
|
"description": "Strict read-only comparison of bounded JSON locale files from no-follow workspace paths, with collision-safe missing and extra keys, stable failures, cancellation, and validated panel status.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "image-compressor",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/image-compressor",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "Image Compressor",
|
|
6
6
|
"description": "Create bounded image copies for model context while preserving the original file and reporting saved bytes.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "llm-verifier",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/llm-verifier",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "LLM Verifier",
|
|
6
6
|
"description": "Ask a configured verifier model to judge a claim against bounded, untrusted evidence.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "mcp-client",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/mcp-client",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "MCP Client",
|
|
6
6
|
"description": "Connect to direct-argv MCP stdio servers with bounded pagination and protocol validation, tool, resource, and prompt bridging, cancellable queued requests, and lifecycle-owned process cleanup.",
|
|
7
7
|
"author": "Pi Harness",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "mcp-panel",
|
|
3
3
|
"packageName": "@pi-harness/core/plugins/mcp-panel",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.26",
|
|
5
5
|
"name": "MCP Panel",
|
|
6
6
|
"description": "Inspect MCP server health and tools, preview profile patches, and apply changes only with an explicit confirmation and backup.",
|
|
7
7
|
"author": "Pi Harness",
|