mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-11-05 23:37:25 +00:00
- P2Tool: origin (any|owner) and scope (any|main|subagent) on the tool; the worker's Durable registry checks them before each call (guardTool), no tool checks itself. owner: location tools, reload_plugins, conversations, ports, MCP tools. main: subagent, rename_session, conversations, ports, reload_plugins. subagent: team. - originOf reads pi.live.run.inputs through tx.submission: the owner's only if every input of the run is. Agent-written inputs record the writing turn's origin: subagent tasks and one-shot prompts, team messages, reports (answerOrigin), peer messages. No peer origin any more. - Subagents and one-shot agents get their caller's tools (default all, tools narrows), except scope main; with codemode the script-only tools; subagents get team. One-shot agents keep codemode and agent. A send takes away what the caller can no longer give.
27 lines
1.5 KiB
TypeScript
27 lines
1.5 KiB
TypeScript
// Code mode's one-shot `agent` tool, contributed unconditionally. Only scripts can call it (`callers: ["tools"]`), so
|
|
// without code mode nothing reaches it, and its prompt section renders only while a conversation can call both
|
|
// `codemode` and `agent`. Code mode stays independently removable: no import of its plugin. Its conversations are listed
|
|
// with the subagents (one-shot entries of their document), which is where their sidebar metadata and read-only rule live.
|
|
|
|
import type { Models } from "@earendil-works/pi-ai/models";
|
|
import { contribute, defineFacet } from "@p2/app/v1";
|
|
import { Extensions, HarnessConfig, toolsByName } from "@p2/app/v1/worker";
|
|
import { createAgentExtension } from "./tool.ts";
|
|
|
|
export default defineFacet((host) => {
|
|
contribute(host, "p2.agent-tool", (self) => {
|
|
const config = self.registry(HarnessConfig);
|
|
// The live model observer, as the subagent tool uses it: a phase captures the tool, not the model catalog.
|
|
const models = new Proxy({} as Models, {
|
|
get: (_target, key) => {
|
|
const current = config.value.get("default")?.models();
|
|
if (!current) throw new Error("No model configuration");
|
|
const value: unknown = Reflect.get(current, key, current);
|
|
return typeof value === "function" ? value.bind(current) : value;
|
|
},
|
|
});
|
|
const extensions = self.registry(Extensions);
|
|
const extension = createAgentExtension(models, () => toolsByName(extensions.value));
|
|
self.contribute(Extensions, { [extension.name]: extension });
|
|
});
|
|
});
|