@fitchmultz/pi-subagents 0.0.0-stage → 0.44.5
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/CHANGELOG.md +1654 -0
- package/LICENSE +21 -0
- package/README.md +1533 -2
- package/agents/context-builder.md +97 -0
- package/agents/debugger.md +51 -0
- package/agents/delegate.md +13 -0
- package/agents/fixer.md +37 -0
- package/agents/oracle.md +71 -0
- package/agents/planner.md +72 -0
- package/agents/researcher.md +51 -0
- package/agents/reviewer-claude.md +69 -0
- package/agents/reviewer-gpt.md +68 -0
- package/agents/reviewer-ponytail.md +82 -0
- package/agents/reviewer-security.md +81 -0
- package/agents/reviewer.md +69 -0
- package/agents/scout.md +66 -0
- package/agents/ui-designer.md +51 -0
- package/agents/watcher.md +26 -0
- package/agents/worker.md +46 -0
- package/agents/writer.md +36 -0
- package/dist/agents/agent-management.js +923 -0
- package/dist/agents/agent-scope.js +7 -0
- package/dist/agents/agent-selection.js +20 -0
- package/dist/agents/agent-serializer.js +100 -0
- package/dist/agents/agents.js +752 -0
- package/dist/agents/chain-serializer.js +367 -0
- package/dist/agents/frontmatter.js +21 -0
- package/dist/agents/identity.js +29 -0
- package/dist/agents/skills.js +570 -0
- package/dist/extension/build-info.js +1 -0
- package/dist/extension/compact-tools.js +112 -0
- package/dist/extension/config.js +22 -0
- package/dist/extension/control-notices.js +29 -0
- package/dist/extension/doctor.js +143 -0
- package/dist/extension/fanout-child.js +326 -0
- package/dist/extension/index.js +577 -0
- package/dist/extension/schemas.js +416 -0
- package/dist/extension/tool-input.js +20 -0
- package/dist/extension/tool-result.js +14 -0
- package/dist/history/canonical-result.js +81 -0
- package/dist/history/database.js +72 -0
- package/dist/history/index.js +199 -0
- package/dist/history/ingest.js +468 -0
- package/dist/history/queries.js +350 -0
- package/dist/history/store.js +216 -0
- package/dist/history/types.js +4 -0
- package/dist/history/worker.js +466 -0
- package/dist/intercom/intercom-bridge.js +112 -0
- package/dist/intercom/live-intercom.js +94 -0
- package/dist/intercom/result-intercom.js +373 -0
- package/dist/pi-intercom/agent-dir.js +10 -0
- package/dist/pi-intercom/bridge.js +750 -0
- package/dist/pi-intercom/broker/broker.js +426 -0
- package/dist/pi-intercom/broker/client.js +492 -0
- package/dist/pi-intercom/broker/framing.js +65 -0
- package/dist/pi-intercom/broker/paths.js +42 -0
- package/dist/pi-intercom/broker/pid.js +66 -0
- package/dist/pi-intercom/broker/spawn.js +221 -0
- package/dist/pi-intercom/config.js +102 -0
- package/dist/pi-intercom/index.js +2942 -0
- package/dist/pi-intercom/reply-tracker.js +182 -0
- package/dist/pi-intercom/session-targets.js +128 -0
- package/dist/pi-intercom/subagent-live-events.js +132 -0
- package/dist/pi-intercom/topics.js +157 -0
- package/dist/pi-intercom/types.js +163 -0
- package/dist/pi-intercom/ui/compose.js +269 -0
- package/dist/pi-intercom/ui/inline-message.js +80 -0
- package/dist/pi-intercom/ui/session-list.js +124 -0
- package/dist/runs/background/async-control.js +95 -0
- package/dist/runs/background/async-execution.js +676 -0
- package/dist/runs/background/async-job-tracker.js +383 -0
- package/dist/runs/background/async-result-file.js +58 -0
- package/dist/runs/background/async-resume.js +305 -0
- package/dist/runs/background/async-status.js +442 -0
- package/dist/runs/background/completion-dedupe.js +69 -0
- package/dist/runs/background/completion-delivery.js +245 -0
- package/dist/runs/background/notify.js +71 -0
- package/dist/runs/background/parallel-groups.js +55 -0
- package/dist/runs/background/result-watcher.js +426 -0
- package/dist/runs/background/run-id-resolver.js +64 -0
- package/dist/runs/background/run-status.js +382 -0
- package/dist/runs/background/stale-run-reconciler.js +335 -0
- package/dist/runs/background/subagent-runner-launcher.js +55 -0
- package/dist/runs/background/subagent-runner.js +1872 -0
- package/dist/runs/background/top-level-async.js +5 -0
- package/dist/runs/foreground/chain-clarify.js +1152 -0
- package/dist/runs/foreground/clarify-invocation.js +72 -0
- package/dist/runs/foreground/execution-input.js +423 -0
- package/dist/runs/foreground/foreground-control.js +817 -0
- package/dist/runs/foreground/question-control.js +88 -0
- package/dist/runs/foreground/run-async-path.js +205 -0
- package/dist/runs/foreground/subagent-executor.js +442 -0
- package/dist/runs/foreground/subagent-params.js +165 -0
- package/dist/runs/foreground/wait-run.js +141 -0
- package/dist/runs/shared/acceptance-contract.js +253 -0
- package/dist/runs/shared/acceptance-evaluation.js +256 -0
- package/dist/runs/shared/acceptance-finalization.js +280 -0
- package/dist/runs/shared/acceptance-reports.js +147 -0
- package/dist/runs/shared/acceptance.js +4 -0
- package/dist/runs/shared/chain-outputs.js +110 -0
- package/dist/runs/shared/child-attempt.js +693 -0
- package/dist/runs/shared/child-execution-cwd.js +96 -0
- package/dist/runs/shared/child-observations.js +114 -0
- package/dist/runs/shared/claude-code.js +199 -0
- package/dist/runs/shared/completion-guard.js +31 -0
- package/dist/runs/shared/dynamic-fanout.js +274 -0
- package/dist/runs/shared/history-index.js +72 -0
- package/dist/runs/shared/mcp-direct-tool-allowlist.js +334 -0
- package/dist/runs/shared/model-fallback.js +185 -0
- package/dist/runs/shared/mutating-tool-guard.js +170 -0
- package/dist/runs/shared/native-finalization.js +101 -0
- package/dist/runs/shared/native-usage.js +153 -0
- package/dist/runs/shared/nested-events.js +700 -0
- package/dist/runs/shared/nested-path.js +48 -0
- package/dist/runs/shared/nested-render.js +108 -0
- package/dist/runs/shared/parallel-utils.js +61 -0
- package/dist/runs/shared/parent-receipts.js +68 -0
- package/dist/runs/shared/parent-usage.js +121 -0
- package/dist/runs/shared/pi-args.js +310 -0
- package/dist/runs/shared/pi-spawn.js +52 -0
- package/dist/runs/shared/run-history-queries.js +45 -0
- package/dist/runs/shared/run-history.js +110 -0
- package/dist/runs/shared/run-id-ambiguity.js +4 -0
- package/dist/runs/shared/run-records.js +679 -0
- package/dist/runs/shared/session-cwd-preload.js +33 -0
- package/dist/runs/shared/single-output.js +222 -0
- package/dist/runs/shared/streaming-text.js +15 -0
- package/dist/runs/shared/structured-output.js +55 -0
- package/dist/runs/shared/subagent-control.js +179 -0
- package/dist/runs/shared/subagent-prompt-runtime.js +197 -0
- package/dist/runs/shared/subagent-tool-loop-guard.js +66 -0
- package/dist/runs/shared/supervisor-questions.js +350 -0
- package/dist/runs/shared/workflow-graph.js +214 -0
- package/dist/runs/shared/workflow-policy.js +84 -0
- package/dist/runs/shared/worktree.js +525 -0
- package/dist/shared/agent-context-policy.js +126 -0
- package/dist/shared/artifacts.js +96 -0
- package/dist/shared/atomic-json.js +13 -0
- package/dist/shared/cooperative.js +20 -0
- package/dist/shared/execution-cwd.js +14 -0
- package/dist/shared/file-coalescer.js +21 -0
- package/dist/shared/fork-context.js +49 -0
- package/dist/shared/formatters.js +85 -0
- package/dist/shared/journal-reader.js +407 -0
- package/dist/shared/lazy-tools.js +32 -0
- package/dist/shared/model-info.js +68 -0
- package/dist/shared/native-session.js +15 -0
- package/dist/shared/native-tui.js +18 -0
- package/dist/shared/native-typebox.js +20 -0
- package/dist/shared/post-exit-stdio-guard.js +197 -0
- package/dist/shared/prompt-sections.js +8 -0
- package/dist/shared/session-entries.js +52 -0
- package/dist/shared/session-identity.js +14 -0
- package/dist/shared/settings.js +254 -0
- package/dist/shared/status-format.js +111 -0
- package/dist/shared/temp-root.js +114 -0
- package/dist/shared/types.js +207 -0
- package/dist/shared/ui-mode.js +3 -0
- package/dist/shared/utils.js +334 -0
- package/dist/slash/prompt-template-bridge.js +298 -0
- package/dist/slash/slash-bridge.js +116 -0
- package/dist/slash/slash-commands.js +607 -0
- package/dist/slash/slash-live-state.js +246 -0
- package/dist/tui/action-hints.js +75 -0
- package/dist/tui/agent-history.js +197 -0
- package/dist/tui/agent-view.js +1656 -0
- package/dist/tui/render.js +1515 -0
- package/docs/intercom-bridge.md +212 -0
- package/docs/intercom.md +581 -0
- package/docs/performance.md +121 -0
- package/package.json +102 -4
- package/prompts/gather-context-and-clarify.md +14 -0
- package/prompts/parallel-cleanup.md +62 -0
- package/prompts/parallel-context-build.md +56 -0
- package/prompts/parallel-handoff-plan.md +62 -0
- package/prompts/parallel-research.md +51 -0
- package/prompts/parallel-review.md +59 -0
- package/prompts/review-loop.md +42 -0
- package/scripts/build.mjs +134 -0
- package/scripts/check-compat.mjs +48 -0
- package/scripts/compat-host.mjs +19 -0
- package/scripts/intercom-bridge-credentials.mjs +143 -0
- package/scripts/intercom-remote.mjs +103 -0
- package/scripts/linux-smoke.sh +51 -0
- package/scripts/local-install-smoke.mjs +66 -0
- package/scripts/native-package-smoke.mjs +82 -0
- package/scripts/package-smoke.mjs +209 -0
- package/scripts/prepare.mjs +67 -0
- package/scripts/real-pi-smoke.mjs +415 -0
- package/scripts/run-tests.mjs +149 -0
- package/skills/pi-intercom/SKILL.md +113 -0
- package/skills/pi-intercom/evals/evals.json +29 -0
- package/skills/pi-intercom/evals/trigger-evals.json +47 -0
- package/skills/pi-intercom/references/peer-sessions.md +69 -0
- package/skills/pi-subagents/SKILL.md +76 -0
- package/skills/pi-subagents/evals/evals.json +29 -0
- package/skills/pi-subagents/evals/trigger-evals.json +42 -0
- package/skills/pi-subagents/references/full-orchestration-guide.md +863 -0
- package/src/agents/agent-management.ts +813 -0
- package/src/agents/agent-scope.ts +7 -0
- package/src/agents/agent-selection.ts +23 -0
- package/src/agents/agent-serializer.ts +99 -0
- package/src/agents/agents.ts +916 -0
- package/src/agents/chain-serializer.ts +329 -0
- package/src/agents/frontmatter.ts +21 -0
- package/src/agents/identity.ts +30 -0
- package/src/agents/skills.ts +637 -0
- package/src/extension/build-info.ts +2 -0
- package/src/extension/compact-tools.ts +114 -0
- package/src/extension/config.ts +23 -0
- package/src/extension/control-notices.ts +47 -0
- package/src/extension/doctor.ts +171 -0
- package/src/extension/fanout-child.ts +312 -0
- package/src/extension/index.ts +649 -0
- package/src/extension/schemas.ts +444 -0
- package/src/extension/tool-input.ts +19 -0
- package/src/extension/tool-result.ts +16 -0
- package/src/history/canonical-result.ts +62 -0
- package/src/history/database.ts +59 -0
- package/src/history/index.ts +156 -0
- package/src/history/ingest.ts +349 -0
- package/src/history/queries.ts +241 -0
- package/src/history/store.ts +203 -0
- package/src/history/types.ts +166 -0
- package/src/history/worker.ts +321 -0
- package/src/intercom/intercom-bridge.ts +123 -0
- package/src/intercom/live-intercom.ts +104 -0
- package/src/intercom/result-intercom.ts +429 -0
- package/src/pi-intercom/agent-dir.ts +9 -0
- package/src/pi-intercom/bridge.ts +668 -0
- package/src/pi-intercom/broker/broker.ts +463 -0
- package/src/pi-intercom/broker/client.ts +558 -0
- package/src/pi-intercom/broker/framing.ts +77 -0
- package/src/pi-intercom/broker/paths.ts +47 -0
- package/src/pi-intercom/broker/pid.ts +59 -0
- package/src/pi-intercom/broker/spawn.ts +248 -0
- package/src/pi-intercom/config.ts +142 -0
- package/src/pi-intercom/index.ts +2929 -0
- package/src/pi-intercom/reply-tracker.ts +211 -0
- package/src/pi-intercom/session-targets.ts +172 -0
- package/src/pi-intercom/subagent-live-events.ts +133 -0
- package/src/pi-intercom/topics.ts +125 -0
- package/src/pi-intercom/types.ts +271 -0
- package/src/pi-intercom/ui/compose.ts +289 -0
- package/src/pi-intercom/ui/inline-message.ts +92 -0
- package/src/pi-intercom/ui/session-list.ts +139 -0
- package/src/runs/background/async-control.ts +89 -0
- package/src/runs/background/async-execution.ts +850 -0
- package/src/runs/background/async-job-tracker.ts +385 -0
- package/src/runs/background/async-result-file.ts +62 -0
- package/src/runs/background/async-resume.ts +333 -0
- package/src/runs/background/async-status.ts +481 -0
- package/src/runs/background/completion-dedupe.ts +79 -0
- package/src/runs/background/completion-delivery.ts +195 -0
- package/src/runs/background/notify.ts +123 -0
- package/src/runs/background/parallel-groups.ts +53 -0
- package/src/runs/background/result-watcher.ts +423 -0
- package/src/runs/background/run-id-resolver.ts +69 -0
- package/src/runs/background/run-status.ts +384 -0
- package/src/runs/background/stale-run-reconciler.ts +369 -0
- package/src/runs/background/subagent-runner-launcher.ts +56 -0
- package/src/runs/background/subagent-runner.ts +2053 -0
- package/src/runs/background/top-level-async.ts +13 -0
- package/src/runs/foreground/chain-clarify.ts +1340 -0
- package/src/runs/foreground/clarify-invocation.ts +77 -0
- package/src/runs/foreground/execution-input.ts +467 -0
- package/src/runs/foreground/foreground-control.ts +821 -0
- package/src/runs/foreground/question-control.ts +82 -0
- package/src/runs/foreground/run-async-path.ts +243 -0
- package/src/runs/foreground/subagent-executor.ts +501 -0
- package/src/runs/foreground/subagent-params.ts +320 -0
- package/src/runs/foreground/wait-run.ts +124 -0
- package/src/runs/shared/acceptance-contract.ts +257 -0
- package/src/runs/shared/acceptance-evaluation.ts +275 -0
- package/src/runs/shared/acceptance-finalization.ts +353 -0
- package/src/runs/shared/acceptance-reports.ts +152 -0
- package/src/runs/shared/acceptance.ts +33 -0
- package/src/runs/shared/chain-outputs.ts +114 -0
- package/src/runs/shared/child-attempt.ts +623 -0
- package/src/runs/shared/child-execution-cwd.ts +91 -0
- package/src/runs/shared/child-observations.ts +99 -0
- package/src/runs/shared/claude-code.ts +243 -0
- package/src/runs/shared/completion-guard.ts +35 -0
- package/src/runs/shared/dynamic-fanout.ts +295 -0
- package/src/runs/shared/history-index.ts +69 -0
- package/src/runs/shared/mcp-direct-tool-allowlist.ts +376 -0
- package/src/runs/shared/model-fallback.ts +219 -0
- package/src/runs/shared/mutating-tool-guard.ts +194 -0
- package/src/runs/shared/native-finalization.ts +128 -0
- package/src/runs/shared/native-usage.ts +113 -0
- package/src/runs/shared/nested-events.ts +752 -0
- package/src/runs/shared/nested-path.ts +52 -0
- package/src/runs/shared/nested-render.ts +119 -0
- package/src/runs/shared/parallel-utils.ts +153 -0
- package/src/runs/shared/parent-receipts.ts +59 -0
- package/src/runs/shared/parent-usage.ts +121 -0
- package/src/runs/shared/pi-args.ts +350 -0
- package/src/runs/shared/pi-spawn.ts +52 -0
- package/src/runs/shared/run-history-queries.ts +44 -0
- package/src/runs/shared/run-history.ts +100 -0
- package/src/runs/shared/run-id-ambiguity.ts +4 -0
- package/src/runs/shared/run-records.ts +607 -0
- package/src/runs/shared/session-cwd-preload.ts +27 -0
- package/src/runs/shared/single-output.ts +267 -0
- package/src/runs/shared/streaming-text.ts +18 -0
- package/src/runs/shared/structured-output.ts +68 -0
- package/src/runs/shared/subagent-control.ts +219 -0
- package/src/runs/shared/subagent-prompt-runtime.ts +201 -0
- package/src/runs/shared/subagent-tool-loop-guard.ts +89 -0
- package/src/runs/shared/supervisor-questions.ts +415 -0
- package/src/runs/shared/workflow-graph.ts +220 -0
- package/src/runs/shared/workflow-policy.ts +125 -0
- package/src/runs/shared/worktree.ts +635 -0
- package/src/shared/agent-context-policy.ts +184 -0
- package/src/shared/artifacts.ts +95 -0
- package/src/shared/atomic-json.ts +16 -0
- package/src/shared/cooperative.ts +21 -0
- package/src/shared/execution-cwd.ts +14 -0
- package/src/shared/file-coalescer.ts +29 -0
- package/src/shared/fork-context.ts +68 -0
- package/src/shared/formatters.ts +84 -0
- package/src/shared/journal-reader.ts +333 -0
- package/src/shared/lazy-tools.ts +36 -0
- package/src/shared/model-info.ts +81 -0
- package/src/shared/native-session.ts +8 -0
- package/src/shared/native-tui.ts +10 -0
- package/src/shared/native-typebox.ts +14 -0
- package/src/shared/post-exit-stdio-guard.ts +204 -0
- package/src/shared/prompt-sections.ts +10 -0
- package/src/shared/session-entries.ts +49 -0
- package/src/shared/session-identity.ts +18 -0
- package/src/shared/settings.ts +384 -0
- package/src/shared/status-format.ts +123 -0
- package/src/shared/temp-root.ts +107 -0
- package/src/shared/types.ts +1260 -0
- package/src/shared/ui-mode.ts +5 -0
- package/src/shared/utils.ts +342 -0
- package/src/slash/prompt-template-bridge.ts +408 -0
- package/src/slash/slash-bridge.ts +178 -0
- package/src/slash/slash-commands.ts +617 -0
- package/src/slash/slash-live-state.ts +292 -0
- package/src/tui/action-hints.ts +69 -0
- package/src/tui/agent-history.ts +210 -0
- package/src/tui/agent-view.ts +1323 -0
- package/src/tui/render.ts +1550 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { pathToFileURL } from "node:url";
|
|
8
|
+
import process from "node:process";
|
|
9
|
+
import { hostCli, hostRoot } from "./compat-host.mjs";
|
|
10
|
+
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
const packageJson = require("../package.json");
|
|
13
|
+
process.env.PI_PACKAGE_DIR = hostRoot;
|
|
14
|
+
let productionRoot;
|
|
15
|
+
|
|
16
|
+
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
17
|
+
console.log(`Usage: node scripts/package-smoke.mjs\n\nVerifies the local pi-subagents package shape without publishing.\n\nChecks:\n - npm pack includes subagent and intercom runtime resources\n - package.json pi manifest points at both extensions and skills without registering example prompts\n - both compiled dist extension entrypoints load as native ES modules\n - a packed production install with dev dependencies omitted can load the detached runner and native broker\n\nExit codes:\n 0 smoke passed\n 1 package shape or runtime load check failed`);
|
|
18
|
+
process.exit(0);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function fail(message) {
|
|
22
|
+
console.error(`[package-smoke] ${message}`);
|
|
23
|
+
if (productionRoot) console.error(`[package-smoke] failure evidence: ${productionRoot}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function run(command, args, cwd = process.cwd(), env = process.env) {
|
|
28
|
+
const result = spawnSync(command, args, {
|
|
29
|
+
cwd,
|
|
30
|
+
env,
|
|
31
|
+
encoding: "utf-8",
|
|
32
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
33
|
+
});
|
|
34
|
+
if (result.error) throw new Error(`failed to start ${command}: ${result.error.message}`);
|
|
35
|
+
if (result.status !== 0) {
|
|
36
|
+
process.stderr.write(result.stderr);
|
|
37
|
+
process.stdout.write(result.stdout);
|
|
38
|
+
throw new Error(`${command} ${args.join(" ")} exited with ${result.status}`);
|
|
39
|
+
}
|
|
40
|
+
return result.stdout;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function runOrFail(command, args, cwd = process.cwd()) {
|
|
44
|
+
try {
|
|
45
|
+
return run(command, args, cwd);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
fail(error instanceof Error ? error.message : String(error));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function assertPackedFile(files, path) {
|
|
52
|
+
if (!files.some((file) => file.path === path)) fail(`npm pack output is missing ${path}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function assertNotPackedFile(files, path) {
|
|
56
|
+
if (files.some((file) => file.path === path)) fail(`npm pack output should not include ${path}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
productionRoot = mkdtempSync(join(tmpdir(), "pi-subagents-package-smoke-"));
|
|
60
|
+
const packDir = join(productionRoot, "pack");
|
|
61
|
+
mkdirSync(packDir);
|
|
62
|
+
const packOutput = runOrFail("npm", ["pack", "--json", "--pack-destination", packDir]);
|
|
63
|
+
let packs;
|
|
64
|
+
try {
|
|
65
|
+
packs = JSON.parse(packOutput);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
fail(`npm pack --json returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
68
|
+
}
|
|
69
|
+
// npm 11 returns an array; npm 12 keys the same records by package name.
|
|
70
|
+
const pack = Object.values(packs)[0];
|
|
71
|
+
if (!pack || !Array.isArray(pack.files)) fail("npm pack --json did not report a file list");
|
|
72
|
+
|
|
73
|
+
for (const path of [
|
|
74
|
+
"package.json",
|
|
75
|
+
"LICENSE",
|
|
76
|
+
"README.md",
|
|
77
|
+
"dist/extension/index.js",
|
|
78
|
+
"dist/pi-intercom/index.js",
|
|
79
|
+
"dist/pi-intercom/broker/broker.js",
|
|
80
|
+
"dist/pi-intercom/bridge.js",
|
|
81
|
+
"scripts/intercom-bridge-credentials.mjs",
|
|
82
|
+
"scripts/intercom-remote.mjs",
|
|
83
|
+
"docs/intercom-bridge.md",
|
|
84
|
+
"dist/runs/background/subagent-runner-launcher.js",
|
|
85
|
+
"src/extension/index.ts",
|
|
86
|
+
"src/extension/schemas.ts",
|
|
87
|
+
"src/pi-intercom/index.ts",
|
|
88
|
+
"src/pi-intercom/broker/broker.ts",
|
|
89
|
+
"src/pi-intercom/ui/session-list.ts",
|
|
90
|
+
"src/shared/types.ts",
|
|
91
|
+
"src/runs/background/subagent-runner-launcher.ts",
|
|
92
|
+
"agents/reviewer.md",
|
|
93
|
+
"agents/reviewer-gpt.md",
|
|
94
|
+
"agents/watcher.md",
|
|
95
|
+
"skills/pi-subagents/SKILL.md",
|
|
96
|
+
"skills/pi-intercom/SKILL.md",
|
|
97
|
+
"docs/intercom.md",
|
|
98
|
+
"prompts/review-loop.md",
|
|
99
|
+
"scripts/real-pi-smoke.mjs",
|
|
100
|
+
]) {
|
|
101
|
+
assertPackedFile(pack.files, path);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
assertNotPackedFile(pack.files, "install.mjs");
|
|
105
|
+
|
|
106
|
+
if (packageJson.name !== "@fitchmultz/pi-subagents" || packageJson.private === true || packageJson.publishConfig?.access !== "public") fail("package.json must expose the owned public scoped npm identity");
|
|
107
|
+
if (packageJson.bin !== undefined) fail("package.json must not expose a legacy npx/bin installer");
|
|
108
|
+
if (!packageJson.pi?.extensions?.includes("./dist/extension/index.js")) fail("package.json pi.extensions must include ./dist/extension/index.js");
|
|
109
|
+
if (!packageJson.pi?.extensions?.includes("./dist/pi-intercom/index.js")) fail("package.json pi.extensions must include ./dist/pi-intercom/index.js");
|
|
110
|
+
if (!packageJson.pi?.skills?.includes("./skills")) fail("package.json pi.skills must include ./skills");
|
|
111
|
+
if (packageJson.pi?.prompts !== undefined) fail("package.json pi.prompts must stay unset so example prompts are not registered as slash commands");
|
|
112
|
+
|
|
113
|
+
for (const entrypoint of ["../dist/extension/index.js", "../dist/pi-intercom/index.js"]) {
|
|
114
|
+
const extensionModule = await import(new URL(entrypoint, import.meta.url));
|
|
115
|
+
if (typeof extensionModule.default !== "function") fail(`${entrypoint} did not load a default registration function`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
let productionImportError;
|
|
119
|
+
try {
|
|
120
|
+
const installDir = join(productionRoot, "install");
|
|
121
|
+
mkdirSync(installDir);
|
|
122
|
+
writeFileSync(join(installDir, "package.json"), JSON.stringify({ private: true, type: "module" }));
|
|
123
|
+
const filename = pack.filename;
|
|
124
|
+
if (typeof filename !== "string") throw new Error("npm pack did not report a tarball filename");
|
|
125
|
+
run("npm", ["install", "--ignore-scripts", "--omit=dev", "--legacy-peer-deps", join(packDir, filename)], installDir);
|
|
126
|
+
const installedRoot = join(installDir, "node_modules", packageJson.name);
|
|
127
|
+
if (!existsSync(installedRoot)) throw new Error(`production install is missing ${packageJson.name}`);
|
|
128
|
+
const gitPackageRoot = join(productionRoot, "git-package");
|
|
129
|
+
cpSync(installedRoot, gitPackageRoot, { recursive: true });
|
|
130
|
+
run("npm", ["install", "--ignore-scripts", "--omit=dev", "--legacy-peer-deps"], gitPackageRoot);
|
|
131
|
+
for (const name of ["typebox", "@earendil-works/pi-agent-core", "@earendil-works/pi-ai", "@earendil-works/pi-coding-agent", "@earendil-works/pi-tui"]) {
|
|
132
|
+
if (existsSync(join(gitPackageRoot, "node_modules", name))) throw new Error(`runtime-only package shadows host-provided ${name}`);
|
|
133
|
+
}
|
|
134
|
+
const hostTypebox = await import(pathToFileURL(createRequire(join(hostRoot, "dist/index.js")).resolve("typebox")).href);
|
|
135
|
+
const nativeTypebox = await import(pathToFileURL(join(gitPackageRoot, "dist/shared/native-typebox.js")).href);
|
|
136
|
+
if (nativeTypebox.Type !== hostTypebox.Type) throw new Error("packed runtime did not use the selected host's TypeBox");
|
|
137
|
+
await import(pathToFileURL(join(gitPackageRoot, "dist", "runs", "shared", "acceptance-contract.js")).href);
|
|
138
|
+
await import(pathToFileURL(join(gitPackageRoot, "dist", "runs", "shared", "supervisor-questions.js")).href);
|
|
139
|
+
const brokerSpawn = await import(pathToFileURL(join(gitPackageRoot, "dist", "pi-intercom", "broker", "spawn.js")).href);
|
|
140
|
+
const brokerCwd = brokerSpawn.getBrokerSpawnOptions().cwd;
|
|
141
|
+
if (realpathSync(brokerCwd) !== realpathSync(gitPackageRoot)) throw new Error(`packed broker resolved ${brokerCwd} instead of ${gitPackageRoot}`);
|
|
142
|
+
run(process.execPath, ["--check", join(gitPackageRoot, "dist", "pi-intercom", "broker", "broker.js")], gitPackageRoot);
|
|
143
|
+
const distPiArgs = await import(pathToFileURL(join(gitPackageRoot, "dist", "runs", "shared", "pi-args.js")).href);
|
|
144
|
+
const childArgs = distPiArgs.buildPiArgs({
|
|
145
|
+
baseArgs: [],
|
|
146
|
+
task: "package-smoke",
|
|
147
|
+
sessionEnabled: false,
|
|
148
|
+
inheritProjectContext: false,
|
|
149
|
+
inheritSkills: false,
|
|
150
|
+
allowSubagents: true,
|
|
151
|
+
}).args ?? [];
|
|
152
|
+
const childExtensionPaths = childArgs.flatMap((arg, index) => (arg === "--extension" ? [childArgs[index + 1]] : []));
|
|
153
|
+
if (childExtensionPaths.length === 0) throw new Error("dist buildPiArgs emitted no --extension paths");
|
|
154
|
+
for (const extensionPath of childExtensionPaths) {
|
|
155
|
+
if (!existsSync(extensionPath)) throw new Error(`dist buildPiArgs emitted a missing --extension path: ${extensionPath}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const home = join(productionRoot, "native-home");
|
|
159
|
+
const asyncDir = join(home, "run");
|
|
160
|
+
mkdirSync(asyncDir, { recursive: true });
|
|
161
|
+
const sessionFile = join(home, "child.jsonl");
|
|
162
|
+
writeFileSync(sessionFile, `${JSON.stringify({ type: "session", version: 3, id: "packed-native-probe", cwd: home, timestamp: new Date().toISOString() })}\n`);
|
|
163
|
+
const marker = join(home, "native-started.json");
|
|
164
|
+
const observer = join(home, "observe.ts");
|
|
165
|
+
writeFileSync(observer, `import { writeFileSync, writeSync } from "node:fs";
|
|
166
|
+
import { fauxAssistantMessage, fauxProvider } from "@earendil-works/pi-ai";
|
|
167
|
+
export default function (pi) {
|
|
168
|
+
const faux = fauxProvider();
|
|
169
|
+
pi.registerProvider("faux", { api: faux.api, baseUrl: faux.getModel().baseUrl, apiKey: "fixture-key", models: faux.models, streamSimple: faux.provider.streamSimple });
|
|
170
|
+
pi.on("session_start", (_event, ctx) => {
|
|
171
|
+
pi.appendEntry("package-probe", { nativeSession: true });
|
|
172
|
+
writeFileSync(${JSON.stringify(marker)}, JSON.stringify({ sessionFile: ctx.sessionManager.getSessionFile(), model: { provider: ctx.model?.provider, id: ctx.model?.id }, modelCalls: faux.state.callCount }));
|
|
173
|
+
const message = fauxAssistantMessage("PACKED_NATIVE_COMPLETE");
|
|
174
|
+
// Pi redirects extension stdout to stderr; this fixture emits controlled wire records.
|
|
175
|
+
writeSync(1, JSON.stringify({ type: "message_end", message }) + "\\n" + JSON.stringify({ type: "agent_settled" }) + "\\n");
|
|
176
|
+
process.exit(0);
|
|
177
|
+
});
|
|
178
|
+
}`);
|
|
179
|
+
const nativeEnv = { ...process.env, HOME: home, PI_CODING_AGENT_DIR: join(home, "agent"), PI_OFFLINE: "1" };
|
|
180
|
+
for (const key of Object.keys(nativeEnv)) if (key.startsWith("PI_SUBAGENT_") || /(?:API_KEY|AUTH_TOKEN|ACCESS_TOKEN)$/.test(key)) delete nativeEnv[key];
|
|
181
|
+
nativeEnv.PI_SUBAGENT_TEMP_ROOT = join(home, "pi-subagents-runtime");
|
|
182
|
+
const piPackageRoot = hostRoot;
|
|
183
|
+
const bin = join(home, "bin");
|
|
184
|
+
mkdirSync(bin);
|
|
185
|
+
writeFileSync(join(bin, "pi"), `#!/bin/sh\nexec "${process.execPath}" "${hostCli}" "$@"\n`, { mode: 0o755 });
|
|
186
|
+
// A wrapper-only PATH also covers managed installs whose shim is not a symlink.
|
|
187
|
+
nativeEnv.PATH = `${bin}:${dirname(process.execPath)}:/usr/bin:/bin`;
|
|
188
|
+
delete nativeEnv.PI_PACKAGE_DIR;
|
|
189
|
+
const configPath = join(home, "config.json");
|
|
190
|
+
const resultPath = join(home, "result.json");
|
|
191
|
+
writeFileSync(configPath, JSON.stringify({ id: "packed-native", cwd: home, asyncDir, resultPath, piPackageRoot, placeholder: "{previous}", resultMode: "single", sessionDir: home, steps: [{ agent: "probe", task: "Controlled package startup check; no model call", model: "faux/faux-1", sessionFile, extensions: [observer], inheritProjectContext: false, inheritSkills: false }] }));
|
|
192
|
+
run(process.execPath, [join(gitPackageRoot, "dist/runs/background/subagent-runner-launcher.js"), join(gitPackageRoot, "dist/runs/background/subagent-runner.js"), configPath], home, nativeEnv);
|
|
193
|
+
const result = JSON.parse(readFileSync(resultPath, "utf8"));
|
|
194
|
+
if (result.success !== true || result.results?.[0]?.output !== "PACKED_NATIVE_COMPLETE") throw new Error(`Packed detached runner did not complete its controlled native Pi child: ${JSON.stringify({ nativeStarted: existsSync(marker), children: result.results?.map(({ exitCode, error, output }) => ({ exitCode, error, output })) })}`);
|
|
195
|
+
const observed = JSON.parse(readFileSync(marker, "utf8"));
|
|
196
|
+
if (observed.sessionFile !== sessionFile) throw new Error("Packed child did not bind the requested native Pi session");
|
|
197
|
+
if (observed.model?.provider !== "faux" || observed.model?.id !== "faux-1" || observed.modelCalls !== 0) throw new Error("Packed child must select the native faux model without invoking it");
|
|
198
|
+
console.log("[package-smoke] packed detached Node runner completed a controlled native Pi startup (no model call)");
|
|
199
|
+
process.stdout.write(run(process.execPath, [join(process.cwd(), "scripts/native-package-smoke.mjs"), gitPackageRoot], home, { ...nativeEnv, PI_PACKAGE_DIR: hostRoot }));
|
|
200
|
+
} catch (error) {
|
|
201
|
+
productionImportError = error;
|
|
202
|
+
} finally {
|
|
203
|
+
if (!productionImportError) rmSync(productionRoot, { recursive: true, force: true });
|
|
204
|
+
}
|
|
205
|
+
if (productionImportError) {
|
|
206
|
+
fail(`packed production install could not load runtime paths: ${productionImportError instanceof Error ? productionImportError.message : String(productionImportError)}`);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
console.log(`[package-smoke] ${pack.name}@${pack.version}: ${pack.files.length} files packed; subagent, intercom, runner, and broker paths loaded`);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Purpose: Build generated dist output for GitHub/source installs even when Pi invokes npm install --omit=dev.
|
|
4
|
+
* Responsibilities: Build with the local compiler when present; otherwise install only the pinned
|
|
5
|
+
* `typescript` into a throwaway prefix, build with it, and delete the prefix. Emit needs no type
|
|
6
|
+
* information (tsconfig.build.json sets noCheck), so the Pi host graph is never installed here.
|
|
7
|
+
* Scope: Package install lifecycle only; runtime behavior remains owned by scripts/build.mjs.
|
|
8
|
+
* Usage: package.json prepare script.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
13
|
+
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import process from "node:process";
|
|
17
|
+
import { promisify } from "node:util";
|
|
18
|
+
|
|
19
|
+
const execFile = promisify(execFileCallback);
|
|
20
|
+
const cwd = process.cwd();
|
|
21
|
+
const buildScript = join(cwd, "scripts", "build.mjs");
|
|
22
|
+
const tscBin = (root) => join(root, "node_modules", "typescript", "bin", "tsc");
|
|
23
|
+
|
|
24
|
+
// No shell: process.execPath runs scripts and npm's cli.js directly, which is safe for
|
|
25
|
+
// paths containing spaces on every platform (shell:true concatenates args unescaped).
|
|
26
|
+
async function runNode(args) {
|
|
27
|
+
const { stderr, stdout } = await execFile(process.execPath, args, { cwd, maxBuffer: 20 * 1024 * 1024 });
|
|
28
|
+
// Forward output on success too: install-time diagnostics such as the
|
|
29
|
+
// concurrent-swap race-loss warning are otherwise swallowed.
|
|
30
|
+
if (stdout) process.stdout.write(stdout);
|
|
31
|
+
if (stderr) process.stderr.write(stderr);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function main() {
|
|
35
|
+
if (existsSync(tscBin(cwd))) {
|
|
36
|
+
await runNode([buildScript]);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const npmExecPath = process.env.npm_execpath;
|
|
40
|
+
if (!npmExecPath) throw new Error(`npm_execpath is not set; run "npm install" manually in ${cwd} and retry.`);
|
|
41
|
+
const { devDependencies } = JSON.parse(await readFile(join(cwd, "package.json"), "utf8"));
|
|
42
|
+
const prefix = await mkdtemp(join(tmpdir(), "pi-subagents-tsc-"));
|
|
43
|
+
try {
|
|
44
|
+
await runNode([
|
|
45
|
+
npmExecPath,
|
|
46
|
+
"install",
|
|
47
|
+
`typescript@${devDependencies.typescript}`,
|
|
48
|
+
"--prefix",
|
|
49
|
+
prefix,
|
|
50
|
+
"--no-save",
|
|
51
|
+
"--no-package-lock",
|
|
52
|
+
"--ignore-scripts",
|
|
53
|
+
"--no-audit",
|
|
54
|
+
"--no-fund",
|
|
55
|
+
]);
|
|
56
|
+
await runNode([buildScript, tscBin(prefix)]);
|
|
57
|
+
} finally {
|
|
58
|
+
await rm(prefix, { force: true, recursive: true, maxRetries: 5, retryDelay: 100 });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
main().catch((error) => {
|
|
63
|
+
if (error?.stdout) process.stdout.write(error.stdout);
|
|
64
|
+
if (error?.stderr) process.stderr.write(error.stderr);
|
|
65
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
});
|