@code-yeongyu/senpi 2026.5.13 → 2026.5.15-2

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 (274) hide show
  1. package/CHANGELOG.md +1109 -1150
  2. package/README.md +1 -2
  3. package/dist/core/agent-session.d.ts +9 -0
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +121 -12
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/bash-executor.d.ts.map +1 -1
  8. package/dist/core/bash-executor.js +1 -1
  9. package/dist/core/bash-executor.js.map +1 -1
  10. package/dist/core/compaction/compaction.d.ts.map +1 -1
  11. package/dist/core/compaction/compaction.js +2 -2
  12. package/dist/core/compaction/compaction.js.map +1 -1
  13. package/dist/core/dynamic-prompt/verification.d.ts +31 -0
  14. package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
  15. package/dist/core/dynamic-prompt/verification.js +41 -0
  16. package/dist/core/dynamic-prompt/verification.js.map +1 -1
  17. package/dist/core/export-html/index.d.ts.map +1 -1
  18. package/dist/core/export-html/index.js +8 -1
  19. package/dist/core/export-html/index.js.map +1 -1
  20. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/anthropic-web-search/index.js +20 -0
  22. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  23. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/compaction/index.js +157 -29
  25. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  26. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +197 -0
  27. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -0
  28. package/dist/core/extensions/builtin/compaction/openai-remote.js +690 -0
  29. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -0
  30. package/dist/core/extensions/builtin/compaction/prompts.d.ts +3 -3
  31. package/dist/core/extensions/builtin/compaction/prompts.d.ts.map +1 -1
  32. package/dist/core/extensions/builtin/compaction/prompts.js +0 -22
  33. package/dist/core/extensions/builtin/compaction/prompts.js.map +1 -1
  34. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts +4 -0
  35. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -0
  36. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js +48 -0
  37. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -0
  38. package/dist/core/extensions/builtin/compaction/speculative.d.ts +3 -1
  39. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/compaction/speculative.js +82 -33
  41. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  42. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts +8 -0
  43. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/compaction/todo-bridge.js +12 -6
  45. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  46. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/index.js +0 -20
  48. package/dist/core/extensions/builtin/index.js.map +1 -1
  49. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/openai-web-search/index.js +28 -0
  51. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  52. package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/permission-system/prompt.js +0 -5
  54. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  55. package/dist/core/extensions/builtin/system-messages.d.ts +7 -7
  56. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/system-messages.js +10 -10
  58. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  59. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts +1 -1
  60. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/todotools/continuation/prompt.js +1 -1
  62. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
  63. package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
  64. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/todotools/state.js +2 -2
  66. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  67. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +3 -3
  68. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/todotools/system-messages.js +6 -6
  70. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
  71. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts +1 -1
  72. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/tool-pair-guard/index.js +8 -4
  74. package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
  75. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts +3 -0
  76. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js +89 -0
  78. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js.map +1 -0
  79. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts +3 -0
  80. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts.map +1 -0
  81. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js +122 -0
  82. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js.map +1 -0
  83. package/dist/core/extensions/loader.d.ts.map +1 -1
  84. package/dist/core/extensions/loader.js +2 -0
  85. package/dist/core/extensions/loader.js.map +1 -1
  86. package/dist/core/extensions/runner.d.ts +3 -0
  87. package/dist/core/extensions/runner.d.ts.map +1 -1
  88. package/dist/core/extensions/runner.js +18 -0
  89. package/dist/core/extensions/runner.js.map +1 -1
  90. package/dist/core/extensions/types.d.ts +22 -0
  91. package/dist/core/extensions/types.d.ts.map +1 -1
  92. package/dist/core/extensions/types.js.map +1 -1
  93. package/dist/core/messages.d.ts +3 -3
  94. package/dist/core/messages.d.ts.map +1 -1
  95. package/dist/core/messages.js +5 -10
  96. package/dist/core/messages.js.map +1 -1
  97. package/dist/core/resource-loader.d.ts.map +1 -1
  98. package/dist/core/resource-loader.js +0 -9
  99. package/dist/core/resource-loader.js.map +1 -1
  100. package/dist/core/sdk.d.ts +2 -2
  101. package/dist/core/sdk.d.ts.map +1 -1
  102. package/dist/core/sdk.js +8 -23
  103. package/dist/core/sdk.js.map +1 -1
  104. package/dist/core/session-manager.d.ts.map +1 -1
  105. package/dist/core/session-manager.js +1 -1
  106. package/dist/core/session-manager.js.map +1 -1
  107. package/dist/core/settings-manager.d.ts +0 -5
  108. package/dist/core/settings-manager.d.ts.map +1 -1
  109. package/dist/core/settings-manager.js.map +1 -1
  110. package/dist/core/thinking-levels.d.ts +6 -0
  111. package/dist/core/thinking-levels.d.ts.map +1 -0
  112. package/dist/core/thinking-levels.js +36 -0
  113. package/dist/core/thinking-levels.js.map +1 -0
  114. package/dist/core/tools/bash.d.ts.map +1 -1
  115. package/dist/core/tools/bash.js +15 -1
  116. package/dist/core/tools/bash.js.map +1 -1
  117. package/dist/core/tools/render-utils.d.ts.map +1 -1
  118. package/dist/core/tools/render-utils.js +1 -1
  119. package/dist/core/tools/render-utils.js.map +1 -1
  120. package/dist/main.d.ts.map +1 -1
  121. package/dist/main.js +3 -2
  122. package/dist/main.js.map +1 -1
  123. package/dist/modes/interactive/components/assistant-message.d.ts +0 -3
  124. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  125. package/dist/modes/interactive/components/assistant-message.js +3 -22
  126. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  127. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/bash-execution.js +1 -1
  129. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  130. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/compaction-summary-message.js +20 -2
  132. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  133. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  134. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  135. package/dist/modes/interactive/components/extension-selector.js +6 -1
  136. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  137. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  138. package/dist/modes/interactive/components/keybinding-hints.js +3 -1
  139. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  140. package/dist/modes/interactive/interactive-mode.d.ts +23 -0
  141. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  142. package/dist/modes/interactive/interactive-mode.js +139 -54
  143. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  144. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  145. package/dist/modes/interactive/theme/theme.js +2 -2
  146. package/dist/modes/interactive/theme/theme.js.map +1 -1
  147. package/dist/modes/print-mode.d.ts.map +1 -1
  148. package/dist/modes/print-mode.js +3 -11
  149. package/dist/modes/print-mode.js.map +1 -1
  150. package/dist/modes/provider-native-rendering.d.ts +5 -0
  151. package/dist/modes/provider-native-rendering.d.ts.map +1 -0
  152. package/dist/modes/provider-native-rendering.js +247 -0
  153. package/dist/modes/provider-native-rendering.js.map +1 -0
  154. package/dist/utils/ansi.d.ts +2 -0
  155. package/dist/utils/ansi.d.ts.map +1 -0
  156. package/dist/utils/ansi.js +52 -0
  157. package/dist/utils/ansi.js.map +1 -0
  158. package/dist/utils/html.d.ts +7 -0
  159. package/dist/utils/html.d.ts.map +1 -0
  160. package/dist/utils/html.js +40 -0
  161. package/dist/utils/html.js.map +1 -0
  162. package/dist/utils/mime.d.ts +1 -0
  163. package/dist/utils/mime.d.ts.map +1 -1
  164. package/dist/utils/mime.js +59 -16
  165. package/dist/utils/mime.js.map +1 -1
  166. package/dist/utils/syntax-highlight.d.ts +12 -0
  167. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  168. package/dist/utils/syntax-highlight.js +118 -0
  169. package/dist/utils/syntax-highlight.js.map +1 -0
  170. package/dist/utils/tools-manager.d.ts.map +1 -1
  171. package/dist/utils/tools-manager.js +76 -7
  172. package/dist/utils/tools-manager.js.map +1 -1
  173. package/docs/extensions.md +0 -1
  174. package/docs/index.md +0 -1
  175. package/docs/sdk.md +25 -44
  176. package/docs/settings.md +1 -29
  177. package/docs/termux.md +2 -2
  178. package/docs/usage.md +1 -1
  179. package/examples/README.md +1 -1
  180. package/examples/extensions/README.md +0 -1
  181. package/examples/extensions/overlay-qa-tests.ts +1 -1
  182. package/examples/sdk/01-minimal.ts +14 -10
  183. package/examples/sdk/02-custom-model.ts +12 -8
  184. package/examples/sdk/03-custom-prompt.ts +24 -16
  185. package/examples/sdk/04-skills.ts +2 -2
  186. package/examples/sdk/05-tools.ts +8 -4
  187. package/examples/sdk/06-extensions.ts +11 -7
  188. package/examples/sdk/07-context-files.ts +2 -2
  189. package/examples/sdk/08-prompt-templates.ts +2 -2
  190. package/examples/sdk/09-api-keys-and-oauth.ts +8 -4
  191. package/examples/sdk/10-settings.ts +4 -4
  192. package/examples/sdk/11-sessions.ts +4 -0
  193. package/examples/sdk/12-full-control.ts +11 -7
  194. package/examples/sdk/README.md +6 -9
  195. package/package.json +7 -12
  196. package/dist/core/extensions/builtin/anthropic-code-execution/index.d.ts +0 -7
  197. package/dist/core/extensions/builtin/anthropic-code-execution/index.d.ts.map +0 -1
  198. package/dist/core/extensions/builtin/anthropic-code-execution/index.js +0 -79
  199. package/dist/core/extensions/builtin/anthropic-code-execution/index.js.map +0 -1
  200. package/dist/core/extensions/builtin/anthropic-computer-use/index.d.ts +0 -53
  201. package/dist/core/extensions/builtin/anthropic-computer-use/index.d.ts.map +0 -1
  202. package/dist/core/extensions/builtin/anthropic-computer-use/index.js +0 -676
  203. package/dist/core/extensions/builtin/anthropic-computer-use/index.js.map +0 -1
  204. package/dist/core/extensions/builtin/anthropic-text-editor/index.d.ts +0 -25
  205. package/dist/core/extensions/builtin/anthropic-text-editor/index.d.ts.map +0 -1
  206. package/dist/core/extensions/builtin/anthropic-text-editor/index.js +0 -244
  207. package/dist/core/extensions/builtin/anthropic-text-editor/index.js.map +0 -1
  208. package/dist/core/extensions/builtin/anthropic-tool-search/index.d.ts +0 -6
  209. package/dist/core/extensions/builtin/anthropic-tool-search/index.d.ts.map +0 -1
  210. package/dist/core/extensions/builtin/anthropic-tool-search/index.js +0 -112
  211. package/dist/core/extensions/builtin/anthropic-tool-search/index.js.map +0 -1
  212. package/dist/core/extensions/builtin/background-task/cancel-tool.d.ts +0 -10
  213. package/dist/core/extensions/builtin/background-task/cancel-tool.d.ts.map +0 -1
  214. package/dist/core/extensions/builtin/background-task/cancel-tool.js +0 -109
  215. package/dist/core/extensions/builtin/background-task/cancel-tool.js.map +0 -1
  216. package/dist/core/extensions/builtin/background-task/index.d.ts +0 -3
  217. package/dist/core/extensions/builtin/background-task/index.d.ts.map +0 -1
  218. package/dist/core/extensions/builtin/background-task/index.js +0 -207
  219. package/dist/core/extensions/builtin/background-task/index.js.map +0 -1
  220. package/dist/core/extensions/builtin/background-task/manager.d.ts +0 -17
  221. package/dist/core/extensions/builtin/background-task/manager.d.ts.map +0 -1
  222. package/dist/core/extensions/builtin/background-task/manager.js +0 -114
  223. package/dist/core/extensions/builtin/background-task/manager.js.map +0 -1
  224. package/dist/core/extensions/builtin/background-task/notification.d.ts +0 -22
  225. package/dist/core/extensions/builtin/background-task/notification.d.ts.map +0 -1
  226. package/dist/core/extensions/builtin/background-task/notification.js +0 -105
  227. package/dist/core/extensions/builtin/background-task/notification.js.map +0 -1
  228. package/dist/core/extensions/builtin/background-task/output-tool.d.ts +0 -11
  229. package/dist/core/extensions/builtin/background-task/output-tool.d.ts.map +0 -1
  230. package/dist/core/extensions/builtin/background-task/output-tool.js +0 -127
  231. package/dist/core/extensions/builtin/background-task/output-tool.js.map +0 -1
  232. package/dist/core/extensions/builtin/background-task/spawner.d.ts +0 -8
  233. package/dist/core/extensions/builtin/background-task/spawner.d.ts.map +0 -1
  234. package/dist/core/extensions/builtin/background-task/spawner.js +0 -207
  235. package/dist/core/extensions/builtin/background-task/spawner.js.map +0 -1
  236. package/dist/core/extensions/builtin/background-task/task-tool.d.ts +0 -20
  237. package/dist/core/extensions/builtin/background-task/task-tool.d.ts.map +0 -1
  238. package/dist/core/extensions/builtin/background-task/task-tool.js +0 -302
  239. package/dist/core/extensions/builtin/background-task/task-tool.js.map +0 -1
  240. package/dist/core/extensions/builtin/background-task/types.d.ts +0 -72
  241. package/dist/core/extensions/builtin/background-task/types.d.ts.map +0 -1
  242. package/dist/core/extensions/builtin/background-task/types.js +0 -32
  243. package/dist/core/extensions/builtin/background-task/types.js.map +0 -1
  244. package/dist/core/extensions/builtin/google-code-execution/index.d.ts +0 -7
  245. package/dist/core/extensions/builtin/google-code-execution/index.d.ts.map +0 -1
  246. package/dist/core/extensions/builtin/google-code-execution/index.js +0 -73
  247. package/dist/core/extensions/builtin/google-code-execution/index.js.map +0 -1
  248. package/dist/core/extensions/builtin/google-google-search/index.d.ts +0 -7
  249. package/dist/core/extensions/builtin/google-google-search/index.d.ts.map +0 -1
  250. package/dist/core/extensions/builtin/google-google-search/index.js +0 -83
  251. package/dist/core/extensions/builtin/google-google-search/index.js.map +0 -1
  252. package/dist/core/extensions/builtin/google-url-context/index.d.ts +0 -7
  253. package/dist/core/extensions/builtin/google-url-context/index.d.ts.map +0 -1
  254. package/dist/core/extensions/builtin/google-url-context/index.js +0 -82
  255. package/dist/core/extensions/builtin/google-url-context/index.js.map +0 -1
  256. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.d.ts +0 -6
  257. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.d.ts.map +0 -1
  258. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.js +0 -57
  259. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.js.map +0 -1
  260. package/dist/core/extensions/builtin/openai-code-interpreter/index.d.ts +0 -10
  261. package/dist/core/extensions/builtin/openai-code-interpreter/index.d.ts.map +0 -1
  262. package/dist/core/extensions/builtin/openai-code-interpreter/index.js +0 -95
  263. package/dist/core/extensions/builtin/openai-code-interpreter/index.js.map +0 -1
  264. package/docs/agents.md +0 -348
  265. package/examples/extensions/subagent/README.md +0 -172
  266. package/examples/extensions/subagent/agents/planner.md +0 -37
  267. package/examples/extensions/subagent/agents/reviewer.md +0 -35
  268. package/examples/extensions/subagent/agents/scout.md +0 -50
  269. package/examples/extensions/subagent/agents/worker.md +0 -24
  270. package/examples/extensions/subagent/agents.ts +0 -126
  271. package/examples/extensions/subagent/index.ts +0 -987
  272. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
  273. package/examples/extensions/subagent/prompts/implement.md +0 -10
  274. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
