feat: initialize Hypothesis Machine Pi extension
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
# Verified Pi capabilities (0.83.0)
|
||||
|
||||
Verified on 2026-07-31 against the published TypeScript declarations for
|
||||
`@earendil-works/pi-coding-agent@0.83.0`, compatibility-tested against Pi 0.78.0, the current
|
||||
[Pi documentation](https://pi.dev/docs/latest), and the official
|
||||
[`earendil-works/pi`](https://github.com/earendil-works/pi) repository.
|
||||
|
||||
## Reused from Pi
|
||||
|
||||
Hypothesis Machine is an extension package. Pi remains responsible for the TUI,
|
||||
normal chat, model selection, credentials, streaming, parallel tool calls,
|
||||
history, compaction, branch summaries, steering/follow-up queues, slash-command
|
||||
dispatch, lifecycle events, tool rendering, and model/provider execution.
|
||||
|
||||
Each child is created by the official SDK `createAgentSession()`. It receives:
|
||||
|
||||
- a persistent `SessionManager` in the research run's `sessions/` directory;
|
||||
- the parent's selected `Model` and thinking level;
|
||||
- one shared official model/auth service: `ModelRuntime` on Pi 0.83+, or the
|
||||
parent context's `ModelRegistry` on Pi 0.78;
|
||||
- a `DefaultResourceLoader` that keeps project context but disables extension
|
||||
rediscovery for the child (the recursive tools are injected explicitly);
|
||||
- only its allowed read-only built-ins and Hypothesis Machine custom tools.
|
||||
|
||||
`AgentSession.prompt()`, `steer()`, `followUp()`, `abort()`, `subscribe()`, and
|
||||
`dispose()` provide the actual loop and lifecycle. Hypothesis Machine does not
|
||||
implement an LLM/tool loop.
|
||||
|
||||
The Supervisor extension uses `registerTool`, `registerCommand`, custom tool
|
||||
rendering, `session_start`, `session_shutdown`, `appendEntry`, `sendUserMessage`,
|
||||
notifications, and status widgets. The `hypothesis-machine-run` custom entry ties
|
||||
the root Pi session to a run manifest without copying its conversation.
|
||||
|
||||
## Implemented here
|
||||
|
||||
Pi does not provide a recursive research registry, domain memory, research stop
|
||||
policy, web-source gateway, or Docker experiment protocol. This package adds:
|
||||
|
||||
- `AgentTree` and `AgentFactory`, including generated/validated Markdown specs;
|
||||
- coded recursion limits, duplicate-task checks, independent replication flags,
|
||||
branch cancellation, result collection, and restart recovery;
|
||||
- Markdown subject memory plus a rebuildable SQLite FTS5 index;
|
||||
- SearXNG → Firecrawl → optional Browser Use adapter routing;
|
||||
- URL canonicalization, SSRF checks, source hashing/cache/provenance;
|
||||
- an explicit bounded iteration state machine;
|
||||
- frozen test plans and networkless, resource-limited Docker experiments.
|
||||
|
||||
## Assumptions corrected after verification
|
||||
|
||||
1. `AgentSessionRuntime` owns replacement of the active interactive session
|
||||
(`newSession`, switch, fork, import). It is not required for independent child
|
||||
sessions; those use `createAgentSession` directly.
|
||||
2. In Pi 0.83, `ExtensionContext` exposes `model`, `thinkingLevel`, and a
|
||||
compatibility `ModelRegistry`, but not the parent `ModelRuntime` instance. The
|
||||
extension creates one canonical `ModelRuntime` and shares it across children.
|
||||
In Pi 0.78, `createAgentSession` instead accepts the full `ModelRegistry`, so
|
||||
the exact registry exposed by the parent context is reused. No key is read or
|
||||
copied by Hypothesis Machine in either path.
|
||||
3. The official `subagent/` example currently launches `pi --mode json` child
|
||||
processes. It is a reference, not a dependency; this project instead uses
|
||||
persistent in-process `AgentSession`s so steering, follow-up, recursive tools,
|
||||
and session restoration remain direct SDK operations.
|
||||
4. Extension factories can run without a session. Background resources must be
|
||||
created during `session_start` and cleaned up during `session_shutdown`.
|
||||
5. Custom tool calls are parallel by default. Only `run_experiment` is forced to
|
||||
sequential execution because it mutates an experiment directory.
|
||||
6. Plain custom session entries do not enter model context. They are suitable for
|
||||
the run pointer; findings belong in separate Markdown memory.
|
||||
7. Current open-source Browser Use agent/MCP operation requires separate model
|
||||
credentials. Passing Pi credentials to a Python worker would violate the
|
||||
design, so the MVP exposes a documented local adapter boundary and uses
|
||||
Firecrawl as the no-extra-model dynamic-page path.
|
||||
8. Pi 0.78 predates `agent_settled`; autonomous continuation additionally listens
|
||||
to `agent_end`, guarded by iteration identity and `ctx.isIdle()` so 0.83 does
|
||||
not schedule duplicate continuation turns.
|
||||
|
||||
Primary references: [SDK](https://pi.dev/docs/latest/sdk),
|
||||
[Extensions](https://pi.dev/docs/latest/extensions),
|
||||
[session format](https://pi.dev/docs/latest/session-format), and the official
|
||||
[`subagent` example](https://github.com/earendil-works/pi/tree/main/packages/coding-agent/examples/extensions/subagent).
|
||||
Reference in New Issue
Block a user