@earendil-works/pi-coding-agent 0.74.0 → 0.74.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 (139) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +8 -6
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +1 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +10 -2
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +13 -16
  11. package/dist/config.js.map +1 -1
  12. package/dist/core/agent-session.d.ts.map +1 -1
  13. package/dist/core/agent-session.js +2 -2
  14. package/dist/core/agent-session.js.map +1 -1
  15. package/dist/core/bash-executor.d.ts.map +1 -1
  16. package/dist/core/bash-executor.js +1 -1
  17. package/dist/core/bash-executor.js.map +1 -1
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +2 -2
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/model-registry.d.ts.map +1 -1
  22. package/dist/core/model-registry.js +1 -0
  23. package/dist/core/model-registry.js.map +1 -1
  24. package/dist/core/model-resolver.d.ts.map +1 -1
  25. package/dist/core/model-resolver.js +1 -0
  26. package/dist/core/model-resolver.js.map +1 -1
  27. package/dist/core/package-manager.d.ts +1 -0
  28. package/dist/core/package-manager.d.ts.map +1 -1
  29. package/dist/core/package-manager.js +45 -7
  30. package/dist/core/package-manager.js.map +1 -1
  31. package/dist/core/prompt-templates.d.ts.map +1 -1
  32. package/dist/core/prompt-templates.js +6 -4
  33. package/dist/core/prompt-templates.js.map +1 -1
  34. package/dist/core/provider-display-names.d.ts.map +1 -1
  35. package/dist/core/provider-display-names.js +1 -0
  36. package/dist/core/provider-display-names.js.map +1 -1
  37. package/dist/core/sdk.d.ts +1 -1
  38. package/dist/core/sdk.d.ts.map +1 -1
  39. package/dist/core/sdk.js +1 -1
  40. package/dist/core/sdk.js.map +1 -1
  41. package/dist/core/session-manager.d.ts +1 -1
  42. package/dist/core/session-manager.d.ts.map +1 -1
  43. package/dist/core/session-manager.js +39 -9
  44. package/dist/core/session-manager.js.map +1 -1
  45. package/dist/core/skills.d.ts.map +1 -1
  46. package/dist/core/skills.js +2 -5
  47. package/dist/core/skills.js.map +1 -1
  48. package/dist/core/tools/read.d.ts.map +1 -1
  49. package/dist/core/tools/read.js +2 -1
  50. package/dist/core/tools/read.js.map +1 -1
  51. package/dist/core/tools/render-utils.d.ts.map +1 -1
  52. package/dist/core/tools/render-utils.js +1 -1
  53. package/dist/core/tools/render-utils.js.map +1 -1
  54. package/dist/main.d.ts.map +1 -1
  55. package/dist/main.js +0 -10
  56. package/dist/main.js.map +1 -1
  57. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  58. package/dist/modes/interactive/components/bash-execution.js +1 -1
  59. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  60. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  61. package/dist/modes/interactive/components/config-selector.js +23 -1
  62. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  63. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  64. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  65. package/dist/modes/interactive/components/extension-selector.js +6 -1
  66. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  67. package/dist/modes/interactive/components/keybinding-hints.d.ts +5 -0
  68. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  69. package/dist/modes/interactive/components/keybinding-hints.js +19 -5
  70. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  71. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  72. package/dist/modes/interactive/components/settings-selector.js +3 -1
  73. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  74. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  75. package/dist/modes/interactive/components/tree-selector.js +2 -1
  76. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  77. package/dist/modes/interactive/interactive-mode.d.ts +12 -4
  78. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  79. package/dist/modes/interactive/interactive-mode.js +67 -27
  80. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  81. package/dist/modes/interactive/theme/dark.json +1 -1
  82. package/dist/modes/interactive/theme/light.json +1 -1
  83. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  84. package/dist/modes/interactive/theme/theme.js +3 -1
  85. package/dist/modes/interactive/theme/theme.js.map +1 -1
  86. package/dist/utils/ansi.d.ts +2 -0
  87. package/dist/utils/ansi.d.ts.map +1 -0
  88. package/dist/utils/ansi.js +52 -0
  89. package/dist/utils/ansi.js.map +1 -0
  90. package/dist/utils/html.d.ts +7 -0
  91. package/dist/utils/html.d.ts.map +1 -0
  92. package/dist/utils/html.js +40 -0
  93. package/dist/utils/html.js.map +1 -0
  94. package/dist/utils/mime.d.ts +1 -0
  95. package/dist/utils/mime.d.ts.map +1 -1
  96. package/dist/utils/mime.js +59 -16
  97. package/dist/utils/mime.js.map +1 -1
  98. package/dist/utils/paths.d.ts +2 -0
  99. package/dist/utils/paths.d.ts.map +1 -1
  100. package/dist/utils/paths.js +16 -0
  101. package/dist/utils/paths.js.map +1 -1
  102. package/dist/utils/syntax-highlight.d.ts +12 -0
  103. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  104. package/dist/utils/syntax-highlight.js +118 -0
  105. package/dist/utils/syntax-highlight.js.map +1 -0
  106. package/dist/utils/tools-manager.d.ts.map +1 -1
  107. package/dist/utils/tools-manager.js +80 -8
  108. package/dist/utils/tools-manager.js.map +1 -1
  109. package/docs/custom-provider.md +58 -3
  110. package/docs/extensions.md +1 -1
  111. package/docs/index.md +7 -1
  112. package/docs/models.md +2 -2
  113. package/docs/providers.md +2 -0
  114. package/docs/sdk.md +24 -44
  115. package/docs/skills.md +3 -4
  116. package/docs/termux.md +3 -3
  117. package/docs/themes.md +2 -2
  118. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  119. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  120. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  121. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  122. package/examples/extensions/sandbox/package-lock.json +2 -2
  123. package/examples/extensions/sandbox/package.json +1 -1
  124. package/examples/extensions/with-deps/package-lock.json +2 -2
  125. package/examples/extensions/with-deps/package.json +1 -1
  126. package/examples/sdk/01-minimal.ts +14 -10
  127. package/examples/sdk/02-custom-model.ts +12 -8
  128. package/examples/sdk/03-custom-prompt.ts +24 -16
  129. package/examples/sdk/04-skills.ts +2 -2
  130. package/examples/sdk/05-tools.ts +8 -4
  131. package/examples/sdk/06-extensions.ts +11 -7
  132. package/examples/sdk/07-context-files.ts +2 -2
  133. package/examples/sdk/08-prompt-templates.ts +2 -2
  134. package/examples/sdk/09-api-keys-and-oauth.ts +8 -4
  135. package/examples/sdk/10-settings.ts +4 -4
  136. package/examples/sdk/11-sessions.ts +4 -0
  137. package/examples/sdk/12-full-control.ts +11 -7
  138. package/examples/sdk/README.md +5 -8
  139. package/package.json +6 -11
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
2
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
3
  "name": "dynamic-resources",