package/docs/sdk.md CHANGED
@@ -8,7 +8,6 @@ The SDK provides programmatic access to pi's agent capabilities. Use it to embed
8
8
  - Build a custom UI (web, desktop, mobile)
9
9
  - Integrate agent capabilities into existing applications
10
10
  - Create automated pipelines with agent reasoning
11
- - Build custom tools that spawn sub-agents
12
11
  - Test agent behavior programmatically
13
12
 
14
13
  See [examples/sdk/](../examples/sdk/) for working examples from minimal to full control.
@@ -54,7 +53,7 @@ The main factory function for a single `AgentSession`.
54
53
  `createAgentSession()` uses a `ResourceLoader` to supply extensions, skills, prompt templates, themes, and context files. If you do not provide one, it uses `DefaultResourceLoader` with standard discovery.
55
54
 
56
55
  ```typescript
57
- import { createAgentSession } from "@code-yeongyu/senpi";
56
+ import { createAgentSession, SessionManager } from "@code-yeongyu/senpi";
58
57
 
59
58
  // Minimal: defaults with DefaultResourceLoader
60
59
  const { session } = await createAgentSession();
@@ -62,7 +61,7 @@ const { session } = await createAgentSession();
62
61
  // Custom: override specific options
63
62
  const { session } = await createAgentSession({
64
63
  model: myModel,
65
- tools: [readTool, bashTool],
64
+ tools: ["read", "bash"],
66
65
  sessionManager: SessionManager.inMemory(),
67
66
  });
68
67
  ```
