@mariozechner/pi-coding-agent 0.63.2 → 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 (144) hide show
  1. package/CHANGELOG.md +120 -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 +10 -42
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +58 -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/runner.d.ts.map +1 -1
  28. package/dist/core/extensions/runner.js +1 -0
  29. package/dist/core/extensions/runner.js.map +1 -1
  30. package/dist/core/extensions/types.d.ts +20 -28
  31. package/dist/core/extensions/types.d.ts.map +1 -1
  32. package/dist/core/extensions/types.js +10 -0
  33. package/dist/core/extensions/types.js.map +1 -1
  34. package/dist/core/footer-data-provider.d.ts +5 -1
  35. package/dist/core/footer-data-provider.d.ts.map +1 -1
  36. package/dist/core/footer-data-provider.js +70 -8
  37. package/dist/core/footer-data-provider.js.map +1 -1
  38. package/dist/core/index.d.ts +3 -1
  39. package/dist/core/index.d.ts.map +1 -1
  40. package/dist/core/index.js +3 -1
  41. package/dist/core/index.js.map +1 -1
  42. package/dist/core/keybindings.d.ts +14 -1
  43. package/dist/core/keybindings.d.ts.map +1 -1
  44. package/dist/core/keybindings.js +13 -14
  45. package/dist/core/keybindings.js.map +1 -1
  46. package/dist/core/model-registry.d.ts +3 -1
  47. package/dist/core/model-registry.d.ts.map +1 -1
  48. package/dist/core/model-registry.js +7 -1
  49. package/dist/core/model-registry.js.map +1 -1
  50. package/dist/core/package-manager.d.ts +20 -0
  51. package/dist/core/package-manager.d.ts.map +1 -1
  52. package/dist/core/package-manager.js +32 -0
  53. package/dist/core/package-manager.js.map +1 -1
  54. package/dist/core/resource-loader.d.ts.map +1 -1
  55. package/dist/core/resource-loader.js +21 -0
  56. package/dist/core/resource-loader.js.map +1 -1
  57. package/dist/core/sdk.d.ts +5 -2
  58. package/dist/core/sdk.d.ts.map +1 -1
  59. package/dist/core/sdk.js +5 -2
  60. package/dist/core/sdk.js.map +1 -1
  61. package/dist/core/session-manager.d.ts +3 -0
  62. package/dist/core/session-manager.d.ts.map +1 -1
  63. package/dist/core/session-manager.js +13 -6
  64. package/dist/core/session-manager.js.map +1 -1
  65. package/dist/core/settings-manager.d.ts +1 -1
  66. package/dist/core/settings-manager.d.ts.map +1 -1
  67. package/dist/core/settings-manager.js +2 -1
  68. package/dist/core/settings-manager.js.map +1 -1
  69. package/dist/core/tools/edit.d.ts.map +1 -1
  70. package/dist/core/tools/edit.js +15 -4
  71. package/dist/core/tools/edit.js.map +1 -1
  72. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  73. package/dist/core/tools/tool-definition-wrapper.js +2 -0
  74. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  75. package/dist/index.d.ts +3 -3
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +3 -3
  78. package/dist/index.js.map +1 -1
  79. package/dist/main.d.ts.map +1 -1
  80. package/dist/main.js +205 -427
  81. package/dist/main.js.map +1 -1
  82. package/dist/migrations.d.ts.map +1 -1
  83. package/dist/migrations.js +20 -0
  84. package/dist/migrations.js.map +1 -1
  85. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  86. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  87. package/dist/modes/interactive/components/assistant-message.js +14 -3
  88. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  89. package/dist/modes/interactive/components/footer.d.ts +1 -0
  90. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  91. package/dist/modes/interactive/components/footer.js +4 -1
  92. package/dist/modes/interactive/components/footer.js.map +1 -1
  93. package/dist/modes/interactive/components/tree-selector.d.ts +4 -2
  94. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  95. package/dist/modes/interactive/components/tree-selector.js +48 -15
  96. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  97. package/dist/modes/interactive/interactive-mode.d.ts +12 -4
  98. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  99. package/dist/modes/interactive/interactive-mode.js +146 -96
  100. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  101. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  102. package/dist/modes/interactive/theme/theme.js +6 -11
  103. package/dist/modes/interactive/theme/theme.js.map +1 -1
  104. package/dist/modes/print-mode.d.ts +2 -2
  105. package/dist/modes/print-mode.d.ts.map +1 -1
  106. package/dist/modes/print-mode.js +41 -36
  107. package/dist/modes/print-mode.js.map +1 -1
  108. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  109. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  110. package/dist/modes/rpc/rpc-mode.js +95 -64
  111. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  112. package/dist/package-manager-cli.d.ts +4 -0
  113. package/dist/package-manager-cli.d.ts.map +1 -0
  114. package/dist/package-manager-cli.js +234 -0
  115. package/dist/package-manager-cli.js.map +1 -0
  116. package/docs/compaction.md +4 -2
  117. package/docs/extensions.md +133 -40
  118. package/docs/json.md +5 -2
  119. package/docs/keybindings.md +2 -0
  120. package/docs/rpc.md +21 -7
  121. package/docs/sdk.md +239 -83
  122. package/docs/settings.md +1 -1
  123. package/docs/tree.md +6 -3
  124. package/examples/extensions/README.md +1 -0
  125. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  126. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  127. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  128. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  129. package/examples/extensions/hello.ts +18 -17
  130. package/examples/extensions/hidden-thinking-label.ts +53 -0
  131. package/examples/extensions/rpc-demo.ts +3 -9
  132. package/examples/extensions/sandbox/index.ts +4 -0
  133. package/examples/extensions/status-line.ts +0 -8
  134. package/examples/extensions/todo.ts +0 -2
  135. package/examples/extensions/tools.ts +0 -5
  136. package/examples/extensions/widget-placement.ts +4 -12
  137. package/examples/extensions/with-deps/package-lock.json +2 -2
  138. package/examples/extensions/with-deps/package.json +1 -1
  139. package/examples/sdk/02-custom-model.ts +1 -1
  140. package/examples/sdk/09-api-keys-and-oauth.ts +3 -3
  141. package/examples/sdk/12-full-control.ts +1 -1
  142. package/examples/sdk/13-session-runtime.ts +67 -0
  143. package/examples/sdk/README.md +7 -4
  144. package/package.json +4 -4
