refactor(coding-agent): replace AgentSessionRuntimeHost with closure-based AgentSessionRuntime
- Replace AgentSessionRuntimeHost and bootstrap abstractions with AgentSessionRuntime - Runtime creation is now closure-based via CreateAgentSessionRuntimeFactory - Factory closes over process-global fixed inputs, recreates cwd-bound services per effective cwd - Session config (model, thinking, tools, scoped models) re-resolved per target cwd - CLI resource paths resolved once at startup as absolute paths - Swap lifecycle: teardown old, create next, apply next (hard fail on creation error) - Unified diagnostics model (info/warning/error) for args, services, session resolution, resources - No logging or process exits inside creation/parsing logic - Removed session_directory support - Removed session_switch and session_fork extension events (use session_start with reason) - Moved package/config CLI to package-manager-cli.ts - Fixed theme init for --resume session picker - Fixed flaky reftable footer test (content-based polling) - Fixed silent drop of unknown single-dash CLI flags - Added error diagnostics for missing explicit CLI resource paths - Updated SDK docs, examples, plans, exports, tests, changelog fixes #2753
This commit is contained in:
@@ -4,74 +4,78 @@
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed extension post-transition events `session_switch` and `session_fork`. Extensions should now use `session_start` and inspect `event.reason`, which is now one of `"startup" | "reload" | "new" | "resume" | "fork"`. For `"new"`, `"resume"`, and `"fork"`, `session_start` also includes `previousSessionFile`. This is better because session replacement now fully reloads extensions, so one post-start hook with explicit reason matches the real lifecycle better than two extra non-cancellable post-transition events.
|
||||
- Removed session-replacement methods from `AgentSession`. Use `AgentSessionRuntimeHost` for `newSession()`, `switchSession()`, `fork()`, and `importFromJsonl()`. This is better because cross-cwd session replacement rebuilds cwd-bound runtime state and can replace the live `AgentSession` instance entirely. Keeping those operations on a stable runtime host matches the real lifecycle and avoids pretending one `AgentSession` mutates into another.
|
||||
- Removed extension post-transition events `session_switch` and `session_fork`. Use `session_start` with `event.reason` (`"startup" | "reload" | "new" | "resume" | "fork"`). For `"new"`, `"resume"`, and `"fork"`, `session_start` includes `previousSessionFile`.
|
||||
- Removed session-replacement methods from `AgentSession`. Use `AgentSessionRuntime` for `newSession()`, `switchSession()`, `fork()`, and `importFromJsonl()`. Cross-cwd session replacement rebuilds all cwd-bound runtime state and replaces the live `AgentSession` instance.
|
||||
- Removed `session_directory` from extension and settings APIs.
|
||||
- Unknown single-dash CLI flags (e.g. `-s`) now produce an error instead of being silently ignored.
|
||||
|
||||
#### Migration Notes
|
||||
|
||||
For existing extensions:
|
||||
#### Migration: Extensions
|
||||
|
||||
Before:
|
||||
|
||||
```ts
|
||||
pi.on("session_switch", async (event, ctx) => {
|
||||
if (event.reason === "new") {
|
||||
resetState();
|
||||
}
|
||||
});
|
||||
|
||||
pi.on("session_fork", async (_event, ctx) => {
|
||||
reconstructState(ctx);
|
||||
});
|
||||
pi.on("session_switch", async (event, ctx) => { ... });
|
||||
pi.on("session_fork", async (_event, ctx) => { ... });
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```ts
|
||||
pi.on("session_start", async (event, ctx) => {
|
||||
if (event.reason === "new") {
|
||||
resetState();
|
||||
}
|
||||
|
||||
if (event.reason === "fork" || event.reason === "resume" || event.reason === "startup") {
|
||||
reconstructState(ctx);
|
||||
}
|
||||
// event.reason: "startup" | "reload" | "new" | "resume" | "fork"
|
||||
// event.previousSessionFile: set for "new", "resume", "fork"
|
||||
});
|
||||
```
|
||||
|
||||
For existing SDK integrations:
|
||||
#### Migration: SDK session replacement
|
||||
|
||||
Before:
|
||||
|
||||
```ts
|
||||
await session.newSession();
|
||||
await session.switchSession("/path/to/session.jsonl");
|
||||
await session.fork("entry-id");
|
||||
await session.importFromJsonl(jsonl);
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```ts
|
||||
const runtime = await createAgentSessionRuntime(bootstrap, {
|
||||
import {
|
||||
type CreateAgentSessionRuntimeFactory,
|
||||
createAgentSessionFromServices,
|
||||
createAgentSessionRuntime,
|
||||
createAgentSessionServices,
|
||||
getAgentDir,
|
||||
SessionManager,
|
||||
} from "@mariozechner/pi-coding-agent";
|
||||
|
||||
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
|
||||
const services = await createAgentSessionServices({ cwd });
|
||||
return {
|
||||
...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
|
||||
services,
|
||||
diagnostics: services.diagnostics,
|
||||
};
|
||||
};
|
||||
|
||||
const runtime = await createAgentSessionRuntime(createRuntime, {
|
||||
cwd: process.cwd(),
|
||||
agentDir: getAgentDir(),
|
||||
sessionManager: SessionManager.create(process.cwd()),
|
||||
});
|
||||
const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
|
||||
|
||||
await runtimeHost.newSession();
|
||||
await runtimeHost.switchSession("/path/to/session.jsonl");
|
||||
await runtimeHost.fork("entry-id");
|
||||
await runtimeHost.importFromJsonl(jsonl);
|
||||
await runtime.newSession();
|
||||
await runtime.switchSession("/path/to/session.jsonl");
|
||||
await runtime.fork("entry-id");
|
||||
|
||||
const session = runtimeHost.session;
|
||||
// After replacement, runtime.session is the new live session.
|
||||
// Rebind any session-local subscriptions or extension bindings.
|
||||
```
|
||||
|
||||
After runtime replacement, use `runtimeHost.session` as the new live session and rebind any session-local subscriptions or extension bindings.
|
||||
|
||||
### Added
|
||||
|
||||
- Added public SDK runtime-host exports `createAgentSessionRuntime()` and `AgentSessionRuntimeHost` for apps that need runtime-backed session replacement and mode-style session switching
|
||||
- Added `createAgentSessionRuntime()` and `AgentSessionRuntime` for runtime-backed session replacement. The runtime takes a `CreateAgentSessionRuntimeFactory` closure that closes over process-global fixed inputs and recreates cwd-bound services and session config for each effective cwd. Startup and later `/new`, `/resume`, `/fork`, import all use the same factory.
|
||||
- Added unified diagnostics model (`info`/`warning`/`error`) for arg parsing, service creation, session option resolution, and resource loading. Creation logic no longer logs or exits. The app layer decides presentation and exit behavior.
|
||||
- Added error diagnostics for missing explicit CLI resource paths (`-e`, `--skill`, `--prompt-template`, `--theme`)
|
||||
|
||||
- Added `defineTool()` so standalone and array-based custom tool definitions keep inferred parameter types without manual casts ([#2746](https://github.com/badlogic/pi-mono/issues/2746))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user