@@ -466,63 +465,51 @@ const { session } = await createAgentSession({ resourceLoader: loader });
466
465
 
467
466
  ### Tools
468
467
 
468
+ Specify which built-in tools to enable:
469
+
470
+ - Built-in tool names: `read`, `bash`, `edit`, `write`, `grep`, `find`, `ls`
471
+ - Default built-ins: `read`, `bash`, `edit`, `write`
472
+ - `noTools: "all"` disables all tools
473
+ - `noTools: "builtin"` disables default built-ins while keeping extension and custom tools enabled
474
+
469
475
  ```typescript
470
- import {
471
- codingTools, // read, bash, edit, write (default)
472
- readOnlyTools, // read, grep, find, ls
473
- readTool, bashTool, editTool, writeTool,
474
- grepTool, findTool, lsTool,
475
- } from "@code-yeongyu/senpi";
476
+ import { createAgentSession } from "@code-yeongyu/senpi";
476
477
 
477
- // Use built-in tool set
478
+ // Read-only mode
478
479
  const { session } = await createAgentSession({
479
- tools: readOnlyTools,
480
+ tools: ["read", "grep", "find", "ls"],
480
481
  });
481
482
 
482
483
  // Pick specific tools
483
484
  const { session } = await createAgentSession({
484
- tools: [readTool, bashTool, grepTool],
485
+ tools: ["read", "bash", "grep"],
485
486
  });
486
487
  ```
