@dyyz1993/pi-coding-agent 0.70.6 → 0.74.4
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 +266 -80
- package/README.md +48 -20
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +4 -2
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts +13 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +32 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +2 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +34 -22
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +2 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -4
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +16 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +238 -66
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +10 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +14 -0
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +2 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +25 -26
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1042 -1116
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +9 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +20 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +9 -6
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +0 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/template.css +53 -4
- package/dist/core/export-html/template.js +84 -20
- package/dist/core/export-html/tool-renderer.d.ts +0 -6
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +15 -2
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +0 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +49 -137
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +24 -20
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +128 -253
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +88 -60
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +10 -0
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/file-store/file-snapshot-manager.d.ts +95 -0
- package/dist/core/file-store/file-snapshot-manager.d.ts.map +1 -0
- package/dist/core/file-store/file-snapshot-manager.js +508 -0
- package/dist/core/file-store/file-snapshot-manager.js.map +1 -0
- package/dist/core/file-store/index.d.ts +5 -0
- package/dist/core/file-store/index.d.ts.map +1 -0
- package/dist/core/file-store/index.js +3 -0
- package/dist/core/file-store/index.js.map +1 -0
- package/dist/core/messages.d.ts +10 -2
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +23 -6
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts +19 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +97 -16
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +24 -15
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +1 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +61 -35
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/provider-display-names.d.ts +2 -0
- package/dist/core/provider-display-names.d.ts.map +1 -0
- package/dist/core/provider-display-names.js +32 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +9 -21
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +9 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +39 -18
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +27 -17
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +133 -47
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +21 -3
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +51 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +3 -8
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +4 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/bash.d.ts +0 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +155 -110
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +3 -2
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +4 -3
- 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 +1 -1
- 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 +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +50 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +178 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +70 -13
- package/dist/core/tools/read.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -39
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +3 -3
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +3 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +1 -4
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +14 -56
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +5 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +19 -4
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +1 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +18 -6
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +93 -25
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +3 -7
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +5 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +53 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +20 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +423 -186
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/light.json +1 -1
- package/dist/modes/print-mode.d.ts +3 -0
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +62 -19
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +80 -60
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +108 -93
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +106 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +115 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +238 -12
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/child-process.d.ts +1 -0
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js +8 -0
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +2 -2
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +84 -45
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +31 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +5 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/structured-output.d.ts +10 -0
- package/dist/utils/structured-output.d.ts.map +1 -0
- package/dist/utils/structured-output.js +57 -0
- package/dist/utils/structured-output.js.map +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +6 -2
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +77 -0
- package/dist/utils/version-check.js.map +1 -0
- package/docs/compaction.md +14 -14
- package/docs/custom-provider.md +40 -31
- package/docs/development.md +1 -1
- package/docs/docs.json +148 -0
- package/docs/extensions.md +116 -56
- package/docs/index.md +70 -0
- package/docs/json.md +4 -4
- package/docs/models.md +150 -3
- package/docs/packages.md +10 -5
- package/docs/providers.md +62 -17
- package/docs/quickstart.md +142 -0
- package/docs/rollback-architecture.md +693 -0
- package/docs/rollback-test-cases.md +412 -0
- package/docs/rpc.md +1 -1
- package/docs/sdk.md +26 -26
- package/docs/{session.md → session-format.md} +6 -6
- package/docs/sessions.md +137 -0
- package/docs/settings.md +52 -9
- package/docs/termux.md +1 -1
- package/docs/themes.md +2 -2
- package/docs/tui.md +20 -20
- package/docs/usage.md +277 -0
- package/examples/extensions/README.md +2 -4
- package/examples/extensions/border-status-editor.ts +150 -0
- package/examples/extensions/commands.ts +2 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/git-checkpoint.ts +1 -1
- package/examples/extensions/handoff.ts +49 -11
- package/examples/extensions/plan-mode/index.ts +1 -1
- package/examples/extensions/sandbox/package-lock.json +5 -5
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/README.md +2 -2
- package/package.json +7 -16
- package/docs/tree.md +0 -233
- package/examples/extensions/antigravity-image-gen.ts +0 -418
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# Rollback Test Cases
|
|
2
|
+
|
|
3
|
+
## Conventions
|
|
4
|
+
|
|
5
|
+
- **Entry types**: user message (U), assistant message (A), tool result (T), step-snapshot (S), compaction (C), deletion (D), segment_summary (SS), branch_summary (BS)
|
|
6
|
+
- **File state**: tracked by snapshot hash. Each step-snapshot records baselineTreeHash → snapshotTreeHash
|
|
7
|
+
- **Event log**: records every event in order with data
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Case 1: Basic Rollback (Message + Files)
|
|
12
|
+
|
|
13
|
+
### Scenario
|
|
14
|
+
Create file A → Modify file B → Rollback to "Create file A" message → Both message and files restored
|
|
15
|
+
|
|
16
|
+
### Steps
|
|
17
|
+
|
|
18
|
+
| Step | Action | Entries Created | File State | Snapshot |
|
|
19
|
+
|------|--------|-----------------|------------|----------|
|
|
20
|
+
| 1 | User: "create file A" | U1 | — | — |
|
|
21
|
+
| 2 | Assistant creates file A (write tool) | A1, T1 | A exists | S1: baseline=null→hash1 |
|
|
22
|
+
| 3 | User: "modify file B" | U2 | — | — |
|
|
23
|
+
| 4 | Assistant modifies file B (edit tool) | A2, T2 | A, B(modified) | S2: hash1→hash2 |
|
|
24
|
+
| 5 | Rollback to U1 (skipFiles=false) | BS1(skipFiles=false) | A, B(original) | Files restored to S1 state |
|
|
25
|
+
|
|
26
|
+
### Expected Results
|
|
27
|
+
- leafId points to BS1 (or U1 depending on navigation)
|
|
28
|
+
- File A: exists (was created in step 2)
|
|
29
|
+
- File B: restored to pre-modification state (or deleted if didn't exist before step 4)
|
|
30
|
+
- Messages: only U1 and earlier visible in context
|
|
31
|
+
- Event log: session_tree event fires, file-snapshot restores files
|
|
32
|
+
|
|
33
|
+
### Event Log
|
|
34
|
+
|
|
35
|
+
| Order | Event | Data |
|
|
36
|
+
|-------|-------|------|
|
|
37
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1, treeHash: hash1 } |
|
|
38
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2, treeHash: hash2 } |
|
|
39
|
+
| 3 | `session_tree` (step 5) | { type: "branch_summary", entryId: BS1, rollbackTo: U1, skipFiles: false } |
|
|
40
|
+
| 4 | `file-snapshot` (step 5) | { action: "restore", targetHash: hash1, filesRestored: ["B"] } |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Case 2: Message-Only Rollback (skipFiles=true)
|
|
45
|
+
|
|
46
|
+
### Scenario
|
|
47
|
+
Modify file A → Modify file B → Modify file A again → Rollback to "Modify file B" message without restoring files
|
|
48
|
+
|
|
49
|
+
### Steps
|
|
50
|
+
|
|
51
|
+
| Step | Action | Entries Created | File State | Snapshot |
|
|
52
|
+
|------|--------|-----------------|------------|----------|
|
|
53
|
+
| 1 | User: "modify file A" | U1 | — | — |
|
|
54
|
+
| 2 | Assistant modifies file A (v1) | A1, T1 | A(v1) | S1: null→hash1 |
|
|
55
|
+
| 3 | User: "modify file B" | U2 | — | — |
|
|
56
|
+
| 4 | Assistant modifies file B (v1) | A2, T2 | A(v1), B(v1) | S2: hash1→hash2 |
|
|
57
|
+
| 5 | User: "modify file A again" | U3 | — | — |
|
|
58
|
+
| 6 | Assistant modifies file A (v2) | A3, T3 | A(v2), B(v1) | S3: hash2→hash3 |
|
|
59
|
+
| 7 | Rollback to A2 (skipFiles=true) | BS1(skipFiles=true) | A(v2), B(v1) | No file restoration |
|
|
60
|
+
|
|
61
|
+
### Expected Results
|
|
62
|
+
- leafId points to position at A2
|
|
63
|
+
- File A: still v2 (not restored)
|
|
64
|
+
- File B: still v1 (not restored)
|
|
65
|
+
- Messages: only U1, A1, T1, U2, A2, T2 visible in context
|
|
66
|
+
- BS1 has skipFiles=true field
|
|
67
|
+
|
|
68
|
+
### Event Log
|
|
69
|
+
|
|
70
|
+
| Order | Event | Data |
|
|
71
|
+
|-------|-------|------|
|
|
72
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1, treeHash: hash1 } |
|
|
73
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2, treeHash: hash2 } |
|
|
74
|
+
| 3 | `session_tree` (step 6) | { type: "step-snapshot", snapshotId: S3, treeHash: hash3 } |
|
|
75
|
+
| 4 | `session_tree` (step 7) | { type: "branch_summary", entryId: BS1, rollbackTo: A2, skipFiles: true } |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Case 3: Rollback After Compaction (Message Only)
|
|
80
|
+
|
|
81
|
+
### Scenario
|
|
82
|
+
Multiple turns → Compaction triggers → Rollback to pre-compaction message with skipFiles=true
|
|
83
|
+
|
|
84
|
+
### Steps
|
|
85
|
+
|
|
86
|
+
| Step | Action | Entries Created | File State | Snapshot |
|
|
87
|
+
|------|--------|-----------------|------------|----------|
|
|
88
|
+
| 1 | User: "create file A" | U1 | — | — |
|
|
89
|
+
| 2 | Assistant creates file A | A1, T1 | A exists | S1 |
|
|
90
|
+
| 3 | User: "create file B" | U2 | — | — |
|
|
91
|
+
| 4 | Assistant creates file B | A2, T2 | A, B | S2 |
|
|
92
|
+
| 5 | User: "create file C" | U3 | — | — |
|
|
93
|
+
| 6 | Assistant creates file C | A3, T3 | A, B, C | S3 |
|
|
94
|
+
| 7 | User: "summarize previous work" | U4 | — | — |
|
|
95
|
+
| 8 | Assistant responds | A4 | A, B, C | S4 (or no change) |
|
|
96
|
+
| 9 | Manual compaction (summarize U1-A3) | C1(summary) | A, B, C | — |
|
|
97
|
+
| 10 | Rollback to U2 (skipFiles=true) | BS1(skipFiles=true) | A, B, C | No file restoration |
|
|
98
|
+
|
|
99
|
+
### Expected Results
|
|
100
|
+
- leafId before U2 (to re-edit)
|
|
101
|
+
- Messages: compaction summary is gone, U1, A1, T1, U2, A2, T2 visible
|
|
102
|
+
- Files: unchanged (skipFiles=true)
|
|
103
|
+
|
|
104
|
+
### Event Log
|
|
105
|
+
|
|
106
|
+
| Order | Event | Data |
|
|
107
|
+
|-------|-------|------|
|
|
108
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1 } |
|
|
109
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2 } |
|
|
110
|
+
| 3 | `session_tree` (step 6) | { type: "step-snapshot", snapshotId: S3 } |
|
|
111
|
+
| 4 | `session_tree` (step 8) | { type: "step-snapshot", snapshotId: S4 } |
|
|
112
|
+
| 5 | `session_tree` (step 9) | { type: "compaction", entryId: C1, summarized: [U1,A1,T1,U2,A2,T2,U3,A3,T3] } |
|
|
113
|
+
| 6 | `session_tree` (step 10) | { type: "branch_summary", entryId: BS1, rollbackTo: U2, skipFiles: true } |
|
|
114
|
+
| 7 | `session_tree` (step 10, side effect) | { type: "compaction_undone", entryId: C1 } |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Case 4: Rollback After Compaction (Message + Files)
|
|
119
|
+
|
|
120
|
+
### Scenario
|
|
121
|
+
Same as Case 3 but skipFiles=false
|
|
122
|
+
|
|
123
|
+
### Steps
|
|
124
|
+
Same as Case 3 through step 9.
|
|
125
|
+
|
|
126
|
+
| Step | Action | Entries Created | File State | Snapshot |
|
|
127
|
+
|------|--------|-----------------|------------|----------|
|
|
128
|
+
| 10 | Rollback to U2 (skipFiles=false) | BS1(skipFiles=false) | A, B (C removed) | Files restored to S2 state |
|
|
129
|
+
|
|
130
|
+
### Expected Results
|
|
131
|
+
- leafId before U2
|
|
132
|
+
- Messages: U1, A1, T1, U2, A2, T2 visible (compaction gone)
|
|
133
|
+
- Files: A exists, B exists, C removed (wasn't created yet at step 4)
|
|
134
|
+
|
|
135
|
+
### Event Log
|
|
136
|
+
|
|
137
|
+
| Order | Event | Data |
|
|
138
|
+
|-------|-------|------|
|
|
139
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1 } |
|
|
140
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2 } |
|
|
141
|
+
| 3 | `session_tree` (step 6) | { type: "step-snapshot", snapshotId: S3 } |
|
|
142
|
+
| 4 | `session_tree` (step 8) | { type: "step-snapshot", snapshotId: S4 } |
|
|
143
|
+
| 5 | `session_tree` (step 9) | { type: "compaction", entryId: C1, summarized: [U1..A3,T3] } |
|
|
144
|
+
| 6 | `session_tree` (step 10) | { type: "branch_summary", entryId: BS1, rollbackTo: U2, skipFiles: false } |
|
|
145
|
+
| 7 | `file-snapshot` (step 10) | { action: "restore", targetSnapshot: S2, filesRestored: ["C"], filesDeleted: ["C"] } |
|
|
146
|
+
| 8 | `session_tree` (step 10, side effect) | { type: "compaction_undone", entryId: C1 } |
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Case 5: Segment Summary + Deletion + Rollback
|
|
151
|
+
|
|
152
|
+
### Scenario
|
|
153
|
+
Create A, B, C → Summarize middle messages → Delete a message → Rollback to various positions
|
|
154
|
+
|
|
155
|
+
### Steps
|
|
156
|
+
|
|
157
|
+
| Step | Action | Entries Created | File State |
|
|
158
|
+
|------|--------|-----------------|------------|
|
|
159
|
+
| 1 | User: "create file A" | U1 | — |
|
|
160
|
+
| 2 | Assistant creates file A | A1, T1 | A |
|
|
161
|
+
| 3 | User: "create file B" | U2 | — |
|
|
162
|
+
| 4 | Assistant creates file B | A2, T2 | A, B |
|
|
163
|
+
| 5 | User: "create file C" | U3 | — |
|
|
164
|
+
| 6 | Assistant creates file C | A3, T3 | A, B, C |
|
|
165
|
+
| 7 | User: "do some work" | U4 | — |
|
|
166
|
+
| 8 | Assistant responds with tools | A4, T4 | A, B, C (possibly modified) |
|
|
167
|
+
| 9 | Summarize A2-T2 into segment summary | SS1(targets=[A2,T2], summary="Created file B") | A, B, C |
|
|
168
|
+
| 10 | Delete message A4 | D1(targets=[A4]) | A, B, C (files unchanged) |
|
|
169
|
+
| 11 | Rollback to U3 (skipFiles=false) | BS1 | A, B, C restored to step 6 state |
|
|
170
|
+
|
|
171
|
+
### Expected Results
|
|
172
|
+
- At step 9: A2,T2 replaced by segmentSummary message in LLM context
|
|
173
|
+
- At step 10: A4 excluded from LLM context, files unchanged
|
|
174
|
+
- At step 11: SS1 and D1 are after U3, so rollback goes past them → all messages restored (including A2,T2,A4)
|
|
175
|
+
|
|
176
|
+
### Event Log
|
|
177
|
+
|
|
178
|
+
| Order | Event | Data |
|
|
179
|
+
|-------|-------|------|
|
|
180
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1 } |
|
|
181
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2 } |
|
|
182
|
+
| 3 | `session_tree` (step 6) | { type: "step-snapshot", snapshotId: S3 } |
|
|
183
|
+
| 4 | `session_tree` (step 8) | { type: "step-snapshot", snapshotId: S4 } |
|
|
184
|
+
| 5 | `session_tree` (step 9) | { type: "segment_summary", entryId: SS1, targets: [A2,T2] } |
|
|
185
|
+
| 6 | `session_tree` (step 10) | { type: "deletion", entryId: D1, targets: [A4] } |
|
|
186
|
+
| 7 | `session_tree` (step 11) | { type: "branch_summary", entryId: BS1, rollbackTo: U3, skipFiles: false } |
|
|
187
|
+
| 8 | `file-snapshot` (step 11) | { action: "restore", targetSnapshot: S3, filesRestored: [] } |
|
|
188
|
+
| 9 | `session_tree` (step 11, side effect) | { type: "segment_summary_undone", entryId: SS1 } |
|
|
189
|
+
| 10 | `session_tree` (step 11, side effect) | { type: "deletion_undone", entryId: D1 } |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Case 6: Delete Message + Rollback Restores It
|
|
194
|
+
|
|
195
|
+
### Scenario
|
|
196
|
+
Delete a specific message → Rollback to before the deletion → Deleted message should reappear
|
|
197
|
+
|
|
198
|
+
### Steps
|
|
199
|
+
|
|
200
|
+
| Step | Action | Entries Created | Context Visible |
|
|
201
|
+
|------|--------|-----------------|-----------------|
|
|
202
|
+
| 1 | User: "create file A" | U1 | U1 |
|
|
203
|
+
| 2 | Assistant creates file A | A1, T1 | U1, A1, T1 |
|
|
204
|
+
| 3 | User: "create file B" | U2 | U1, A1, T1, U2 |
|
|
205
|
+
| 4 | Assistant creates file B | A2, T2 | U1, A1, T1, U2, A2, T2 |
|
|
206
|
+
| 5 | Delete A1 (message only) | D1(targets=[A1]) | U1, T1, U2, A2, T2 (A1 excluded, T1 kept) |
|
|
207
|
+
| 6 | Rollback to U2 (skipFiles=true) | BS1(skipFiles=true) | U1, A1, T1, U2 (A1 restored, D1 after rollback point) |
|
|
208
|
+
|
|
209
|
+
### Expected Results
|
|
210
|
+
- After step 5: A1 excluded from context, but files unchanged
|
|
211
|
+
- After step 6: A1 reappears in context (D1 is after the rollback point)
|
|
212
|
+
- Files: unchanged throughout (skipFiles=true)
|
|
213
|
+
|
|
214
|
+
### Event Log
|
|
215
|
+
|
|
216
|
+
| Order | Event | Data |
|
|
217
|
+
|-------|-------|------|
|
|
218
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1 } |
|
|
219
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2 } |
|
|
220
|
+
| 3 | `session_tree` (step 5) | { type: "deletion", entryId: D1, targets: [A1] } |
|
|
221
|
+
| 4 | `session_tree` (step 6) | { type: "branch_summary", entryId: BS1, rollbackTo: U2, skipFiles: true } |
|
|
222
|
+
| 5 | `session_tree` (step 6, side effect) | { type: "deletion_undone", entryId: D1, restoredEntry: A1 } |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Case 7: Fork Scenario
|
|
227
|
+
|
|
228
|
+
### Design Decision
|
|
229
|
+
Fork does NOT carry file snapshots. The forked session starts fresh:
|
|
230
|
+
- Object store is shared (content-addressable, files deduplicated)
|
|
231
|
+
- Snapshot index is empty in the forked session
|
|
232
|
+
- First turn_end in the fork creates a new initial snapshot
|
|
233
|
+
- Fork rollback is independent of original session
|
|
234
|
+
- Original session is not affected by fork operations
|
|
235
|
+
|
|
236
|
+
### Sub-case 7a: Basic Fork
|
|
237
|
+
|
|
238
|
+
| Step | Action | Entries | File State |
|
|
239
|
+
|------|--------|---------|------------|
|
|
240
|
+
| 1 | User: "create file A" | U1 | — |
|
|
241
|
+
| 2 | Assistant creates file A | A1, T1 | A |
|
|
242
|
+
| 3 | User: "modify file A" | U2 | — |
|
|
243
|
+
| 4 | Assistant modifies file A | A2, T2 | A(modified) |
|
|
244
|
+
| 5 | Fork from U2 | New session with U1, A1, T1, U2 | A(modified) — files not changed by fork |
|
|
245
|
+
| 6 | In fork: "create file B" | U1' | — |
|
|
246
|
+
| 7 | In fork: assistant creates B | A1', T1' | A(modified), B |
|
|
247
|
+
| 8 | In original: file state unchanged | — | A(modified) — no B |
|
|
248
|
+
|
|
249
|
+
#### Expected Results (7a)
|
|
250
|
+
- Fork session has independent entry tree
|
|
251
|
+
- Original session unaffected by fork operations
|
|
252
|
+
- File state in fork includes working directory state at fork time
|
|
253
|
+
|
|
254
|
+
#### Event Log (7a)
|
|
255
|
+
|
|
256
|
+
| Order | Event | Session | Data |
|
|
257
|
+
|-------|-------|---------|------|
|
|
258
|
+
| 1 | `session_tree` | original | { type: "step-snapshot", snapshotId: S1 } |
|
|
259
|
+
| 2 | `session_tree` | original | { type: "step-snapshot", snapshotId: S2 } |
|
|
260
|
+
| 3 | `session_tree` | original | { type: "fork", forkSessionId: "fork-1", fromEntry: U2 } |
|
|
261
|
+
| 4 | `session_tree` | fork | { type: "session_created", forkedFrom: original, entries: [U1,A1,T1,U2] } |
|
|
262
|
+
| 5 | `session_tree` | fork | { type: "step-snapshot", snapshotId: S1' } |
|
|
263
|
+
| 6 | `session_tree` | fork | { type: "step-snapshot", snapshotId: S2' } |
|
|
264
|
+
|
|
265
|
+
### Sub-case 7b: Fork + Rollback
|
|
266
|
+
|
|
267
|
+
| Step | Action | Entries | Expected |
|
|
268
|
+
|------|--------|---------|----------|
|
|
269
|
+
| 1-5 | Same as 7a | — | — |
|
|
270
|
+
| 6 | In fork: rollback to U1' (skipFiles=false) | BS1' | Files in fork: A(modified) restored, B removed |
|
|
271
|
+
| 7 | In original: no change | — | Original unaffected |
|
|
272
|
+
|
|
273
|
+
#### Expected Results (7b)
|
|
274
|
+
- Fork rollback only affects fork session
|
|
275
|
+
- Files in fork: B removed, A stays modified (fork has no pre-fork snapshots to restore to)
|
|
276
|
+
- Original session tree and file state unchanged
|
|
277
|
+
|
|
278
|
+
#### Event Log (7b)
|
|
279
|
+
|
|
280
|
+
| Order | Event | Session | Data |
|
|
281
|
+
|-------|-------|---------|------|
|
|
282
|
+
| 1-6 | Same as 7a | — | — |
|
|
283
|
+
| 7 | `session_tree` | fork | { type: "branch_summary", entryId: BS1', rollbackTo: U1', skipFiles: false } |
|
|
284
|
+
| 8 | `file-snapshot` | fork | { action: "restore", filesRestored: ["B"] } |
|
|
285
|
+
|
|
286
|
+
### Sub-case 7c: Fork of Fork
|
|
287
|
+
|
|
288
|
+
| Step | Action | Expected |
|
|
289
|
+
|------|--------|----------|
|
|
290
|
+
| 1-5 | Same as 7a | — |
|
|
291
|
+
| 6 | Fork the fork (from fork's current position) | New-new session, fresh snapshot index |
|
|
292
|
+
| 7 | In fork-of-fork: rollback works independently | No cross-contamination |
|
|
293
|
+
|
|
294
|
+
#### Expected Results (7c)
|
|
295
|
+
- Fork-of-fork has its own independent snapshot index
|
|
296
|
+
- Rollback in fork-of-fork does not affect fork or original
|
|
297
|
+
- No cross-contamination between any session level
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Case 8: Rollback Across Multiple Compactions
|
|
302
|
+
|
|
303
|
+
### Scenario
|
|
304
|
+
Multiple compactions → Rollback to before first compaction
|
|
305
|
+
|
|
306
|
+
### Steps
|
|
307
|
+
|
|
308
|
+
| Step | Action | Entries |
|
|
309
|
+
|------|--------|---------|
|
|
310
|
+
| 1-4 | Create files A, B (turns 1-2) | U1,A1,T1,S1, U2,A2,T2,S2 |
|
|
311
|
+
| 5 | Compaction of turns 1-2 | C1 |
|
|
312
|
+
| 6-9 | Create files C, D (turns 3-4) | U3,A3,T3,S3, U4,A4,T4,S4 |
|
|
313
|
+
| 10 | Compaction of turn 3 (C1+U3-A3) | C2 |
|
|
314
|
+
| 11 | Rollback to U2 (skipFiles=false) | BS1 |
|
|
315
|
+
| 12 | Verify: C1, C2 both gone, original messages restored, files restored to S2 state |
|
|
316
|
+
|
|
317
|
+
### Expected Results
|
|
318
|
+
- Both C1 and C2 are after U2, so rollback undoes both
|
|
319
|
+
- Original messages U1,A1,T1,U2,A2,T2 are restored in context
|
|
320
|
+
- Files: restored to S2 state (A, B exist; C, D removed)
|
|
321
|
+
- Entry tree: BS1 is new leaf, C1/C2 and everything after U2 is in the branch but not traversed
|
|
322
|
+
|
|
323
|
+
### Event Log
|
|
324
|
+
|
|
325
|
+
| Order | Event | Data |
|
|
326
|
+
|-------|-------|------|
|
|
327
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1 } |
|
|
328
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2 } |
|
|
329
|
+
| 3 | `session_tree` (step 5) | { type: "compaction", entryId: C1, summarized: [U1,A1,T1,U2,A2,T2] } |
|
|
330
|
+
| 4 | `session_tree` (step 8) | { type: "step-snapshot", snapshotId: S3 } |
|
|
331
|
+
| 5 | `session_tree` (step 9) | { type: "step-snapshot", snapshotId: S4 } |
|
|
332
|
+
| 6 | `session_tree` (step 10) | { type: "compaction", entryId: C2, summarized: [C1,U3,A3,T3] } |
|
|
333
|
+
| 7 | `session_tree` (step 11) | { type: "branch_summary", entryId: BS1, rollbackTo: U2, skipFiles: false } |
|
|
334
|
+
| 8 | `file-snapshot` (step 11) | { action: "restore", targetSnapshot: S2, filesRestored: ["C","D"], filesDeleted: ["C","D"] } |
|
|
335
|
+
| 9 | `session_tree` (step 11, side effect) | { type: "compaction_undone", entryId: C1 } |
|
|
336
|
+
| 10 | `session_tree` (step 11, side effect) | { type: "compaction_undone", entryId: C2 } |
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Case 9: Rollback Then Continue Conversation
|
|
341
|
+
|
|
342
|
+
### Scenario
|
|
343
|
+
Rollback → Continue working → Rollback again
|
|
344
|
+
|
|
345
|
+
### Steps
|
|
346
|
+
|
|
347
|
+
| Step | Action | Entries |
|
|
348
|
+
|------|--------|---------|
|
|
349
|
+
| 1-4 | Create A, modify B | U1,A1,T1,S1, U2,A2,T2,S2 |
|
|
350
|
+
| 5 | Rollback to U1 (skipFiles=false) | BS1, files restored |
|
|
351
|
+
| 6 | User: "create file C" | U3 |
|
|
352
|
+
| 7 | Assistant creates file C | A3, T3, S3 |
|
|
353
|
+
| 8 | Rollback to BS1 (skipFiles=false) | BS2, files restored to post-step-5 state |
|
|
354
|
+
|
|
355
|
+
### Expected Results
|
|
356
|
+
- Step 5: leafId moves to BS1, files restored to S1 state (A exists, B original)
|
|
357
|
+
- Step 7: new branch created from BS1, S3 snapshots current file state
|
|
358
|
+
- Step 8: leafId moves to BS2, files restored to S1 state again (A exists, B original, C removed)
|
|
359
|
+
- A3/T3/S3 branch still exists in tree (not deleted, just not traversed)
|
|
360
|
+
|
|
361
|
+
### Event Log
|
|
362
|
+
|
|
363
|
+
| Order | Event | Data |
|
|
364
|
+
|-------|-------|------|
|
|
365
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1 } |
|
|
366
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2 } |
|
|
367
|
+
| 3 | `session_tree` (step 5) | { type: "branch_summary", entryId: BS1, rollbackTo: U1, skipFiles: false } |
|
|
368
|
+
| 4 | `file-snapshot` (step 5) | { action: "restore", targetSnapshot: S1 } |
|
|
369
|
+
| 5 | `session_tree` (step 7) | { type: "step-snapshot", snapshotId: S3, branchFrom: BS1 } |
|
|
370
|
+
| 6 | `session_tree` (step 8) | { type: "branch_summary", entryId: BS2, rollbackTo: BS1, skipFiles: false } |
|
|
371
|
+
| 7 | `file-snapshot` (step 8) | { action: "restore", targetSnapshot: S1, filesRestored: ["B"], filesDeleted: ["C"] } |
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Case 10: Concurrent Deletion + Summary + Compaction
|
|
376
|
+
|
|
377
|
+
### Scenario
|
|
378
|
+
All three operations coexist → Rollback through all of them
|
|
379
|
+
|
|
380
|
+
### Steps
|
|
381
|
+
|
|
382
|
+
| Step | Action | Entries |
|
|
383
|
+
|------|--------|---------|
|
|
384
|
+
| 1-6 | Create A, B, C (3 turns) | U1,A1,T1,S1, U2,A2,T2,S2, U3,A3,T3,S3 |
|
|
385
|
+
| 7 | Delete A2 | D1(targets=[A2]) |
|
|
386
|
+
| 8 | Summarize A1-T1 | SS1(targets=[A1,T1], summary="Created file A") |
|
|
387
|
+
| 9 | Compact turns 1-3 | C1 |
|
|
388
|
+
| 10 | Rollback to U2 (skipFiles=false) | BS1 |
|
|
389
|
+
| 11 | Verify: D1, SS1, C1 all after rollback point, original messages restored, files at S2 state |
|
|
390
|
+
|
|
391
|
+
### Expected Results
|
|
392
|
+
- At step 7: A2 excluded from context
|
|
393
|
+
- At step 8: A1,T1 replaced by segment summary in context
|
|
394
|
+
- At step 9: remaining messages summarized into compaction
|
|
395
|
+
- At step 10: D1, SS1, C1 all undone → original messages U1,A1,T1,U2,A2,T2 visible
|
|
396
|
+
- Files: restored to S2 state (A, B exist; C removed)
|
|
397
|
+
|
|
398
|
+
### Event Log
|
|
399
|
+
|
|
400
|
+
| Order | Event | Data |
|
|
401
|
+
|-------|-------|------|
|
|
402
|
+
| 1 | `session_tree` (step 2) | { type: "step-snapshot", snapshotId: S1 } |
|
|
403
|
+
| 2 | `session_tree` (step 4) | { type: "step-snapshot", snapshotId: S2 } |
|
|
404
|
+
| 3 | `session_tree` (step 6) | { type: "step-snapshot", snapshotId: S3 } |
|
|
405
|
+
| 4 | `session_tree` (step 7) | { type: "deletion", entryId: D1, targets: [A2] } |
|
|
406
|
+
| 5 | `session_tree` (step 8) | { type: "segment_summary", entryId: SS1, targets: [A1,T1] } |
|
|
407
|
+
| 6 | `session_tree` (step 9) | { type: "compaction", entryId: C1, summarized: [SS1,U2,D1,..] } |
|
|
408
|
+
| 7 | `session_tree` (step 10) | { type: "branch_summary", entryId: BS1, rollbackTo: U2, skipFiles: false } |
|
|
409
|
+
| 8 | `file-snapshot` (step 10) | { action: "restore", targetSnapshot: S2, filesDeleted: ["C"] } |
|
|
410
|
+
| 9 | `session_tree` (step 10, side effect) | { type: "deletion_undone", entryId: D1 } |
|
|
411
|
+
| 10 | `session_tree` (step 10, side effect) | { type: "segment_summary_undone", entryId: SS1 } |
|
|
412
|
+
| 11 | `session_tree` (step 10, side effect) | { type: "compaction_undone", entryId: C1 } |
|
package/docs/rpc.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
RPC mode enables headless operation of the coding agent via a JSON protocol over stdin/stdout. This is useful for embedding the agent in other applications, IDEs, or custom UIs.
|
|
4
4
|
|
|
5
|
-
**Note for Node.js/TypeScript users**: If you're building a Node.js application, consider using `AgentSession` directly from `@
|
|
5
|
+
**Note for Node.js/TypeScript users**: If you're building a Node.js application, consider using `AgentSession` directly from `@dyyz1993/pi-coding-agent` instead of spawning a subprocess. See [`src/core/agent-session.ts`](../src/core/agent-session.ts) for the API. For a subprocess-based TypeScript client, see [`src/modes/rpc/rpc-client.ts`](../src/modes/rpc/rpc-client.ts).
|
|
6
6
|
|
|
7
7
|
## Starting RPC Mode
|
|
8
8
|
|
package/docs/sdk.md
CHANGED
|
@@ -16,7 +16,7 @@ See [examples/sdk/](../examples/sdk/) for working examples from minimal to full
|
|
|
16
16
|
## Quick Start
|
|
17
17
|
|
|
18
18
|
```typescript
|
|
19
|
-
import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@
|
|
19
|
+
import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@dyyz1993/pi-coding-agent";
|
|
20
20
|
|
|
21
21
|
// Set up credential storage and model registry
|
|
22
22
|
const authStorage = AuthStorage.create();
|
|
@@ -40,7 +40,7 @@ await session.prompt("What files are in the current directory?");
|
|
|
40
40
|
## Installation
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
npm install @
|
|
43
|
+
npm install @dyyz1993/pi-coding-agent
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
The SDK is included in the main package. No separate installation needed.
|
|
@@ -54,7 +54,7 @@ The main factory function for a single `AgentSession`.
|
|
|
54
54
|
`createAgentSession()` uses a `ResourceLoader` to supply extensions, skills, prompt templates, themes, and context files. If you do not provide one, it uses `DefaultResourceLoader` with standard discovery.
|
|
55
55
|
|
|
56
56
|
```typescript
|
|
57
|
-
import { createAgentSession } from "@
|
|
57
|
+
import { createAgentSession } from "@dyyz1993/pi-coding-agent";
|
|
58
58
|
|
|
59
59
|
// Minimal: defaults with DefaultResourceLoader
|
|
60
60
|
const { session } = await createAgentSession();
|
|
@@ -132,7 +132,7 @@ import {
|
|
|
132
132
|
createAgentSessionServices,
|
|
133
133
|
getAgentDir,
|
|
134
134
|
SessionManager,
|
|
135
|
-
} from "@
|
|
135
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
136
136
|
|
|
137
137
|
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
|
|
138
138
|
const services = await createAgentSessionServices({ cwd });
|
|
@@ -239,7 +239,7 @@ Both `steer()` and `followUp()` expand file-based prompt templates but error on
|
|
|
239
239
|
|
|
240
240
|
### Agent and AgentState
|
|
241
241
|
|
|
242
|
-
The `Agent` class (from `@
|
|
242
|
+
The `Agent` class (from `@dyyz1993/pi-agent-core`) handles the core LLM interaction. Access it via `session.agent`.
|
|
243
243
|
|
|
244
244
|
```typescript
|
|
245
245
|
// Access current state
|
|
@@ -368,8 +368,8 @@ When you pass a custom `ResourceLoader`, `cwd` and `agentDir` no longer control
|
|
|
368
368
|
### Model
|
|
369
369
|
|
|
370
370
|
```typescript
|
|
371
|
-
import { getModel } from "@
|
|
372
|
-
import { AuthStorage, ModelRegistry } from "@
|
|
371
|
+
import { getModel } from "@dyyz1993/pi-ai";
|
|
372
|
+
import { AuthStorage, ModelRegistry } from "@dyyz1993/pi-coding-agent";
|
|
373
373
|
|
|
374
374
|
const authStorage = AuthStorage.create();
|
|
375
375
|
const modelRegistry = ModelRegistry.create(authStorage);
|
|
@@ -416,7 +416,7 @@ API key resolution priority (handled by AuthStorage):
|
|
|
416
416
|
4. Fallback resolver (for custom provider keys from `models.json`)
|
|
417
417
|
|
|
418
418
|
```typescript
|
|
419
|
-
import { AuthStorage, ModelRegistry } from "@
|
|
419
|
+
import { AuthStorage, ModelRegistry } from "@dyyz1993/pi-coding-agent";
|
|
420
420
|
|
|
421
421
|
// Default: uses ~/.pi/agent/auth.json and ~/.pi/agent/models.json
|
|
422
422
|
const authStorage = AuthStorage.create();
|
|
@@ -452,7 +452,7 @@ const simpleRegistry = ModelRegistry.inMemory(authStorage);
|
|
|
452
452
|
Use a `ResourceLoader` to override the system prompt:
|
|
453
453
|
|
|
454
454
|
```typescript
|
|
455
|
-
import { createAgentSession, DefaultResourceLoader } from "@
|
|
455
|
+
import { createAgentSession, DefaultResourceLoader } from "@dyyz1993/pi-coding-agent";
|
|
456
456
|
|
|
457
457
|
const loader = new DefaultResourceLoader({
|
|
458
458
|
systemPromptOverride: () => "You are a helpful assistant.",
|
|
@@ -472,7 +472,7 @@ import {
|
|
|
472
472
|
readOnlyTools, // read, grep, find, ls
|
|
473
473
|
readTool, bashTool, editTool, writeTool,
|
|
474
474
|
grepTool, findTool, lsTool,
|
|
475
|
-
} from "@
|
|
475
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
476
476
|
|
|
477
477
|
// Use built-in tool set
|
|
478
478
|
const { session } = await createAgentSession({
|
|
@@ -500,7 +500,7 @@ import {
|
|
|
500
500
|
createGrepTool,
|
|
501
501
|
createFindTool,
|
|
502
502
|
createLsTool,
|
|
503
|
-
} from "@
|
|
503
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
504
504
|
|
|
505
505
|
const cwd = "/path/to/project";
|
|
506
506
|
|
|
@@ -530,7 +530,7 @@ const { session } = await createAgentSession({
|
|
|
530
530
|
|
|
531
531
|
```typescript
|
|
532
532
|
import { Type } from "typebox";
|
|
533
|
-
import { createAgentSession, defineTool } from "@
|
|
533
|
+
import { createAgentSession, defineTool } from "@dyyz1993/pi-coding-agent";
|
|
534
534
|
|
|
535
535
|
// Inline custom tool
|
|
536
536
|
const myTool = defineTool({
|
|
@@ -563,7 +563,7 @@ Custom tools passed via `customTools` are combined with extension-registered too
|
|
|
563
563
|
Extensions are loaded by the `ResourceLoader`. `DefaultResourceLoader` discovers extensions from `~/.pi/agent/extensions/`, `.pi/extensions/`, and settings.json extension sources.
|
|
564
564
|
|
|
565
565
|
```typescript
|
|
566
|
-
import { createAgentSession, DefaultResourceLoader } from "@
|
|
566
|
+
import { createAgentSession, DefaultResourceLoader } from "@dyyz1993/pi-coding-agent";
|
|
567
567
|
|
|
568
568
|
const loader = new DefaultResourceLoader({
|
|
569
569
|
additionalExtensionPaths: ["/path/to/my-extension.ts"],
|
|
@@ -585,7 +585,7 @@ Extensions can register tools, subscribe to events, add commands, and more. See
|
|
|
585
585
|
**Event Bus:** Extensions can communicate via `pi.events`. Pass a shared `eventBus` to `DefaultResourceLoader` if you need to emit or listen from outside:
|
|
586
586
|
|
|
587
587
|
```typescript
|
|
588
|
-
import { createEventBus, DefaultResourceLoader } from "@
|
|
588
|
+
import { createEventBus, DefaultResourceLoader } from "@dyyz1993/pi-coding-agent";
|
|
589
589
|
|
|
590
590
|
const eventBus = createEventBus();
|
|
591
591
|
const loader = new DefaultResourceLoader({
|
|
@@ -605,7 +605,7 @@ import {
|
|
|
605
605
|
createAgentSession,
|
|
606
606
|
DefaultResourceLoader,
|
|
607
607
|
type Skill,
|
|
608
|
-
} from "@
|
|
608
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
609
609
|
|
|
610
610
|
const customSkill: Skill = {
|
|
611
611
|
name: "my-skill",
|
|
@@ -631,7 +631,7 @@ const { session } = await createAgentSession({ resourceLoader: loader });
|
|
|
631
631
|
### Context Files
|
|
632
632
|
|
|
633
633
|
```typescript
|
|
634
|
-
import { createAgentSession, DefaultResourceLoader } from "@
|
|
634
|
+
import { createAgentSession, DefaultResourceLoader } from "@dyyz1993/pi-coding-agent";
|
|
635
635
|
|
|
636
636
|
const loader = new DefaultResourceLoader({
|
|
637
637
|
agentsFilesOverride: (current) => ({
|
|
@@ -655,7 +655,7 @@ import {
|
|
|
655
655
|
createAgentSession,
|
|
656
656
|
DefaultResourceLoader,
|
|
657
657
|
type PromptTemplate,
|
|
658
|
-
} from "@
|
|
658
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
659
659
|
|
|
660
660
|
const customCommand: PromptTemplate = {
|
|
661
661
|
name: "deploy",
|
|
@@ -690,7 +690,7 @@ import {
|
|
|
690
690
|
createAgentSessionServices,
|
|
691
691
|
getAgentDir,
|
|
692
692
|
SessionManager,
|
|
693
|
-
} from "@
|
|
693
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
694
694
|
|
|
695
695
|
// In-memory (no persistence)
|
|
696
696
|
const { session } = await createAgentSession({
|
|
@@ -779,12 +779,12 @@ sm.branchWithSummary(id, "Summary..."); // Branch with context summary
|
|
|
779
779
|
sm.createBranchedSession(leafId); // Extract path to new file
|
|
780
780
|
```
|
|
781
781
|
|
|
782
|
-
> See [examples/sdk/11-sessions.ts](../examples/sdk/11-sessions.ts) and [
|
|
782
|
+
> See [examples/sdk/11-sessions.ts](../examples/sdk/11-sessions.ts) and [Session Format](session-format.md)
|
|
783
783
|
|
|
784
784
|
### Settings Management
|
|
785
785
|
|
|
786
786
|
```typescript
|
|
787
|
-
import { createAgentSession, SettingsManager, SessionManager } from "@
|
|
787
|
+
import { createAgentSession, SettingsManager, SessionManager } from "@dyyz1993/pi-coding-agent";
|
|
788
788
|
|
|
789
789
|
// Default: loads from files (global + project merged)
|
|
790
790
|
const { session } = await createAgentSession({
|
|
@@ -840,7 +840,7 @@ Use `DefaultResourceLoader` to discover extensions, skills, prompts, themes, and
|
|
|
840
840
|
import {
|
|
841
841
|
DefaultResourceLoader,
|
|
842
842
|
getAgentDir,
|
|
843
|
-
} from "@
|
|
843
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
844
844
|
|
|
845
845
|
const loader = new DefaultResourceLoader({
|
|
846
846
|
cwd,
|
|
@@ -881,7 +881,7 @@ interface LoadExtensionsResult {
|
|
|
881
881
|
## Complete Example
|
|
882
882
|
|
|
883
883
|
```typescript
|
|
884
|
-
import { getModel } from "@
|
|
884
|
+
import { getModel } from "@dyyz1993/pi-ai";
|
|
885
885
|
import { Type } from "typebox";
|
|
886
886
|
import {
|
|
887
887
|
AuthStorage,
|
|
@@ -893,7 +893,7 @@ import {
|
|
|
893
893
|
readTool,
|
|
894
894
|
SessionManager,
|
|
895
895
|
SettingsManager,
|
|
896
|
-
} from "@
|
|
896
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
897
897
|
|
|
898
898
|
// Set up auth storage (custom location)
|
|
899
899
|
const authStorage = AuthStorage.create("/custom/agent/auth.json");
|
|
@@ -978,7 +978,7 @@ import {
|
|
|
978
978
|
getAgentDir,
|
|
979
979
|
InteractiveMode,
|
|
980
980
|
SessionManager,
|
|
981
|
-
} from "@
|
|
981
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
982
982
|
|
|
983
983
|
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
|
|
984
984
|
const services = await createAgentSessionServices({ cwd });
|
|
@@ -1018,7 +1018,7 @@ import {
|
|
|
1018
1018
|
getAgentDir,
|
|
1019
1019
|
runPrintMode,
|
|
1020
1020
|
SessionManager,
|
|
1021
|
-
} from "@
|
|
1021
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
1022
1022
|
|
|
1023
1023
|
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
|
|
1024
1024
|
const services = await createAgentSessionServices({ cwd });
|
|
@@ -1055,7 +1055,7 @@ import {
|
|
|
1055
1055
|
getAgentDir,
|
|
1056
1056
|
runRpcMode,
|
|
1057
1057
|
SessionManager,
|
|
1058
|
-
} from "@
|
|
1058
|
+
} from "@dyyz1993/pi-coding-agent";
|
|
1059
1059
|
|
|
1060
1060
|
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
|
|
1061
1061
|
const services = await createAgentSessionServices({ cwd });
|
|
@@ -28,13 +28,13 @@ Existing sessions are automatically migrated to the current version (v3) when lo
|
|
|
28
28
|
|
|
29
29
|
## Source Files
|
|
30
30
|
|
|
31
|
-
Source on GitHub ([pi-mono](https://github.com/
|
|
32
|
-
- [`packages/coding-agent/src/core/session-manager.ts`](https://github.com/
|
|
33
|
-
- [`packages/coding-agent/src/core/messages.ts`](https://github.com/
|
|
34
|
-
- [`packages/ai/src/types.ts`](https://github.com/
|
|
35
|
-
- [`packages/agent/src/types.ts`](https://github.com/
|
|
31
|
+
Source on GitHub ([pi-mono](https://github.com/dyyz1993/pi-mono)):
|
|
32
|
+
- [`packages/coding-agent/src/core/session-manager.ts`](https://github.com/dyyz1993/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts) - Session entry types and SessionManager
|
|
33
|
+
- [`packages/coding-agent/src/core/messages.ts`](https://github.com/dyyz1993/pi-mono/blob/main/packages/coding-agent/src/core/messages.ts) - Extended message types (BashExecutionMessage, CustomMessage, etc.)
|
|
34
|
+
- [`packages/ai/src/types.ts`](https://github.com/dyyz1993/pi-mono/blob/main/packages/ai/src/types.ts) - Base message types (UserMessage, AssistantMessage, ToolResultMessage)
|
|
35
|
+
- [`packages/agent/src/types.ts`](https://github.com/dyyz1993/pi-mono/blob/main/packages/agent/src/types.ts) - AgentMessage union type
|
|
36
36
|
|
|
37
|
-
For TypeScript definitions in your project, inspect `node_modules/@
|
|
37
|
+
For TypeScript definitions in your project, inspect `node_modules/@dyyz1993/pi-coding-agent/dist/` and `node_modules/@dyyz1993/pi-ai/dist/`.
|
|
38
38
|
|
|
39
39
|
## Message Types
|
|
40
40
|
|