4
4
  "vars": {
5
5
  "cyan": "#00d7ff",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "1.4.0",
9
+ "version": "1.4.1",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "1.4.0",
4
+ "version": "1.4.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": "0.74.0",
3
+ "version": "0.74.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.74.0",
9
+ "version": "0.74.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": "0.74.0",
4
+ "version": "0.74.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -9,14 +9,18 @@ import { createAgentSession } from "@earendil-works/pi-coding-agent";
9
9
 
10
10
  const { session } = await createAgentSession();
11
11
 
12
- session.subscribe((event) => {
13
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
14
- process.stdout.write(event.assistantMessageEvent.delta);
15
- }
16
- });
12
+ try {
13
+ session.subscribe((event) => {
14
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
15
+ process.stdout.write(event.assistantMessageEvent.delta);
16
+ }
17
+ });
17
18
 
18
- await session.prompt("What files are in the current directory?");
19
- session.state.messages.forEach((msg) => {
20
- console.log(msg);
21
- });
22
- console.log();
19
+ await session.prompt("What files are in the current directory?");
20
+ session.state.messages.forEach((msg) => {
21
+ console.log(msg);
22
+ });
23
+ console.log();
24
+ } finally {
25
+ session.dispose();
26
+ }
@@ -38,12 +38,16 @@ if (available.length > 0) {
38
38
  modelRegistry,
39
39
  });