487
488
 
488
489
  #### Tools with Custom cwd
489
490
 
490
- **Important:** The pre-built tool instances (`readTool`, `bashTool`, etc.) use `process.cwd()` for path resolution. When you specify a custom `cwd` AND provide explicit `tools`, you must use the tool factory functions to ensure paths resolve correctly:
491
+ When you pass a custom `cwd`, `createAgentSession()` builds selected built-in tools for that cwd.
491
492
 
492
493
  ```typescript
493
- import {
494
- createCodingTools, // Creates [read, bash, edit, write] for specific cwd
495
- createReadOnlyTools, // Creates [read, grep, find, ls] for specific cwd
496
- createReadTool,
497
- createBashTool,
498
- createEditTool,
499
- createWriteTool,
500
- createGrepTool,
501
- createFindTool,
502
- createLsTool,
503
- } from "@code-yeongyu/senpi";
494
+ import { createAgentSession, SessionManager } from "@code-yeongyu/senpi";
504
495
 
505
496
  const cwd = "/path/to/project";
506
497
 
507
- // Use factory for tool sets
498
+ // Use default tools for custom cwd
508
499
  const { session } = await createAgentSession({
509
500
  cwd,
510
- tools: createCodingTools(cwd), // Tools resolve paths relative to cwd
501
+ sessionManager: SessionManager.inMemory(cwd),
511
502
  });
512
503
 
513
- // Or pick specific tools
504
+ // Or pick specific tools for custom cwd
514
505
  const { session } = await createAgentSession({
515
506
  cwd,
516
- tools: [createReadTool(cwd), createBashTool(cwd), createGrepTool(cwd)],
507
+ tools: ["read", "bash", "grep"],
508
+ sessionManager: SessionManager.inMemory(cwd),
517
509
  });
518
510
  ```