@@ -3,23 +3,24 @@
3
3
  */
4
4
 
5
5
  import { Type } from "@mariozechner/pi-ai";
6
- import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
6
+ import { defineTool, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
7
7
 
8
- export default function (pi: ExtensionAPI) {
9
- pi.registerTool({
10
- name: "hello",
11
- label: "Hello",
12
- description: "A simple greeting tool",
13
- parameters: Type.Object({
14
- name: Type.String({ description: "Name to greet" }),
15
- }),
8
+ const helloTool = defineTool({
9
+ name: "hello",
10
+ label: "Hello",
11
+ description: "A simple greeting tool",
12
+ parameters: Type.Object({
13
+ name: Type.String({ description: "Name to greet" }),
14
+ }),
15
+
16
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
17
+ return {
18
+ content: [{ type: "text", text: `Hello, ${params.name}!` }],
19
+ details: { greeted: params.name },
20
+ };
21
+ },
22
+ });
16
23
 
17
- async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
18
- const { name } = params as { name: string };
19
- return {
20
- content: [{ type: "text", text: `Hello, ${name}!` }],
21
- details: { greeted: name },
22
- };
23
- },
24
- });
24
+ export default function (pi: ExtensionAPI) {
25
+ pi.registerTool(helloTool);
25
26
  }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Hidden Thinking Label Extension
