iosm-cli 0.1.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 (729) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/LICENSE +21 -0
  3. package/README.md +650 -0
  4. package/dist/cli/args.d.ts +54 -0
  5. package/dist/cli/args.d.ts.map +1 -0
  6. package/dist/cli/args.js +331 -0
  7. package/dist/cli/args.js.map +1 -0
  8. package/dist/cli/config-selector.d.ts +14 -0
  9. package/dist/cli/config-selector.d.ts.map +1 -0
  10. package/dist/cli/config-selector.js +31 -0
  11. package/dist/cli/config-selector.js.map +1 -0
  12. package/dist/cli/file-processor.d.ts +15 -0
  13. package/dist/cli/file-processor.d.ts.map +1 -0
  14. package/dist/cli/file-processor.js +79 -0
  15. package/dist/cli/file-processor.js.map +1 -0
  16. package/dist/cli/list-models.d.ts +9 -0
  17. package/dist/cli/list-models.d.ts.map +1 -0
  18. package/dist/cli/list-models.js +92 -0
  19. package/dist/cli/list-models.js.map +1 -0
  20. package/dist/cli/session-picker.d.ts +9 -0
  21. package/dist/cli/session-picker.d.ts.map +1 -0
  22. package/dist/cli/session-picker.js +34 -0
  23. package/dist/cli/session-picker.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +15 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/config.d.ts +88 -0
  29. package/dist/config.d.ts.map +1 -0
  30. package/dist/config.js +262 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/core/agent-profiles.d.ts +29 -0
  33. package/dist/core/agent-profiles.d.ts.map +1 -0
  34. package/dist/core/agent-profiles.js +86 -0
  35. package/dist/core/agent-profiles.js.map +1 -0
  36. package/dist/core/agent-session.d.ts +688 -0
  37. package/dist/core/agent-session.d.ts.map +1 -0
  38. package/dist/core/agent-session.js +3112 -0
  39. package/dist/core/agent-session.js.map +1 -0
  40. package/dist/core/agent-teams.d.ts +41 -0
  41. package/dist/core/agent-teams.d.ts.map +1 -0
  42. package/dist/core/agent-teams.js +90 -0
  43. package/dist/core/agent-teams.js.map +1 -0
  44. package/dist/core/ask-user-tool.d.ts +22 -0
  45. package/dist/core/ask-user-tool.d.ts.map +1 -0
  46. package/dist/core/ask-user-tool.js +115 -0
  47. package/dist/core/ask-user-tool.js.map +1 -0
  48. package/dist/core/auth-storage.d.ts +133 -0
  49. package/dist/core/auth-storage.d.ts.map +1 -0
  50. package/dist/core/auth-storage.js +391 -0
  51. package/dist/core/auth-storage.js.map +1 -0
  52. package/dist/core/bash-executor.d.ts +49 -0
  53. package/dist/core/bash-executor.d.ts.map +1 -0
  54. package/dist/core/bash-executor.js +213 -0
  55. package/dist/core/bash-executor.js.map +1 -0
  56. package/dist/core/compaction/branch-summarization.d.ts +86 -0
  57. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  58. package/dist/core/compaction/branch-summarization.js +242 -0
  59. package/dist/core/compaction/branch-summarization.js.map +1 -0
  60. package/dist/core/compaction/compaction.d.ts +121 -0
  61. package/dist/core/compaction/compaction.d.ts.map +1 -0
  62. package/dist/core/compaction/compaction.js +610 -0
  63. package/dist/core/compaction/compaction.js.map +1 -0
  64. package/dist/core/compaction/index.d.ts +7 -0
  65. package/dist/core/compaction/index.d.ts.map +1 -0
  66. package/dist/core/compaction/index.js +7 -0
  67. package/dist/core/compaction/index.js.map +1 -0
  68. package/dist/core/compaction/utils.d.ts +35 -0
  69. package/dist/core/compaction/utils.d.ts.map +1 -0
  70. package/dist/core/compaction/utils.js +138 -0
  71. package/dist/core/compaction/utils.js.map +1 -0
  72. package/dist/core/defaults.d.ts +3 -0
  73. package/dist/core/defaults.d.ts.map +1 -0
  74. package/dist/core/defaults.js +2 -0
  75. package/dist/core/defaults.js.map +1 -0
  76. package/dist/core/diagnostics.d.ts +15 -0
  77. package/dist/core/diagnostics.d.ts.map +1 -0
  78. package/dist/core/diagnostics.js +2 -0
  79. package/dist/core/diagnostics.js.map +1 -0
  80. package/dist/core/event-bus.d.ts +9 -0
  81. package/dist/core/event-bus.d.ts.map +1 -0
  82. package/dist/core/event-bus.js +25 -0
  83. package/dist/core/event-bus.js.map +1 -0
  84. package/dist/core/exec.d.ts +29 -0
  85. package/dist/core/exec.d.ts.map +1 -0
  86. package/dist/core/exec.js +71 -0
  87. package/dist/core/exec.js.map +1 -0
  88. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  89. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  90. package/dist/core/export-html/ansi-to-html.js +249 -0
  91. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  92. package/dist/core/export-html/index.d.ts +34 -0
  93. package/dist/core/export-html/index.d.ts.map +1 -0
  94. package/dist/core/export-html/index.js +222 -0
  95. package/dist/core/export-html/index.js.map +1 -0
  96. package/dist/core/export-html/template.css +971 -0
  97. package/dist/core/export-html/template.html +54 -0
  98. package/dist/core/export-html/template.js +1590 -0
  99. package/dist/core/export-html/tool-renderer.d.ts +35 -0
  100. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  101. package/dist/core/export-html/tool-renderer.js +63 -0
  102. package/dist/core/export-html/tool-renderer.js.map +1 -0
  103. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  104. package/dist/core/export-html/vendor/marked.min.js +6 -0
  105. package/dist/core/extensions/index.d.ts +11 -0
  106. package/dist/core/extensions/index.d.ts.map +1 -0
  107. package/dist/core/extensions/index.js +9 -0
  108. package/dist/core/extensions/index.js.map +1 -0
  109. package/dist/core/extensions/loader.d.ts +25 -0
  110. package/dist/core/extensions/loader.d.ts.map +1 -0
  111. package/dist/core/extensions/loader.js +447 -0
  112. package/dist/core/extensions/loader.js.map +1 -0
  113. package/dist/core/extensions/runner.d.ts +146 -0
  114. package/dist/core/extensions/runner.d.ts.map +1 -0
  115. package/dist/core/extensions/runner.js +652 -0
  116. package/dist/core/extensions/runner.js.map +1 -0
  117. package/dist/core/extensions/types.d.ts +1074 -0
  118. package/dist/core/extensions/types.d.ts.map +1 -0
  119. package/dist/core/extensions/types.js +35 -0
  120. package/dist/core/extensions/types.js.map +1 -0
  121. package/dist/core/extensions/wrapper.d.ts +27 -0
  122. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  123. package/dist/core/extensions/wrapper.js +102 -0
  124. package/dist/core/extensions/wrapper.js.map +1 -0
  125. package/dist/core/footer-data-provider.d.ts +32 -0
  126. package/dist/core/footer-data-provider.d.ts.map +1 -0
  127. package/dist/core/footer-data-provider.js +134 -0
  128. package/dist/core/footer-data-provider.js.map +1 -0
  129. package/dist/core/hooks.d.ts +53 -0
  130. package/dist/core/hooks.d.ts.map +1 -0
  131. package/dist/core/hooks.js +332 -0
  132. package/dist/core/hooks.js.map +1 -0
  133. package/dist/core/index.d.ts +9 -0
  134. package/dist/core/index.d.ts.map +1 -0
  135. package/dist/core/index.js +9 -0
  136. package/dist/core/index.js.map +1 -0
  137. package/dist/core/keybindings.d.ts +55 -0
  138. package/dist/core/keybindings.d.ts.map +1 -0
  139. package/dist/core/keybindings.js +157 -0
  140. package/dist/core/keybindings.js.map +1 -0
  141. package/dist/core/mcp/cli.d.ts +27 -0
  142. package/dist/core/mcp/cli.d.ts.map +1 -0
  143. package/dist/core/mcp/cli.js +275 -0
  144. package/dist/core/mcp/cli.js.map +1 -0
  145. package/dist/core/mcp/config.d.ts +11 -0
  146. package/dist/core/mcp/config.d.ts.map +1 -0
  147. package/dist/core/mcp/config.js +310 -0
  148. package/dist/core/mcp/config.js.map +1 -0
  149. package/dist/core/mcp/index.d.ts +5 -0
  150. package/dist/core/mcp/index.d.ts.map +1 -0
  151. package/dist/core/mcp/index.js +4 -0
  152. package/dist/core/mcp/index.js.map +1 -0
  153. package/dist/core/mcp/runtime.d.ts +42 -0
  154. package/dist/core/mcp/runtime.d.ts.map +1 -0
  155. package/dist/core/mcp/runtime.js +387 -0
  156. package/dist/core/mcp/runtime.js.map +1 -0
  157. package/dist/core/mcp/types.d.ts +76 -0
  158. package/dist/core/mcp/types.d.ts.map +1 -0
  159. package/dist/core/mcp/types.js +2 -0
  160. package/dist/core/mcp/types.js.map +1 -0
  161. package/dist/core/memory.d.ts +27 -0
  162. package/dist/core/memory.d.ts.map +1 -0
  163. package/dist/core/memory.js +203 -0
  164. package/dist/core/memory.js.map +1 -0
  165. package/dist/core/messages.d.ts +84 -0
  166. package/dist/core/messages.d.ts.map +1 -0
  167. package/dist/core/messages.js +141 -0
  168. package/dist/core/messages.js.map +1 -0
  169. package/dist/core/model-registry.d.ts +115 -0
  170. package/dist/core/model-registry.d.ts.map +1 -0
  171. package/dist/core/model-registry.js +549 -0
  172. package/dist/core/model-registry.js.map +1 -0
  173. package/dist/core/model-resolver.d.ts +104 -0
  174. package/dist/core/model-resolver.d.ts.map +1 -0
  175. package/dist/core/model-resolver.js +448 -0
  176. package/dist/core/model-resolver.js.map +1 -0
  177. package/dist/core/package-manager.d.ts +156 -0
  178. package/dist/core/package-manager.d.ts.map +1 -0
  179. package/dist/core/package-manager.js +1465 -0
  180. package/dist/core/package-manager.js.map +1 -0
  181. package/dist/core/parallel-task-agent.d.ts +19 -0
  182. package/dist/core/parallel-task-agent.d.ts.map +1 -0
  183. package/dist/core/parallel-task-agent.js +482 -0
  184. package/dist/core/parallel-task-agent.js.map +1 -0
  185. package/dist/core/prompt-templates.d.ts +50 -0
  186. package/dist/core/prompt-templates.d.ts.map +1 -0
  187. package/dist/core/prompt-templates.js +251 -0
  188. package/dist/core/prompt-templates.js.map +1 -0
  189. package/dist/core/qwen-cli-provider.d.ts +10 -0
  190. package/dist/core/qwen-cli-provider.d.ts.map +1 -0
  191. package/dist/core/qwen-cli-provider.js +271 -0
  192. package/dist/core/qwen-cli-provider.js.map +1 -0
  193. package/dist/core/resolve-config-value.d.ts +17 -0
  194. package/dist/core/resolve-config-value.d.ts.map +1 -0
  195. package/dist/core/resolve-config-value.js +60 -0
  196. package/dist/core/resolve-config-value.js.map +1 -0
  197. package/dist/core/resource-loader.d.ts +195 -0
  198. package/dist/core/resource-loader.d.ts.map +1 -0
  199. package/dist/core/resource-loader.js +820 -0
  200. package/dist/core/resource-loader.js.map +1 -0
  201. package/dist/core/sdk.d.ts +106 -0
  202. package/dist/core/sdk.d.ts.map +1 -0
  203. package/dist/core/sdk.js +460 -0
  204. package/dist/core/sdk.js.map +1 -0
  205. package/dist/core/session-manager.d.ts +323 -0
  206. package/dist/core/session-manager.d.ts.map +1 -0
  207. package/dist/core/session-manager.js +1094 -0
  208. package/dist/core/session-manager.js.map +1 -0
  209. package/dist/core/settings-manager.d.ts +243 -0
  210. package/dist/core/settings-manager.d.ts.map +1 -0
  211. package/dist/core/settings-manager.js +691 -0
  212. package/dist/core/settings-manager.js.map +1 -0
  213. package/dist/core/skills.d.ts +58 -0
  214. package/dist/core/skills.d.ts.map +1 -0
  215. package/dist/core/skills.js +364 -0
  216. package/dist/core/skills.js.map +1 -0
  217. package/dist/core/slash-commands.d.ts +15 -0
  218. package/dist/core/slash-commands.d.ts.map +1 -0
  219. package/dist/core/slash-commands.js +64 -0
  220. package/dist/core/slash-commands.js.map +1 -0
  221. package/dist/core/subagent-runs.d.ts +16 -0
  222. package/dist/core/subagent-runs.d.ts.map +1 -0
  223. package/dist/core/subagent-runs.js +70 -0
  224. package/dist/core/subagent-runs.js.map +1 -0
  225. package/dist/core/subagents.d.ts +45 -0
  226. package/dist/core/subagents.d.ts.map +1 -0
  227. package/dist/core/subagents.js +467 -0
  228. package/dist/core/subagents.js.map +1 -0
  229. package/dist/core/system-prompt.d.ts +28 -0
  230. package/dist/core/system-prompt.d.ts.map +1 -0
  231. package/dist/core/system-prompt.js +196 -0
  232. package/dist/core/system-prompt.js.map +1 -0
  233. package/dist/core/task-plan.d.ts +32 -0
  234. package/dist/core/task-plan.d.ts.map +1 -0
  235. package/dist/core/task-plan.js +155 -0
  236. package/dist/core/task-plan.js.map +1 -0
  237. package/dist/core/timings.d.ts +7 -0
  238. package/dist/core/timings.d.ts.map +1 -0
  239. package/dist/core/timings.js +26 -0
  240. package/dist/core/timings.js.map +1 -0
  241. package/dist/core/tools/bash.d.ts +58 -0
  242. package/dist/core/tools/bash.d.ts.map +1 -0
  243. package/dist/core/tools/bash.js +275 -0
  244. package/dist/core/tools/bash.js.map +1 -0
  245. package/dist/core/tools/edit-diff.d.ts +63 -0
  246. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  247. package/dist/core/tools/edit-diff.js +243 -0
  248. package/dist/core/tools/edit-diff.js.map +1 -0
  249. package/dist/core/tools/edit.d.ts +42 -0
  250. package/dist/core/tools/edit.d.ts.map +1 -0
  251. package/dist/core/tools/edit.js +158 -0
  252. package/dist/core/tools/edit.js.map +1 -0
  253. package/dist/core/tools/find.d.ts +39 -0
  254. package/dist/core/tools/find.d.ts.map +1 -0
  255. package/dist/core/tools/find.js +219 -0
  256. package/dist/core/tools/find.js.map +1 -0
  257. package/dist/core/tools/grep.d.ts +45 -0
  258. package/dist/core/tools/grep.d.ts.map +1 -0
  259. package/dist/core/tools/grep.js +254 -0
  260. package/dist/core/tools/grep.js.map +1 -0
  261. package/dist/core/tools/ignore-filter.d.ts +5 -0
  262. package/dist/core/tools/ignore-filter.d.ts.map +1 -0
  263. package/dist/core/tools/ignore-filter.js +97 -0
  264. package/dist/core/tools/ignore-filter.js.map +1 -0
  265. package/dist/core/tools/index.d.ts +97 -0
  266. package/dist/core/tools/index.d.ts.map +1 -0
  267. package/dist/core/tools/index.js +78 -0
  268. package/dist/core/tools/index.js.map +1 -0
  269. package/dist/core/tools/ls.d.ts +46 -0
  270. package/dist/core/tools/ls.d.ts.map +1 -0
  271. package/dist/core/tools/ls.js +136 -0
  272. package/dist/core/tools/ls.js.map +1 -0
  273. package/dist/core/tools/path-utils.d.ts +8 -0
  274. package/dist/core/tools/path-utils.d.ts.map +1 -0
  275. package/dist/core/tools/path-utils.js +81 -0
  276. package/dist/core/tools/path-utils.js.map +1 -0
  277. package/dist/core/tools/permissions.d.ts +8 -0
  278. package/dist/core/tools/permissions.d.ts.map +1 -0
  279. package/dist/core/tools/permissions.js +2 -0
  280. package/dist/core/tools/permissions.js.map +1 -0
  281. package/dist/core/tools/read.d.ts +39 -0
  282. package/dist/core/tools/read.d.ts.map +1 -0
  283. package/dist/core/tools/read.js +166 -0
  284. package/dist/core/tools/read.js.map +1 -0
  285. package/dist/core/tools/task.d.ts +109 -0
  286. package/dist/core/tools/task.d.ts.map +1 -0
  287. package/dist/core/tools/task.js +1065 -0
  288. package/dist/core/tools/task.js.map +1 -0
  289. package/dist/core/tools/todo.d.ts +42 -0
  290. package/dist/core/tools/todo.d.ts.map +1 -0
  291. package/dist/core/tools/todo.js +159 -0
  292. package/dist/core/tools/todo.js.map +1 -0
  293. package/dist/core/tools/truncate.d.ts +70 -0
  294. package/dist/core/tools/truncate.d.ts.map +1 -0
  295. package/dist/core/tools/truncate.js +205 -0
  296. package/dist/core/tools/truncate.js.map +1 -0
  297. package/dist/core/tools/write.d.ts +32 -0
  298. package/dist/core/tools/write.d.ts.map +1 -0
  299. package/dist/core/tools/write.js +90 -0
  300. package/dist/core/tools/write.js.map +1 -0
  301. package/dist/index.d.ts +30 -0
  302. package/dist/index.d.ts.map +1 -0
  303. package/dist/index.js +45 -0
  304. package/dist/index.js.map +1 -0
  305. package/dist/iosm/agent-verification.d.ts +16 -0
  306. package/dist/iosm/agent-verification.d.ts.map +1 -0
  307. package/dist/iosm/agent-verification.js +138 -0
  308. package/dist/iosm/agent-verification.js.map +1 -0
  309. package/dist/iosm/automation.d.ts +40 -0
  310. package/dist/iosm/automation.d.ts.map +1 -0
  311. package/dist/iosm/automation.js +76 -0
  312. package/dist/iosm/automation.js.map +1 -0
  313. package/dist/iosm/config.d.ts +151 -0
  314. package/dist/iosm/config.d.ts.map +1 -0
  315. package/dist/iosm/config.js +323 -0
  316. package/dist/iosm/config.js.map +1 -0
  317. package/dist/iosm/context-loader.d.ts +12 -0
  318. package/dist/iosm/context-loader.d.ts.map +1 -0
  319. package/dist/iosm/context-loader.js +50 -0
  320. package/dist/iosm/context-loader.js.map +1 -0
  321. package/dist/iosm/cycle.d.ts +51 -0
  322. package/dist/iosm/cycle.d.ts.map +1 -0
  323. package/dist/iosm/cycle.js +861 -0
  324. package/dist/iosm/cycle.js.map +1 -0
  325. package/dist/iosm/guide.d.ts +31 -0
  326. package/dist/iosm/guide.d.ts.map +1 -0
  327. package/dist/iosm/guide.js +101 -0
  328. package/dist/iosm/guide.js.map +1 -0
  329. package/dist/iosm/index.d.ts +12 -0
  330. package/dist/iosm/index.d.ts.map +1 -0
  331. package/dist/iosm/index.js +11 -0
  332. package/dist/iosm/index.js.map +1 -0
  333. package/dist/iosm/init.d.ts +58 -0
  334. package/dist/iosm/init.d.ts.map +1 -0
  335. package/dist/iosm/init.js +1221 -0
  336. package/dist/iosm/init.js.map +1 -0
  337. package/dist/iosm/metrics.d.ts +23 -0
  338. package/dist/iosm/metrics.d.ts.map +1 -0
  339. package/dist/iosm/metrics.js +336 -0
  340. package/dist/iosm/metrics.js.map +1 -0
  341. package/dist/iosm/paths.d.ts +24 -0
  342. package/dist/iosm/paths.d.ts.map +1 -0
  343. package/dist/iosm/paths.js +77 -0
  344. package/dist/iosm/paths.js.map +1 -0
  345. package/dist/iosm/runtime-context.d.ts +20 -0
  346. package/dist/iosm/runtime-context.d.ts.map +1 -0
  347. package/dist/iosm/runtime-context.js +170 -0
  348. package/dist/iosm/runtime-context.js.map +1 -0
  349. package/dist/iosm/types.d.ts +151 -0
  350. package/dist/iosm/types.d.ts.map +1 -0
  351. package/dist/iosm/types.js +3 -0
  352. package/dist/iosm/types.js.map +1 -0
  353. package/dist/main.d.ts +8 -0
  354. package/dist/main.d.ts.map +1 -0
  355. package/dist/main.js +1478 -0
  356. package/dist/main.js.map +1 -0
  357. package/dist/migrations.d.ts +33 -0
  358. package/dist/migrations.d.ts.map +1 -0
  359. package/dist/migrations.js +261 -0
  360. package/dist/migrations.js.map +1 -0
  361. package/dist/modes/index.d.ts +9 -0
  362. package/dist/modes/index.d.ts.map +1 -0
  363. package/dist/modes/index.js +8 -0
  364. package/dist/modes/index.js.map +1 -0
  365. package/dist/modes/interactive/components/armin.d.ts +34 -0
  366. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  367. package/dist/modes/interactive/components/armin.js +329 -0
  368. package/dist/modes/interactive/components/armin.js.map +1 -0
  369. package/dist/modes/interactive/components/ascii-logo.d.ts +11 -0
  370. package/dist/modes/interactive/components/ascii-logo.d.ts.map +1 -0
  371. package/dist/modes/interactive/components/ascii-logo.js +25 -0
  372. package/dist/modes/interactive/components/ascii-logo.js.map +1 -0
  373. package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
  374. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  375. package/dist/modes/interactive/components/assistant-message.js +92 -0
  376. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  377. package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
  378. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  379. package/dist/modes/interactive/components/bash-execution.js +170 -0
  380. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  381. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  382. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  383. package/dist/modes/interactive/components/bordered-loader.js +48 -0
  384. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  385. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  386. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  387. package/dist/modes/interactive/components/branch-summary-message.js +42 -0
  388. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  389. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  390. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  391. package/dist/modes/interactive/components/compaction-summary-message.js +43 -0
  392. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  393. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  394. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  395. package/dist/modes/interactive/components/config-selector.js +470 -0
  396. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  397. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  398. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  399. package/dist/modes/interactive/components/countdown-timer.js +28 -0
  400. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  401. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  402. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  403. package/dist/modes/interactive/components/custom-editor.js +63 -0
  404. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  405. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  406. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  407. package/dist/modes/interactive/components/custom-message.js +74 -0
  408. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  409. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  410. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  411. package/dist/modes/interactive/components/daxnuts.js +138 -0
  412. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  413. package/dist/modes/interactive/components/decrypt-loader.d.ts +25 -0
  414. package/dist/modes/interactive/components/decrypt-loader.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/decrypt-loader.js +102 -0
  416. package/dist/modes/interactive/components/decrypt-loader.js.map +1 -0
  417. package/dist/modes/interactive/components/diff.d.ts +12 -0
  418. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/diff.js +133 -0
  420. package/dist/modes/interactive/components/diff.js.map +1 -0
  421. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  422. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/dynamic-border.js +20 -0
  424. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  425. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  426. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/extension-editor.js +105 -0
  428. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  429. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  430. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/extension-input.js +55 -0
  432. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  433. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  434. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/extension-selector.js +71 -0
  436. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  437. package/dist/modes/interactive/components/footer.d.ts +39 -0
  438. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/footer.js +285 -0
  440. package/dist/modes/interactive/components/footer.js.map +1 -0
  441. package/dist/modes/interactive/components/index.d.ts +33 -0
  442. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/index.js +34 -0
  444. package/dist/modes/interactive/components/index.js.map +1 -0
  445. package/dist/modes/interactive/components/keybinding-hints.d.ts +50 -0
  446. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/keybinding-hints.js +85 -0
  448. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  449. package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
  450. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/login-dialog.js +139 -0
  452. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  453. package/dist/modes/interactive/components/mcp-selector.d.ts +31 -0
  454. package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/mcp-selector.js +171 -0
  456. package/dist/modes/interactive/components/mcp-selector.js.map +1 -0
  457. package/dist/modes/interactive/components/model-selector.d.ts +51 -0
  458. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/model-selector.js +292 -0
  460. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  461. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  462. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/oauth-selector.js +134 -0
  464. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  465. package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  466. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/scoped-models-selector.js +271 -0
  468. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  469. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  470. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  472. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  473. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  474. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/session-selector.js +839 -0
  476. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  477. package/dist/modes/interactive/components/settings-selector.d.ts +60 -0
  478. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/settings-selector.js +311 -0
  480. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  481. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  482. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/show-images-selector.js +34 -0
  484. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  485. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  486. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/skill-invocation-message.js +45 -0
  488. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  489. package/dist/modes/interactive/components/subagent-message.d.ts +91 -0
  490. package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/subagent-message.js +306 -0
  492. package/dist/modes/interactive/components/subagent-message.js.map +1 -0
  493. package/dist/modes/interactive/components/task-plan-message.d.ts +12 -0
  494. package/dist/modes/interactive/components/task-plan-message.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/task-plan-message.js +61 -0
  496. package/dist/modes/interactive/components/task-plan-message.js.map +1 -0
  497. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  498. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/theme-selector.js +44 -0
  500. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  501. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  502. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/thinking-selector.js +46 -0
  504. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  505. package/dist/modes/interactive/components/tool-execution.d.ts +78 -0
  506. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/tool-execution.js +880 -0
  508. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  509. package/dist/modes/interactive/components/tree-selector.d.ts +70 -0
  510. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/tree-selector.js +921 -0
  512. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  513. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  514. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  515. package/dist/modes/interactive/components/user-message-selector.js +110 -0
  516. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  517. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  518. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/user-message.js +27 -0
  520. package/dist/modes/interactive/components/user-message.js.map +1 -0
  521. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  522. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  523. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  524. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  525. package/dist/modes/interactive/interactive-mode.d.ts +453 -0
  526. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  527. package/dist/modes/interactive/interactive-mode.js +8669 -0
  528. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  529. package/dist/modes/interactive/theme/dark.json +85 -0
  530. package/dist/modes/interactive/theme/light.json +84 -0
  531. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  532. package/dist/modes/interactive/theme/theme.d.ts +78 -0
  533. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  534. package/dist/modes/interactive/theme/theme.js +944 -0
  535. package/dist/modes/interactive/theme/theme.js.map +1 -0
  536. package/dist/modes/print-mode.d.ts +28 -0
  537. package/dist/modes/print-mode.d.ts.map +1 -0
  538. package/dist/modes/print-mode.js +101 -0
  539. package/dist/modes/print-mode.js.map +1 -0
  540. package/dist/modes/rpc/rpc-client.d.ts +217 -0
  541. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  542. package/dist/modes/rpc/rpc-client.js +404 -0
  543. package/dist/modes/rpc/rpc-client.js.map +1 -0
  544. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  545. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  546. package/dist/modes/rpc/rpc-mode.js +580 -0
  547. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  548. package/dist/modes/rpc/rpc-types.d.ts +409 -0
  549. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  550. package/dist/modes/rpc/rpc-types.js +8 -0
  551. package/dist/modes/rpc/rpc-types.js.map +1 -0
  552. package/dist/utils/changelog.d.ts +21 -0
  553. package/dist/utils/changelog.d.ts.map +1 -0
  554. package/dist/utils/changelog.js +87 -0
  555. package/dist/utils/changelog.js.map +1 -0
  556. package/dist/utils/clipboard-image.d.ts +11 -0
  557. package/dist/utils/clipboard-image.d.ts.map +1 -0
  558. package/dist/utils/clipboard-image.js +162 -0
  559. package/dist/utils/clipboard-image.js.map +1 -0
  560. package/dist/utils/clipboard-native.d.ts +7 -0
  561. package/dist/utils/clipboard-native.d.ts.map +1 -0
  562. package/dist/utils/clipboard-native.js +14 -0
  563. package/dist/utils/clipboard-native.js.map +1 -0
  564. package/dist/utils/clipboard.d.ts +2 -0
  565. package/dist/utils/clipboard.d.ts.map +1 -0
  566. package/dist/utils/clipboard.js +67 -0
  567. package/dist/utils/clipboard.js.map +1 -0
  568. package/dist/utils/frontmatter.d.ts +8 -0
  569. package/dist/utils/frontmatter.d.ts.map +1 -0
  570. package/dist/utils/frontmatter.js +26 -0
  571. package/dist/utils/frontmatter.js.map +1 -0
  572. package/dist/utils/git.d.ts +26 -0
  573. package/dist/utils/git.d.ts.map +1 -0
  574. package/dist/utils/git.js +163 -0
  575. package/dist/utils/git.js.map +1 -0
  576. package/dist/utils/image-convert.d.ts +9 -0
  577. package/dist/utils/image-convert.d.ts.map +1 -0
  578. package/dist/utils/image-convert.js +35 -0
  579. package/dist/utils/image-convert.js.map +1 -0
  580. package/dist/utils/image-resize.d.ts +36 -0
  581. package/dist/utils/image-resize.d.ts.map +1 -0
  582. package/dist/utils/image-resize.js +181 -0
  583. package/dist/utils/image-resize.js.map +1 -0
  584. package/dist/utils/mime.d.ts +2 -0
  585. package/dist/utils/mime.d.ts.map +1 -0
  586. package/dist/utils/mime.js +26 -0
  587. package/dist/utils/mime.js.map +1 -0
  588. package/dist/utils/photon.d.ts +21 -0
  589. package/dist/utils/photon.d.ts.map +1 -0
  590. package/dist/utils/photon.js +121 -0
  591. package/dist/utils/photon.js.map +1 -0
  592. package/dist/utils/shell.d.ts +26 -0
  593. package/dist/utils/shell.d.ts.map +1 -0
  594. package/dist/utils/shell.js +186 -0
  595. package/dist/utils/shell.js.map +1 -0
  596. package/dist/utils/sleep.d.ts +5 -0
  597. package/dist/utils/sleep.d.ts.map +1 -0
  598. package/dist/utils/sleep.js +17 -0
  599. package/dist/utils/sleep.js.map +1 -0
  600. package/dist/utils/tools-manager.d.ts +3 -0
  601. package/dist/utils/tools-manager.d.ts.map +1 -0
  602. package/dist/utils/tools-manager.js +251 -0
  603. package/dist/utils/tools-manager.js.map +1 -0
  604. package/docs/README.md +32 -0
  605. package/docs/cli-reference.md +342 -0
  606. package/docs/configuration.md +301 -0
  607. package/docs/development-and-testing.md +295 -0
  608. package/docs/extensions-packages-themes.md +415 -0
  609. package/docs/getting-started.md +246 -0
  610. package/docs/interactive-mode.md +272 -0
  611. package/docs/iosm-init-and-cycles.md +355 -0
  612. package/docs/orchestration-and-subagents.md +273 -0
  613. package/docs/rpc-json-sdk.md +353 -0
  614. package/docs/sessions-traces-export.md +260 -0
  615. package/examples/README.md +120 -0
  616. package/examples/extensions/README.md +306 -0
  617. package/examples/extensions/antigravity-image-gen.ts +415 -0
  618. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  619. package/examples/extensions/bash-spawn-hook.ts +30 -0
  620. package/examples/extensions/bookmark.ts +50 -0
  621. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  622. package/examples/extensions/claude-rules.ts +86 -0
  623. package/examples/extensions/commands.ts +72 -0
  624. package/examples/extensions/confirm-destructive.ts +59 -0
  625. package/examples/extensions/custom-compaction.ts +114 -0
  626. package/examples/extensions/custom-footer.ts +64 -0
  627. package/examples/extensions/custom-header.ts +73 -0
  628. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  629. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  630. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  631. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  632. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  633. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  634. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  635. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  636. package/examples/extensions/dirty-repo-guard.ts +56 -0
  637. package/examples/extensions/doom-overlay/README.md +46 -0
  638. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  639. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  640. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  641. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  642. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  643. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  644. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  645. package/examples/extensions/doom-overlay/index.ts +74 -0
  646. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  647. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  648. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  649. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  650. package/examples/extensions/dynamic-resources/index.ts +15 -0
  651. package/examples/extensions/dynamic-tools.ts +74 -0
  652. package/examples/extensions/event-bus.ts +43 -0
  653. package/examples/extensions/file-trigger.ts +41 -0
  654. package/examples/extensions/git-checkpoint.ts +53 -0
  655. package/examples/extensions/handoff.ts +150 -0
  656. package/examples/extensions/hello.ts +25 -0
  657. package/examples/extensions/inline-bash.ts +94 -0
  658. package/examples/extensions/input-transform.ts +43 -0
  659. package/examples/extensions/interactive-shell.ts +196 -0
  660. package/examples/extensions/mac-system-theme.ts +47 -0
  661. package/examples/extensions/message-renderer.ts +59 -0
  662. package/examples/extensions/minimal-mode.ts +426 -0
  663. package/examples/extensions/modal-editor.ts +85 -0
  664. package/examples/extensions/model-status.ts +31 -0
  665. package/examples/extensions/notify.ts +55 -0
  666. package/examples/extensions/overlay-qa-tests.ts +881 -0
  667. package/examples/extensions/overlay-test.ts +150 -0
  668. package/examples/extensions/permission-gate.ts +34 -0
  669. package/examples/extensions/pirate.ts +47 -0
  670. package/examples/extensions/plan-mode/README.md +65 -0
  671. package/examples/extensions/plan-mode/index.ts +340 -0
  672. package/examples/extensions/plan-mode/utils.ts +168 -0
  673. package/examples/extensions/preset.ts +398 -0
  674. package/examples/extensions/protected-paths.ts +30 -0
  675. package/examples/extensions/qna.ts +119 -0
  676. package/examples/extensions/question.ts +264 -0
  677. package/examples/extensions/questionnaire.ts +427 -0
  678. package/examples/extensions/rainbow-editor.ts +88 -0
  679. package/examples/extensions/reload-runtime.ts +37 -0
  680. package/examples/extensions/rpc-demo.ts +124 -0
  681. package/examples/extensions/sandbox/index.ts +318 -0
  682. package/examples/extensions/sandbox/package-lock.json +92 -0
  683. package/examples/extensions/sandbox/package.json +19 -0
  684. package/examples/extensions/send-user-message.ts +97 -0
  685. package/examples/extensions/session-name.ts +27 -0
  686. package/examples/extensions/shutdown-command.ts +63 -0
  687. package/examples/extensions/snake.ts +343 -0
  688. package/examples/extensions/space-invaders.ts +560 -0
  689. package/examples/extensions/ssh.ts +220 -0
  690. package/examples/extensions/status-line.ts +40 -0
  691. package/examples/extensions/subagent/README.md +172 -0
  692. package/examples/extensions/subagent/agents/planner.md +37 -0
  693. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  694. package/examples/extensions/subagent/agents/scout.md +50 -0
  695. package/examples/extensions/subagent/agents/worker.md +24 -0
  696. package/examples/extensions/subagent/agents.ts +126 -0
  697. package/examples/extensions/subagent/index.ts +964 -0
  698. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  699. package/examples/extensions/subagent/prompts/implement.md +10 -0
  700. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  701. package/examples/extensions/summarize.ts +195 -0
  702. package/examples/extensions/system-prompt-header.ts +17 -0
  703. package/examples/extensions/timed-confirm.ts +70 -0
  704. package/examples/extensions/titlebar-spinner.ts +58 -0
  705. package/examples/extensions/todo.ts +299 -0
  706. package/examples/extensions/tool-override.ts +143 -0
  707. package/examples/extensions/tools.ts +146 -0
  708. package/examples/extensions/trigger-compact.ts +40 -0
  709. package/examples/extensions/truncated-tool.ts +192 -0
  710. package/examples/extensions/widget-placement.ts +17 -0
  711. package/examples/extensions/with-deps/index.ts +36 -0
  712. package/examples/extensions/with-deps/package-lock.json +31 -0
  713. package/examples/extensions/with-deps/package.json +22 -0
  714. package/examples/rpc-extension-ui.ts +632 -0
  715. package/examples/sdk/01-minimal.ts +22 -0
  716. package/examples/sdk/02-custom-model.ts +49 -0
  717. package/examples/sdk/03-custom-prompt.ts +55 -0
  718. package/examples/sdk/04-skills.ts +46 -0
  719. package/examples/sdk/05-tools.ts +56 -0
  720. package/examples/sdk/06-extensions.ts +88 -0
  721. package/examples/sdk/07-context-files.ts +40 -0
  722. package/examples/sdk/08-prompt-templates.ts +47 -0
  723. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  724. package/examples/sdk/10-settings.ts +51 -0
  725. package/examples/sdk/11-sessions.ts +48 -0
  726. package/examples/sdk/12-full-control.ts +82 -0
  727. package/examples/sdk/README.md +337 -0
  728. package/examples/tsconfig.json +3 -0
  729. package/package.json +107 -0