519
511
 
520
- **When you don't need factories:**
521
- - If you omit `tools`, senpi automatically creates them with the correct `cwd`
522
- - If you use `process.cwd()` as your `cwd`, the pre-built instances work fine
523
-
524
- **When you must use factories:**
525
- - When you specify both `cwd` (different from `process.cwd()`) AND `tools`
512
+ `createAgentSession()` automatically builds selected built-in tools for the provided `cwd`. Factory helpers such as `createReadTool()` and `createCodingTools()` remain exported for lower-level composition, but most SDK users should pass tool names.
526
513
 
527
514
  > See [examples/sdk/05-tools.ts](../examples/sdk/05-tools.ts)
528
515
 
@@ -556,6 +543,8 @@ Use `defineTool()` for standalone definitions and arrays like `customTools: [myT
556
543
 
557
544
  Custom tools passed via `customTools` are combined with extension-registered tools. Extensions loaded by the ResourceLoader can also register tools via `pi.registerTool()`.
558
545
 
546
+ If you pass `tools`, include each custom or extension tool name you want enabled, for example `tools: ["read", "bash", "my_tool"]`.
547
+
559
548
  > See [examples/sdk/05-tools.ts](../examples/sdk/05-tools.ts)
560
549
 
561
550
  ### Extensions
@@ -885,12 +874,10 @@ import { getModel } from "@earendil-works/pi-ai";
885
874
  import { Type } from "typebox";
886
875
  import {
887
876
  AuthStorage,
888
- bashTool,
889
877
  createAgentSession,
890
878
  DefaultResourceLoader,
891
879
  defineTool,
892
880
  ModelRegistry,
893
- readTool,
894
881
  SessionManager,
895
882
  SettingsManager,
896
883
  } from "@code-yeongyu/senpi";
@@ -944,7 +931,7 @@ const { session } = await createAgentSession({
944
931
  authStorage,
945
932
  modelRegistry,
946
933
 
947
- tools: [readTool, bashTool],
934
+ tools: ["read", "bash", "status"],
948
935
  customTools: [statusTool],
949
936
  resourceLoader: loader,
950
937
 
@@ -1123,13 +1110,7 @@ defineTool
1123
1110
  SessionManager
1124
1111
  SettingsManager
1125
1112
 
1126
- // Built-in tools (use process.cwd())
1127
- codingTools
1128
- readOnlyTools
1129
- readTool, bashTool, editTool, writeTool
1130
- grepTool, findTool, lsTool
1131
-
1132
- // Tool factories (for custom cwd)
1113
+ // Tool factories
1133
1114
  createCodingTools
1134
1115
  createReadOnlyTools
1135
1116
  createReadTool, createBashTool, createEditTool, createWriteTool
package/docs/settings.md CHANGED
@@ -266,28 +266,6 @@ Object form filters which resources to load:
266
266
 
267
267
  See [packages.md](packages.md) for package management details.
268
268
 
269
- ### Agent Defaults
270
-
271
- | Setting | Type | Default | Description |
272
- |---------|------|---------|-------------|
273
- | `agentDefaults.permission` | object | `{}` | Default tool permissions applied to all agents (lowest priority) |
274
- | `agentDefaults.model` | string | - | Default model ID for agents spawned via `task()` |
275
-
276
- Permission values: `"allow"`, `"deny"`, `"ask"`. See [agents.md](agents.md) for details.
277
-
278
- ```json
279
- {
280
- "agentDefaults": {
281
- "permission": {
282
- "edit": "ask",
283
- "write": "ask",
284
- "bash": "allow"
285
- },
286
- "model": "anthropic/claude-haiku-4-5"
287
- }
288
- }
289
- ```
290
-
291
269
  ## Example
292
270
 
293
271
  ```json
