@mariozechner/pi-coding-agent 0.49.2 → 0.50.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 (237) hide show
  1. package/CHANGELOG.md +126 -1
  2. package/README.md +310 -1229
  3. package/dist/cli/args.d.ts +5 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +57 -22
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +14 -0
  8. package/dist/cli/config-selector.d.ts.map +1 -0
  9. package/dist/cli/config-selector.js +31 -0
  10. package/dist/cli/config-selector.js.map +1 -0
  11. package/dist/cli/session-picker.d.ts.map +1 -1
  12. package/dist/cli/session-picker.js +1 -1
  13. package/dist/cli/session-picker.js.map +1 -1
  14. package/dist/config.d.ts +2 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +6 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +53 -34
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +262 -67
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/auth-storage.d.ts +8 -18
  23. package/dist/core/auth-storage.d.ts.map +1 -1
  24. package/dist/core/auth-storage.js +39 -55
  25. package/dist/core/auth-storage.js.map +1 -1
  26. package/dist/core/bash-executor.d.ts.map +1 -1
  27. package/dist/core/bash-executor.js +2 -1
  28. package/dist/core/bash-executor.js.map +1 -1
  29. package/dist/core/diagnostics.d.ts +15 -0
  30. package/dist/core/diagnostics.d.ts.map +1 -0
  31. package/dist/core/diagnostics.js +2 -0
  32. package/dist/core/diagnostics.js.map +1 -0
  33. package/dist/core/export-html/template.css +9 -0
  34. package/dist/core/export-html/template.js +6 -4
  35. package/dist/core/extensions/index.d.ts +1 -1
  36. package/dist/core/extensions/index.d.ts.map +1 -1
  37. package/dist/core/extensions/index.js.map +1 -1
  38. package/dist/core/extensions/loader.d.ts +1 -1
  39. package/dist/core/extensions/loader.d.ts.map +1 -1
  40. package/dist/core/extensions/loader.js +10 -1
  41. package/dist/core/extensions/loader.js.map +1 -1
  42. package/dist/core/extensions/runner.d.ts +9 -3
  43. package/dist/core/extensions/runner.d.ts.map +1 -1
  44. package/dist/core/extensions/runner.js +39 -12
  45. package/dist/core/extensions/runner.js.map +1 -1
  46. package/dist/core/extensions/types.d.ts +112 -1
  47. package/dist/core/extensions/types.d.ts.map +1 -1
  48. package/dist/core/extensions/types.js.map +1 -1
  49. package/dist/core/footer-data-provider.d.ts +9 -2
  50. package/dist/core/footer-data-provider.d.ts.map +1 -1
  51. package/dist/core/footer-data-provider.js +13 -0
  52. package/dist/core/footer-data-provider.js.map +1 -1
  53. package/dist/core/model-registry.d.ts +42 -2
  54. package/dist/core/model-registry.d.ts.map +1 -1
  55. package/dist/core/model-registry.js +154 -44
  56. package/dist/core/model-registry.js.map +1 -1
  57. package/dist/core/model-resolver.d.ts.map +1 -1
  58. package/dist/core/model-resolver.js +3 -2
  59. package/dist/core/model-resolver.js.map +1 -1
  60. package/dist/core/package-manager.d.ts +129 -0
  61. package/dist/core/package-manager.d.ts.map +1 -0
  62. package/dist/core/package-manager.js +1148 -0
  63. package/dist/core/package-manager.js.map +1 -0
  64. package/dist/core/prompt-templates.d.ts +6 -0
  65. package/dist/core/prompt-templates.d.ts.map +1 -1
  66. package/dist/core/prompt-templates.js +114 -54
  67. package/dist/core/prompt-templates.js.map +1 -1
  68. package/dist/core/resource-loader.d.ts +160 -0
  69. package/dist/core/resource-loader.d.ts.map +1 -0
  70. package/dist/core/resource-loader.js +604 -0
  71. package/dist/core/resource-loader.js.map +1 -0
  72. package/dist/core/sdk.d.ts +14 -105
  73. package/dist/core/sdk.d.ts.map +1 -1
  74. package/dist/core/sdk.js +52 -304
  75. package/dist/core/sdk.js.map +1 -1
  76. package/dist/core/session-manager.d.ts.map +1 -1
  77. package/dist/core/session-manager.js +45 -1
  78. package/dist/core/session-manager.js.map +1 -1
  79. package/dist/core/settings-manager.d.ts +39 -16
  80. package/dist/core/settings-manager.d.ts.map +1 -1
  81. package/dist/core/settings-manager.js +107 -25
  82. package/dist/core/settings-manager.js.map +1 -1
  83. package/dist/core/skills.d.ts +18 -10
  84. package/dist/core/skills.d.ts.map +1 -1
  85. package/dist/core/skills.js +126 -93
  86. package/dist/core/skills.js.map +1 -1
  87. package/dist/core/system-prompt.d.ts +3 -27
  88. package/dist/core/system-prompt.d.ts.map +1 -1
  89. package/dist/core/system-prompt.js +16 -103
  90. package/dist/core/system-prompt.js.map +1 -1
  91. package/dist/core/tools/bash.d.ts.map +1 -1
  92. package/dist/core/tools/bash.js +2 -1
  93. package/dist/core/tools/bash.js.map +1 -1
  94. package/dist/core/tools/read.d.ts.map +1 -1
  95. package/dist/core/tools/read.js +4 -4
  96. package/dist/core/tools/read.js.map +1 -1
  97. package/dist/index.d.ts +12 -7
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +8 -6
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.d.ts.map +1 -1
  102. package/dist/main.js +209 -97
  103. package/dist/main.js.map +1 -1
  104. package/dist/modes/interactive/components/assistant-message.d.ts +3 -2
  105. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  106. package/dist/modes/interactive/components/assistant-message.js +5 -3
  107. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  108. package/dist/modes/interactive/components/bordered-loader.d.ts +5 -1
  109. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  110. package/dist/modes/interactive/components/bordered-loader.js +29 -9
  111. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  112. package/dist/modes/interactive/components/branch-summary-message.d.ts +3 -2
  113. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  114. package/dist/modes/interactive/components/branch-summary-message.js +4 -2
  115. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  116. package/dist/modes/interactive/components/compaction-summary-message.d.ts +3 -2
  117. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  118. package/dist/modes/interactive/components/compaction-summary-message.js +4 -2
  119. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  120. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  121. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  122. package/dist/modes/interactive/components/config-selector.js +468 -0
  123. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  124. package/dist/modes/interactive/components/custom-message.d.ts +3 -2
  125. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  126. package/dist/modes/interactive/components/custom-message.js +4 -2
  127. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  128. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  129. package/dist/modes/interactive/components/footer.js +9 -0
  130. package/dist/modes/interactive/components/footer.js.map +1 -1
  131. package/dist/modes/interactive/components/index.d.ts +1 -0
  132. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  133. package/dist/modes/interactive/components/index.js +1 -0
  134. package/dist/modes/interactive/components/index.js.map +1 -1
  135. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  136. package/dist/modes/interactive/components/oauth-selector.js +3 -4
  137. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  138. package/dist/modes/interactive/components/session-selector.d.ts +18 -1
  139. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  140. package/dist/modes/interactive/components/session-selector.js +195 -87
  141. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  142. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  143. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  144. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  145. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  146. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  147. package/dist/modes/interactive/components/tool-execution.js +12 -5
  148. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  149. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  150. package/dist/modes/interactive/components/tree-selector.js +2 -2
  151. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  152. package/dist/modes/interactive/components/user-message.d.ts +2 -2
  153. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/user-message.js +2 -2
  155. package/dist/modes/interactive/components/user-message.js.map +1 -1
  156. package/dist/modes/interactive/interactive-mode.d.ts +47 -2
  157. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  158. package/dist/modes/interactive/interactive-mode.js +566 -211
  159. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  160. package/dist/modes/interactive/theme/dark.json +1 -1
  161. package/dist/modes/interactive/theme/light.json +1 -1
  162. package/dist/modes/interactive/theme/theme-schema.json +8 -1
  163. package/dist/modes/interactive/theme/theme.d.ts +8 -1
  164. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  165. package/dist/modes/interactive/theme/theme.js +79 -28
  166. package/dist/modes/interactive/theme/theme.js.map +1 -1
  167. package/dist/modes/print-mode.d.ts.map +1 -1
  168. package/dist/modes/print-mode.js +25 -89
  169. package/dist/modes/print-mode.js.map +1 -1
  170. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  171. package/dist/modes/rpc/rpc-mode.js +32 -92
  172. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  173. package/dist/utils/git.d.ts +2 -0
  174. package/dist/utils/git.d.ts.map +1 -0
  175. package/dist/utils/git.js +6 -0
  176. package/dist/utils/git.js.map +1 -0
  177. package/dist/utils/shell.d.ts +1 -0
  178. package/dist/utils/shell.d.ts.map +1 -1
  179. package/dist/utils/shell.js +16 -2
  180. package/dist/utils/shell.js.map +1 -1
  181. package/dist/utils/sleep.d.ts +5 -0
  182. package/dist/utils/sleep.d.ts.map +1 -0
  183. package/dist/utils/sleep.js +17 -0
  184. package/dist/utils/sleep.js.map +1 -0
  185. package/docs/compaction.md +23 -21
  186. package/docs/custom-provider.md +538 -0
  187. package/docs/development.md +69 -0
  188. package/docs/extensions.md +180 -118
  189. package/docs/images/doom-extension.png +0 -0
  190. package/docs/images/interactive-mode.png +0 -0
  191. package/docs/images/tree-view.png +0 -0
  192. package/docs/json.md +79 -0
  193. package/docs/keybindings.md +162 -0
  194. package/docs/models.md +193 -0
  195. package/docs/packages.md +163 -0
  196. package/docs/prompt-templates.md +67 -0
  197. package/docs/providers.md +147 -0
  198. package/docs/sdk.md +111 -178
  199. package/docs/session.md +167 -16
  200. package/docs/settings.md +216 -0
  201. package/docs/shell-aliases.md +13 -0
  202. package/docs/skills.md +111 -202
  203. package/docs/terminal-setup.md +65 -0
  204. package/docs/themes.md +295 -0
  205. package/docs/tui.md +36 -5
  206. package/docs/windows.md +17 -0
  207. package/examples/README.md +1 -0
  208. package/examples/extensions/README.md +24 -2
  209. package/examples/extensions/antigravity-image-gen.ts +413 -0
  210. package/examples/extensions/bookmark.ts +50 -0
  211. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  212. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  213. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  214. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  215. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  216. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  217. package/examples/extensions/doom-overlay/doom/build.sh +1 -1
  218. package/examples/extensions/event-bus.ts +43 -0
  219. package/examples/extensions/inline-bash.ts +94 -0
  220. package/examples/extensions/message-renderer.ts +59 -0
  221. package/examples/extensions/session-name.ts +27 -0
  222. package/examples/extensions/space-invaders.ts +560 -0
  223. package/examples/extensions/with-deps/package-lock.json +2 -2
  224. package/examples/extensions/with-deps/package.json +1 -1
  225. package/examples/sdk/02-custom-model.ts +3 -3
  226. package/examples/sdk/03-custom-prompt.ts +20 -9
  227. package/examples/sdk/04-skills.ts +26 -27
  228. package/examples/sdk/06-extensions.ts +15 -6
  229. package/examples/sdk/07-context-files.ts +22 -18
  230. package/examples/sdk/08-prompt-templates.ts +19 -14
  231. package/examples/sdk/09-api-keys-and-oauth.ts +5 -12
  232. package/examples/sdk/10-settings.ts +3 -3
  233. package/examples/sdk/12-full-control.ts +16 -7
  234. package/examples/sdk/README.md +24 -30
  235. package/package.json +4 -4
  236. package/docs/theme.md +0 -617
  237. package/examples/extensions/chalk-logger.ts +0 -26
