@mariozechner/pi-coding-agent 0.64.0 → 0.65.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.
Files changed (119) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +11 -5
  3. package/dist/cli/args.d.ts +7 -4
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +37 -15
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/core/agent-session-runtime.d.ts +83 -0
  8. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  9. package/dist/core/agent-session-runtime.js +232 -0
  10. package/dist/core/agent-session-runtime.js.map +1 -0
  11. package/dist/core/agent-session-services.d.ts +86 -0
  12. package/dist/core/agent-session-services.d.ts.map +1 -0
  13. package/dist/core/agent-session-services.js +116 -0
  14. package/dist/core/agent-session-services.js.map +1 -0
  15. package/dist/core/agent-session.d.ts +5 -42
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +46 -237
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/export-html/tool-renderer.d.ts +2 -0
  20. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  21. package/dist/core/export-html/tool-renderer.js +2 -2
  22. package/dist/core/export-html/tool-renderer.js.map +1 -1
  23. package/dist/core/extensions/index.d.ts +2 -2
  24. package/dist/core/extensions/index.d.ts.map +1 -1
  25. package/dist/core/extensions/index.js +1 -1
  26. package/dist/core/extensions/index.js.map +1 -1
  27. package/dist/core/extensions/types.d.ts +16 -28
  28. package/dist/core/extensions/types.d.ts.map +1 -1
  29. package/dist/core/extensions/types.js +10 -0
  30. package/dist/core/extensions/types.js.map +1 -1
  31. package/dist/core/footer-data-provider.d.ts +5 -1
  32. package/dist/core/footer-data-provider.d.ts.map +1 -1
  33. package/dist/core/footer-data-provider.js +70 -8
  34. package/dist/core/footer-data-provider.js.map +1 -1
  35. package/dist/core/index.d.ts +3 -1
  36. package/dist/core/index.d.ts.map +1 -1
  37. package/dist/core/index.js +3 -1
  38. package/dist/core/index.js.map +1 -1
  39. package/dist/core/keybindings.d.ts +14 -1
  40. package/dist/core/keybindings.d.ts.map +1 -1
  41. package/dist/core/keybindings.js +13 -14
  42. package/dist/core/keybindings.js.map +1 -1
  43. package/dist/core/package-manager.d.ts +20 -0
  44. package/dist/core/package-manager.d.ts.map +1 -1
  45. package/dist/core/package-manager.js +32 -0
  46. package/dist/core/package-manager.js.map +1 -1
  47. package/dist/core/resource-loader.d.ts.map +1 -1
  48. package/dist/core/resource-loader.js +21 -0
  49. package/dist/core/resource-loader.js.map +1 -1
  50. package/dist/core/sdk.d.ts +4 -1
  51. package/dist/core/sdk.d.ts.map +1 -1
  52. package/dist/core/sdk.js +4 -1
  53. package/dist/core/sdk.js.map +1 -1
  54. package/dist/core/session-manager.d.ts +3 -0
  55. package/dist/core/session-manager.d.ts.map +1 -1
  56. package/dist/core/session-manager.js +13 -6
  57. package/dist/core/session-manager.js.map +1 -1
  58. package/dist/core/settings-manager.d.ts +1 -1
  59. package/dist/core/settings-manager.d.ts.map +1 -1
  60. package/dist/core/settings-manager.js +2 -1
  61. package/dist/core/settings-manager.js.map +1 -1
  62. package/dist/index.d.ts +3 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +3 -3
  65. package/dist/index.js.map +1 -1
  66. package/dist/main.d.ts.map +1 -1
  67. package/dist/main.js +205 -427
  68. package/dist/main.js.map +1 -1
  69. package/dist/migrations.d.ts.map +1 -1
  70. package/dist/migrations.js +20 -0
  71. package/dist/migrations.js.map +1 -1
  72. package/dist/modes/interactive/components/footer.d.ts +1 -0
  73. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  74. package/dist/modes/interactive/components/footer.js +4 -1
  75. package/dist/modes/interactive/components/footer.js.map +1 -1
  76. package/dist/modes/interactive/components/tree-selector.d.ts +4 -2
  77. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  78. package/dist/modes/interactive/components/tree-selector.js +48 -15
  79. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  80. package/dist/modes/interactive/interactive-mode.d.ts +9 -4
  81. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  82. package/dist/modes/interactive/interactive-mode.js +124 -94
  83. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  84. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  85. package/dist/modes/interactive/theme/theme.js +6 -11
  86. package/dist/modes/interactive/theme/theme.js.map +1 -1
  87. package/dist/modes/print-mode.d.ts +2 -2
  88. package/dist/modes/print-mode.d.ts.map +1 -1
  89. package/dist/modes/print-mode.js +41 -36
  90. package/dist/modes/print-mode.js.map +1 -1
  91. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  92. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  93. package/dist/modes/rpc/rpc-mode.js +92 -64
  94. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  95. package/dist/package-manager-cli.d.ts +4 -0
  96. package/dist/package-manager-cli.d.ts.map +1 -0
  97. package/dist/package-manager-cli.js +234 -0
  98. package/dist/package-manager-cli.js.map +1 -0
  99. package/docs/extensions.md +72 -40
  100. package/docs/keybindings.md +2 -0
  101. package/docs/sdk.md +227 -74
  102. package/docs/settings.md +1 -1
  103. package/docs/tree.md +6 -3
  104. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  105. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  106. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  107. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  108. package/examples/extensions/hello.ts +18 -17
  109. package/examples/extensions/hidden-thinking-label.ts +0 -4
  110. package/examples/extensions/rpc-demo.ts +3 -9
  111. package/examples/extensions/status-line.ts +0 -8
  112. package/examples/extensions/todo.ts +0 -2
  113. package/examples/extensions/tools.ts +0 -5
  114. package/examples/extensions/widget-placement.ts +4 -12
  115. package/examples/extensions/with-deps/package-lock.json +2 -2
  116. package/examples/extensions/with-deps/package.json +1 -1
  117. package/examples/sdk/13-session-runtime.ts +67 -0
  118. package/examples/sdk/README.md +4 -1
  119. package/package.json +4 -4
