@codex-infinity/pi-infinity 0.64.3 → 0.65.1

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 (87) hide show
  1. package/CHANGELOG.md +54 -34
  2. package/README.md +1 -1
  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 +51 -104
  8. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  9. package/dist/core/agent-session-runtime.js +103 -141
  10. package/dist/core/agent-session-runtime.js.map +1 -1
  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.map +1 -1
  16. package/dist/core/agent-session.js +1 -1
  17. package/dist/core/agent-session.js.map +1 -1
  18. package/dist/core/extensions/index.d.ts +1 -1
  19. package/dist/core/extensions/index.d.ts.map +1 -1
  20. package/dist/core/extensions/index.js.map +1 -1
  21. package/dist/core/extensions/types.d.ts +1 -13
  22. package/dist/core/extensions/types.d.ts.map +1 -1
  23. package/dist/core/extensions/types.js.map +1 -1
  24. package/dist/core/index.d.ts +2 -1
  25. package/dist/core/index.d.ts.map +1 -1
  26. package/dist/core/index.js +2 -1
  27. package/dist/core/index.js.map +1 -1
  28. package/dist/core/keybindings.d.ts +4 -1
  29. package/dist/core/keybindings.d.ts.map +1 -1
  30. package/dist/core/keybindings.js +3 -14
  31. package/dist/core/keybindings.js.map +1 -1
  32. package/dist/core/package-manager.d.ts +20 -0
  33. package/dist/core/package-manager.d.ts.map +1 -1
  34. package/dist/core/package-manager.js +32 -0
  35. package/dist/core/package-manager.js.map +1 -1
  36. package/dist/core/resource-loader.d.ts.map +1 -1
  37. package/dist/core/resource-loader.js +21 -0
  38. package/dist/core/resource-loader.js.map +1 -1
  39. package/dist/core/sdk.d.ts +1 -1
  40. package/dist/core/sdk.d.ts.map +1 -1
  41. package/dist/core/sdk.js +1 -1
  42. package/dist/core/sdk.js.map +1 -1
  43. package/dist/core/settings-manager.d.ts +1 -1
  44. package/dist/core/settings-manager.d.ts.map +1 -1
  45. package/dist/core/settings-manager.js +2 -1
  46. package/dist/core/settings-manager.js.map +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +2 -2
  50. package/dist/index.js.map +1 -1
  51. package/dist/main.d.ts.map +1 -1
  52. package/dist/main.js +202 -457
  53. package/dist/main.js.map +1 -1
  54. package/dist/migrations.d.ts.map +1 -1
  55. package/dist/migrations.js +20 -0
  56. package/dist/migrations.js.map +1 -1
  57. package/dist/modes/interactive/interactive-mode.d.ts +3 -2
  58. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  59. package/dist/modes/interactive/interactive-mode.js +56 -29
  60. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  61. package/dist/modes/print-mode.d.ts +2 -2
  62. package/dist/modes/print-mode.d.ts.map +1 -1
  63. package/dist/modes/print-mode.js +4 -0
  64. package/dist/modes/print-mode.js.map +1 -1
  65. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  66. package/dist/modes/rpc/rpc-client.js +1 -0
  67. package/dist/modes/rpc/rpc-client.js.map +1 -1
  68. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  69. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  70. package/dist/modes/rpc/rpc-mode.js +23 -15
  71. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  72. package/dist/package-manager-cli.d.ts +4 -0
  73. package/dist/package-manager-cli.d.ts.map +1 -0
  74. package/dist/package-manager-cli.js +234 -0
  75. package/dist/package-manager-cli.js.map +1 -0
  76. package/docs/extensions.md +2 -26
  77. package/docs/sdk.md +97 -37
  78. package/docs/settings.md +1 -1
  79. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  80. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  81. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  82. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  83. package/examples/extensions/with-deps/package-lock.json +2 -2
  84. package/examples/extensions/with-deps/package.json +1 -1
  85. package/examples/sdk/13-session-runtime.ts +30 -12
  86. package/examples/sdk/README.md +2 -0
  87. package/package.json +4 -4
package/docs/sdk.md CHANGED
@@ -115,33 +115,46 @@ interface AgentSession {
115
115
  }
116
116
  ```
117
117
 
118
- Session replacement APIs such as new-session, resume, fork, and import live on `AgentSessionRuntimeHost`, not on `AgentSession`.
118
+ Session replacement APIs such as new-session, resume, fork, and import live on `AgentSessionRuntime`, not on `AgentSession`.
119
119
 
120
- ### createAgentSessionRuntime() and AgentSessionRuntimeHost
120
+ ### createAgentSessionRuntime() and AgentSessionRuntime
121
121
 
122
122
  Use the runtime API when you need to replace the active session and rebuild cwd-bound runtime state.
123
123
  This is the same layer used by the built-in interactive, print, and RPC modes.
124
124
 
125
+ `createAgentSessionRuntime()` takes a runtime factory plus the initial cwd/session target. The factory closes over process-global fixed inputs, recreates cwd-bound services for the effective cwd, resolves session options against those services, and returns a full runtime result.
126
+
125
127
  ```typescript