@@ -310,13 +288,7 @@ Permission values: `"allow"`, `"deny"`, `"ask"`. See [agents.md](agents.md) for
310
288
  "warnings": {
311
289
  "anthropicExtraUsage": true
312
290
  },
313
- "packages": ["pi-skills"],
314
- "agentDefaults": {
315
- "permission": {
316
- "edit": "ask",
317
- "write": "ask"
318
- }
319
- }
291
+ "packages": ["pi-skills"]
320
292
  }
321
293
  ```
322
294
 
package/docs/termux.md CHANGED
@@ -36,7 +36,7 @@ Image clipboard is not supported on Termux (the `ctrl+v` image paste feature wil
36
36
 
37
37
  Create `~/.senpi/agent/AGENTS.md` to help the agent understand the Termux environment:
38
38
 
39
- ```markdown
39
+ ````markdown
40
40
  # Agent Environment: Termux on Android
41
41
 
42
42
  ## Location
@@ -91,7 +91,7 @@ termux-camera-photo out.jpg # Take photo
91
91
  - Termux:API app must be installed for `termux-*` commands
92
92
  - Use `pkg install termux-api` for the command-line tools
93
93
  - Storage permission needed for `/storage/emulated/0` access
94
- ```
94
+ ````
95
95
 
96
96
  ## Limitations
97
97
 
package/docs/usage.md CHANGED
@@ -272,6 +272,6 @@ pi --tools read,grep,find,ls -p "Review the code"
272
272
 
273
273
  Pi keeps the core small and pushes workflow-specific behavior into extensions, skills, prompt templates, and packages.
274
274
 
275
- It intentionally does not include built-in MCP, sub-agents, permission popups, plan mode, to-dos, or background bash. You can build or install those workflows as extensions or packages, or use external tools such as containers and tmux.
275
+ It intentionally does not include built-in MCP, permission popups, plan mode, to-dos, or long-running shell orchestration. You can build or install those workflows as extensions or packages, or use external tools such as containers and tmux.
276
276
 
277
277
  For the full rationale, read the [blog post](https://mariozechner.at/posts/2025-11-30-pi-coding-agent/).
@@ -10,7 +10,7 @@ Programmatic usage via `createAgentSession()`. Shows how to customize models, pr
10
10
  ### [extensions/](extensions/)
11
11
  Example extensions demonstrating:
12
12
  - Lifecycle event handlers (tool interception, safety gates, context modifications)
13
- - Custom tools (todo lists, questions, subagents, output truncation)
13
+ - Custom tools (todo lists, questions, output truncation)
14
14
  - Commands and keyboard shortcuts
15
15
  - Custom UI (footers, headers, editors, overlays)
16
16
  - Git integration (checkpoints, auto-commit)
@@ -39,7 +39,6 @@ cp permission-gate.ts ~/.senpi/agent/extensions/
39
39
  | `minimal-mode.ts` | Override built-in tool rendering for minimal display (only tool calls, no output in collapsed mode) |
40
40
  | `truncated-tool.ts` | Wraps ripgrep with proper output truncation (50KB/2000 lines) |
41
41
  | `ssh.ts` | Delegate all tools to a remote machine via SSH using pluggable operations |
42
- | `subagent/` | Delegate tasks to specialized subagents with isolated context windows |
43
42
 
44
43
  ### Commands & UI
45
44
 
@@ -469,7 +469,7 @@ class StreamingOverflowComponent extends BaseOverlay {
469
469
  "-c",
470
470
  `