@@ -0,0 +1,260 @@
1
+ # Sessions, Traces, Export
2
+
3
+ `iosm-cli` provides comprehensive session management with persistence, branching, tracing, HTML export, and sharing capabilities.
4
+
5
+ ---
6
+
7
+ ## Session Persistence
8
+
9
+ By default, interactive sessions are automatically persisted to:
10
+
11
+ ```
12
+ ~/.iosm/agent/sessions/
13
+ ```
14
+
15
+ Each session is stored as a JSONL (JSON Lines) file containing the complete conversation history, tool calls, and metadata.
16
+
17
+ ### CLI Session Controls
18
+
19
+ | Flag | Description | Example |
20
+ |------|-------------|---------|
21
+ | `--continue`, `-c` | Continue the most recent session | `iosm -c` |
22
+ | `--resume`, `-r` | Open interactive session picker | `iosm -r` |
23
+ | `--session <path>` | Open a specific session file | `iosm --session ~/sessions/my.jsonl` |
24
+ | `--session-dir <dir>` | Override session storage directory | `iosm --session-dir ./local-sessions` |
25
+ | `--no-session` | Disable persistence (ephemeral run) | `iosm --no-session` |
26
+
27
+ ### Examples
28
+
29
+ ```bash
30
+ # Continue where you left off
31
+ iosm --continue
32
+
33
+ # Pick from a list of recent sessions
34
+ iosm --resume
35
+
36
+ # Use a specific session file
37
+ iosm --session ~/my-project-sessions/refactor-auth.jsonl
38
+
39
+ # Custom session directory
40
+ iosm --session-dir /tmp/my-sessions
41
+
42
+ # One-off ephemeral session (not saved)
43
+ iosm --no-session -p "Quick question about TypeScript generics"
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Session Tree & Branching
49
+
50
+ Sessions support tree-based branching, allowing you to explore different paths from any point in the conversation.
51
+
52
+ ### Slash Commands
53
+
54
+ | Command | Description |
55
+ |---------|-------------|
56
+ | `/tree` | Navigate the session tree visually |
57
+ | `/fork` | Create a branch from a previous message |
58
+ | `/name` | Set a display name for the current session |
59
+
60
+ ### Branching Workflow
61
+
62
+ ```bash
63
+ iosm
64
+
65
+ # Have a conversation...
66
+ # You: "Analyze the auth module"
67
+ # Agent: [analysis]
68
+ # You: "Propose two approaches: rewrite vs refactor"
69
+ # Agent: [proposals]
70
+
71
+ # Fork to explore Approach A
72
+ /fork
73
+ # "Let's go with the rewrite approach and implement it"
74
+
75
+ # Later, go back and fork to explore Approach B
76
+ /tree
77
+ # Navigate to the branching point
78
+ /fork
79
+ # "Let's try the refactor approach instead"
80
+
81
+ # Name this session for easy finding later
82
+ /name "auth-module-exploration"
83
+ ```
84
+
85
+ ### Tree Navigation
86
+
87
+ The `/tree` command shows a visual tree of your conversation branches:
88
+
89
+ ```
90
+ 📝 auth-module-exploration
91
+ ├── [1] You: Analyze the auth module
92
+ ├── [2] Agent: [analysis]
93
+ ├── [3] You: Propose two approaches
94
+ ├── [4] Agent: [proposals]
95
+ ├── Branch A (current)
96
+ │ └── [5] You: Rewrite approach
97
+ │ └── [6] Agent: [implementation]
98
+ └── Branch B
99
+ └── [5] You: Refactor approach
100
+ └── [6] Agent: [implementation]
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Session Trace Logging
106
+
107
+ Enable full JSONL trace logging for debugging, auditing, or analysis:
108
+
109
+ ### Enable Tracing
110
+
111
+ ```bash
112
+ # Via CLI flag
113
+ iosm --session-trace
114
+
115
+ # Via environment variable
116
+ IOSM_SESSION_TRACE=1 iosm
117
+
118
+ # Custom trace directory
119
+ iosm --session-trace --session-trace-dir /path/to/traces
120
+
121
+ # Via environment variable
122
+ IOSM_SESSION_TRACE_DIR="/path/to/traces" IOSM_SESSION_TRACE=1 iosm
123
+ ```
124
+
125
+ ### Trace File Format
126
+
127
+ Traces are stored as `<session-id>.jsonl` files. Each line is a JSON event:
128
+
129
+ ```jsonl
130
+ {"type":"session_start","timestamp":"2026-03-09T15:42:00Z","sessionId":"abc123"}
131
+ {"type":"user_message","timestamp":"2026-03-09T15:42:05Z","content":"Analyze the project"}
132
+ {"type":"tool_call","timestamp":"2026-03-09T15:42:06Z","tool":"ls","input":{"path":"."}}
133
+ {"type":"tool_result","timestamp":"2026-03-09T15:42:06Z","tool":"ls","output":"..."}
134
+ {"type":"assistant_message","timestamp":"2026-03-09T15:42:10Z","content":"Here's my analysis..."}
135
+ {"type":"turn_end","timestamp":"2026-03-09T15:42:10Z","usage":{"totalTokens":1500}}
136
+ ```
137
+
138
+ ### Analyzing Traces
139
+
140
+ ```bash
141
+ # View all events
142
+ cat ~/.iosm/agent/session-traces/<session-id>.jsonl | jq .
143
+
144
+ # Filter tool calls
145
+ cat trace.jsonl | jq 'select(.type=="tool_call")'
146
+
147
+ # Count token usage per turn
148
+ cat trace.jsonl | jq 'select(.type=="turn_end") | .usage.totalTokens'
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Export to HTML
154
+
155
+ Export sessions to beautifully formatted, self-contained HTML files.
156
+
157
+ ### Interactive Export
158
+
159
+ ```bash
160
+ iosm
161
+ # ... have a conversation ...
162
+ /export
163
+ ```
164
+
165
+ ### CLI Export
166
+
167
+ ```bash
168
+ iosm --export /path/to/session.jsonl
169
+ ```
170
+
171
+ ### Export Features
172
+
173
+ - **Self-contained** — Single HTML file with all assets embedded
174
+ - **Themed** — Uses the current TUI theme for styling
175
+ - **Tool rendering** — Tool calls and results are pre-rendered with syntax highlighting
176
+ - **Navigable** — Conversation structure is preserved with collapsible sections
177
+
178
+ ---
179
+
180
+ ## Share via GitHub Gist
181
+
182
+ Share a session publicly (or privately) via GitHub Gist:
183
+
184
+ ```bash
185
+ /share
186
+ ```
187
+
188
+ This will:
189
+ 1. Serialize the current session
190
+ 2. Upload as a secret GitHub Gist
191
+ 3. Return a shareable URL
192
+
193
+ > **Note**: Requires GitHub authentication. Use `/login` to set up GitHub credentials.
194
+
195
+ ---
196
+
197
+ ## Copy to Clipboard
198
+
199
+ Copy the latest assistant response to your clipboard:
200
+
201
+ ```bash
202
+ /copy
203
+ ```
204
+
205
+ Useful for quickly grabbing generated code, explanations, or summaries.
206
+
207
+ ---
208
+
209
+ ## Session Management Workflows
210
+
211
+ ### Daily Development
212
+
213
+ ```bash
214
+ # Morning — continue yesterday's session
215
+ iosm -c
216
+
217
+ # Or pick a specific past session
218
+ iosm -r
219
+ ```
220
+
221
+ ### Code Review Sessions
222
+
223
+ ```bash
224
+ # Start a named review session
225
+ iosm --profile plan
226
+ /name "Q1 security review"
227
+ # ... review code ...
228
+ /export # Export for team sharing
229
+ ```
230
+
231
+ ### CI/Automation (Ephemeral)
232
+
233
+ ```bash
234
+ # No persistence needed
235
+ iosm --no-session -p "Check for deprecated APIs in src/"
236
+ ```
237
+
238
+ ### Branching Exploration
239
+
240
+ ```bash
241
+ iosm
242
+ # Analyze an issue
243
+ # Fork to try different solutions
244
+ /fork
245
+ # Try solution A
246
+ # ...
247
+ /tree
248
+ # Go back, fork again
249
+ /fork
250
+ # Try solution B
251
+ # Compare and decide
252
+ ```
253
+
254
+ ---
255
+
256
+ ## Further Reading
257
+
258
+ - [Interactive Mode](./interactive-mode.md) — All slash commands
259
+ - [Configuration](./configuration.md) — Session directory settings
260
+ - [JSON/RPC/SDK](./rpc-json-sdk.md) — Programmatic session management
@@ -0,0 +1,120 @@
1
+ # Examples
2
+
3
+ Complete example library for `iosm-cli` SDK and extension development. These examples demonstrate how to use `iosm-cli` programmatically and extend it with custom functionality.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Run any example with tsx
9
+ npx tsx examples/sdk/01-minimal.ts
10
+ npx tsx examples/extensions/hello.ts
11
+
12
+ # Or load an extension directly
13
+ iosm -e examples/extensions/permission-gate.ts
14
+ ```
15
+
16
+ ---
17
+
18
+ ## 📁 Directory Structure
19
+
20
+ ### [sdk/](sdk/)
21
+
22
+ **12 progressive examples** showing how to use `iosm-cli` as a library via `createAgentSession()`.
23
+
24
+ | # | Example | What You Learn |
25
+ |---|---------|---------------|
26
+ | 01 | [Minimal](sdk/01-minimal.ts) | Simplest usage — auto-discovers everything |
27
+ | 02 | [Custom Model](sdk/02-custom-model.ts) | Select provider, model, and thinking level |
28
+ | 03 | [Custom Prompt](sdk/03-custom-prompt.ts) | Replace or append to the system prompt |
29
+ | 04 | [Skills](sdk/04-skills.ts) | Discover, filter, and inject custom skills |
30
+ | 05 | [Tools](sdk/05-tools.ts) | Built-in tools, read-only mode, custom cwd |
31
+ | 06 | [Extensions](sdk/06-extensions.ts) | Inline extensions, lifecycle hooks, custom tools |
32
+ | 07 | [Context Files](sdk/07-context-files.ts) | AGENTS.md project-specific instructions |
33
+ | 08 | [Prompt Templates](sdk/08-prompt-templates.ts) | File-based reusable prompts as slash commands |
34
+ | 09 | [API Keys & OAuth](sdk/09-api-keys-and-oauth.ts) | Auth storage, model registry, runtime key override |
35
+ | 10 | [Settings](sdk/10-settings.ts) | Override compaction, retry, terminal settings |
36
+ | 11 | [Sessions](sdk/11-sessions.ts) | In-memory, persistent, continue, list, open sessions |
37
+ | 12 | [Full Control](sdk/12-full-control.ts) | Zero discovery — explicit configuration for everything |
38
+
39
+ → Full SDK guide at [sdk/README.md](sdk/README.md)
40
+
41
+ ---
42
+
43
+ ### [extensions/](extensions/)
44
+
45
+ **66 extension examples** organized by category, demonstrating the full extension API.
46
+
47
+ | Category | Count | Highlights |
48
+ |----------|-------|-----------|
49
+ | **Safety & Lifecycle** | 5 | Permission gates, protected paths, destructive action confirmation |
50
+ | **Custom Tools** | 12 | Todo list, hello world, SSH delegation, image gen, subagents |
51
+ | **Commands & UI** | 22 | Presets, overlays, editors, footers, headers, notifications, games |
52
+ | **Git Integration** | 2 | Checkpoint stashing, auto-commit on exit |
53
+ | **System Prompt** | 4 | Dynamic prompt modification, custom compaction |
54
+ | **System Integration** | 1 | macOS theme sync |
55
+ | **Custom Providers** | 3 | Anthropic, GitLab Duo, Qwen CLI |
56
+ | **Session & Messages** | 4 | Named sessions, bookmarks, event bus, message rendering |
57
+ | **Resources** | 1 | Dynamic skill/prompt/theme loading |
58
+ | **Dependencies** | 2 | Extension with own package.json, file watcher |
59
+
60
+ → Full extension guide at [extensions/README.md](extensions/README.md)
61
+
62
+ ---
63
+
64
+ ### [rpc-extension-ui.ts](rpc-extension-ui.ts)
65
+
66
+ Standalone RPC client that exercises all extension UI methods over the RPC protocol. Demonstrates how to use `confirm`, `select`, `notify`, and custom UI from an external process.
67
+
68
+ ---
69
+
70
+ ## Key Concepts
71
+
72
+ ### Extension Pattern
73
+
74
+ ```typescript
75
+ import type { ExtensionAPI } from "iosm-cli";
76
+
77
+ export default function (pi: ExtensionAPI) {
78
+ // Register tools, commands, hooks, UI
79
+ pi.registerTool({ ... });
80
+ pi.registerCommand("name", { ... });
81
+ pi.on("tool_call", async (event, ctx) => { ... });
82
+ }
83
+ ```
84
+
85
+ ### SDK Pattern
86
+
87
+ ```typescript
88
+ import { createAgentSession } from "iosm-cli";
89
+
90
+ const { session } = await createAgentSession({ /* options */ });
91
+ session.subscribe((event) => { /* handle events */ });
92
+ await session.prompt("Your message");
93
+ ```
94
+
95
+ ### State Persistence
96
+
97
+ Store extension state in tool result `details` for proper session branching:
98
+
99
+ ```typescript
100
+ return {
101
+ content: [{ type: "text", text: "Done" }],
102
+ details: { myState: [...data] }, // Persisted with session
103
+ };
104
+
105
+ // Reconstruct on fork/resume
106
+ pi.on("session_start", async (_event, ctx) => {
107
+ for (const entry of ctx.sessionManager.getBranch()) {
108
+ // Rebuild state from details
109
+ }
110
+ });
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Documentation
116
+
117
+ - [SDK Reference](sdk/README.md) — Complete SDK guide with all options
118
+ - [Extension Guide](extensions/README.md) — Full extension API documentation
119
+ - [Extension API Docs](../docs/extensions-packages-themes.md) — Official extension reference
120
+ - [SDK Integration Docs](../docs/rpc-json-sdk.md) — JSON/RPC/SDK integration guide
@@ -0,0 +1,306 @@
1
+ # Extension Examples
2
+
3
+ 66 example extensions for `iosm-cli` demonstrating the full extension API: custom tools, lifecycle hooks, commands, UI components, and provider integrations.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Load an extension via CLI flag
9
+ iosm -e examples/extensions/permission-gate.ts
10
+
11
+ # Or copy to extensions directory for auto-discovery
12
+ cp permission-gate.ts ~/.iosm/agent/extensions/
13
+
14
+ # Reload at runtime
15
+ /reload
16
+ ```
17
+
18
+ ---
19
+
20
+ ## Extension Template
21
+
22
+ Every extension exports a default function receiving the `ExtensionAPI`:
23
+
24
+ ```typescript
25
+ import type { ExtensionAPI } from "iosm-cli";
26
+
27
+ export default function (pi: ExtensionAPI) {
28
+ // Register tools, commands, hooks, UI — all goes here
29
+ }
30
+ ```
31
+
32
+ ---
33
+
34
+ ## Examples by Category
35
+
36
+ ### 🛡️ Lifecycle & Safety
37
+
38
+ | Extension | Description | Key APIs |
39
+ |-----------|-------------|----------|
40
+ | [permission-gate.ts](permission-gate.ts) | Prompts for confirmation before dangerous bash commands (rm -rf, sudo, chmod 777) | `pi.on("tool_call")`, `ctx.ui.select()` |
41
+ | [protected-paths.ts](protected-paths.ts) | Blocks writes to protected paths (.env, .git/, node_modules/) | `pi.on("tool_call")`, `return { block: true }` |
42
+ | [confirm-destructive.ts](confirm-destructive.ts) | Confirms before destructive session actions (clear, switch, fork) | `pi.on("tool_call")`, `ctx.ui.confirm()` |
43
+ | [dirty-repo-guard.ts](dirty-repo-guard.ts) | Prevents session changes with uncommitted git changes | `pi.on("session_switch")`, `pi.exec()` |
44
+ | [sandbox/](sandbox/) | OS-level sandboxing using `@anthropic-ai/sandbox-runtime` | External sandbox integration |
45
+
46
+ ### 🔧 Custom Tools
47
+
48
+ | Extension | Description | Key APIs |
49
+ |-----------|-------------|----------|
50
+ | [hello.ts](hello.ts) | **Minimal example** — simplest custom tool | `pi.registerTool()` |
51
+ | [todo.ts](todo.ts) | Todo list with `/todos` command, custom rendering, and state persistence | `pi.registerTool()`, `renderCall()`, `renderResult()` |
52
+ | [question.ts](question.ts) | Demonstrates `ctx.ui.select()` for asking user questions | `ctx.ui.select()`, custom UI |
53
+ | [questionnaire.ts](questionnaire.ts) | Multi-question input with tab bar navigation | `ctx.ui.custom()`, tab bar |
54
+ | [tool-override.ts](tool-override.ts) | Override built-in tools (e.g., add logging to `read`) | `wrapRegisteredTool()` |
55
+ | [dynamic-tools.ts](dynamic-tools.ts) | Register tools after startup and at runtime via command | `session_start` hook, prompt snippets |
56
+ | [built-in-tool-renderer.ts](built-in-tool-renderer.ts) | Custom compact rendering for built-in tools | `renderCall()`, `renderResult()` |
57
+ | [minimal-mode.ts](minimal-mode.ts) | Override built-in tool rendering for minimal display | Tool render override |
58
+ | [truncated-tool.ts](truncated-tool.ts) | Wraps ripgrep with proper output truncation (50KB/2000 lines) | Output truncation, `pi.exec()` |
59
+ | [antigravity-image-gen.ts](antigravity-image-gen.ts) | Generate images via Google Antigravity | External API, file save |
60
+ | [ssh.ts](ssh.ts) | Delegate all tools to a remote machine via SSH | SSH operations, tool delegation |
61
+ | [subagent/](subagent/) | Delegate tasks to subagents with isolated context | Subagent orchestration |
62
+
63
+ ### 🎨 Commands & UI
64
+
65
+ | Extension | Description | Key APIs |
66
+ |-----------|-------------|----------|
67
+ | [commands.ts](commands.ts) | Register custom slash commands | `pi.registerCommand()` |
68
+ | [preset.ts](preset.ts) | Named presets for model, thinking, tools, instructions | `--preset` flag, `/preset` command |
69
+ | [plan-mode/](plan-mode/) | Claude Code-style plan mode with step tracking | `/plan` command, read-only mode |
70
+ | [tools.ts](tools.ts) | Interactive `/tools` to enable/disable tools with persistence | `pi.registerCommand()`, tool management |
71
+ | [handoff.ts](handoff.ts) | Transfer context to new focused session via `/handoff` | Session creation, context transfer |
72
+ | [qna.ts](qna.ts) | Extracts questions from response into editor | `ctx.ui.setEditorText()` |
73
+ | [status-line.ts](status-line.ts) | Shows turn progress in footer | `ctx.ui.setStatus()` |
74
+ | [widget-placement.ts](widget-placement.ts) | Shows widgets above/below the editor | `ctx.ui.setWidget()` |
75
+ | [model-status.ts](model-status.ts) | Shows model changes in status bar | `model_select` hook |
76
+ | [custom-footer.ts](custom-footer.ts) | Git branch and token stats in footer | `ctx.ui.setFooter()` |
77
+ | [custom-header.ts](custom-header.ts) | Custom header | `ctx.ui.setHeader()` |
78
+ | [modal-editor.ts](modal-editor.ts) | Vim-like modal editor | `ctx.ui.setEditorComponent()` |
79
+ | [rainbow-editor.ts](rainbow-editor.ts) | Animated rainbow text effect | Custom editor component |
80
+ | [notify.ts](notify.ts) | Desktop notifications via OSC 777 (Ghostty, iTerm2, WezTerm) | Terminal escape sequences |
81
+ | [titlebar-spinner.ts](titlebar-spinner.ts) | Braille spinner in terminal title while agent works | `turn_start`/`turn_end` hooks |
82
+ | [summarize.ts](summarize.ts) | Summarize conversation and show in transient UI | External model call, UI |
83
+ | [snake.ts](snake.ts) | Snake game with custom UI and keyboard handling | `ctx.ui.custom()`, game loop |
84
+ | [space-invaders.ts](space-invaders.ts) | Space Invaders game | Full game rendering |
85
+ | [doom-overlay/](doom-overlay/) | DOOM game running as overlay at 35 FPS | Real-time game rendering |
86
+ | [overlay-test.ts](overlay-test.ts) | Test overlay compositing with edge cases | Overlay system |
87
+ | [overlay-qa-tests.ts](overlay-qa-tests.ts) | Comprehensive overlay QA: anchors, margins, stacking | Overlay QA |
88
+ | [shutdown-command.ts](shutdown-command.ts) | `/quit` command demonstrating `ctx.shutdown()` | `ctx.shutdown()` |
89
+ | [reload-runtime.ts](reload-runtime.ts) | `/reload-runtime` with safe reload flow | Runtime reload |
90
+ | [interactive-shell.ts](interactive-shell.ts) | Run interactive commands (vim, htop) with full terminal | `user_bash` hook |
91
+ | [inline-bash.ts](inline-bash.ts) | Expands `!{command}` patterns in prompts | `input` event transformation |
92
+ | [send-user-message.ts](send-user-message.ts) | Send user messages from extensions | `pi.sendUserMessage()` |
93
+ | [timed-confirm.ts](timed-confirm.ts) | Auto-dismissing confirm/select with AbortSignal | `AbortSignal`, `ctx.ui.confirm()` |
94
+ | [rpc-demo.ts](rpc-demo.ts) | Exercises all RPC extension UI methods | RPC UI methods |
95
+
96
+ ### 🔀 Git Integration
97
+
98
+ | Extension | Description | Key APIs |
99
+ |-----------|-------------|----------|
100
+ | [git-checkpoint.ts](git-checkpoint.ts) | Creates git stash checkpoints at each turn for fork restoration | `pi.exec("git")`, `session_before_fork` |
101
+ | [auto-commit-on-exit.ts](auto-commit-on-exit.ts) | Auto-commits on exit using last assistant message | `agent_end` hook |
102
+
103
+ ### 📝 System Prompt & Compaction
104
+
105
+ | Extension | Description | Key APIs |
106
+ |-----------|-------------|----------|
107
+ | [pirate.ts](pirate.ts) | Dynamically modify system prompt via hook | `before_agent_start` + `systemPromptAppend` |
108
+ | [claude-rules.ts](claude-rules.ts) | Scans `.claude/rules/` and lists rules in system prompt | System prompt injection |
109
+ | [system-prompt-header.ts](system-prompt-header.ts) | Add header to system prompt | `systemPromptAppend` |
110
+ | [custom-compaction.ts](custom-compaction.ts) | Custom compaction that summarizes entire conversation | Custom compaction strategy |
111
+ | [trigger-compact.ts](trigger-compact.ts) | Auto-triggers compaction at 100k tokens | Context monitoring, compaction |
112
+
113
+ ### 💻 System Integration
114
+
115
+ | Extension | Description |
116
+ |-----------|-------------|
117
+ | [mac-system-theme.ts](mac-system-theme.ts) | Syncs iosm theme with macOS dark/light mode |
118
+
119
+ ### 📦 Resources
120
+
121
+ | Extension | Description |
122
+ |-----------|-------------|
123
+ | [dynamic-resources/](dynamic-resources/) | Loads skills, prompts, themes using `resources_discover` |
124
+
125
+ ### 💬 Messages & Communication
126
+
127
+ | Extension | Description | Key APIs |
128
+ |-----------|-------------|----------|
129
+ | [message-renderer.ts](message-renderer.ts) | Custom message rendering with colors and expandable details | `registerMessageRenderer` |
130
+ | [event-bus.ts](event-bus.ts) | Inter-extension communication | `pi.events` |
131
+ | [input-transform.ts](input-transform.ts) | Transform user input before processing | `input` hook |
132
+
133
+ ### 📌 Session Metadata
134
+
135
+ | Extension | Description | Key APIs |
136
+ |-----------|-------------|----------|
137
+ | [session-name.ts](session-name.ts) | Name sessions for the session selector | `setSessionName` |
138
+ | [bookmark.ts](bookmark.ts) | Bookmark entries for `/tree` navigation | `setLabel` |
139
+
140
+ ### 🔌 Custom Providers
141
+
142
+ | Extension | Description |
143
+ |-----------|-------------|
144
+ | [custom-provider-anthropic/](custom-provider-anthropic/) | Custom Anthropic provider with OAuth and custom streaming |
145
+ | [custom-provider-gitlab-duo/](custom-provider-gitlab-duo/) | GitLab Duo provider using built-in streaming via proxy |
146
+ | [custom-provider-qwen-cli/](custom-provider-qwen-cli/) | Qwen CLI with OAuth device flow and OpenAI-compatible models |
147
+
148
+ ### 📎 External Dependencies
149
+
150
+ | Extension | Description |
151
+ |-----------|-------------|
152
+ | [with-deps/](with-deps/) | Extension with its own package.json and dependencies (jiti module resolution) |
153
+ | [file-trigger.ts](file-trigger.ts) | Watches a trigger file and injects contents into conversation |
154
+
155
+ ---
156
+
157
+ ## Key Patterns
158
+
159
+ ### Pattern 1: Tool with Safety Gate
160
+
161
+ ```typescript
162
+ pi.on("tool_call", async (event, ctx) => {
163
+ if (event.toolName === "bash" && event.input.command?.includes("rm -rf")) {
164
+ const ok = await ctx.ui.confirm("Warning", "Allow rm -rf?");
165
+ if (!ok) return { block: true, reason: "Blocked by user" };
166
+ }
167
+ return undefined; // Allow execution
168
+ });
169
+ ```
170
+
171
+ ### Pattern 2: Custom Tool with Rendering
172
+
173
+ ```typescript
174
+ pi.registerTool({
175
+ name: "my_tool",
176
+ label: "My Tool",
177
+ description: "Does something useful",
178
+ parameters: Type.Object({
179
+ input: Type.String({ description: "Input value" }),
180
+ }),
181
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
182
+ return {
183
+ content: [{ type: "text", text: `Result: ${params.input}` }],
184
+ details: { raw: params.input },
185
+ };
186
+ },
187
+ // Custom rendering in TUI
188
+ renderCall(args, theme) {
189
+ return new Text(theme.fg("toolTitle", "my_tool ") + args.input, 0, 0);
190
+ },
191
+ renderResult(result, { expanded }, theme) {
192
+ return new Text(result.content[0]?.text || "", 0, 0);
193
+ },
194
+ });
195
+ ```
196
+
197
+ ### Pattern 3: State Persistence via Details
198
+
199
+ ```typescript
200
+ let state: MyState = {};
201
+
202
+ pi.registerTool({
203
+ name: "stateful",
204
+ // ...
205
+ async execute(toolCallId, params) {
206
+ // Modify state
207
+ state = { ...state, ...newData };
208
+ return {
209
+ content: [{ type: "text", text: "Done" }],
210
+ details: { state: { ...state } }, // ← Persisted in session
211
+ };
212
+ },
213
+ });
214
+
215
+ // Reconstruct on session events
216
+ pi.on("session_start", async (_event, ctx) => {
217
+ state = {};
218
+ for (const entry of ctx.sessionManager.getBranch()) {
219
+ if (entry.type === "message" && entry.message.toolName === "stateful") {
220
+ state = entry.message.details?.state || {};
221
+ }
222
+ }
223
+ });
224
+ ```
225
+
226
+ ### Pattern 4: Dynamic System Prompt
227
+
228
+ ```typescript
229
+ pi.on("before_agent_start", async (event) => {
230
+ return {
231
+ systemPrompt: event.systemPrompt + "\n\nAdditional instructions here.",
232
+ };
233
+ });
234
+ ```
235
+
236
+ ### Pattern 5: StringEnum for Google Compatibility
237
+
238
+ ```typescript
239
+ import { StringEnum } from "@mariozechner/pi-ai";
240
+
241
+ // ✅ Works everywhere
242
+ action: StringEnum(["list", "add", "remove"] as const)
243
+
244
+ // ❌ Breaks with Google API
245
+ action: Type.Union([Type.Literal("list"), Type.Literal("add")])
246
+ ```
247
+
248
+ ---
249
+
250
+ ## Extension API Reference
251
+
252
+ ### Registration
253
+
254
+ | Method | Description |
255
+ |--------|-------------|
256
+ | `pi.registerTool(def)` | Register a custom tool |
257
+ | `pi.registerCommand(name, handler)` | Register a slash command |
258
+ | `pi.on(event, handler)` | Subscribe to lifecycle event |
259
+ | `pi.exec(cmd, args)` | Execute a shell command |
260
+ | `pi.sendUserMessage(text)` | Send a user message programmatically |
261
+
262
+ ### Lifecycle Hooks
263
+
264
+ | Hook | When | Can Block |
265
+ |------|------|-----------|
266
+ | `session_start` | Session begins or is resumed | No |
267
+ | `session_switch` | Active session changes | No |
268
+ | `session_fork` | Session is forked | No |
269
+ | `session_tree` | Tree navigation occurs | No |
270
+ | `session_before_fork` | Before fork is executed | No |
271
+ | `before_agent_start` | Before model is called | No (can modify prompt) |
272
+ | `tool_call` | Before tool executes | **Yes** (`{ block: true }`) |
273
+ | `tool_result` | After tool returns | No |
274
+ | `turn_start` | Conversation turn begins | No |
275
+ | `turn_end` | Conversation turn ends | No |
276
+ | `agent_start` | Agent begins processing | No |
277
+ | `agent_end` | Agent finishes | No |
278
+ | `model_select` | Model is changed | No |
279
+ | `input` | User input received | No (can transform) |
280
+
281
+ ### UI Context Methods
282
+
283
+ | Method | Description |
284
+ |--------|-------------|
285
+ | `ctx.ui.confirm(title, message)` | Show yes/no dialog |
286
+ | `ctx.ui.select(title, options)` | Show selection dialog |
287
+ | `ctx.ui.notify(message, level)` | Show notification |
288
+ | `ctx.ui.setStatus(text, level)` | Set status bar text |
289
+ | `ctx.ui.setFooter(factory)` | Custom footer renderer |
290
+ | `ctx.ui.setHeader(factory)` | Custom header renderer |
291
+ | `ctx.ui.setWidget(placement, component)` | Show widget above/below editor |
292
+ | `ctx.ui.setEditorText(text)` | Set editor content |
293
+ | `ctx.ui.setEditorComponent(factory)` | Replace editor with custom component |
294
+ | `ctx.ui.custom(factory)` | Show full-screen custom UI |
295
+ | `ctx.hasUI` | Check if interactive mode (for non-interactive safety) |
296
+
297
+ ---
298
+
299
+ ## Writing Your Own Extension
300
+
301
+ 1. Create a `.ts` file with the extension template
302
+ 2. Place it in `~/.iosm/agent/extensions/` (global) or `.iosm/extensions/` (project)
303
+ 3. Or load explicitly: `iosm -e ./my-extension.ts`
304
+ 4. Use `/reload` to hot-reload during development
305
+
306
+ For full documentation, see [Extensions & Packages](../../docs/extensions-packages-themes.md).