3
+ *
4
+ * Demonstrates `ctx.ui.setHiddenThinkingLabel()` for customizing the label shown
5
+ * when thinking blocks are hidden.
6
+ *
7
+ * Usage:
8
+ * pi --extension examples/extensions/hidden-thinking-label.ts
9
+ *
10
+ * Test:
11
+ * 1. Load this extension
12
+ * 2. Hide thinking blocks with Ctrl+T
13
+ * 3. Ask for something that produces reasoning output
14
+ * 4. The collapsed thinking block label will show the custom text
15
+ *
16
+ * Commands:
17
+ * /thinking-label <text> Set a custom hidden thinking label
18
+ * /thinking-label Reset to the default label
19
+ */
20
+
21
+ import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
22
+
23
+ const DEFAULT_LABEL = "Pondering...";
24
+
25
+ export default function (pi: ExtensionAPI) {
26
+ let label = DEFAULT_LABEL;
27
+
28
+ const applyLabel = (ctx: ExtensionContext) => {
29
+ ctx.ui.setHiddenThinkingLabel(label);
30
+ };
31
+
32
+ pi.on("session_start", async (_event, ctx) => {
33
+ applyLabel(ctx);
34
+ });
35
+
36
+ pi.registerCommand("thinking-label", {
37
+ description: "Set the hidden thinking label. Use without args to reset.",
38
+ handler: async (args, ctx) => {
39
+ const nextLabel = args.trim();
40
+
41
+ if (!nextLabel) {
42
+ label = DEFAULT_LABEL;
43
+ ctx.ui.setHiddenThinkingLabel();
44
+ ctx.ui.notify(`Hidden thinking label reset to: ${DEFAULT_LABEL}`);
45
+ return;
46
+ }
47
+
48
+ label = nextLabel;
49
+ ctx.ui.setHiddenThinkingLabel(label);
50
+ ctx.ui.notify(`Hidden thinking label set to: ${label}`);
51
+ },
52
+ });
53
+ }
@@ -13,7 +13,7 @@
13
13
  * - notify() - after each dialog completes
14
14
  * - setStatus() - on turn_start/turn_end
15
15
  * - setWidget() - on session_start
16
- * - setTitle() - on session_start and session_switch
16
+ * - setTitle() - on session_start
17
17
  * - setEditorText() - via /rpc-prefill command
18
18
  */
19
19
 