471
471
  echo "Starting streaming overflow test (30+ seconds)..."
472
- echo "This simulates subagent output with colors, hyperlinks, and long paths"
472
+ echo "This simulates streaming output with colors, hyperlinks, and long paths"
473
473
  echo ""
474
474
  for i in $(seq 1 100); do
475
475
  # Simulate long file paths with OSC 8 hyperlinks (clickable) - tests width overflow
@@ -9,14 +9,18 @@ import { createAgentSession } from "@code-yeongyu/senpi";
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 AGENTS-style instructions to the defaults
44
48
  const loader2 = new DefaultResourceLoader({
@@ -61,12 +65,16 @@ const { session: session2 } = await createAgentSession({
61
65
  sessionManager: SessionManager.inMemory(),
62
66
  });
63
67
 
64
- session2.subscribe((event) => {
65
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
66
- process.stdout.write(event.assistantMessageEvent.delta);
67
- }
68
- });
68
+ try {
69
+ session2.subscribe((event) => {
70
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
71
+ process.stdout.write(event.assistantMessageEvent.delta);
72
+ }
73
+ });
69
74
 
70
- console.log("=== Modify prompt ===");
71
- await session2.prompt("List 3 benefits of TypeScript.");
72
- console.log();
75
+ console.log("=== Modify prompt ===");
76
+ await session2.prompt("List 3 benefits of TypeScript.");
77
+ console.log();
78
+ } finally {
79
+ session2.dispose();
80
+ }
@@ -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 "@code-yeongyu/senpi";
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();
@@ -37,14 +37,18 @@ const { session } = await createAgentSession({
37
37
  sessionManager: SessionManager.inMemory(),
38
38
  });