@@ -5,20 +5,7 @@
5
5
  * Discover, filter, merge, or replace them.
6
6
  */
7
7
 
8
- import { createAgentSession, discoverSkills, SessionManager, type Skill } from "@mariozechner/pi-coding-agent";
9
-
10
- // Discover all skills from cwd/.pi/skills, ~/.pi/agent/skills, etc.
11
- const { skills: allSkills, warnings } = discoverSkills();
12
- console.log(
13
- "Discovered skills:",
14
- allSkills.map((s) => s.name),
15
- );
16
- if (warnings.length > 0) {
17
- console.log("Warnings:", warnings);
18
- }
19
-
20
- // Filter to specific skills
21
- const filteredSkills = allSkills.filter((s) => s.name.includes("browser") || s.name.includes("search"));
8
+ import { createAgentSession, DefaultResourceLoader, SessionManager, type Skill } from "@mariozechner/pi-coding-agent";
22
9
 
23
10
  // Or define custom skills inline
24
11
  const customSkill: Skill = {
@@ -26,22 +13,34 @@ const customSkill: Skill = {
26
13
  description: "Custom project instructions",
27
14
  filePath: "/virtual/SKILL.md",
28
15
  baseDir: "/virtual",
29
- source: "custom",
16
+ source: "path",
17
+ disableModelInvocation: false,
30
18
  };
31
19
 
32
- // Use filtered + custom skills
33
- await createAgentSession({
34
- skills: [...filteredSkills, customSkill],
35
- sessionManager: SessionManager.inMemory(),
20
+ const loader = new DefaultResourceLoader({
21
+ skillsOverride: (current) => {
22
+ const filteredSkills = current.skills.filter((s) => s.name.includes("browser") || s.name.includes("search"));
23
+ return {
24
+ skills: [...filteredSkills, customSkill],
25
+ diagnostics: current.diagnostics,
26
+ };
27
+ },
36
28
  });
29
+ await loader.reload();
37
30
 
38
- console.log(`Session created with ${filteredSkills.length + 1} skills`);
31
+ // Discover all skills from cwd/.pi/skills, ~/.pi/agent/skills, etc.
32
+ const { skills: allSkills, diagnostics } = loader.getSkills();
33
+ console.log(
34
+ "Discovered skills:",
35
+ allSkills.map((s) => s.name),
36
+ );
37
+ if (diagnostics.length > 0) {
38
+ console.log("Warnings:", diagnostics);
39
+ }
39
40
 
40
- // To disable all skills:
41
- // skills: []
41
+ await createAgentSession({
42
+ resourceLoader: loader,
43
+ sessionManager: SessionManager.inMemory(),
44
+ });
42
45
 
43
- // To use discovery with filtering via settings:
44
- // discoverSkills(process.cwd(), undefined, {
45
- // ignoredSkills: ["browser-tools"], // glob patterns to exclude
46
- // includeSkills: ["brave-*"], // glob patterns to include (empty = all)
47
- // })
46
+ console.log("Session created with filtered skills");
@@ -13,16 +13,25 @@
13
13
  * export default function (pi: ExtensionAPI) { ... }
14
14
  */
15
15
 
16
- import { createAgentSession, SessionManager } from "@mariozechner/pi-coding-agent";
16
+ import { createAgentSession, DefaultResourceLoader, SessionManager } from "@mariozechner/pi-coding-agent";
17
17
 
18
18
  // Extensions are discovered automatically from standard locations.
19
- // You can also add paths via:
20
- // 1. settings.json: { "extensions": ["./my-extension.ts"] }
21
- // 2. additionalExtensionPaths option (see below)
19
+ // You can also add paths via settings.json or DefaultResourceLoader options.
22
20
 
23
- // To add additional extension paths beyond discovery:
24
- const { session } = await createAgentSession({
21
+ const resourceLoader = new DefaultResourceLoader({
25
22
  additionalExtensionPaths: ["./my-logging-extension.ts", "./my-safety-extension.ts"],
23
+ extensionFactories: [
24
+ (pi) => {
25
+ pi.on("agent_start", () => {
26
+ console.log("[Inline Extension] Agent starting");
27
+ });
28
+ },
29
+ ],
30
+ });
31
+ await resourceLoader.reload();
32
+
33
+ const { session } = await createAgentSession({
34
+ resourceLoader,
26
35
  sessionManager: SessionManager.inMemory(),
27
36
  });
28
37
 
@@ -4,33 +4,37 @@
4
4
  * Context files provide project-specific instructions loaded into the system prompt.
5
5
  */
6
6
 
7
- import { createAgentSession, discoverContextFiles, SessionManager } from "@mariozechner/pi-coding-agent";
7
+ import { createAgentSession, DefaultResourceLoader, SessionManager } from "@mariozechner/pi-coding-agent";
8
+
9
+ // Disable context files entirely by returning an empty list in agentsFilesOverride.
10
+ const loader = new DefaultResourceLoader({
11
+ agentsFilesOverride: (current) => ({
12
+ agentsFiles: [
13
+ ...current.agentsFiles,
14
+ {
15
+ path: "/virtual/AGENTS.md",
16
+ content: `# Project Guidelines
17
+
18
+ ## Code Style
19
+ - Use TypeScript strict mode
20
+ - No any types
21
+ - Prefer const over let`,
22
+ },
23
+ ],
24
+ }),
25
+ });
26
+ await loader.reload();
8
27
 
9
28
  // Discover AGENTS.md files walking up from cwd
10
- const discovered = discoverContextFiles();
29
+ const discovered = loader.getAgentsFiles().agentsFiles;
11
30
  console.log("Discovered context files:");
12
31
  for (const file of discovered) {
13
32
  console.log(` - ${file.path} (${file.content.length} chars)`);
14
33
  }
15
34
 
16
- // Use custom context files
17
35
  await createAgentSession({
18
- contextFiles: [
19
- ...discovered,
20
- {
21
- path: "/virtual/AGENTS.md",
22
- content: `# Project Guidelines
23
-
24
- ## Code Style
25
- - Use TypeScript strict mode
26
- - No any types
27
- - Prefer const over let`,
28
- },
29
- ],
36
+ resourceLoader: loader,
30
37
  sessionManager: SessionManager.inMemory(),
31
38
  });
32
39
 
33
40
  console.log(`Session created with ${discovered.length + 1} context files`);
34
-
35
- // Disable context files:
36
- // contextFiles: []
@@ -6,23 +6,17 @@
6
6
 
7
7
  import {
8
8
  createAgentSession,
9
- discoverPromptTemplates,
9
+ DefaultResourceLoader,
10
10
  type PromptTemplate,
11
11
  SessionManager,
12
12
  } from "@mariozechner/pi-coding-agent";
13
13
 
14
- // Discover templates from cwd/.pi/prompts/ and ~/.pi/agent/prompts/
15
- const discovered = discoverPromptTemplates();
16
- console.log("Discovered prompt templates:");
17
- for (const template of discovered) {
18
- console.log(` /${template.name}: ${template.description}`);
19
- }
20
-
21
14
  // Define custom templates
22
15
  const deployTemplate: PromptTemplate = {
23
16
  name: "deploy",
24
17
  description: "Deploy the application",
25
- source: "(custom)",
18
+ source: "path",
19
+ filePath: "/virtual/prompts/deploy.md",
26
20
  content: `# Deploy Instructions
27
21
 
28
22
  1. Build: npm run build
@@ -30,13 +24,24 @@ const deployTemplate: PromptTemplate = {
30
24
  3. Deploy: npm run deploy`,
31
25
  };
32
26
 
33
- // Use discovered + custom templates
27
+ const loader = new DefaultResourceLoader({
28
+ promptsOverride: (current) => ({
29
+ prompts: [...current.prompts, deployTemplate],
30
+ diagnostics: current.diagnostics,
31
+ }),
32
+ });
33
+ await loader.reload();
34
+
35
+ // Discover templates from cwd/.pi/prompts/ and ~/.pi/agent/prompts/
36
+ const discovered = loader.getPrompts().prompts;
37
+ console.log("Discovered prompt templates:");
38
+ for (const template of discovered) {
39
+ console.log(` /${template.name}: ${template.description}`);
40
+ }
41
+
34
42
  await createAgentSession({
35
- promptTemplates: [...discovered, deployTemplate],
43
+ resourceLoader: loader,
36
44
  sessionManager: SessionManager.inMemory(),
37
45
  });
38
46
 
39
47
  console.log(`Session created with ${discovered.length + 1} prompt templates`);
40
-
41
- // Disable prompt templates:
42
- // promptTemplates: []
@@ -4,19 +4,12 @@
4
4
  * Configure API key resolution via AuthStorage and ModelRegistry.
5
5
  */
6
6
 
7
- import {
8
- AuthStorage,
9
- createAgentSession,
10
- discoverAuthStorage,
11
- discoverModels,
12
- ModelRegistry,
13
- SessionManager,
14
- } from "@mariozechner/pi-coding-agent";
7
+ import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@mariozechner/pi-coding-agent";
15
8
 
16
- // Default: discoverAuthStorage() uses ~/.pi/agent/auth.json
17
- // discoverModels() loads built-in + custom models from ~/.pi/agent/models.json
18
- const authStorage = discoverAuthStorage();
19
- const modelRegistry = discoverModels(authStorage);
9
+ // Default: AuthStorage uses ~/.pi/agent/auth.json
10
+ // ModelRegistry loads built-in + custom models from ~/.pi/agent/models.json
11
+ const authStorage = new AuthStorage();
12
+ const modelRegistry = new ModelRegistry(authStorage);
20
13
 
21
14
  await createAgentSession({
22
15
  sessionManager: SessionManager.inMemory(),
@@ -4,11 +4,11 @@
4
4
  * Override settings using SettingsManager.
5
5
  */
6
6
 
7
- import { createAgentSession, loadSettings, SessionManager, SettingsManager } from "@mariozechner/pi-coding-agent";
7
+ import { createAgentSession, SessionManager, SettingsManager } from "@mariozechner/pi-coding-agent";
8
8
 
9
9
  // Load current settings (merged global + project)
10
- const settings = loadSettings();
11
- console.log("Current settings:", JSON.stringify(settings, null, 2));
10
+ const settingsManagerFromDisk = SettingsManager.create();
11
+ console.log("Current settings:", JSON.stringify(settingsManagerFromDisk.getGlobalSettings(), null, 2));
12
12
 
13
13
  // Override specific settings
14
14
  const settingsManager = SettingsManager.create();
@@ -13,8 +13,10 @@ import {
13
13
  AuthStorage,
14
14
  createAgentSession,
15
15
  createBashTool,
16
+ createExtensionRuntime,
16
17
  createReadTool,
17
18
  ModelRegistry,
19
+ type ResourceLoader,
18
20
  SessionManager,
19
21
  SettingsManager,
20
22
  } from "@mariozechner/pi-coding-agent";
@@ -42,6 +44,19 @@ const settingsManager = SettingsManager.inMemory({
42
44
  // When using a custom cwd with explicit tools, use the factory functions
43
45
  const cwd = process.cwd();
44
46
 
47
+ const resourceLoader: ResourceLoader = {
48
+ getExtensions: () => ({ extensions: [], errors: [], runtime: createExtensionRuntime() }),
49
+ getSkills: () => ({ skills: [], diagnostics: [] }),
50
+ getPrompts: () => ({ prompts: [], diagnostics: [] }),
51
+ getThemes: () => ({ themes: [], diagnostics: [] }),
52
+ getAgentsFiles: () => ({ agentsFiles: [] }),
53
+ getSystemPrompt: () => `You are a minimal assistant.
54
+ Available: read, bash. Be concise.`,
55
+ getAppendSystemPrompt: () => [],
56
+ getPathMetadata: () => new Map(),
57
+ reload: async () => {},
58
+ };
59
+
45
60
  const { session } = await createAgentSession({
46
61
  cwd,
47
62
  agentDir: "/tmp/my-agent",
@@ -49,15 +64,9 @@ const { session } = await createAgentSession({
49
64
  thinkingLevel: "off",
50
65
  authStorage,
51
66
  modelRegistry,
52
- systemPrompt: `You are a minimal assistant.
53
- Available: read, bash. Be concise.`,
67
+ resourceLoader,
54
68
  // Use factory functions with the same cwd to ensure path resolution works correctly
55
69
  tools: [createReadTool(cwd), createBashTool(cwd)],
56
- // Pass empty array to disable extension discovery, or provide inline factories
57
- extensions: [],
58
- skills: [],
59
- contextFiles: [],
60
- promptTemplates: [],
61
70
  sessionManager: SessionManager.inMemory(),
62
71
  settingsManager,
63
72
  });
@@ -33,24 +33,18 @@ import { getModel } from "@mariozechner/pi-ai";
33
33
  import {
34
34
  AuthStorage,
35
35
  createAgentSession,
36
- discoverAuthStorage,
37
- discoverModels,
38
- discoverSkills,
39
- discoverExtensions,
40
- discoverContextFiles,
41
- discoverPromptTemplates,
42
- loadSettings,
43
- buildSystemPrompt,
36
+ DefaultResourceLoader,
44
37
  ModelRegistry,
45
38
  SessionManager,
39
+ SettingsManager,
46
40
  codingTools,
47
41
  readOnlyTools,
48
42
  readTool, bashTool, editTool, writeTool,
49
43
  } from "@mariozechner/pi-coding-agent";
50
44
 
51
45
  // Auth and models setup
52
- const authStorage = discoverAuthStorage();
53
- const modelRegistry = discoverModels(authStorage);
46
+ const authStorage = new AuthStorage();
47
+ const modelRegistry = new ModelRegistry(authStorage);
54
48
 
55
49
  // Minimal
56
50
  const { session } = await createAgentSession({ authStorage, modelRegistry });
@@ -60,11 +54,11 @@ const model = getModel("anthropic", "claude-opus-4-5");
60
54
  const { session } = await createAgentSession({ model, thinkingLevel: "high", authStorage, modelRegistry });
61
55
 
62
56
  // Modify prompt
63
- const { session } = await createAgentSession({
64
- systemPrompt: (defaultPrompt) => defaultPrompt + "\n\nBe concise.",
65
- authStorage,
66
- modelRegistry,
57
+ const loader = new DefaultResourceLoader({
58
+ systemPromptOverride: (base) => `${base}\n\nBe concise.`,
67
59
  });
60
+ await loader.reload();
61
+ const { session } = await createAgentSession({ resourceLoader: loader, authStorage, modelRegistry });
68
62
 
69
63
  // Read-only
70
64
  const { session } = await createAgentSession({ tools: readOnlyTools, authStorage, modelRegistry });
@@ -81,18 +75,24 @@ const customAuth = new AuthStorage("/my/app/auth.json");
81
75
  customAuth.setRuntimeApiKey("anthropic", process.env.MY_KEY!);
82
76
  const customRegistry = new ModelRegistry(customAuth);
83
77
 
78
+ const resourceLoader = new DefaultResourceLoader({
79
+ systemPromptOverride: () => "You are helpful.",
80
+ extensionFactories: [myExtension],
81
+ skillsOverride: () => ({ skills: [], diagnostics: [] }),
82
+ agentsFilesOverride: () => ({ agentsFiles: [] }),
83
+ promptsOverride: () => ({ prompts: [], diagnostics: [] }),
84
+ });
85
+ await resourceLoader.reload();
86
+
84
87
  const { session } = await createAgentSession({
85
88
  model,
86
89
  authStorage: customAuth,
87
90
  modelRegistry: customRegistry,
88
- systemPrompt: "You are helpful.",
91
+ resourceLoader,
89
92
  tools: [readTool, bashTool],
90
93
  customTools: [{ tool: myTool }],
91
- extensions: [{ factory: myExtension }],
92
- skills: [],
93
- contextFiles: [],
94
- promptTemplates: [],
95
94
  sessionManager: SessionManager.inMemory(),
95
+ settingsManager: SettingsManager.inMemory(),
96
96
  });
97
97
 
98
98
  // Run prompts
@@ -108,23 +108,17 @@ await session.prompt("Hello");
108
108
 
109
109
  | Option | Default | Description |
110
110
  |--------|---------|-------------|
111
- | `authStorage` | `discoverAuthStorage()` | Credential storage |
112
- | `modelRegistry` | `discoverModels(authStorage)` | Model registry |
111
+ | `authStorage` | `new AuthStorage()` | Credential storage |
112
+ | `modelRegistry` | `new ModelRegistry(authStorage)` | Model registry |
113
113
  | `cwd` | `process.cwd()` | Working directory |
114
114
  | `agentDir` | `~/.pi/agent` | Config directory |
115
115
  | `model` | From settings/first available | Model to use |
116
116
  | `thinkingLevel` | From settings/"off" | off, low, medium, high |
117
- | `systemPrompt` | Discovered | String or `(default) => modified` |
118
117
  | `tools` | `codingTools` | Built-in tools |
119
- | `customTools` | Discovered | Replaces discovery |
120
- | `additionalCustomToolPaths` | `[]` | Merge with discovery |
121
- | `extensions` | Discovered | Replaces discovery |
122
- | `additionalExtensionPaths` | `[]` | Merge with discovery |
123
- | `skills` | Discovered | Skills for prompt |
124
- | `contextFiles` | Discovered | AGENTS.md files |
125
- | `promptTemplates` | Discovered | Prompt templates (slash commands) |
118
+ | `customTools` | `[]` | Additional tool definitions |
119
+ | `resourceLoader` | DefaultResourceLoader | Resource loader for extensions, skills, prompts, themes |
126
120
  | `sessionManager` | `SessionManager.create(cwd)` | Persistence |
127
- | `settingsManager` | From agentDir | Settings overrides |
121
+ | `settingsManager` | `SettingsManager.create(cwd, agentDir)` | Settings overrides |
128
122
 
129
123
  ## Events
130
124
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mariozechner/pi-coding-agent",
3
- "version": "0.49.2",
3
+ "version": "0.50.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
  "dependencies": {
41
41
  "@mariozechner/clipboard": "^0.3.0",
42
42
  "@mariozechner/jiti": "^2.6.2",
43
- "@mariozechner/pi-agent-core": "^0.49.2",
44
- "@mariozechner/pi-ai": "^0.49.2",
45
- "@mariozechner/pi-tui": "^0.49.2",
43
+ "@mariozechner/pi-agent-core": "^0.50.0",
44
+ "@mariozechner/pi-ai": "^0.50.0",
45
+ "@mariozechner/pi-tui": "^0.50.0",
46
46
  "@silvia-odwyer/photon-node": "^0.3.4",
47
47
  "chalk": "^5.5.0",
48
48
  "cli-highlight": "^2.1.11",