pi-rnd 0.2.8 → 0.3.0

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 CHANGED
@@ -14,17 +14,8 @@ Ports the R&D framework methodology (pre-registration, information-barrier verif
14
14
 
15
15
  - Node ≥ 20
16
16
  - `@earendil-works/pi-coding-agent` (official PI runtime) installed and working
17
- - `@tintinweb/pi-subagents` (community subagent extension, pinned to `^0.7.3`) installed: `pi install npm:@tintinweb/pi-subagents`
18
17
 
19
- ### Dependency trust
20
-
21
- `@tintinweb/pi-subagents` is a community extension, NOT shipped by official PI. PI explicitly omits subagents from its core surface, so any pipeline that needs plan→build→verify→integrate orchestration must reach outside the official packages. pi-rnd audited this package at v0.7.3 (2026-05-16); summary:
22
-
23
- - No install scripts. Zero outbound network calls. One bounded `execFileSync` for git worktrees. Normal OSS hygiene (tests, biome, CI, semver CHANGELOG).
24
- - Maintainer: tintinweb (security researcher, public GitHub presence).
25
- - Same author as official PI maintains its transitive `@mariozechner/*` peer-deps — they're the deprecated personal-namespace publications of the same code now under `@earendil-works/*`.
26
-
27
- Full audit: see `audits/pi-subagents-audit.md` in the R&D session artifacts. Re-audit on each minor or major bump.
18
+ Subagent functionality is built into pi-rnd directly via PI's public SDK (`createAgentSession`) — no external subagent extension is required.
28
19
 
29
20
  ## Develop
30
21
 
@@ -58,7 +49,7 @@ cp agents/*.md .pi/agents/
58
49
 
59
50
  1. `~/.pi/agent/` (or `$PI_CODING_AGENT_DIR`) is writable
60
51
  2. `$RND_DIR` is writable
61
- 3. `@tintinweb/pi-subagents` responds to `subagents:rpc:ping` within 2 s
52
+ 3. Native subagent module responds to `subagents:rpc:ping` within 2 s
62
53
  4. Each of the 4 subagent `.md` files is discoverable
63
54
  5. Each of the 11 skill directories is discoverable
64
55
  6. Gate registry has registered seed gates (`gates: N`)
package/dist/doctor.js CHANGED
@@ -91,14 +91,14 @@ async function checkRoundTrip(pi, lines) {
91
91
  lines.push("§ round-trip");
92
92
  const ping = await rpcCall(pi, "ping", {}, 2000);
93
93
  if (!ping?.success) {
94
- lines.push("✗ pi-subagents not responding (ping timeout 2s) — install @tintinweb/pi-subagents");
94
+ lines.push("✗ pi-rnd native subagents not responding (ping timeout 2s) — check the extension log for initialization errors");
95
95
  return "error";
96
96
  }
97
- lines.push(`✓ pi-subagents loaded (protocol v${ping.data?.version ?? "?"})`);
97
+ lines.push(`✓ pi-rnd native subagents loaded (protocol v${ping.data?.version ?? "?"})`);
98
98
  const roundTripBudgetMs = 30_000;
99
- // subagents:started fires SYNCHRONOUSLY inside the spawn RPC call (before
100
- // we know our targetId), so we can't gate the listener on targetId. Instead,
101
- // buffer every started event with its id+timestamp and look up after spawn.
99
+ // subagents:started may fire before the spawn RPC reply (the manager emits
100
+ // :started from agent_start, which can race with the synchronous id return).
101
+ // Buffer every started event with its id+timestamp and look up after spawn.
102
102
  const startedEvents = new Map();
103
103
  const unsubStarted = pi.events.on("subagents:started", (data) => {
104
104
  const id = data?.id;
@@ -130,15 +130,15 @@ async function checkRoundTrip(pi, lines) {
130
130
  const startedAtMs = startedEvents.get(targetId);
131
131
  if (startedAtMs === undefined) {
132
132
  lines.push(`✗ subagent ${targetId} never transitioned to running (no subagents:started observed for this id after ${roundTripBudgetMs / 1000}s) — ` +
133
- `the runner accepted the spawn but never invoked the onStart callback. ` +
134
- `Likely a pi-subagents internal issue or an exception thrown inside manager.startAgent before the lifecycle event fires.`);
133
+ `the manager accepted the spawn but agent_start never fired. ` +
134
+ `Likely an exception thrown inside createAgentSession before the lifecycle event.`);
135
135
  return "error";
136
136
  }
137
137
  const sinceStartMs = Date.now() - startedAtMs;
138
138
  lines.push(`⚠ subagent ${targetId} started but did not complete within ${roundTripBudgetMs / 1000}s ` +
139
139
  `(${Math.round(sinceStartMs / 1000)}s since started event) — the LLM call is slow in this environment. ` +
140
140
  `pi-rnd itself is healthy; this only affects /rnd-start latency. ` +
141
- `Inspect transcript at ${process.env.TMPDIR ?? "/tmp"}pi-subagents-<uid>/<cwd>/<sessionId>/tasks/${targetId}.output`);
141
+ `Native subagents run in-process; no on-disk transcript. Re-run with PI_LOG_LEVEL=debug for stream details.`);
142
142
  return "warning";
143
143
  }
144
144
  if (completion.status === "completed") {
@@ -153,7 +153,7 @@ export function registerRndDoctor(pi) {
153
153
  pi.registerCommand("rnd-doctor", {
154
154
  description: "Diagnose pi-rnd prerequisites (PI dir, subagents, discovery, gates, round-trip)",
155
155
  handler: async (_args, ctx) => {
156
- const lines = ["pi-rnd — doctor v0.2"];
156
+ const lines = ["pi-rnd — doctor v0.3"];
157
157
  const roundTripLines = [];
158
158
  const [runtimeLines, discoveryLines, rtLevel] = await Promise.all([
159
159
  checkPiRuntime(),
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,12 +5,15 @@ import { bashDiscipline } from "./gates/bash-discipline.js";
5
5
  import { rndDirRequired } from "./gates/rnd-dir-required.js";
6
6
  import { readEvidencePack } from "./gates/read-evidence-pack.js";
7
7
  import { registerRndDoctor } from "./doctor.js";
8
+ import { createSubagentManager } from "./subagents/manager.js";
9
+ import { registerSubagentRpc } from "./subagents/rpc.js";
8
10
  export default async function pirndFramework(pi) {
9
- // pi-subagents' loadCustomAgents only reads .pi/agents/ (project) and
10
- // ~/.pi/agent/agents/ (global) it doesn't scan npm packages. Deploy our
11
- // bundled agent .md files into the global dir on load so the user doesn't
12
- // have to copy them manually. Only copies missing files; never overwrites.
11
+ // Bundled agent .md files live in <pkgRoot>/agents/. The agent-defs loader
12
+ // resolves them via project → global bundled lookup, but copying into the
13
+ // global dir keeps PI's own /agents UI discoverable without extra plumbing.
13
14
  await autoInstallBundledAgents();
15
+ const manager = createSubagentManager(pi);
16
+ registerSubagentRpc(pi, manager);
14
17
  registerRndStart(pi);
15
18
  registerGate(bashDiscipline);
16
19
  registerGate(rndDirRequired);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,cAAc,CAAC,EAAgB;IAC3D,sEAAsE;IACtE,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,wBAAwB,EAAE,CAAC;IAEjC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAErB,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7B,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7B,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAE/B,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEzD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,cAAc,CAAC,EAAgB;IAC3D,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,wBAAwB,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1C,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAEjC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAErB,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7B,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7B,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAE/B,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEzD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { readFile } from "node:fs/promises";
3
2
  const DEFAULT_SPAWN_TIMEOUT_MS = 10_000;
4
3
  const DEFAULT_COMPLETION_TIMEOUT_MS = 600_000;
5
4
  export function rpcSpawn(pi, type, prompt, options, timeoutMs = DEFAULT_SPAWN_TIMEOUT_MS) {
@@ -53,15 +52,4 @@ export function waitForCompletion(pi, agentId, timeoutMs = DEFAULT_COMPLETION_TI
53
52
  }, timeoutMs);
54
53
  });
55
54
  }
56
- export async function readTranscript(agentId, sessionId, cwd) {
57
- const uid = process.getuid?.() ?? 0;
58
- const cwdEncoded = cwd.replace(/\//g, "-").replace(/^-/, "");
59
- const path = `/tmp/pi-subagents-${uid}/${cwdEncoded}/${sessionId}/tasks/${agentId}.output`;
60
- try {
61
- return await readFile(path, "utf8");
62
- }
63
- catch {
64
- return null;
65
- }
66
- }
67
55
  //# sourceMappingURL=spawn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/orchestrator/spawn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/orchestrator/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,6BAA6B,GAAG,OAAO,CAAC;AAE9C,MAAM,UAAU,QAAQ,CACtB,EAAgB,EAChB,IAAY,EACZ,MAAc,EACd,OAAsB,EACtB,YAAoB,wBAAwB;IAE5C,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,6BAA6B,SAAS,EAAE,CAAC;IAE9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAa,EAAE,EAAE;YACzD,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,IAAgC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAgB,EAChB,OAAe,EACf,YAAoB,6BAA6B;IAEjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,MAAM,GAAG,CAAC,IAAa,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,IAMT,CAAC;YAEF,IAAI,CAAC,EAAE,EAAE,KAAK,OAAO,IAAI,OAAO;gBAAE,OAAO;YACzC,OAAO,GAAG,IAAI,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC;gBACN,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;gBAC7B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC;gBAC7B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAE3D,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { constants } from "node:fs";
2
+ import { access, readFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { parseFrontmatter, stripFrontmatter } from "@earendil-works/pi-coding-agent";
7
+ import { getModel } from "@earendil-works/pi-ai";
8
+ // From dist/subagents/agent-defs.js the package root is two levels up.
9
+ const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
10
+ const PI_AGENT_DIR = process.env.PI_CODING_AGENT_DIR ?? join(homedir(), ".pi", "agent");
11
+ // ── Helpers ───────────────────────────────────────────────────────────────────
12
+ async function isReadable(path) {
13
+ try {
14
+ await access(path, constants.R_OK);
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ function stripLeadingHtmlComments(text) {
22
+ // Strip zero or more leading HTML comment blocks (<!-- ... -->) including
23
+ // surrounding whitespace, so the body starts with the actual content.
24
+ return text.replace(/^(\s*<!--[\s\S]*?-->\s*)+/, "");
25
+ }
26
+ // ── Exported API ──────────────────────────────────────────────────────────────
27
+ export async function resolveAgentPath(name) {
28
+ const candidates = [
29
+ join(process.cwd(), ".pi", "agents", `${name}.md`),
30
+ join(PI_AGENT_DIR, "agents", `${name}.md`),
31
+ join(PACKAGE_ROOT, "agents", `${name}.md`),
32
+ ];
33
+ for (const candidate of candidates) {
34
+ if (await isReadable(candidate))
35
+ return candidate;
36
+ }
37
+ return null;
38
+ }
39
+ export async function loadAgentDef(name) {
40
+ const path = await resolveAgentPath(name);
41
+ if (!path) {
42
+ throw new Error(`Agent "${name}" not found in project, global, or bundled locations`);
43
+ }
44
+ const raw = await readFile(path, "utf8");
45
+ const { frontmatter } = parseFrontmatter(raw);
46
+ const body = stripLeadingHtmlComments(stripFrontmatter(raw));
47
+ return { name, path, frontmatter, body };
48
+ }
49
+ export function toSessionOptions(def) {
50
+ const { frontmatter, body } = def;
51
+ const toolsField = typeof frontmatter.tools === "string" ? frontmatter.tools : undefined;
52
+ const toolsOpt = toolsField === "none"
53
+ ? { noTools: "all" }
54
+ : toolsField !== undefined
55
+ ? { tools: toolsField.split(",").map((t) => t.trim().toLowerCase()) }
56
+ : {};
57
+ const thinkingLevel = typeof frontmatter.thinking === "string" ? frontmatter.thinking : undefined;
58
+ const modelId = typeof frontmatter.model === "string" ? frontmatter.model : undefined;
59
+ const model = modelId !== undefined ? getModel("anthropic", modelId) : undefined;
60
+ const maxTurns = typeof frontmatter.max_turns === "number" ? frontmatter.max_turns : undefined;
61
+ return {
62
+ ...toolsOpt,
63
+ ...(model !== undefined && { model }),
64
+ ...(thinkingLevel !== undefined && { thinkingLevel }),
65
+ ...(maxTurns !== undefined && { maxTurns }),
66
+ systemPrompt: body,
67
+ };
68
+ }
69
+ //# sourceMappingURL=agent-defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-defs.js","sourceRoot":"","sources":["../../src/subagents/agent-defs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createAgentSession, SessionManager, } from "@earendil-works/pi-coding-agent";
3
+ import { loadAgentDef, toSessionOptions } from "./agent-defs.js";
4
+ // ── Helpers ───────────────────────────────────────────────────────────────────
5
+ // max_turns: 0 means unlimited. When both caller and frontmatter specify a
6
+ // bound, the smaller one wins.
7
+ function stricterTurnLimit(a, b) {
8
+ if (a === 0)
9
+ return b;
10
+ if (b === 0)
11
+ return a;
12
+ return Math.min(a, b);
13
+ }
14
+ // ── Factory ───────────────────────────────────────────────────────────────────
15
+ export function createSubagentManager(pi) {
16
+ const sessions = new Map();
17
+ // ── Internal: run the LLM session for a spawned agent ─────────────────────
18
+ async function runSession(id, args, opts) {
19
+ const record = sessions.get(id);
20
+ let unsub;
21
+ try {
22
+ const { session } = await createAgentSession({
23
+ sessionManager: SessionManager.inMemory(),
24
+ ...(opts.model !== undefined && { model: opts.model }),
25
+ ...(opts.thinkingLevel !== undefined && { thinkingLevel: opts.thinkingLevel }),
26
+ ...(opts.tools !== undefined && { tools: opts.tools }),
27
+ ...(opts.noTools !== undefined && { noTools: opts.noTools }),
28
+ });
29
+ record.session = session;
30
+ // If stop() was called while createAgentSession was in-flight, clean up
31
+ // immediately and emit a terminal event so callers observing lifecycle
32
+ // events see a settled state.
33
+ if (record.stopped) {
34
+ await session.abort();
35
+ session.dispose();
36
+ pi.events.emit("subagents:failed", {
37
+ id,
38
+ type: args.type,
39
+ description: args.options?.description ?? "",
40
+ status: "aborted",
41
+ error: "Stopped by caller",
42
+ durationMs: Date.now() - record.startedAt,
43
+ });
44
+ return;
45
+ }
46
+ let turnCount = 0;
47
+ const maxTurns = opts.maxTurns ?? 0;
48
+ unsub = session.subscribe((event) => {
49
+ if (event.type === "agent_start") {
50
+ pi.events.emit("subagents:started", {
51
+ id,
52
+ type: args.type,
53
+ description: args.options?.description ?? "",
54
+ });
55
+ }
56
+ if (event.type === "turn_end") {
57
+ turnCount += 1;
58
+ if (maxTurns > 0 && turnCount >= maxTurns) {
59
+ // Max turns reached — abort to prevent additional LLM calls.
60
+ void session.abort();
61
+ }
62
+ }
63
+ if (event.type === "agent_end") {
64
+ const result = session.getLastAssistantText();
65
+ const durationMs = Date.now() - record.startedAt;
66
+ // Unsubscribe and dispose in the terminal path so it happens exactly once.
67
+ unsub?.();
68
+ unsub = undefined;
69
+ session.dispose();
70
+ if (record.stopped) {
71
+ pi.events.emit("subagents:failed", {
72
+ id,
73
+ type: args.type,
74
+ description: args.options?.description ?? "",
75
+ status: "aborted",
76
+ error: "Stopped by caller",
77
+ durationMs,
78
+ });
79
+ }
80
+ else {
81
+ pi.events.emit("subagents:completed", {
82
+ id,
83
+ type: args.type,
84
+ description: args.options?.description ?? "",
85
+ status: "completed",
86
+ result,
87
+ durationMs,
88
+ });
89
+ }
90
+ }
91
+ });
92
+ // Prepend the agent body as a system-prompt context block before the
93
+ // user prompt. This is the simplest injection path since createAgentSession
94
+ // has no direct systemPrompt option — the agent body is the system prompt.
95
+ const userContent = opts.systemPrompt.trim().length > 0
96
+ ? `<system>\n${opts.systemPrompt}\n</system>\n\n${args.prompt}`
97
+ : args.prompt;
98
+ await session.sendUserMessage(userContent);
99
+ }
100
+ catch (err) {
101
+ unsub?.();
102
+ unsub = undefined;
103
+ const durationMs = Date.now() - record.startedAt;
104
+ pi.events.emit("subagents:failed", {
105
+ id,
106
+ type: args.type,
107
+ description: args.options?.description ?? "",
108
+ status: "failed",
109
+ error: err instanceof Error ? err.message : String(err),
110
+ durationMs,
111
+ });
112
+ }
113
+ }
114
+ // ── Public API ─────────────────────────────────────────────────────────────
115
+ async function spawn(args) {
116
+ const id = randomUUID();
117
+ // loadAgentDef is async — we await it so errors surface as a rejected
118
+ // spawn promise rather than a silent fire-and-forget failure.
119
+ const def = await loadAgentDef(args.type);
120
+ const opts = toSessionOptions(def);
121
+ const callerMaxTurns = args.options?.max_turns;
122
+ if (callerMaxTurns !== undefined) {
123
+ opts.maxTurns = stricterTurnLimit(callerMaxTurns, opts.maxTurns ?? 0);
124
+ }
125
+ const startedAt = Date.now();
126
+ sessions.set(id, { def, opts, startedAt, stopped: false });
127
+ pi.events.emit("subagents:created", {
128
+ id,
129
+ type: args.type,
130
+ description: args.options?.description ?? "",
131
+ isBackground: true,
132
+ });
133
+ // Run the actual LLM session asynchronously — caller already has the id.
134
+ void runSession(id, args, opts);
135
+ return id;
136
+ }
137
+ async function stop(id) {
138
+ const record = sessions.get(id);
139
+ if (!record)
140
+ return;
141
+ // Guard against double-stop — idempotent.
142
+ if (record.stopped)
143
+ return;
144
+ record.stopped = true;
145
+ // Signal abort. The agent_end handler in the subscriber is responsible for
146
+ // calling dispose() — we don't call it here to avoid a double-dispose race
147
+ // between stop() and the agent_end path.
148
+ if (record.session) {
149
+ await record.session.abort();
150
+ }
151
+ }
152
+ function ping() {
153
+ return { version: 2 };
154
+ }
155
+ return { spawn, stop, ping };
156
+ }
157
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/subagents/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ // ── Helpers ───────────────────────────────────────────────────────────────────
2
+ const reply = (pi, channel, payload) => pi.events.emit(channel, payload);
3
+ const errorMessage = (err) => String(err?.message ?? err);
4
+ // ── RPC registration ──────────────────────────────────────────────────────────
5
+ // Invariant: PI's EventBus ignores handler return values, so async handlers
6
+ // here MUST keep every `await` inside their try/catch — an unhandled rejection
7
+ // would surface only via process-level handlers, not through the RPC reply.
8
+ export function registerSubagentRpc(pi, manager) {
9
+ const unsubPing = pi.events.on("subagents:rpc:ping", (data) => {
10
+ const { requestId } = data;
11
+ reply(pi, `subagents:rpc:ping:reply:${requestId}`, { success: true, data: manager.ping() });
12
+ });
13
+ const unsubSpawn = pi.events.on("subagents:rpc:spawn", async (data) => {
14
+ const { requestId, type, prompt, options } = data;
15
+ const channel = `subagents:rpc:spawn:reply:${requestId}`;
16
+ try {
17
+ const id = await manager.spawn({ type, prompt, options: options });
18
+ reply(pi, channel, { success: true, data: { id } });
19
+ }
20
+ catch (err) {
21
+ reply(pi, channel, { success: false, error: errorMessage(err) });
22
+ }
23
+ });
24
+ const unsubStop = pi.events.on("subagents:rpc:stop", async (data) => {
25
+ const { requestId, agentId } = data;
26
+ const channel = `subagents:rpc:stop:reply:${requestId}`;
27
+ try {
28
+ await manager.stop(agentId);
29
+ reply(pi, channel, { success: true });
30
+ }
31
+ catch (err) {
32
+ reply(pi, channel, { success: false, error: errorMessage(err) });
33
+ }
34
+ });
35
+ return () => {
36
+ unsubPing();
37
+ unsubSpawn();
38
+ unsubStop();
39
+ };
40
+ }
41
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/subagents/rpc.ts"],"names":[],"mappings":"AAQA,iFAAiF;AAEjF,MAAM,KAAK,GAAG,CAAC,EAAgB,EAAE,OAAe,EAAE,OAAc,EAAE,EAAE,CAClE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEnC,MAAM,YAAY,GAAG,CAAC,GAAY,EAAU,EAAE,CAC5C,MAAM,CAAE,GAAa,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;AAEzC,iFAAiF;AAEjF,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,EAAgB,EAAE,OAAwB;IAC5E,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,IAAa,EAAE,EAAE;QACrE,MAAM,EAAE,SAAS,EAAE,GAAG,IAA6B,CAAC;QACpD,KAAK,CAAC,EAAE,EAAE,4BAA4B,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,qBAAqB,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;QAC7E,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GACxC,IAA8E,CAAC;QACjF,MAAM,OAAO,GAAG,6BAA6B,SAAS,EAAE,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAgB,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;QAC3E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAA8C,CAAC;QAC9E,MAAM,OAAO,GAAG,4BAA4B,SAAS,EAAE,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
package/docs/PI-API.md CHANGED
@@ -3,6 +3,13 @@
3
3
  > Citation format: `(file:line-range)` — paths abbreviated as `pi-agent/` for
4
4
  > `@earendil-works/pi-coding-agent/dist/core/` and `pi-sub/` for
5
5
  > `@tintinweb/pi-subagents/src/`.
6
+ >
7
+ > **Note (v0.3+):** pi-rnd no longer depends on `@tintinweb/pi-subagents` — the
8
+ > subagent module was reimplemented in-tree at `src/subagents/` on top of PI's
9
+ > public `createAgentSession` SDK. Sections 2 and 3 (RPC contract, lifecycle
10
+ > events) still describe the exact wire shape the native module preserves, so
11
+ > they remain the protocol spec the implementation honors. `pi-sub/` citations
12
+ > are historical reference for that shape.
6
13
 
7
14
  ---
8
15
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-rnd",
3
- "version": "0.2.8",
3
+ "version": "0.3.0",
4
4
  "description": "Scientific-method R&D orchestration for PI Coding Agent — methodology skills, subagent definitions, /rnd-start pipeline, /rnd-doctor, and a composable tool_call gate registry",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -35,8 +35,7 @@
35
35
  "subagents"
36
36
  ],
37
37
  "peerDependencies": {
38
- "@earendil-works/pi-coding-agent": "^0.74.0",
39
- "@tintinweb/pi-subagents": "^0.7.3"
38
+ "@earendil-works/pi-coding-agent": "^0.74.0"
40
39
  },
41
40
  "devDependencies": {
42
41
  "@earendil-works/pi-coding-agent": "^0.74.0",