39
39
 
40
- session.subscribe((event) => {
41
- if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
42
- process.stdout.write(event.assistantMessageEvent.delta);
43
- }
44
- });
40
+ try {
41
+ session.subscribe((event) => {
42
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
43
+ process.stdout.write(event.assistantMessageEvent.delta);
44
+ }
45
+ });
45
46
 
46
- await session.prompt("List files in the current directory.");
47
- console.log();
47
+ await session.prompt("List files in the current directory.");
48
+ console.log();
49
+ } finally {
50
+ session.dispose();
51
+ }
48
52
 
49
53
  // Example extension file (./my-logging-extension.ts):
50
54
  /*
@@ -34,9 +34,9 @@ for (const file of discovered) {
34
34
  console.log(` - ${file.path} (${file.content.length} chars)`);
35
35
  }
36
36
 
37
- await createAgentSession({
37
+ const { session } = await createAgentSession({
38
38
  resourceLoader: loader,
39
39
  sessionManager: SessionManager.inMemory(),
40
40
  });
41
-
42
41
  console.log(`Session created with ${discovered.length + 1} context files`);
42
+ 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
+ }
@@ -1,6 +1,6 @@
1
1
  # SDK Examples
2
2
 
3
- Programmatic usage of pi-coding-agent via `createAgentSession()` and `createAgentSessionRuntime()`.
3
+ Programmatic usage of senpi via `createAgentSession()` and `createAgentSessionRuntime()`.
4
4
 
5
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
6
 
@@ -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 "@code-yeongyu/senpi";
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` | `~/.senpi/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 |