@@ -130,8 +130,6 @@ export default function (pi: ExtensionAPI) {
130
130
 
131
131
  // Reconstruct state on session events
132
132
  pi.on("session_start", async (_event, ctx) => reconstructState(ctx));
133
- pi.on("session_switch", async (_event, ctx) => reconstructState(ctx));
134
- pi.on("session_fork", async (_event, ctx) => reconstructState(ctx));
135
133
  pi.on("session_tree", async (_event, ctx) => reconstructState(ctx));
136
134
 
137
135
  // Register the todo tool for the LLM
@@ -138,9 +138,4 @@ export default function toolsExtension(pi: ExtensionAPI) {
138
138
  pi.on("session_tree", async (_event, ctx) => {
139
139
  restoreFromBranch(ctx);
140
140
  });
141
-
142
- // Restore state after forking
143
- pi.on("session_fork", async (_event, ctx) => {
144
- restoreFromBranch(ctx);
145
- });
146
141
  }
@@ -1,17 +1,9 @@
1
- import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
2
-
3
- const applyWidgets = (ctx: ExtensionContext) => {
4
- if (!ctx.hasUI) return;
5
- ctx.ui.setWidget("widget-above", ["Above editor widget"]);
6
- ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
7
- };
1
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
8
2
 
9
3
  export default function widgetPlacementExtension(pi: ExtensionAPI) {
10
4
  pi.on("session_start", (_event, ctx) => {
11
- applyWidgets(ctx);
12
- });
13
-
14
- pi.on("session_switch", (_event, ctx) => {
15
- applyWidgets(ctx);
5
+ if (!ctx.hasUI) return;
6
+ ctx.ui.setWidget("widget-above", ["Above editor widget"]);
7
+ ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
16
8
  });
17
9
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "1.28.0",
3
+ "version": "1.29.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "1.28.0",
9
+ "version": "1.29.0",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "1.28.0",
4
+ "version": "1.29.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Session runtime
3
+ *
4
+ * Use AgentSessionRuntime when you need to replace the active AgentSession,
5
+ * for example for new-session, resume, fork, or import flows.
6
+ *
7
+ * The important pattern is: after the runtime replaces the active session,
8
+ * rebind any session-local subscriptions and extension bindings to `runtime.session`.
9
+ */
10
+
11
+ import {
12
+ type CreateAgentSessionRuntimeFactory,
13
+ createAgentSessionFromServices,
14
+ createAgentSessionRuntime,
15
+ createAgentSessionServices,
16
+ getAgentDir,
17
+ SessionManager,
18
+ } from "@mariozechner/pi-coding-agent";
19
+
20
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
21
+ const services = await createAgentSessionServices({ cwd });
22
+ return {
23
+ ...(await createAgentSessionFromServices({
24
+ services,
25
+ sessionManager,
26
+ sessionStartEvent,
27
+ })),
28
+ services,
29
+ diagnostics: services.diagnostics,
30
+ };
31
+ };
32
+ const runtime = await createAgentSessionRuntime(createRuntime, {
33
+ cwd: process.cwd(),
34
+ agentDir: getAgentDir(),
35
+ sessionManager: SessionManager.create(process.cwd()),
36
+ });
37
+
38
+ let unsubscribe: (() => void) | undefined;
39
+
40
+ async function bindSession() {
41
+ unsubscribe?.();
42
+ const session = runtime.session;
43
+ await session.bindExtensions({});
44
+ unsubscribe = session.subscribe((event) => {
45
+ if (event.type === "queue_update") {
46
+ console.log("Queued:", event.steering.length + event.followUp.length);
47
+ }
48
+ });
49
+ return session;
50
+ }
51
+
52
+ let session = await bindSession();
53
+ const originalSessionFile = session.sessionFile;
54
+ console.log("Initial session:", originalSessionFile);
55
+
56
+ await runtime.newSession();
57
+ session = await bindSession();
58
+ console.log("After newSession():", session.sessionFile);
59
+
60
+ if (originalSessionFile) {
61
+ await runtime.switchSession(originalSessionFile);
62
+ session = await bindSession();
63
+ console.log("After switchSession():", session.sessionFile);
64
+ }
65
+
66
+ unsubscribe?.();
67
+ await runtime.dispose();
@@ -1,6 +1,8 @@
1
1
  # SDK Examples
2
2
 
3
- Programmatic usage of pi-coding-agent via `createAgentSession()`.
3
+ Programmatic usage of pi-coding-agent via `createAgentSession()` and `createAgentSessionRuntime()`.
4
+
5
+ The runtime example shows how to build a recreate function that closes over process-global fixed inputs and recreates cwd-bound services and sessions as the active session cwd changes.
4
6
 
5
7
  ## Examples
6
8
 
@@ -18,6 +20,7 @@ Programmatic usage of pi-coding-agent via `createAgentSession()`.
18
20
  | `10-settings.ts` | Override compaction, retry, terminal settings |
19
21
  | `11-sessions.ts` | In-memory, persistent, continue, list sessions |
20
22
  | `12-full-control.ts` | Replace everything, no discovery |
23
+ | `13-session-runtime.ts` | Manage runtime-backed session replacement |
21
24
 
22
25
  ## Running
23
26
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mariozechner/pi-coding-agent",
3
- "version": "0.64.0",
3
+ "version": "0.65.0",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -40,9 +40,9 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@mariozechner/jiti": "^2.6.2",
43
- "@mariozechner/pi-agent-core": "^0.64.0",
44
- "@mariozechner/pi-ai": "^0.64.0",
45
- "@mariozechner/pi-tui": "^0.64.0",
43
+ "@mariozechner/pi-agent-core": "^0.65.0",
44
+ "@mariozechner/pi-ai": "^0.65.0",
45
+ "@mariozechner/pi-tui": "^0.65.0",
46
46
  "@silvia-odwyer/photon-node": "^0.3.4",
47
47
  "ajv": "^8.17.1",
48
48
  "chalk": "^5.5.0",