40
40
 
41
- session.subscribe((event) => {
42
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
43
- process.stdout.write(event.assistantMessageEvent.delta);
44
- }
45
- });
46
-
47
- await session.prompt("Say hello in one sentence.");
48
- console.log();
41
+ try {
42
+ session.subscribe((event) => {
43
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
44
+ process.stdout.write(event.assistantMessageEvent.delta);
45
+ }
46
+ });
47
+
48
+ await session.prompt("Say hello in one sentence.");
49
+ console.log();
50
+ } finally {
51
+ session.dispose();
52
+ }
49
53
  }
@@ -30,15 +30,19 @@ const { session: session1 } = await createAgentSession({
30
30
  sessionManager: SessionManager.inMemory(),
31
31
  });
32
32
 
33
- session1.subscribe((event) => {
34
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
35
- process.stdout.write(event.assistantMessageEvent.delta);
36
- }
37
- });
33
+ try {
34
+ session1.subscribe((event) => {
35
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
36
+ process.stdout.write(event.assistantMessageEvent.delta);
37
+ }
38
+ });
38
39
 
39
- console.log("=== Replace prompt ===");
40
- await session1.prompt("What is 2 + 2?");
41
- console.log("\n");
40
+ console.log("=== Replace prompt ===");
41
+ await session1.prompt("What is 2 + 2?");
42
+ console.log("\n");
43
+ } finally {
44
+ session1.dispose();
45
+ }
42
46
 
43
47
  // Option 2: Append instructions to the default prompt
44
48
  const loader2 = new DefaultResourceLoader({
@@ -56,12 +60,16 @@ const { session: session2 } = await createAgentSession({
56
60
  sessionManager: SessionManager.inMemory(),
57
61
  });
58
62
 
59
- session2.subscribe((event) => {
60
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
61
- process.stdout.write(event.assistantMessageEvent.delta);
62
- }
63
- });
63
+ try {
64
+ session2.subscribe((event) => {
65
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
66
+ process.stdout.write(event.assistantMessageEvent.delta);
67
+ }
68
+ });
64
69
 
65
- console.log("=== Modify prompt ===");
66
- await session2.prompt("List 3 benefits of TypeScript.");
67
- console.log();
70
+ console.log("=== Modify prompt ===");
71
+ await session2.prompt("List 3 benefits of TypeScript.");
72
+ console.log();
73
+ } finally {
74
+ session2.dispose();
75
+ }
@@ -47,9 +47,9 @@ if (diagnostics.length > 0) {
47
47
  console.log("Warnings:", diagnostics);
48
48
  }
49
49
 