126
128
  import {
127
- AgentSessionRuntimeHost,
129
+ type CreateAgentSessionRuntimeFactory,
130
+ createAgentSessionFromServices,
128
131
  createAgentSessionRuntime,
132
+ createAgentSessionServices,
133
+ getAgentDir,
129
134
  SessionManager,
130
135
  } from "@mariozechner/pi-coding-agent";
131
136
 
132
- const bootstrap = {
133
- // Optional: authStorage, model, thinkingLevel, tools, customTools, resourceLoader
137
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
138
+ const services = await createAgentSessionServices({ cwd });
139
+ return {
140
+ ...(await createAgentSessionFromServices({
141
+ services,
142
+ sessionManager,
143
+ sessionStartEvent,
144
+ })),
145
+ services,
146
+ diagnostics: services.diagnostics,
147
+ };
134
148
  };
135
149
 
136
- const runtime = await createAgentSessionRuntime(bootstrap, {
150
+ const runtime = await createAgentSessionRuntime(createRuntime, {
137
151
  cwd: process.cwd(),
152
+ agentDir: getAgentDir(),
138
153
  sessionManager: SessionManager.create(process.cwd()),
139
154
  });
140
-
141
- const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
142
155
  ```
143
156
 
144
- `createAgentSessionRuntime()` returns an internal runtime bundle. `AgentSessionRuntimeHost` owns replacement of that bundle across:
157
+ `AgentSessionRuntime` owns replacement of the active runtime across:
145
158
 
146
159
  - `newSession()`
147
160
  - `switchSession()`
@@ -150,18 +163,20 @@ const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
150
163
 
151
164
  Important behavior:
152
165
 
153
- - `runtimeHost.session` changes after those operations
166
+ - `runtime.session` changes after those operations
154
167
  - event subscriptions are attached to a specific `AgentSession`, so re-subscribe after replacement
155
- - if you use extensions, call `runtimeHost.session.bindExtensions(...)` again for the new session
168
+ - if you use extensions, call `runtime.session.bindExtensions(...)` again for the new session
169
+ - creation returns diagnostics on `runtime.diagnostics`
170
+ - if runtime creation or replacement fails, the method throws and the caller decides how to handle it
156
171
 
157
172
  ```typescript
158
- let session = runtimeHost.session;
173
+ let session = runtime.session;
159
174
  let unsubscribe = session.subscribe(() => {});
160
175
 
161
- await runtimeHost.newSession();
176
+ await runtime.newSession();
162
177
 
163
178
  unsubscribe();
164
- session = runtimeHost.session;
179
+ session = runtime.session;
165
180
  unsubscribe = session.subscribe(() => {});
166
181
  ```
167
182
 
@@ -646,9 +661,12 @@ Sessions use a tree structure with `id`/`parentId` linking, enabling in-place br
646
661
 
647
662
  ```typescript
648
663
  import {
649
- AgentSessionRuntimeHost,
664
+ type CreateAgentSessionRuntimeFactory,
650
665
  createAgentSession,
666
+ createAgentSessionFromServices,
651
667
  createAgentSessionRuntime,
668
+ createAgentSessionServices,
669
+ getAgentDir,
652
670
  SessionManager,
653
671
  } from "@mariozechner/pi-coding-agent";
654
672
 
@@ -680,21 +698,33 @@ const currentProjectSessions = await SessionManager.list(process.cwd());
680
698
  const allSessions = await SessionManager.listAll(process.cwd());
681
699
 
682
700
  // Session replacement API for /new, /resume, /fork, and import flows.
683
- const bootstrap = {};
684
- const runtime = await createAgentSessionRuntime(bootstrap, {
701
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
702
+ const services = await createAgentSessionServices({ cwd });
703
+ return {
704
+ ...(await createAgentSessionFromServices({
705
+ services,
706
+ sessionManager,
707
+ sessionStartEvent,
708
+ })),
709
+ services,
710
+ diagnostics: services.diagnostics,
711
+ };
712
+ };
713
+
714
+ const runtime = await createAgentSessionRuntime(createRuntime, {
685
715
  cwd: process.cwd(),
716
+ agentDir: getAgentDir(),
686
717
  sessionManager: SessionManager.create(process.cwd()),
687
718
  });
688
- const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
689
719
 
690
720
  // Replace the active session with a fresh one
691
- await runtimeHost.newSession();
721
+ await runtime.newSession();
692
722
 
693
723
  // Replace the active session with another saved session
694
- await runtimeHost.switchSession("/path/to/session.jsonl");
724
+ await runtime.switchSession("/path/to/session.jsonl");
695
725
 
696
726
  // Replace the active session with a fork from a specific entry
697
- await runtimeHost.fork("entry-id");
727
+ await runtime.fork("entry-id");
698
728
  ```
699
729
 
700
730
  **SessionManager tree API:**
@@ -916,20 +946,30 @@ Full TUI interactive mode with editor, chat history, and all built-in commands:
916
946
 
917
947
  ```typescript
918
948
  import {
919
- AgentSessionRuntimeHost,
949
+ type CreateAgentSessionRuntimeFactory,
950
+ createAgentSessionFromServices,
920
951
  createAgentSessionRuntime,
952
+ createAgentSessionServices,
953
+ getAgentDir,
921
954
  InteractiveMode,
922
955
  SessionManager,
923
956
  } from "@mariozechner/pi-coding-agent";
924
957
 
925
- const bootstrap = {};
926
- const runtime = await createAgentSessionRuntime(bootstrap, {
958
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
959
+ const services = await createAgentSessionServices({ cwd });
960
+ return {
961
+ ...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
962
+ services,
963
+ diagnostics: services.diagnostics,
964
+ };
965
+ };
966
+ const runtime = await createAgentSessionRuntime(createRuntime, {
927
967
  cwd: process.cwd(),
968
+ agentDir: getAgentDir(),
928
969
  sessionManager: SessionManager.create(process.cwd()),
929
970
  });
930
- const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
931
971
 
932
- const mode = new InteractiveMode(runtimeHost, {
972
+ const mode = new InteractiveMode(runtime, {
933
973
  migratedProviders: [],
934
974
  modelFallbackMessage: undefined,
935
975
  initialMessage: "Hello",
@@ -946,20 +986,30 @@ Single-shot mode: send prompts, output result, exit:
946
986
 
947
987
  ```typescript
948
988
  import {
949
- AgentSessionRuntimeHost,
989
+ type CreateAgentSessionRuntimeFactory,
990
+ createAgentSessionFromServices,
950
991
  createAgentSessionRuntime,
992
+ createAgentSessionServices,
993
+ getAgentDir,
951
994
  runPrintMode,
952
995
  SessionManager,
953
996
  } from "@mariozechner/pi-coding-agent";
954
997
 
955
- const bootstrap = {};
956
- const runtime = await createAgentSessionRuntime(bootstrap, {
998
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
999
+ const services = await createAgentSessionServices({ cwd });
1000
+ return {
1001
+ ...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
1002
+ services,
1003
+ diagnostics: services.diagnostics,
1004
+ };
1005
+ };
1006
+ const runtime = await createAgentSessionRuntime(createRuntime, {
957
1007
  cwd: process.cwd(),
1008
+ agentDir: getAgentDir(),
958
1009
  sessionManager: SessionManager.create(process.cwd()),
959
1010
  });
960
- const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
961
1011
 
962
- await runPrintMode(runtimeHost, {
1012
+ await runPrintMode(runtime, {
963
1013
  mode: "text",
964
1014
  initialMessage: "Hello",
965
1015
  initialImages: [],
@@ -973,20 +1023,30 @@ JSON-RPC mode for subprocess integration:
973
1023
 
974
1024
  ```typescript
975
1025
  import {
976
- AgentSessionRuntimeHost,
1026
+ type CreateAgentSessionRuntimeFactory,
1027
+ createAgentSessionFromServices,
977
1028
  createAgentSessionRuntime,
1029
+ createAgentSessionServices,
1030
+ getAgentDir,
978
1031
  runRpcMode,
979
1032
  SessionManager,
980
1033
  } from "@mariozechner/pi-coding-agent";
981
1034
 
982
- const bootstrap = {};
983
- const runtime = await createAgentSessionRuntime(bootstrap, {
1035
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
1036
+ const services = await createAgentSessionServices({ cwd });
1037
+ return {
1038
+ ...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
1039
+ services,
1040
+ diagnostics: services.diagnostics,
1041
+ };
1042
+ };
1043
+ const runtime = await createAgentSessionRuntime(createRuntime, {
984
1044
  cwd: process.cwd(),
1045
+ agentDir: getAgentDir(),
985
1046
  sessionManager: SessionManager.create(process.cwd()),
986
1047
  });
987
- const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
988
1048
 
989
- await runRpcMode(runtimeHost);
1049
+ await runRpcMode(runtime);
990
1050
  ```
991
1051
 
992
1052
  See [RPC documentation](rpc.md) for the JSON protocol.
@@ -1020,7 +1080,7 @@ The main entry point exports:
1020
1080
  // Factory
1021
1081
  createAgentSession
1022
1082
  createAgentSessionRuntime
1023
- AgentSessionRuntimeHost
1083
+ AgentSessionRuntime
1024
1084
 
1025
1085
  // Auth and Models
1026
1086
  AuthStorage
package/docs/settings.md CHANGED
@@ -137,7 +137,7 @@ When a provider requests a retry delay longer than `maxDelayMs` (e.g., Google's
137
137
  { "sessionDir": ".pi/sessions" }
138
138
  ```
139
139
 
140
- When multiple sources specify a session directory, `--session-dir` CLI flag takes precedence, then `sessionDir` in settings.json, then extension hooks.
140
+ When multiple sources specify a session directory, `--session-dir` CLI flag takes precedence over `sessionDir` in settings.json.
141
141
 
142
142
  ### Model Cycling
143
143
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "1.15.2",
3
+ "version": "1.16.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "1.15.2",
9
+ "version": "1.16.1",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "1.15.2",
4
+ "version": "1.16.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "1.15.2",
4
+ "version": "1.16.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-qwen-cli",
3
3
  "private": true,
4
- "version": "1.14.2",
4
+ "version": "1.15.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "1.28.2",
3
+ "version": "1.29.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "1.28.2",
9
+ "version": "1.29.1",
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.2",
4
+ "version": "1.29.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,27 +1,45 @@
1
1
  /**
2
- * Session Runtime Host
2
+ * Session runtime
3
3
  *
4
- * Use the runtime host when you need to replace the active AgentSession,
4
+ * Use AgentSessionRuntime when you need to replace the active AgentSession,
5
5
  * for example for new-session, resume, fork, or import flows.
6
6
  *
7
- * The important pattern is: after the host replaces the runtime, rebind any
8
- * session-local subscriptions and extension bindings to `runtimeHost.session`.
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
9
  */
10
10
 
11
- import { AgentSessionRuntimeHost, createAgentSessionRuntime, SessionManager } from "@mariozechner/pi-coding-agent";
11
+ import {
12
+ type CreateAgentSessionRuntimeFactory,
13
+ createAgentSessionFromServices,
14
+ createAgentSessionRuntime,
15
+ createAgentSessionServices,
16
+ getAgentDir,
17
+ SessionManager,
18
+ } from "@mariozechner/pi-coding-agent";
12
19
 
13
- const bootstrap = {};
14
- const runtime = await createAgentSessionRuntime(bootstrap, {
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, {
15
33
  cwd: process.cwd(),
34
+ agentDir: getAgentDir(),
16
35
  sessionManager: SessionManager.create(process.cwd()),
17
36
  });
18
- const runtimeHost = new AgentSessionRuntimeHost(bootstrap, runtime);
19
37
 
20
38
  let unsubscribe: (() => void) | undefined;
21
39
 
22
40
  async function bindSession() {
23
41
  unsubscribe?.();
24
- const session = runtimeHost.session;
42
+ const session = runtime.session;
25
43
  await session.bindExtensions({});
26
44
  unsubscribe = session.subscribe((event) => {
27
45
  if (event.type === "queue_update") {
@@ -35,15 +53,15 @@ let session = await bindSession();
35
53
  const originalSessionFile = session.sessionFile;
36
54
  console.log("Initial session:", originalSessionFile);
37
55
 
38
- await runtimeHost.newSession();
56
+ await runtime.newSession();
39
57
  session = await bindSession();
40
58
  console.log("After newSession():", session.sessionFile);
41
59
 
42
60
  if (originalSessionFile) {
43
- await runtimeHost.switchSession(originalSessionFile);
61
+ await runtime.switchSession(originalSessionFile);
44
62
  session = await bindSession();
45
63
  console.log("After switchSession():", session.sessionFile);
46
64
  }
47
65
 
48
66
  unsubscribe?.();
49
- await runtimeHost.dispose();
67
+ await runtime.dispose();
@@ -2,6 +2,8 @@
2
2
 
3
3
  Programmatic usage of pi-coding-agent via `createAgentSession()` and `createAgentSessionRuntime()`.
4
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.
6
+
5
7
  ## Examples
6
8
 
7
9
  | File | Description |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codex-infinity/pi-infinity",
3
- "version": "0.64.3",
3
+ "version": "0.65.1",
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.3",
44
- "@mariozechner/pi-ai": "^0.64.3",
45
- "@mariozechner/pi-tui": "^0.64.3",
43
+ "@mariozechner/pi-agent-core": "^0.65.1",
44
+ "@mariozechner/pi-ai": "^0.65.1",
45
+ "@mariozechner/pi-tui": "^0.65.1",
46
46
  "@silvia-odwyer/photon-node": "^0.3.4",
47
47
  "ajv": "^8.17.1",
48
48
  "chalk": "^5.5.0",