@@ -24,18 +24,12 @@ export default function (pi: ExtensionAPI) {
24
24
 
25
25
  // -- setTitle, setWidget, setStatus on session lifecycle --
26
26
 
27
- pi.on("session_start", async (_event, ctx) => {
28
- ctx.ui.setTitle("pi RPC Demo");
27
+ pi.on("session_start", async (event, ctx) => {
28
+ ctx.ui.setTitle(event.reason === "new" ? "pi RPC Demo (new session)" : "pi RPC Demo");
29
29
  ctx.ui.setWidget("rpc-demo", ["--- RPC Extension UI Demo ---", "Loaded and ready."]);
30
30
  ctx.ui.setStatus("rpc-demo", `Turns: ${turnCount}`);
31
31
  });
32
32
 
33
- pi.on("session_switch", async (_event, ctx) => {
34
- turnCount = 0;
35
- ctx.ui.setTitle("pi RPC Demo (new session)");
36
- ctx.ui.setStatus("rpc-demo", `Turns: ${turnCount}`);
37
- });
38
-
39
33
  // -- setStatus on turn lifecycle --
40
34
 
41
35
  pi.on("turn_start", async (_event, ctx) => {
@@ -5,6 +5,10 @@
5
5
  * restrictions on bash commands at the OS level (sandbox-exec on macOS,
6
6
  * bubblewrap on Linux).
7
7
  *
8
+ * Note: this example intentionally overrides the built-in `bash` tool to show
9
+ * how built-in tools can be replaced. Alternatively, you could sandbox `bash`
10
+ * via `tool_call` input mutation without replacing the tool.
11
+ *
8
12
  * Config files (merged, project takes precedence):
9
13
  * - ~/.pi/agent/sandbox.json (global)
10
14
  * - <cwd>/.pi/sandbox.json (project-local)
@@ -29,12 +29,4 @@ export default function (pi: ExtensionAPI) {
29
29
  const text = theme.fg("dim", ` Turn ${turnCount} complete`);
30
30
  ctx.ui.setStatus("status-demo", check + text);
31
31
  });
32
-
33
- pi.on("session_switch", async (event, ctx) => {
34
- if (event.reason === "new") {
35
- turnCount = 0;
36
- const theme = ctx.ui.theme;
37
- ctx.ui.setStatus("status-demo", theme.fg("dim", "Ready"));
38
- }
39
- });
40
32
  }
@@ -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.27.2",
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.27.2",
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.27.2",
4
+ "version": "1.29.0",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -9,7 +9,7 @@ import { AuthStorage, createAgentSession, ModelRegistry } from "@mariozechner/pi
9
9
 
10
10
  // Set up auth storage and model registry
11
11
  const authStorage = AuthStorage.create();
12
- const modelRegistry = new ModelRegistry(authStorage);
12
+ const modelRegistry = ModelRegistry.create(authStorage);
13
13
 
14
14
  // Option 1: Find a specific built-in model by provider/id
15
15
  const opus = getModel("anthropic", "claude-opus-4-5");
@@ -9,7 +9,7 @@ import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "
9
9
  // Default: AuthStorage uses ~/.pi/agent/auth.json
10
10
  // ModelRegistry loads built-in + custom models from ~/.pi/agent/models.json
11
11
  const authStorage = AuthStorage.create();
12
- const modelRegistry = new ModelRegistry(authStorage);
12
+ const modelRegistry = ModelRegistry.create(authStorage);
13
13
 
14
14
  await createAgentSession({
15
15
  sessionManager: SessionManager.inMemory(),
@@ -20,7 +20,7 @@ console.log("Session with default auth storage and model registry");
20
20
 
21
21
  // Custom auth storage location
22
22
  const customAuthStorage = AuthStorage.create("/tmp/my-app/auth.json");
23
- const customModelRegistry = new ModelRegistry(customAuthStorage, "/tmp/my-app/models.json");
23
+ const customModelRegistry = ModelRegistry.create(customAuthStorage, "/tmp/my-app/models.json");
24
24
 
25
25
  await createAgentSession({
26
26
  sessionManager: SessionManager.inMemory(),
@@ -39,7 +39,7 @@ await createAgentSession({
39
39
  console.log("Session with runtime API key override");
40
40
 
41
41
  // No models.json - only built-in models
42
- const simpleRegistry = new ModelRegistry(authStorage); // null = no models.json
42
+ const simpleRegistry = ModelRegistry.inMemory(authStorage);
43
43
  await createAgentSession({
44
44
  sessionManager: SessionManager.inMemory(),
45
45
  authStorage,
@@ -30,7 +30,7 @@ if (process.env.MY_ANTHROPIC_KEY) {
30
30
  }
31
31
 
32
32
  // Model registry with no custom models.json
33
- const modelRegistry = new ModelRegistry(authStorage);
33
+ const modelRegistry = ModelRegistry.inMemory(authStorage);
34
34
 
35
35
  const model = getModel("anthropic", "claude-sonnet-4-20250514");
36
36
  if (!model) throw new Error("Model not found");
@@ -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
 
@@ -44,7 +47,7 @@ import {
44
47
 
45
48
  // Auth and models setup
46
49
  const authStorage = AuthStorage.create();
47
- const modelRegistry = new ModelRegistry(authStorage);
50
+ const modelRegistry = ModelRegistry.create(authStorage);
48
51
 
49
52
  // Minimal
50
53
  const { session } = await createAgentSession({ authStorage, modelRegistry });
@@ -73,7 +76,7 @@ const { session } = await createAgentSession({
73
76
  // Full control
74
77
  const customAuth = AuthStorage.create("/my/app/auth.json");
75
78
  customAuth.setRuntimeApiKey("anthropic", process.env.MY_KEY!);
76
- const customRegistry = new ModelRegistry(customAuth);
79
+ const customRegistry = ModelRegistry.create(customAuth);
77
80
 
78
81
  const resourceLoader = new DefaultResourceLoader({
79
82
  systemPromptOverride: () => "You are helpful.",
@@ -109,7 +112,7 @@ await session.prompt("Hello");
109
112
  | Option | Default | Description |
110
113
  |--------|---------|-------------|
111
114
  | `authStorage` | `AuthStorage.create()` | Credential storage |
112
- | `modelRegistry` | `new ModelRegistry(authStorage)` | Model registry |
115
+ | `modelRegistry` | `ModelRegistry.create(authStorage)` | Model registry |
113
116
  | `cwd` | `process.cwd()` | Working directory |
114
117
  | `agentDir` | `~/.pi/agent` | Config directory |
115
118
  | `model` | From settings/first available | Model to use |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mariozechner/pi-coding-agent",
3
- "version": "0.63.2",
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.63.2",
44
- "@mariozechner/pi-ai": "^0.63.2",
45
- "@mariozechner/pi-tui": "^0.63.2",
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",