@astralyn/pi 0.82.6 → 0.83.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/CHANGELOG.md +61 -5099
- package/README.md +12 -111
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/credential-print.d.ts +23 -0
- package/dist/cli/credential-print.d.ts.map +1 -0
- package/dist/cli/credential-print.js +116 -0
- package/dist/cli/credential-print.js.map +1 -0
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +11 -13
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +3 -0
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +13 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +7 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +11 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +10 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +13 -6
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader.d.ts +15 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +70 -9
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -5
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -41
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +42 -11
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +40 -11
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +17 -8
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +3 -3
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -4
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +7 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +11 -0
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -3
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +48 -9
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/extensions/deepwiki/render.d.ts.map +1 -1
- package/dist/extensions/deepwiki/render.js +34 -22
- package/dist/extensions/deepwiki/render.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +0 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +1 -1
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +29 -10
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js +7 -2
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/render.d.ts +4 -8
- package/dist/extensions/question/render.d.ts.map +1 -1
- package/dist/extensions/question/render.js +202 -29
- package/dist/extensions/question/render.js.map +1 -1
- package/dist/extensions/question/results.d.ts.map +1 -1
- package/dist/extensions/question/results.js +1 -0
- package/dist/extensions/question/results.js.map +1 -1
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js +2 -2
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/question/types.d.ts +1 -0
- package/dist/extensions/question/types.d.ts.map +1 -1
- package/dist/extensions/question/types.js +1 -1
- package/dist/extensions/question/types.js.map +1 -1
- package/dist/extensions/router/stream.d.ts +1 -0
- package/dist/extensions/router/stream.d.ts.map +1 -1
- package/dist/extensions/router/stream.js +44 -13
- package/dist/extensions/router/stream.js.map +1 -1
- package/dist/extensions/subagent/constants.d.ts +1 -0
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/constants.js +1 -0
- package/dist/extensions/subagent/constants.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +2 -0
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +121 -48
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/retry.d.ts +17 -0
- package/dist/extensions/subagent/retry.d.ts.map +1 -0
- package/dist/extensions/subagent/retry.js +41 -0
- package/dist/extensions/subagent/retry.js.map +1 -0
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +33 -5
- package/dist/extensions/subagent/runner.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts +6 -0
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +46 -24
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/types.d.ts +7 -0
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/todo/index.d.ts.map +1 -1
- package/dist/extensions/todo/index.js +1 -1
- package/dist/extensions/todo/index.js.map +1 -1
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js +10 -2
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts +1 -1
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +179 -34
- package/dist/extensions/todo/view.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +43 -0
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +5 -0
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -2
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +13 -6
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +54 -17
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +10 -6
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +11 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +56 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +4 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +3 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +52 -2
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +133 -18
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts +1 -0
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +5 -0
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +10 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +55 -2
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +40 -3
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +92 -24
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +3 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +13 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/utils/paths.d.ts +5 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +7 -0
- package/dist/utils/paths.js.map +1 -1
- package/docs/bundled/README.md +13 -15
- package/docs/bundled/extensions/deepwiki.md +1 -1
- package/docs/bundled/extensions/question.md +7 -5
- package/docs/bundled/extensions/router.md +3 -4
- package/docs/bundled/extensions/statusline.md +0 -1
- package/docs/bundled/extensions/subagent.md +4 -3
- package/docs/bundled/extensions/todo.md +1 -1
- package/docs/bundled/themes.md +1 -1
- package/docs/bundled/tool-presentation.md +17 -16
- package/docs/compaction.md +25 -30
- package/docs/custom-provider.md +298 -583
- package/docs/docs.json +0 -8
- package/docs/extensions.md +132 -121
- package/docs/index.md +18 -74
- package/docs/json.md +20 -14
- package/docs/models.md +193 -151
- package/docs/providers.md +2 -1
- package/docs/quickstart.md +3 -3
- package/docs/rpc.md +166 -124
- package/docs/sdk.md +119 -178
- package/docs/security.md +1 -1
- package/docs/session-format.md +139 -119
- package/docs/skills.md +0 -1
- package/docs/themes.md +2 -2
- package/docs/tui.md +411 -549
- package/docs/usage.md +3 -11
- package/examples/README.md +6 -1
- package/examples/extensions/README.md +13 -33
- package/examples/extensions/custom-provider-anthropic/index.ts +9 -3
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/truncated-tool.ts +2 -2
- package/examples/sdk/12-full-control.ts +2 -0
- package/npm-shrinkwrap.json +25 -25
- package/package.json +5 -5
- package/dist/extensions/plan/constants.d.ts +0 -40
- package/dist/extensions/plan/constants.d.ts.map +0 -1
- package/dist/extensions/plan/constants.js +0 -69
- package/dist/extensions/plan/constants.js.map +0 -1
- package/dist/extensions/plan/index.d.ts +0 -3
- package/dist/extensions/plan/index.d.ts.map +0 -1
- package/dist/extensions/plan/index.js +0 -323
- package/dist/extensions/plan/index.js.map +0 -1
- package/dist/extensions/plan/schema.d.ts +0 -15
- package/dist/extensions/plan/schema.d.ts.map +0 -1
- package/dist/extensions/plan/schema.js +0 -13
- package/dist/extensions/plan/schema.js.map +0 -1
- package/dist/extensions/plan/state.d.ts +0 -29
- package/dist/extensions/plan/state.d.ts.map +0 -1
- package/dist/extensions/plan/state.js +0 -74
- package/dist/extensions/plan/state.js.map +0 -1
- package/dist/extensions/plan/storage.d.ts +0 -18
- package/dist/extensions/plan/storage.d.ts.map +0 -1
- package/dist/extensions/plan/storage.js +0 -58
- package/dist/extensions/plan/storage.js.map +0 -1
- package/dist/extensions/plan/view.d.ts +0 -36
- package/dist/extensions/plan/view.d.ts.map +0 -1
- package/dist/extensions/plan/view.js +0 -74
- package/dist/extensions/plan/view.js.map +0 -1
- package/docs/bundled/extensions/README.md +0 -19
- package/docs/bundled/extensions/plan.md +0 -33
- package/examples/extensions/plan-mode/README.md +0 -66
- package/examples/extensions/plan-mode/index.ts +0 -390
- package/examples/extensions/plan-mode/utils.ts +0 -168
package/docs/session-format.md
CHANGED
|
@@ -5,10 +5,10 @@ Sessions are stored as JSONL (JSON Lines) files. Each line is a JSON object with
|
|
|
5
5
|
## File Location
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
~/.pi/agent/sessions/--<
|
|
8
|
+
~/.pi/agent/sessions/--<encoded-cwd>--/<timestamp>_<uuid>.jsonl
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Pi resolves the working directory to an absolute path, removes one leading `/` or `\`, replaces every `/`, `\`, and `:` with `-`, then wraps the result in `--`. For example, `/path/to/project` is stored under `--path-to-project--`; `C:\Users\me\project` is stored under `--C--Users-me-project--`.
|
|
12
12
|
|
|
13
13
|
## Deleting Sessions
|
|
14
14
|
|
|
@@ -26,28 +26,51 @@ Sessions have a version field in the header:
|
|
|
26
26
|
|
|
27
27
|
Existing sessions are automatically migrated to the current version (v3) when loaded.
|
|
28
28
|
|
|
29
|
-
##
|
|
29
|
+
## Public Type Imports
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
- [`src/core/session-manager.ts`](https://github.com/ming-kang/pi/blob/main/src/core/session-manager.ts) - Session entry types and SessionManager
|
|
33
|
-
- [`src/core/messages.ts`](https://github.com/ming-kang/pi/blob/main/src/core/messages.ts) - Extended message types (BashExecutionMessage, CustomMessage, etc.)
|
|
34
|
-
- [`packages/ai/src/types.ts`](https://github.com/earendil-works/pi/blob/v0.82.1/packages/ai/src/types.ts) - Base message types (UserMessage, AssistantMessage, ToolResultMessage)
|
|
35
|
-
- [`packages/agent/src/types.ts`](https://github.com/earendil-works/pi/blob/v0.82.1/packages/agent/src/types.ts) - AgentMessage union type
|
|
31
|
+
The published packages provide the session and message types used here:
|
|
36
32
|
|
|
37
|
-
|
|
33
|
+
```typescript
|
|
34
|
+
import {
|
|
35
|
+
type CompactionEntry,
|
|
36
|
+
type NewSessionOptions,
|
|
37
|
+
type SessionContext,
|
|
38
|
+
type SessionEntry,
|
|
39
|
+
type SessionHeader,
|
|
40
|
+
type SessionInfo,
|
|
41
|
+
type SessionTreeNode,
|
|
42
|
+
SessionManager,
|
|
43
|
+
} from "@astralyn/pi";
|
|
44
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
45
|
+
import type {
|
|
46
|
+
Api,
|
|
47
|
+
AssistantMessage,
|
|
48
|
+
AssistantMessageDiagnostic,
|
|
49
|
+
ImageContent,
|
|
50
|
+
Message,
|
|
51
|
+
ProviderId,
|
|
52
|
+
TextContent,
|
|
53
|
+
ThinkingContent,
|
|
54
|
+
ToolCall,
|
|
55
|
+
ToolResultMessage,
|
|
56
|
+
Usage,
|
|
57
|
+
UserMessage,
|
|
58
|
+
} from "@earendil-works/pi-ai";
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Pi augments `AgentMessage` with its session-specific roles when `@astralyn/pi` is loaded. Extensions can augment it further.
|
|
38
62
|
|
|
39
63
|
## Message Types
|
|
40
64
|
|
|
41
|
-
Session entries contain `AgentMessage` objects.
|
|
65
|
+
Session message entries contain `AgentMessage` objects. The base message types come from `@earendil-works/pi-ai`; Pi adds the persisted roles described below.
|
|
42
66
|
|
|
43
67
|
### Content Blocks
|
|
44
68
|
|
|
45
|
-
Messages contain arrays of typed content blocks:
|
|
46
|
-
|
|
47
69
|
```typescript
|
|
48
70
|
interface TextContent {
|
|
49
71
|
type: "text";
|
|
50
72
|
text: string;
|
|
73
|
+
textSignature?: string;
|
|
51
74
|
}
|
|
52
75
|
|
|
53
76
|
interface ImageContent {
|
|
@@ -59,6 +82,8 @@ interface ImageContent {
|
|
|
59
82
|
interface ThinkingContent {
|
|
60
83
|
type: "thinking";
|
|
61
84
|
thinking: string;
|
|
85
|
+
thinkingSignature?: string;
|
|
86
|
+
redacted?: boolean;
|
|
62
87
|
}
|
|
63
88
|
|
|
64
89
|
interface ToolCall {
|
|
@@ -66,10 +91,11 @@ interface ToolCall {
|
|
|
66
91
|
id: string;
|
|
67
92
|
name: string;
|
|
68
93
|
arguments: Record<string, any>;
|
|
94
|
+
thoughtSignature?: string;
|
|
69
95
|
}
|
|
70
96
|
```
|
|
71
97
|
|
|
72
|
-
### Base Message Types (
|
|
98
|
+
### Base Message Types (`@earendil-works/pi-ai`)
|
|
73
99
|
|
|
74
100
|
```typescript
|
|
75
101
|
interface UserMessage {
|
|
@@ -81,22 +107,26 @@ interface UserMessage {
|
|
|
81
107
|
interface AssistantMessage {
|
|
82
108
|
role: "assistant";
|
|
83
109
|
content: (TextContent | ThinkingContent | ToolCall)[];
|
|
84
|
-
api:
|
|
85
|
-
provider:
|
|
110
|
+
api: Api;
|
|
111
|
+
provider: ProviderId;
|
|
86
112
|
model: string;
|
|
113
|
+
responseModel?: string;
|
|
114
|
+
responseId?: string;
|
|
115
|
+
diagnostics?: AssistantMessageDiagnostic[];
|
|
87
116
|
usage: Usage;
|
|
88
117
|
stopReason: "stop" | "length" | "toolUse" | "error" | "aborted";
|
|
89
118
|
errorMessage?: string;
|
|
90
119
|
timestamp: number;
|
|
91
120
|
}
|
|
92
121
|
|
|
93
|
-
interface ToolResultMessage {
|
|
122
|
+
interface ToolResultMessage<TDetails = any> {
|
|
94
123
|
role: "toolResult";
|
|
95
124
|
toolCallId: string;
|
|
96
125
|
toolName: string;
|
|
97
126
|
content: (TextContent | ImageContent)[];
|
|
98
|
-
details?:
|
|
99
|
-
usage?: Usage;
|
|
127
|
+
details?: TDetails;
|
|
128
|
+
usage?: Usage; // Tool-execution usage, not main context accounting
|
|
129
|
+
addedToolNames?: string[];
|
|
100
130
|
isError: boolean;
|
|
101
131
|
timestamp: number;
|
|
102
132
|
}
|
|
@@ -106,6 +136,8 @@ interface Usage {
|
|
|
106
136
|
output: number;
|
|
107
137
|
cacheRead: number;
|
|
108
138
|
cacheWrite: number;
|
|
139
|
+
cacheWrite1h?: number;
|
|
140
|
+
reasoning?: number; // Already included in output
|
|
109
141
|
totalTokens: number;
|
|
110
142
|
cost: {
|
|
111
143
|
input: number;
|
|
@@ -117,7 +149,9 @@ interface Usage {
|
|
|
117
149
|
}
|
|
118
150
|
```
|
|
119
151
|
|
|
120
|
-
|
|
152
|
+
The exported pi-ai `StopReason` type also includes `"pending"`, but that value is reserved for partial messages in streaming events. Terminal `done` or `error` events replace it with a final completion reason before Pi persists the assistant message, so `"pending"` must never appear in session JSONL.
|
|
153
|
+
|
|
154
|
+
### Pi-Specific `AgentMessage` Roles
|
|
121
155
|
|
|
122
156
|
```typescript
|
|
123
157
|
interface BashExecutionMessage {
|
|
@@ -132,12 +166,12 @@ interface BashExecutionMessage {
|
|
|
132
166
|
timestamp: number;
|
|
133
167
|
}
|
|
134
168
|
|
|
135
|
-
interface CustomMessage {
|
|
169
|
+
interface CustomMessage<T = unknown> {
|
|
136
170
|
role: "custom";
|
|
137
171
|
customType: string; // Extension identifier
|
|
138
172
|
content: string | (TextContent | ImageContent)[];
|
|
139
173
|
display: boolean; // Show in TUI
|
|
140
|
-
details?:
|
|
174
|
+
details?: T; // Extension-specific metadata
|
|
141
175
|
timestamp: number;
|
|
142
176
|
}
|
|
143
177
|
|
|
@@ -156,18 +190,9 @@ interface CompactionSummaryMessage {
|
|
|
156
190
|
}
|
|
157
191
|
```
|
|
158
192
|
|
|
159
|
-
### AgentMessage
|
|
193
|
+
### `AgentMessage`
|
|
160
194
|
|
|
161
|
-
|
|
162
|
-
type AgentMessage =
|
|
163
|
-
| UserMessage
|
|
164
|
-
| AssistantMessage
|
|
165
|
-
| ToolResultMessage
|
|
166
|
-
| BashExecutionMessage
|
|
167
|
-
| CustomMessage
|
|
168
|
-
| BranchSummaryMessage
|
|
169
|
-
| CompactionSummaryMessage;
|
|
170
|
-
```
|
|
195
|
+
`AgentMessage` is the `Message` union from `@earendil-works/pi-ai` plus roles registered through `CustomAgentMessages` in `@earendil-works/pi-agent-core`. Pi registers the four roles above; extensions may register additional roles.
|
|
171
196
|
|
|
172
197
|
## Entry Base
|
|
173
198
|
|
|
@@ -176,9 +201,9 @@ All entries (except `SessionHeader`) extend `SessionEntryBase`:
|
|
|
176
201
|
```typescript
|
|
177
202
|
interface SessionEntryBase {
|
|
178
203
|
type: string;
|
|
179
|
-
id: string;
|
|
204
|
+
id: string;
|
|
180
205
|
parentId: string | null; // Parent entry ID (null for first entry)
|
|
181
|
-
timestamp: string;
|
|
206
|
+
timestamp: string; // ISO timestamp
|
|
182
207
|
}
|
|
183
208
|
```
|
|
184
209
|
|
|
@@ -200,12 +225,12 @@ For sessions with a parent (created via `/fork`, `/clone`, or `newSession({ pare
|
|
|
200
225
|
|
|
201
226
|
### SessionMessageEntry
|
|
202
227
|
|
|
203
|
-
A message in the conversation. The `message` field contains an `AgentMessage`.
|
|
228
|
+
A message in the conversation. The `message` field contains an `AgentMessage`. These examples include the required message fields; optional fields from the message shapes above may also be present.
|
|
204
229
|
|
|
205
230
|
```json
|
|
206
|
-
{"type":"message","id":"a1b2c3d4","parentId":
|
|
207
|
-
{"type":"message","id":"b2c3d4e5","parentId":"a1b2c3d4","timestamp":"2024-12-03T14:00:02.000Z","message":{"role":"assistant","content":[{"type":"text","text":"Hi!"}],"provider":"anthropic","model":"claude-sonnet-4-5","usage":{
|
|
208
|
-
{"type":"message","id":"c3d4e5f6","parentId":"b2c3d4e5","timestamp":"2024-12-03T14:00:03.000Z","message":{"role":"toolResult","toolCallId":"call_123","toolName":"bash","content":[{"type":"text","text":"output"}],"isError":false}}
|
|
231
|
+
{"type":"message","id":"a1b2c3d4","parentId":null,"timestamp":"2024-12-03T14:00:01.000Z","message":{"role":"user","content":"Hello","timestamp":1733234401000}}
|
|
232
|
+
{"type":"message","id":"b2c3d4e5","parentId":"a1b2c3d4","timestamp":"2024-12-03T14:00:02.000Z","message":{"role":"assistant","content":[{"type":"text","text":"Hi!"}],"api":"anthropic-messages","provider":"anthropic","model":"claude-sonnet-4-5","usage":{"input":10,"output":2,"cacheRead":0,"cacheWrite":0,"totalTokens":12,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"stop","timestamp":1733234402000}}
|
|
233
|
+
{"type":"message","id":"c3d4e5f6","parentId":"b2c3d4e5","timestamp":"2024-12-03T14:00:03.000Z","message":{"role":"toolResult","toolCallId":"call_123","toolName":"bash","content":[{"type":"text","text":"output"}],"isError":false,"timestamp":1733234403000}}
|
|
209
234
|
```
|
|
210
235
|
|
|
211
236
|
### ModelChangeEntry
|
|
@@ -213,7 +238,7 @@ A message in the conversation. The `message` field contains an `AgentMessage`.
|
|
|
213
238
|
Emitted when the user switches models mid-session.
|
|
214
239
|
|
|
215
240
|
```json
|
|
216
|
-
{"type":"model_change","id":"
|
|
241
|
+
{"type":"model_change","id":"d4e5f607","parentId":"c3d4e5f6","timestamp":"2024-12-03T14:05:00.000Z","provider":"openai","modelId":"gpt-4o"}
|
|
217
242
|
```
|
|
218
243
|
|
|
219
244
|
### ThinkingLevelChangeEntry
|
|
@@ -221,36 +246,28 @@ Emitted when the user switches models mid-session.
|
|
|
221
246
|
Emitted when the user changes the thinking/reasoning level.
|
|
222
247
|
|
|
223
248
|
```json
|
|
224
|
-
{"type":"thinking_level_change","id":"
|
|
249
|
+
{"type":"thinking_level_change","id":"e5f60718","parentId":"d4e5f607","timestamp":"2024-12-03T14:06:00.000Z","thinkingLevel":"high"}
|
|
225
250
|
```
|
|
226
251
|
|
|
227
252
|
### CompactionEntry
|
|
228
253
|
|
|
229
|
-
Created when context is compacted. Stores a summary of earlier messages.
|
|
230
|
-
|
|
231
|
-
```json
|
|
232
|
-
{"type":"compaction","id":"f6g7h8i9","parentId":"e5f6g7h8","timestamp":"2024-12-03T14:10:00.000Z","summary":"User discussed X, Y, Z...","firstKeptEntryId":"c3d4e5f6","tokensBefore":50000}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
Newer harness-generated compactions embed the retained post-compaction context directly on the entry, instead of `firstKeptEntryId`:
|
|
254
|
+
Created when context is compacted. Stores a summary of earlier messages. `firstKeptEntryId` is required and identifies the earliest pre-compaction path entry retained alongside the summary.
|
|
236
255
|
|
|
237
256
|
```json
|
|
238
|
-
{"type":"compaction","id":"
|
|
257
|
+
{"type":"compaction","id":"f6071829","parentId":"e5f60718","timestamp":"2024-12-03T14:10:00.000Z","summary":"User discussed X, Y, Z...","firstKeptEntryId":"c3d4e5f6","tokensBefore":50000}
|
|
239
258
|
```
|
|
240
259
|
|
|
241
260
|
Optional fields:
|
|
242
261
|
- `usage`: LLM usage from generating the summary; included in session token and cost totals
|
|
243
|
-
- `retainedTail`: Materialized `AgentMessage[]` kept after compaction. This is optional only for backward compatibility with older sessions. Newer harness-generated compactions include it so we can rebuild context from this checkpoint without walking older entries before the compaction entry.
|
|
244
262
|
- `details`: Implementation-specific data (e.g., `{ readFiles: string[], modifiedFiles: string[] }` for default, or custom data for extensions)
|
|
245
263
|
- `fromHook`: `true` if generated by an extension, `false`/`undefined` if pi-generated (legacy field name)
|
|
246
|
-
- `firstKeptEntryId`: for compatibility with old entry format.
|
|
247
264
|
|
|
248
265
|
### BranchSummaryEntry
|
|
249
266
|
|
|
250
267
|
Created when switching branches via `/tree` with an LLM generated summary of the left branch up to the common ancestor. Captures context from the abandoned path.
|
|
251
268
|
|
|
252
269
|
```json
|
|
253
|
-
{"type":"branch_summary","id":"
|
|
270
|
+
{"type":"branch_summary","id":"0718293a","parentId":"a1b2c3d4","timestamp":"2024-12-03T14:15:00.000Z","fromId":"f6071829","summary":"Branch explored approach A..."}
|
|
254
271
|
```
|
|
255
272
|
|
|
256
273
|
Optional fields:
|
|
@@ -263,7 +280,7 @@ Optional fields:
|
|
|
263
280
|
Extension state persistence. Does NOT participate in LLM context.
|
|
264
281
|
|
|
265
282
|
```json
|
|
266
|
-
{"type":"custom","id":"
|
|
283
|
+
{"type":"custom","id":"18293a4b","parentId":"0718293a","timestamp":"2024-12-03T14:20:00.000Z","customType":"my-extension","data":{"count":42}}
|
|
267
284
|
```
|
|
268
285
|
|
|
269
286
|
Use `customType` to identify your extension's entries on reload. Interactive mode can render custom entries via `pi.registerEntryRenderer(customType, renderer)`, but they still do not participate in LLM context.
|
|
@@ -273,7 +290,7 @@ Use `customType` to identify your extension's entries on reload. Interactive mod
|
|
|
273
290
|
Extension-injected messages that DO participate in LLM context.
|
|
274
291
|
|
|
275
292
|
```json
|
|
276
|
-
{"type":"custom_message","id":"
|
|
293
|
+
{"type":"custom_message","id":"293a4b5c","parentId":"18293a4b","timestamp":"2024-12-03T14:25:00.000Z","customType":"my-extension","content":"Injected context...","display":true}
|
|
277
294
|
```
|
|
278
295
|
|
|
279
296
|
Fields:
|
|
@@ -286,7 +303,7 @@ Fields:
|
|
|
286
303
|
User-defined bookmark/marker on an entry.
|
|
287
304
|
|
|
288
305
|
```json
|
|
289
|
-
{"type":"label","id":"
|
|
306
|
+
{"type":"label","id":"3a4b5c6d","parentId":"293a4b5c","timestamp":"2024-12-03T14:30:00.000Z","targetId":"a1b2c3d4","label":"checkpoint-1"}
|
|
290
307
|
```
|
|
291
308
|
|
|
292
309
|
Set `label` to `undefined` to clear a label.
|
|
@@ -296,7 +313,7 @@ Set `label` to `undefined` to clear a label.
|
|
|
296
313
|
Session metadata (e.g., user-defined display name). Set via `/name`, `--name` / `-n`, or `pi.setSessionName()` in extensions.
|
|
297
314
|
|
|
298
315
|
```json
|
|
299
|
-
{"type":"session_info","id":"
|
|
316
|
+
{"type":"session_info","id":"4b5c6d7e","parentId":"3a4b5c6d","timestamp":"2024-12-03T14:35:00.000Z","name":"Refactor auth module"}
|
|
300
317
|
```
|
|
301
318
|
|
|
302
319
|
The session name is displayed in the session selector (`/resume`) instead of the first message when set.
|
|
@@ -317,27 +334,25 @@ Entries form a tree:
|
|
|
317
334
|
|
|
318
335
|
## Context Building
|
|
319
336
|
|
|
320
|
-
`buildContextEntries()`
|
|
337
|
+
`buildContextEntries()` follows the active path from root to the current leaf. If the path has no compaction entry, it returns that path unchanged. Otherwise it uses only the latest `CompactionEntry` and returns entries in this order:
|
|
338
|
+
|
|
339
|
+
1. The latest compaction entry itself.
|
|
340
|
+
2. Path entries starting at that compaction's required `firstKeptEntryId` and ending immediately before the compaction entry.
|
|
341
|
+
3. Every path entry after the compaction entry.
|
|
321
342
|
|
|
322
|
-
|
|
323
|
-
2. If a `CompactionEntry` is on the path:
|
|
324
|
-
- Includes the compaction entry first
|
|
325
|
-
- If `retainedTail` is present, it acts as a self-contained checkpoint and entries after the compaction are included
|
|
326
|
-
- Otherwise entries from `firstKeptEntryId` to the compaction are included
|
|
327
|
-
- Then entries after compaction are included
|
|
328
|
-
3. Preserves non-message entries in the selected range so interactive mode can render them
|
|
343
|
+
Earlier summarized entries are omitted. Non-message entries in the selected ranges remain in the returned list for rendering and state handling. If a malformed session's `firstKeptEntryId` is not found before the compaction entry, step 2 contributes no entries.
|
|
329
344
|
|
|
330
|
-
`buildSessionContext()`
|
|
345
|
+
`buildSessionContext()` returns a `SessionContext`, not provider-ready `Message[]` directly:
|
|
331
346
|
|
|
332
|
-
1.
|
|
333
|
-
2.
|
|
334
|
-
- `message`
|
|
335
|
-
- `compaction`
|
|
336
|
-
- `branch_summary`
|
|
337
|
-
- `custom_message`
|
|
338
|
-
- `custom
|
|
347
|
+
1. It determines `thinkingLevel` and `model` from the entire active path, including entries omitted by compaction. A `model_change` sets the model, and an assistant message later on the path sets it from that message's `provider` and `model`.
|
|
348
|
+
2. It projects the selected entries to `AgentMessage[]` in the order above:
|
|
349
|
+
- `message` → the stored `AgentMessage`; parsed user, assistant, or tool-result messages with null or missing `content` are copied with `content: []`.
|
|
350
|
+
- `compaction` → `CompactionSummaryMessage`.
|
|
351
|
+
- `branch_summary` → `BranchSummaryMessage`.
|
|
352
|
+
- `custom_message` → `CustomMessage`.
|
|
353
|
+
- `custom`, model/thinking changes, labels, and session-info entries → no message.
|
|
339
354
|
|
|
340
|
-
|
|
355
|
+
Use `convertToLlm()` from `@astralyn/pi` when provider-ready `Message[]` are required. It passes base user, assistant, and tool-result messages through; it converts Pi-specific context roles to user messages and omits `bashExecution` messages marked `excludeFromContext`.
|
|
341
356
|
|
|
342
357
|
## Parsing Example
|
|
343
358
|
|
|
@@ -383,54 +398,59 @@ for (const line of lines) {
|
|
|
383
398
|
|
|
384
399
|
## SessionManager API
|
|
385
400
|
|
|
386
|
-
|
|
401
|
+
Import `SessionManager` and its session types from `@astralyn/pi` as shown above. `NewSessionOptions` is `{ id?: string; parentSession?: string }`; `id`, when supplied, must be a valid session ID.
|
|
387
402
|
|
|
388
403
|
### Static Creation Methods
|
|
389
|
-
|
|
390
|
-
- `SessionManager.
|
|
391
|
-
- `SessionManager.
|
|
392
|
-
- `SessionManager.
|
|
393
|
-
- `SessionManager.
|
|
404
|
+
|
|
405
|
+
- `SessionManager.create(cwd: string, sessionDir?: string, options?: NewSessionOptions): SessionManager` — create a persisted session.
|
|
406
|
+
- `SessionManager.open(path: string, sessionDir?: string, cwdOverride?: string): SessionManager` — open a session file. `cwdOverride` takes precedence over the header's `cwd`.
|
|
407
|
+
- `SessionManager.continueRecent(cwd: string, sessionDir?: string): SessionManager` — open the most recent session or create one.
|
|
408
|
+
- `SessionManager.inMemory(cwd?: string, options?: NewSessionOptions): SessionManager` — create a non-persisted session.
|
|
409
|
+
- `SessionManager.forkFrom(sourcePath: string, targetCwd: string, sessionDir?: string, options?: NewSessionOptions): SessionManager` — fork into another working directory.
|
|
394
410
|
|
|
395
411
|
### Static Listing Methods
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
- `
|
|
401
|
-
- `
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
- `
|
|
406
|
-
- `
|
|
407
|
-
- `
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
- `
|
|
416
|
-
- `
|
|
417
|
-
- `
|
|
418
|
-
- `
|
|
419
|
-
- `
|
|
420
|
-
- `
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
- `
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
- `
|
|
428
|
-
- `
|
|
429
|
-
- `
|
|
430
|
-
- `
|
|
431
|
-
- `
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
- `
|
|
436
|
-
- `
|
|
412
|
+
|
|
413
|
+
The optional progress callback has type `(loaded: number, total: number) => void`.
|
|
414
|
+
|
|
415
|
+
- `SessionManager.list(cwd: string, sessionDir?: string, onProgress?: (loaded: number, total: number) => void): Promise<SessionInfo[]>` — list sessions for a directory.
|
|
416
|
+
- `SessionManager.listAll(onProgress?: (loaded: number, total: number) => void): Promise<SessionInfo[]>` — list all default session directories.
|
|
417
|
+
- `SessionManager.listAll(sessionDir?: string, onProgress?: (loaded: number, total: number) => void): Promise<SessionInfo[]>` — list one supplied session directory. This is an overload of the previous form.
|
|
418
|
+
|
|
419
|
+
### Instance Methods — Session Management
|
|
420
|
+
|
|
421
|
+
- `newSession(options?: NewSessionOptions): string | undefined` — start a new session; returns its file path only when persisting.
|
|
422
|
+
- `setSessionFile(sessionFile: string): void` — switch to a different session file.
|
|
423
|
+
- `createBranchedSession(leafId: string): string | undefined` — extract one branch to a new session file; returns no path for an in-memory session.
|
|
424
|
+
|
|
425
|
+
### Instance Methods — Appending
|
|
426
|
+
|
|
427
|
+
All of these return the appended entry ID:
|
|
428
|
+
|
|
429
|
+
- `appendMessage(message: Message | CustomMessage | BashExecutionMessage): string`
|
|
430
|
+
- `appendThinkingLevelChange(thinkingLevel: string): string`
|
|
431
|
+
- `appendModelChange(provider: string, modelId: string): string`
|
|
432
|
+
- `appendCompaction<T = unknown>(summary: string, firstKeptEntryId: string, tokensBefore: number, details?: T, fromHook?: boolean, usage?: Usage): string`
|
|
433
|
+
- `appendCustomEntry(customType: string, data?: unknown): string`
|
|
434
|
+
- `appendSessionInfo(name: string): string`
|
|
435
|
+
- `appendCustomMessageEntry<T = unknown>(customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details?: T): string`
|
|
436
|
+
- `appendLabelChange(targetId: string, label: string | undefined): string`
|
|
437
|
+
|
|
438
|
+
### Instance Methods — Tree Navigation
|
|
439
|
+
|
|
440
|
+
- `getLeafId(): string | null` — get the current position.
|
|
441
|
+
- `getLeafEntry(): SessionEntry | undefined` and `getEntry(id: string): SessionEntry | undefined`
|
|
442
|
+
- `getBranch(fromId?: string): SessionEntry[]` — walk from an entry (or the leaf) to the root.
|
|
443
|
+
- `getTree(): SessionTreeNode[]` — get the complete tree; `getChildren(parentId: string): SessionEntry[]` gets direct children.
|
|
444
|
+
- `getLabel(id: string): string | undefined`
|
|
445
|
+
- `branch(branchFromId: string): void` — move the leaf to an existing entry.
|
|
446
|
+
- `resetLeaf(): void` — reset the leaf to the root position before any entries.
|
|
447
|
+
- `branchWithSummary(branchFromId: string | null, summary: string, details?: unknown, fromHook?: boolean, usage?: Usage): string` — branch with a context summary. Pass `null` for `branchFromId` to create the branch from the root.
|
|
448
|
+
|
|
449
|
+
### Instance Methods — Context and Info
|
|
450
|
+
|
|
451
|
+
- `buildContextEntries(): SessionEntry[]` — get the compaction-aware active branch.
|
|
452
|
+
- `buildSessionContext(): SessionContext` — get `AgentMessage[]`, thinking level, and model; use `convertToLlm()` for provider messages.
|
|
453
|
+
- `getEntries(): SessionEntry[]` and `getHeader(): SessionHeader | null`
|
|
454
|
+
- `getSessionName(): string | undefined`
|
|
455
|
+
- `getCwd(): string`, `getSessionDir(): string`, `getSessionId(): string`, and `getSessionFile(): string | undefined`
|
|
456
|
+
- `usesDefaultSessionDir(): boolean` and `isPersisted(): boolean`
|
package/docs/skills.md
CHANGED
|
@@ -154,7 +154,6 @@ Per the [Agent Skills specification](https://agentskills.io/specification#frontm
|
|
|
154
154
|
- Lowercase letters, numbers, hyphens only
|
|
155
155
|
- No leading/trailing hyphens
|
|
156
156
|
- No consecutive hyphens
|
|
157
|
-
Pi does not require the name to match the parent directory. The Agent Skills standard does, but that requirement is suboptimal for shared skill directories used by multiple tools.
|
|
158
157
|
|
|
159
158
|
Valid: `pdf-processing`, `data-analysis`, `code-review`
|
|
160
159
|
Invalid: `PDF-Processing`, `-pdf`, `pdf--processing`
|
package/docs/themes.md
CHANGED
|
@@ -52,7 +52,7 @@ vim ~/.pi/agent/themes/my-theme.json
|
|
|
52
52
|
|
|
53
53
|
```json
|
|
54
54
|
{
|
|
55
|
-
"$schema": "https://raw.githubusercontent.com/
|
|
55
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
56
56
|
"name": "my-theme",
|
|
57
57
|
"vars": {
|
|
58
58
|
"primary": "#00aaff",
|
|
@@ -123,7 +123,7 @@ vim ~/.pi/agent/themes/my-theme.json
|
|
|
123
123
|
|
|
124
124
|
```json
|
|
125
125
|
{
|
|
126
|
-
"$schema": "https://raw.githubusercontent.com/
|
|
126
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
127
127
|
"name": "my-theme",
|
|
128
128
|
"vars": {
|
|
129
129
|
"blue": "#0066cc",
|