50
- await createAgentSession({
50
+ const { session } = await createAgentSession({
51
51
  resourceLoader: loader,
52
52
  sessionManager: SessionManager.inMemory(),
53
53
  });
54
-
55
54
  console.log("Session created with filtered skills");
55
+ session.dispose();
@@ -13,32 +13,36 @@
13
13
  import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent";
14
14
 
15
15
  // Read-only mode (no edit/write)
16
- await createAgentSession({
16
+ const { session: readOnlySession } = await createAgentSession({
17
17
  tools: ["read", "grep", "find", "ls"],
18
18
  sessionManager: SessionManager.inMemory(),
19
19
  });
20
20
  console.log("Read-only session created");
21
+ readOnlySession.dispose();
21
22
 
22
23
  // Custom tool selection
23
- await createAgentSession({
24
+ const { session: customToolsSession } = await createAgentSession({
24
25
  tools: ["read", "bash", "grep"],
25
26
  sessionManager: SessionManager.inMemory(),
26
27
  });
27
28
  console.log("Custom tools session created");
29
+ customToolsSession.dispose();
28
30
 
29
31
  // With custom cwd
30
32
  const customCwd = "/path/to/project";
31
- await createAgentSession({
33
+ const { session: customCwdSession } = await createAgentSession({
32
34
  cwd: customCwd,
33
35
  tools: ["read", "bash", "edit", "write"],
34
36
  sessionManager: SessionManager.inMemory(customCwd),
35
37
  });
36
38
  console.log("Custom cwd session created");
39
+ customCwdSession.dispose();
37
40
 
38
41
  // Or pick specific tools for custom cwd
39
- await createAgentSession({
42
+ const { session: specificToolsSession } = await createAgentSession({
40
43
  cwd: customCwd,
41
44
  tools: ["read", "bash", "grep"],
42
45
  sessionManager: SessionManager.inMemory(customCwd),
43
46
  });
44
47
  console.log("Specific tools with custom cwd session created");
48
+ specificToolsSession.dispose();
@@ -42,14 +42,18 @@ const { session } = await createAgentSession({
42
42
  sessionManager: SessionManager.inMemory(),
43
43
  });
44
44
 
45
- session.subscribe((event) => {
46
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
47
- process.stdout.write(event.assistantMessageEvent.delta);
48
- }
49
- });
45
+ try {
46
+ session.subscribe((event) => {
47
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
48
+ process.stdout.write(event.assistantMessageEvent.delta);
49
+ }
50
+ });
50
51
 
51
- await session.prompt("List files in the current directory.");
52
- console.log();
52
+ await session.prompt("List files in the current directory.");
53
+ console.log();
54
+ } finally {
55
+ session.dispose();
56
+ }
53
57
 
54
58
  // Example extension file (./my-logging-extension.ts):
55
59
  /*
@@ -39,9 +39,9 @@ for (const file of discovered) {
39
39
  console.log(` - ${file.path} (${file.content.length} chars)`);
40
40
  }
41
41
 
42
- await createAgentSession({
42
+ const { session } = await createAgentSession({
43
43
  resourceLoader: loader,
44
44
  sessionManager: SessionManager.inMemory(),
45
45
  });
46
-
47
46
  console.log(`Session created with ${discovered.length + 1} context files`);
47
+ session.dispose();
@@ -43,9 +43,9 @@ for (const template of discovered) {
43
43
  console.log(` /${template.name}: ${template.description}`);
44
44
  }
45
45
 
46
- await createAgentSession({
46
+ const { session } = await createAgentSession({
47
47
  resourceLoader: loader,
48
48
  sessionManager: SessionManager.inMemory(),
49
49
  });
50
-
51
50
  console.log(`Session created with ${discovered.length + 1} prompt templates`);
51
+ session.dispose();
@@ -11,38 +11,42 @@ import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "
11
11
  const authStorage = AuthStorage.create();
12
12
  const modelRegistry = ModelRegistry.create(authStorage);
13
13
 
14
- await createAgentSession({
14
+ const { session: defaultAuthSession } = await createAgentSession({
15
15
  sessionManager: SessionManager.inMemory(),
16
16
  authStorage,
17
17
  modelRegistry,
18
18
  });
19
19
  console.log("Session with default auth storage and model registry");
20
+ defaultAuthSession.dispose();
20
21
 
21
22
  // Custom auth storage location
22
23
  const customAuthStorage = AuthStorage.create("/tmp/my-app/auth.json");
23
24
  const customModelRegistry = ModelRegistry.create(customAuthStorage, "/tmp/my-app/models.json");
24
25
 
25
- await createAgentSession({
26
+ const { session: customAuthSession } = await createAgentSession({
26
27
  sessionManager: SessionManager.inMemory(),
27
28
  authStorage: customAuthStorage,
28
29
  modelRegistry: customModelRegistry,
29
30
  });
30
31
  console.log("Session with custom auth storage location");
32
+ customAuthSession.dispose();
31
33
 
32
34
  // Runtime API key override (not persisted to disk)
33
35
  authStorage.setRuntimeApiKey("anthropic", "sk-my-temp-key");
34
- await createAgentSession({
36
+ const { session: runtimeKeySession } = await createAgentSession({
35
37
  sessionManager: SessionManager.inMemory(),
36
38
  authStorage,
37
39
  modelRegistry,
38
40
  });
39
41
  console.log("Session with runtime API key override");
42
+ runtimeKeySession.dispose();
40
43
 
41
44
  // No models.json - only built-in models
42
45
  const simpleRegistry = ModelRegistry.inMemory(authStorage);
43
- await createAgentSession({
46
+ const { session: builtInModelsSession } = await createAgentSession({
44
47
  sessionManager: SessionManager.inMemory(),
45
48
  authStorage,
46
49
  modelRegistry: simpleRegistry,
47
50
  });
48
51
  console.log("Session with only built-in models");
52
+ builtInModelsSession.dispose();
@@ -19,12 +19,12 @@ settingsManager.applyOverrides({
19
19
  retry: { enabled: true, maxRetries: 5, baseDelayMs: 1000 },
20
20
  });
21
21
 
22
- await createAgentSession({
22
+ const { session: customSettingsSession } = await createAgentSession({
23
23
  settingsManager,
24
24
  sessionManager: SessionManager.inMemory(),
25
25
  });
26
-
27
26
  console.log("Session created with custom settings");
27
+ customSettingsSession.dispose();
28
28
 
29
29
  // Setters update memory immediately and queue persistence writes.
30
30
  // Call flush() when you need a durability boundary.
@@ -45,9 +45,9 @@ const inMemorySettings = SettingsManager.inMemory({
45
45
  retry: { enabled: false },
46
46
  });
47
47
 
48
- await createAgentSession({
48
+ const { session: testSession } = await createAgentSession({
49
49
  settingsManager: inMemorySettings,
50
50
  sessionManager: SessionManager.inMemory(),
51
51
  });
52
-
53
52
  console.log("Test session created with in-memory settings");
53
+ testSession.dispose();
@@ -11,12 +11,14 @@ const { session: inMemory } = await createAgentSession({
11
11
  sessionManager: SessionManager.inMemory(),
12
12
  });
13
13
  console.log("In-memory session:", inMemory.sessionFile ?? "(none)");
14
+ inMemory.dispose();
14
15
 
15
16
  // New persistent session
16
17
  const { session: newSession } = await createAgentSession({
17
18
  sessionManager: SessionManager.create(process.cwd()),
18
19
  });
19
20
  console.log("New session file:", newSession.sessionFile);
21
+ newSession.dispose();
20
22
 
21
23
  // Continue most recent session (or create new if none)
22
24
  const { session: continued, modelFallbackMessage } = await createAgentSession({
@@ -24,6 +26,7 @@ const { session: continued, modelFallbackMessage } = await createAgentSession({
24
26
  });
25
27
  if (modelFallbackMessage) console.log("Note:", modelFallbackMessage);
26
28
  console.log("Continued session:", continued.sessionFile);
29
+ continued.dispose();
27
30
 
28
31
  // List and open specific session
29
32
  const sessions = await SessionManager.list(process.cwd());
@@ -37,6 +40,7 @@ if (sessions.length > 0) {
37
40
  sessionManager: SessionManager.open(sessions[0].path),
38
41
  });
39
42
  console.log(`\nOpened: ${opened.sessionId}`);
43
+ opened.dispose();
40
44
  }
41
45
 
42
46
  // Custom session directory (no cwd encoding)
@@ -63,11 +63,15 @@ const { session } = await createAgentSession({
63
63
  settingsManager,
64
64
  });
65
65
 
66
- session.subscribe((event) => {
67
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
68
- process.stdout.write(event.assistantMessageEvent.delta);
69
- }
70
- });
66
+ try {
67
+ session.subscribe((event) => {
68
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
69
+ process.stdout.write(event.assistantMessageEvent.delta);
70
+ }
71
+ });
71
72
 
72
- await session.prompt("List files in the current directory.");
73
- console.log();
73
+ await session.prompt("List files in the current directory.");
74
+ console.log();
75
+ } finally {
76
+ session.dispose();
77
+ }
@@ -12,7 +12,7 @@ The runtime example shows how to build a recreate function that closes over proc
12
12
  | `02-custom-model.ts` | Select model and thinking level |
13
13
  | `03-custom-prompt.ts` | Replace or modify system prompt |
14
14
  | `04-skills.ts` | Discover, filter, or replace skills |
15
- | `05-tools.ts` | Built-in tools, custom tools |
15
+ | `05-tools.ts` | Built-in tool allowlists |
16
16
  | `06-extensions.ts` | Logging, blocking, result modification |
17
17
  | `07-context-files.ts` | AGENTS.md context files |
18
18
  | `08-slash-commands.ts` | File-based slash commands |
@@ -40,9 +40,6 @@ import {
40
40
  ModelRegistry,
41
41
  SessionManager,
42
42
  SettingsManager,
43
- codingTools,
44
- readOnlyTools,
45
- readTool, bashTool, editTool, writeTool,
46
43
  } from "@earendil-works/pi-coding-agent";
47
44
 
48
45
  // Auth and models setup
@@ -64,7 +61,7 @@ await loader.reload();
64
61
  const { session } = await createAgentSession({ resourceLoader: loader, authStorage, modelRegistry });
65
62
 
66
63
  // Read-only
67
- const { session } = await createAgentSession({ tools: readOnlyTools, authStorage, modelRegistry });
64
+ const { session } = await createAgentSession({ tools: ["read", "grep", "find", "ls"], authStorage, modelRegistry });
68
65
 
69
66
  // In-memory
70
67
  const { session } = await createAgentSession({
@@ -92,8 +89,8 @@ const { session } = await createAgentSession({
92
89
  authStorage: customAuth,
93
90
  modelRegistry: customRegistry,
94
91
  resourceLoader,
95
- tools: [readTool, bashTool],
96
- customTools: [{ tool: myTool }],
92
+ tools: ["read", "bash", "my_tool"],
93
+ customTools: [myTool],
97
94
  sessionManager: SessionManager.inMemory(),
98
95
  settingsManager: SettingsManager.inMemory(),
99
96
  });
@@ -117,7 +114,7 @@ await session.prompt("Hello");
117
114
  | `agentDir` | `~/.pi/agent` | Config directory |
118
115
  | `model` | From settings/first available | Model to use |
119
116
  | `thinkingLevel` | From settings/"off" | off, low, medium, high |
120
- | `tools` | `codingTools` | Built-in tools |
117
+ | `tools` | `["read", "bash", "edit", "write"]` built-ins | Allowlist tool names across built-in, extension, and custom tools |
121
118
  | `customTools` | `[]` | Additional tool definitions |
122
119
  | `resourceLoader` | DefaultResourceLoader | Resource loader for extensions, skills, prompts, themes |
123
120
  | `sessionManager` | `SessionManager.create(cwd)` | Persistence |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-coding-agent",
3
- "version": "0.74.0",
3
+ "version": "0.74.1",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -38,26 +38,21 @@
38
38
  "prepublishOnly": "npm run clean && npm run build"
39
39
  },
40
40
  "dependencies": {
41
- "@earendil-works/pi-agent-core": "^0.74.0",
42
- "@earendil-works/pi-ai": "^0.74.0",
43
- "@earendil-works/pi-tui": "^0.74.0",
41
+ "@earendil-works/pi-agent-core": "^0.74.1",
42
+ "@earendil-works/pi-ai": "^0.74.1",
43
+ "@earendil-works/pi-tui": "^0.74.1",
44
44
  "@silvia-odwyer/photon-node": "^0.3.4",
45
45
  "chalk": "^5.5.0",
46
- "cli-highlight": "^2.1.11",
47
46
  "diff": "^8.0.2",
48
- "extract-zip": "^2.0.1",
49
- "file-type": "^21.1.1",
50
47
  "glob": "^13.0.1",
48
+ "highlight.js": "^10.7.3",
51
49
  "hosted-git-info": "^9.0.2",
52
50
  "ignore": "^7.0.5",
53
51
  "jiti": "^2.7.0",
54
- "marked": "^15.0.12",
55
52
  "minimatch": "^10.2.3",
56
53
  "proper-lockfile": "^4.1.2",
57
- "strip-ansi": "^7.1.0",
58
54
  "typebox": "^1.1.24",
59
55
  "undici": "^7.19.1",
60
- "uuid": "^14.0.0",
61
56
  "yaml": "^2.8.2"
62
57
  },
63
58
  "overrides": {
@@ -67,7 +62,7 @@
67
62
  }
68
63
  },
69
64
  "optionalDependencies": {
70
- "@mariozechner/clipboard": "^0.3.5"
65
+ "@mariozechner/clipboard": "^0.3.6"
71
66
  },
72
67
  "devDependencies": {
73
68
  "@types/diff": "^7.0.2",