@selesai/code 0.13.15 → 0.13.18

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 (473) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +2 -14
  3. package/dist/bun/cli.d.ts +3 -1
  4. package/dist/bun/cli.js +3 -9
  5. package/dist/bun/{register-bedrock.js → runtime-setup.js} +5 -0
  6. package/dist/bun/sandbox-env-setup.d.ts +1 -0
  7. package/dist/bun/sandbox-env-setup.js +3 -0
  8. package/dist/cli/auth-command.d.ts +23 -0
  9. package/dist/cli/auth-command.js +102 -0
  10. package/dist/cli/config-selector.js +2 -1
  11. package/dist/cli/setup.d.ts +1 -0
  12. package/dist/cli/setup.js +11 -0
  13. package/dist/cli.js +2 -14
  14. package/dist/config.d.ts +3 -2
  15. package/dist/config.js +9 -4
  16. package/dist/core/agent-session-runtime.js +15 -7
  17. package/dist/core/agent-session.d.ts +2 -6
  18. package/dist/core/agent-session.js +15 -4
  19. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  20. package/dist/core/compaction/branch-summarization.js +2 -1
  21. package/dist/core/extensions/loader.js +3 -0
  22. package/dist/core/extensions/types.d.ts +16 -2
  23. package/dist/core/http-dispatcher.js +2 -0
  24. package/dist/core/keybindings.d.ts +5 -0
  25. package/dist/core/keybindings.js +4 -0
  26. package/dist/core/messages.d.ts +1 -1
  27. package/dist/core/model-config.d.ts +15 -0
  28. package/dist/core/model-config.js +3 -0
  29. package/dist/core/model-runtime.d.ts +1 -0
  30. package/dist/core/model-runtime.js +5 -2
  31. package/dist/core/provider-composer.js +8 -2
  32. package/dist/core/session-export.d.ts +3 -0
  33. package/dist/core/session-export.js +31 -0
  34. package/dist/core/session-manager.d.ts +3 -2
  35. package/dist/core/session-manager.js +40 -13
  36. package/dist/core/skills.d.ts +1 -1
  37. package/dist/core/skills.js +4 -2
  38. package/dist/core/system-prompt.js +10 -10
  39. package/dist/core/tools/bash.js +3 -117
  40. package/dist/core/tools/edit.d.ts +1 -12
  41. package/dist/core/tools/edit.js +5 -163
  42. package/dist/core/tools/find.js +4 -55
  43. package/dist/core/tools/grep.js +4 -60
  44. package/dist/core/tools/ls.js +4 -49
  45. package/dist/core/tools/read.d.ts +4 -0
  46. package/dist/core/tools/read.js +10 -122
  47. package/dist/core/tools/renderers/bash.d.ts +11 -0
  48. package/dist/core/tools/renderers/bash.js +129 -0
  49. package/dist/core/tools/renderers/edit.d.ts +22 -0
  50. package/dist/core/tools/renderers/edit.js +166 -0
  51. package/dist/core/tools/renderers/find.d.ts +9 -0
  52. package/dist/core/tools/renderers/find.js +63 -0
  53. package/dist/core/tools/renderers/grep.d.ts +9 -0
  54. package/dist/core/tools/renderers/grep.js +68 -0
  55. package/dist/core/tools/renderers/index.d.ts +27 -0
  56. package/dist/core/tools/renderers/index.js +46 -0
  57. package/dist/core/tools/renderers/ls.d.ts +9 -0
  58. package/dist/core/tools/renderers/ls.js +57 -0
  59. package/dist/core/tools/renderers/read.d.ts +10 -0
  60. package/dist/core/tools/renderers/read.js +128 -0
  61. package/dist/core/tools/renderers/write.d.ts +9 -0
  62. package/dist/core/tools/renderers/write.js +152 -0
  63. package/dist/core/tools/write.js +5 -146
  64. package/dist/extensions/capability-gateway/index.ts +12 -1
  65. package/dist/extensions/capability-gateway/integration.test.ts +23 -0
  66. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +18 -0
  67. package/dist/extensions/pi-hermes-memory/README.md +16 -12
  68. package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +1 -1
  69. package/dist/extensions/pi-hermes-memory/package-lock.json +587 -62
  70. package/dist/extensions/pi-hermes-memory/package.json +4 -4
  71. package/dist/extensions/pi-hermes-memory/src/config.ts +32 -0
  72. package/dist/extensions/pi-hermes-memory/src/constants.ts +12 -2
  73. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +109 -51
  74. package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +9 -3
  75. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +257 -98
  76. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +9 -2
  77. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +5 -0
  78. package/dist/extensions/pi-hermes-memory/src/index.ts +22 -2
  79. package/dist/extensions/pi-hermes-memory/src/paths.ts +1 -1
  80. package/dist/extensions/pi-hermes-memory/src/store/db.ts +6 -0
  81. package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +58 -1
  82. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +60 -8
  83. package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +169 -7
  84. package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +7 -21
  85. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +134 -15
  86. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +4 -2
  87. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +24 -9
  88. package/dist/extensions/pi-hermes-memory/src/types.ts +11 -0
  89. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +42 -0
  90. package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +159 -3
  91. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +452 -0
  92. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +39 -0
  93. package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +91 -0
  94. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +29 -0
  95. package/dist/extensions/pi-hermes-memory/tests/store/fts-query.test.ts +116 -0
  96. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +163 -0
  97. package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +233 -0
  98. package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +12 -0
  99. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +175 -0
  100. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +2 -2
  101. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +22 -0
  102. package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +37 -1
  103. package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
  104. package/dist/extensions/pi-intercom/README.md +16 -2
  105. package/dist/extensions/pi-intercom/broker/spawn.test.ts +19 -2
  106. package/dist/extensions/pi-intercom/broker/spawn.ts +4 -4
  107. package/dist/extensions/pi-intercom/index.ts +1 -1
  108. package/dist/extensions/pi-intercom/intercom.integration.test.ts +121 -2
  109. package/dist/extensions/pi-intercom/package.json +1 -1
  110. package/dist/extensions/pi-intercom/project-agent.test.ts +1 -1
  111. package/dist/extensions/pi-intercom/project-agent.ts +1 -6
  112. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +7 -6
  113. package/dist/extensions/pi-rewind-hook/index.test.ts +7 -0
  114. package/dist/extensions/pi-subagents/.github/workflows/test.yml +36 -4
  115. package/dist/extensions/pi-subagents/CHANGELOG.md +120 -0
  116. package/dist/extensions/pi-subagents/README.md +3 -3
  117. package/dist/extensions/pi-subagents/agents/researcher.md +23 -13
  118. package/dist/extensions/pi-subagents/agents/reviewer.md +1 -1
  119. package/dist/extensions/pi-subagents/agents/scout.md +1 -1
  120. package/dist/extensions/pi-subagents/docs/agents.md +32 -16
  121. package/dist/extensions/pi-subagents/docs/configuration.md +41 -15
  122. package/dist/extensions/pi-subagents/docs/extension-api.md +109 -6
  123. package/dist/extensions/pi-subagents/docs/missions.md +2 -0
  124. package/dist/extensions/pi-subagents/docs/models.md +58 -1
  125. package/dist/extensions/pi-subagents/docs/observability.md +50 -12
  126. package/dist/extensions/pi-subagents/docs/tool-reference.md +17 -10
  127. package/dist/extensions/pi-subagents/docs/watchdog.md +1 -1
  128. package/dist/extensions/pi-subagents/docs/workflows.md +26 -9
  129. package/dist/extensions/pi-subagents/package-lock.json +747 -177
  130. package/dist/extensions/pi-subagents/package.json +6 -4
  131. package/dist/extensions/pi-subagents/runner-server-preload.mjs +13 -0
  132. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +2 -1
  133. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
  134. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +21 -4
  135. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -1
  136. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +2 -0
  137. package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +63 -0
  138. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +61 -16
  139. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +2 -0
  140. package/dist/extensions/pi-subagents/src/agents/agents.ts +8 -0
  141. package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +0 -1
  142. package/dist/extensions/pi-subagents/src/api/{pi-args.ts → child-tool-plan.ts} +1 -1
  143. package/dist/extensions/pi-subagents/src/api/preflight.ts +7 -4
  144. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -2
  145. package/dist/extensions/pi-subagents/src/api/workflow-resources.ts +6 -0
  146. package/dist/extensions/pi-subagents/src/extension/config.ts +4 -2
  147. package/dist/extensions/pi-subagents/src/extension/doctor.ts +2 -10
  148. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +9 -11
  149. package/dist/extensions/pi-subagents/src/extension/index.ts +99 -10
  150. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +13 -0
  151. package/dist/extensions/pi-subagents/src/extension/rpc.ts +7 -23
  152. package/dist/extensions/pi-subagents/src/extension/schemas.ts +11 -8
  153. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +25 -7
  154. package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +73 -0
  155. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +228 -136
  156. package/dist/extensions/pi-subagents/src/intercom/supervisor-ui.ts +244 -0
  157. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +37 -16
  158. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +18 -18
  159. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +51 -25
  160. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +46 -3
  161. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +14 -3
  162. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +9 -0
  163. package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +10 -12
  164. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -15
  165. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +40 -29
  166. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +8 -0
  167. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +79 -247
  168. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +88 -12
  169. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +6 -6
  170. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +24 -24
  171. package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +96 -0
  172. package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +642 -0
  173. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +75 -6
  174. package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +163 -0
  175. package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +86 -0
  176. package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +31 -0
  177. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +18 -4
  178. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -1
  179. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +597 -1092
  180. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +3 -0
  181. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +4 -0
  182. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +20 -17
  183. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +296 -394
  184. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +4 -0
  185. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +3 -1
  186. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +9 -5
  187. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +630 -283
  188. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +8 -5
  189. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +78 -98
  190. package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +3 -3
  191. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +16 -3
  192. package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
  193. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +47 -47
  194. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -2
  195. package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +174 -0
  196. package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +14 -3
  197. package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +319 -0
  198. package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +25 -0
  199. package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +126 -0
  200. package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +373 -0
  201. package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +530 -0
  202. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +2 -2
  203. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +2 -1
  204. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +16 -0
  205. package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +11 -11
  206. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +30 -20
  207. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +5 -4
  208. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +84 -15
  209. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +88 -12
  210. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +37 -53
  211. package/dist/extensions/pi-subagents/src/runs/shared/nested-path.ts +1 -1
  212. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +18 -7
  213. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +57 -12
  214. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -4
  215. package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +0 -11
  216. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +4 -1
  217. package/dist/extensions/pi-subagents/src/runs/shared/readonly-drain-observation.ts +42 -0
  218. package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +69 -0
  219. package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +307 -0
  220. package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +8 -21
  221. package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +3 -30
  222. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +17 -4
  223. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +2 -0
  224. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +99 -386
  225. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +18 -62
  226. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +0 -14
  227. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +31 -9
  228. package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +190 -0
  229. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +506 -226
  230. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +1 -1
  231. package/dist/extensions/pi-subagents/src/shared/jsonl-writer.ts +11 -0
  232. package/dist/extensions/pi-subagents/src/shared/model-response-aliases.ts +13 -0
  233. package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +0 -6
  234. package/dist/extensions/pi-subagents/src/shared/types.ts +145 -89
  235. package/dist/extensions/pi-subagents/src/shared/utils.ts +13 -6
  236. package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +2 -0
  237. package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +18 -13
  238. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +0 -6
  239. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +1 -1
  240. package/dist/extensions/pi-subagents/src/tui/fleet.ts +11 -6
  241. package/dist/extensions/pi-subagents/src/tui/render.ts +277 -46
  242. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +0 -1
  243. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +12 -12
  244. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
  245. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +116 -15
  246. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +15 -18
  247. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +57 -8
  248. package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +19 -19
  249. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +3 -3
  250. package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +97 -22
  251. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +3 -0
  252. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +336 -21
  253. package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +1181 -0
  254. package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +2240 -0
  255. package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +2268 -0
  256. package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +1512 -0
  257. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +231 -16
  258. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +4 -18
  259. package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +95 -0
  260. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +9 -15
  261. package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +374 -0
  262. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +20 -10
  263. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +18 -6
  264. package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +151 -0
  265. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +42 -1
  266. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +150 -25
  267. package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +354 -0
  268. package/dist/extensions/pi-subagents/test/integration/shared-cwd-terminal-evidence.test.ts +117 -0
  269. package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +3678 -0
  270. package/dist/extensions/pi-subagents/test/integration/{single-execution.test.ts → single-execution.part-2.test.ts} +500 -4207
  271. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -2
  272. package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +127 -0
  273. package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +365 -0
  274. package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +31 -0
  275. package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +74 -0
  276. package/dist/extensions/pi-subagents/test/smoke/pi085-extension.ts +16 -0
  277. package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +699 -0
  278. package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +418 -0
  279. package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +13 -0
  280. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +30 -76
  281. package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +84 -0
  282. package/dist/extensions/pi-subagents/test/support/result-publication-capacity-preload.mjs +70 -0
  283. package/dist/extensions/pi-subagents/test/support/runner-child-session-factory.ts +17 -0
  284. package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +390 -0
  285. package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +120 -0
  286. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +24 -3
  287. package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +87 -0
  288. package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +163 -0
  289. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +70 -31
  290. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +78 -3
  291. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +2 -8
  292. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +1 -1
  293. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +73 -66
  294. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +51 -1
  295. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +49 -1
  296. package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +103 -0
  297. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +3 -3
  298. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +9 -8
  299. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +10 -7
  300. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +48 -6
  301. package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +90 -0
  302. package/dist/extensions/pi-subagents/test/unit/{pi-args-permission-system.test.ts → child-tool-plan-permission-system.test.ts} +48 -86
  303. package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +33 -0
  304. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +18 -18
  305. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +9 -9
  306. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +8 -7
  307. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +225 -65
  308. package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +17 -22
  309. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +11 -1
  310. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +47 -3
  311. package/dist/extensions/pi-subagents/test/unit/foreign-workflow-steering.test.ts +74 -0
  312. package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +23 -29
  313. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +96 -4
  314. package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +4 -4
  315. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +116 -55
  316. package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +58 -1
  317. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +104 -3
  318. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
  319. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +31 -1
  320. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +102 -51
  321. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +196 -6
  322. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +181 -38
  323. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +62 -70
  324. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +58 -53
  325. package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +42 -0
  326. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +84 -0
  327. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +13 -5
  328. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +21 -5
  329. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +5 -4
  330. package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +2 -6
  331. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +28 -2
  332. package/dist/extensions/pi-subagents/test/unit/pi-web-session-liveness.test.ts +209 -0
  333. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +38 -1
  334. package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +43 -0
  335. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +24 -2
  336. package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +174 -0
  337. package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +94 -0
  338. package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +1329 -0
  339. package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +29 -80
  340. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +11 -8
  341. package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +2 -2
  342. package/dist/extensions/pi-subagents/test/unit/retained-nested-route-tracker.test.ts +175 -0
  343. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +38 -12
  344. package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +2 -5
  345. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +89 -1
  346. package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +2 -16
  347. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +27 -3
  348. package/dist/extensions/pi-subagents/test/unit/scheduled-supervisor-demand.test.ts +215 -0
  349. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +15 -11
  350. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +237 -1
  351. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -5
  352. package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +2 -2
  353. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +14 -1
  354. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +130 -739
  355. package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +682 -0
  356. package/dist/extensions/pi-subagents/test/unit/supervisor-ui.test.ts +137 -0
  357. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +1 -11
  358. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +23 -3
  359. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +8 -1
  360. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +19 -1
  361. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +72 -4
  362. package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +17 -3
  363. package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +34 -0
  364. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +12 -2
  365. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +46 -6
  366. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +3 -3
  367. package/dist/extensions/pi-subagents/test/unit/workflow-resources.test.ts +133 -1
  368. package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +53 -2
  369. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +222 -14
  370. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +526 -85
  371. package/dist/extensions/pi-web-agent/src/backends/config.ts +1 -0
  372. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +5 -3
  373. package/dist/extensions/pi-web-agent/src/search/tokenin.ts +7 -3
  374. package/dist/extensions/pi-web-agent/src/types.ts +1 -1
  375. package/dist/extensions/pi-zentui/README.md +17 -0
  376. package/dist/extensions/pi-zentui/assets/screenshots/footer-status-hyperlink.png +0 -0
  377. package/dist/extensions/pi-zentui/docs/configuration.md +71 -2
  378. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +11 -0
  379. package/dist/extensions/pi-zentui/extensions/zentui/editor-transfer.ts +14 -0
  380. package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +29 -13
  381. package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +5 -4
  382. package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +11 -0
  383. package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +11 -10
  384. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +77 -3
  385. package/dist/extensions/pi-zentui/extensions/zentui/presets.ts +77 -0
  386. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +103 -2
  387. package/dist/extensions/pi-zentui/extensions/zentui/working-line-extension-segments.ts +115 -0
  388. package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +87 -5
  389. package/dist/extensions/pi-zentui/package-lock.json +277 -517
  390. package/dist/extensions/pi-zentui/package.json +7 -4
  391. package/dist/extensions/pi-zentui/test/config-presets.test.ts +238 -0
  392. package/dist/extensions/pi-zentui/test/editor-transfer.test.ts +24 -1
  393. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +570 -2
  394. package/dist/extensions/pi-zentui/test/extension-status.test.ts +90 -0
  395. package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +243 -0
  396. package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
  397. package/dist/extensions/pi-zentui/test/presets.test.ts +121 -0
  398. package/dist/extensions/pi-zentui/test/settings-command.test.ts +205 -1
  399. package/dist/extensions/pi-zentui/test/working-line-extension-segments.test.ts +139 -0
  400. package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +237 -3
  401. package/dist/extensions/pi-zentui/test/working-line.test.ts +94 -2
  402. package/dist/index.d.ts +1 -1
  403. package/dist/main.js +4 -1
  404. package/dist/modes/interactive/chat-viewport.d.ts +19 -0
  405. package/dist/modes/interactive/chat-viewport.js +27 -0
  406. package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
  407. package/dist/modes/interactive/components/assistant-message.js +30 -13
  408. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  409. package/dist/modes/interactive/components/custom-editor.js +39 -1
  410. package/dist/modes/interactive/components/first-time-setup.js +1 -1
  411. package/dist/modes/interactive/components/index.d.ts +1 -1
  412. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -0
  413. package/dist/modes/interactive/components/markdown-transform.js +18 -0
  414. package/dist/modes/interactive/components/model-selector.js +19 -17
  415. package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
  416. package/dist/modes/interactive/components/settings-selector.d.ts +7 -1
  417. package/dist/modes/interactive/components/settings-selector.js +128 -20
  418. package/dist/modes/interactive/components/settings-submenu.d.ts +71 -0
  419. package/dist/modes/interactive/components/settings-submenu.js +164 -0
  420. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  421. package/dist/modes/interactive/components/status-indicator.js +10 -3
  422. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  423. package/dist/modes/interactive/components/thinking-selector.js +75 -18
  424. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  425. package/dist/modes/interactive/components/tool-execution.js +35 -33
  426. package/dist/modes/interactive/components/trust-selector.js +2 -2
  427. package/dist/modes/interactive/interactive-mode.d.ts +13 -15
  428. package/dist/modes/interactive/interactive-mode.js +144 -80
  429. package/dist/modes/interactive/session-share.d.ts +15 -0
  430. package/dist/modes/interactive/session-share.js +183 -0
  431. package/dist/modes/interactive/theme/dark.json +2 -1
  432. package/dist/modes/interactive/theme/light.json +2 -1
  433. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  434. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  435. package/dist/modes/interactive/theme/theme-json.d.ts +83 -0
  436. package/dist/modes/interactive/theme/theme-json.js +129 -0
  437. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  438. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  439. package/dist/modes/interactive/theme/theme.js +18 -119
  440. package/dist/modes/interactive/tui-renderer.d.ts +20 -0
  441. package/dist/modes/interactive/tui-renderer.js +65 -0
  442. package/dist/utils/exif-orientation.js +2 -3
  443. package/dist/utils/management-http.d.ts +24 -0
  444. package/dist/utils/management-http.js +53 -0
  445. package/dist/utils/text.d.ts +7 -0
  446. package/dist/utils/text.js +8 -0
  447. package/dist/utils/tools-manager.d.ts +1 -0
  448. package/dist/utils/tools-manager.js +43 -21
  449. package/docs/docs.json +0 -4
  450. package/package.json +4 -4
  451. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +0 -415
  452. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +0 -1059
  453. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +0 -116
  454. package/dist/extensions/pi-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
  455. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +0 -224
  456. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +0 -6986
  457. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +0 -447
  458. package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +0 -185
  459. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +0 -311
  460. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +0 -84
  461. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +0 -202
  462. package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +0 -101
  463. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +0 -2347
  464. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +0 -104
  465. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +0 -49
  466. package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
  467. package/dist/skills/imagegen-frontend-web/SKILL.md +0 -987
  468. package/dist/skills/implanger/SKILL.md +0 -70
  469. package/dist/skills/output/SKILL.md +0 -49
  470. package/dist/skills/planger/SKILL.md +0 -167
  471. package/dist/skills/workflow/SKILL.md +0 -95
  472. package/docs/workflows.md +0 -18
  473. /package/dist/bun/{register-bedrock.d.ts → runtime-setup.d.ts} +0 -0
@@ -2,17 +2,21 @@ import { Container, fuzzyFilter, getKeybindings, Input, Key, matchesKey, Spacer,
2
2
  import { getModelSearchText } from "../model-search.js";
3
3
  import { theme } from "../theme/theme.js";
4
4
  import { DynamicBorder } from "./dynamic-border.js";
5
- import { keyText } from "./keybinding-hints.js";
5
+ import { keyDisplayText } from "./keybinding-hints.js";
6
6
  function isEnabled(enabledIds, id) {
7
7
  return enabledIds === null || enabledIds.includes(id);
8
8
  }
9
- function toggle(enabledIds, id) {
9
+ /** Collapse an explicit list back to null (= all enabled) when it covers every available model. */
10
+ function normalizeEnabled(result, allIds) {
11
+ return result.length === allIds.length && result.every((id) => allIds.includes(id)) ? null : result;
12
+ }
13
+ function toggle(enabledIds, allIds, id) {
10
14
  if (enabledIds === null)
11
- return [id]; // First toggle: start with only this one
15
+ return allIds.filter((modelId) => modelId !== id);
12
16
  const index = enabledIds.indexOf(id);
13
17
  if (index >= 0)
14
18
  return [...enabledIds.slice(0, index), ...enabledIds.slice(index + 1)];
15
- return [...enabledIds, id];
19
+ return normalizeEnabled([...enabledIds, id], allIds);
16
20
  }
17
21
  function enableAll(enabledIds, allIds, targetIds) {
18
22
  if (enabledIds === null)
@@ -23,7 +27,7 @@ function enableAll(enabledIds, allIds, targetIds) {
23
27
  if (!result.includes(id))
24
28
  result.push(id);
25
29
  }
26
- return result.length === allIds.length && result.every((id) => allIds.includes(id)) ? null : result;
30
+ return normalizeEnabled(result, allIds);
27
31
  }
28
32
  function clearAll(enabledIds, allIds, targetIds) {
29
33
  if (enabledIds === null) {
@@ -91,7 +95,7 @@ export class ScopedModelsSelectorComponent extends Container {
91
95
  this.addChild(new DynamicBorder());
92
96
  this.addChild(new Spacer(1));
93
97
  this.addChild(new Text(theme.fg("accent", theme.bold("Model Configuration")), 0, 0));
94
- this.addChild(new Text(theme.fg("muted", `Session-only. ${keyText("app.models.save")} to save to settings.`), 0, 0));
98
+ this.addChild(new Text(theme.fg("muted", `Session-only. ${keyDisplayText("app.models.save")} to save to settings.`), 0, 0));
95
99
  this.addChild(new Spacer(1));
96
100
  // Search input
97
101
  this.searchInput = new Input();
@@ -122,12 +126,12 @@ export class ScopedModelsSelectorComponent extends Container {
122
126
  ? "all enabled"
123
127
  : `${enabledCount}/${this.allIds.length} enabled${unavailableCount ? ` · ${unavailableCount} unavailable` : ""}`;
124
128
  const parts = [
125
- `${keyText("tui.select.confirm")} toggle`,
126
- `${keyText("app.models.enableAll")} all`,
127
- `${keyText("app.models.clearAll")} clear`,
128
- `${keyText("app.models.toggleProvider")} provider`,
129
- `${keyText("app.models.reorderUp")}/${keyText("app.models.reorderDown")} reorder`,
130
- `${keyText("app.models.save")} save`,
129
+ `${keyDisplayText("tui.select.confirm")} toggle`,
130
+ `${keyDisplayText("app.models.enableAll")} all`,
131
+ `${keyDisplayText("app.models.clearAll")} clear`,
132
+ `${keyDisplayText("app.models.toggleProvider")} provider`,
133
+ `${keyDisplayText("app.models.reorderUp")}/${keyDisplayText("app.models.reorderDown")} reorder`,
134
+ `${keyDisplayText("app.models.save")} save`,
131
135
  countText,
132
136
  ];
133
137
  return this.isDirty
@@ -157,22 +161,16 @@ export class ScopedModelsSelectorComponent extends Container {
157
161
  }
158
162
  const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible));
159
163
  const endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);
160
- const allEnabled = this.enabledIds === null;
161
164
  for (let i = startIndex; i < endIndex; i++) {
162
165
  const item = this.filteredItems[i];
163
166
  const isSelected = i === this.selectedIndex;
164
167
  const prefix = isSelected ? theme.fg("accent", "→ ") : " ";
165
168
  const id = item.model?.id ?? item.fullId;
166
- const modelText = isSelected ? theme.fg("accent", id) : id;
169
+ const styledId = item.model ? id : theme.strikethrough(id);
170
+ const modelText = isSelected ? theme.fg("accent", styledId) : styledId;
167
171
  const providerBadge = theme.fg("muted", item.model ? ` [${item.model.provider}]` : " [unavailable]");
168
- const status = item.model
169
- ? allEnabled
170
- ? ""
171
- : item.enabled
172
- ? theme.fg("success", " ✓")
173
- : theme.fg("dim", " ✗")
174
- : theme.fg("dim", " ✗");
175
- this.listContainer.addChild(new Text(`${prefix}${modelText}${providerBadge}${status}`, 0, 0));
172
+ const status = item.model && item.enabled ? theme.fg("accent", "✓ ") : " ";
173
+ this.listContainer.addChild(new Text(`${prefix}${status}${modelText}${providerBadge}`, 0, 0));
176
174
  }
177
175
  // Add scroll indicator if needed
178
176
  if (startIndex > 0 || endIndex < this.filteredItems.length) {
@@ -227,7 +225,7 @@ export class ScopedModelsSelectorComponent extends Container {
227
225
  if (kb.matches(data, "tui.select.confirm")) {
228
226
  const item = this.filteredItems[this.selectedIndex];
229
227
  if (item) {
230
- this.enabledIds = toggle(this.enabledIds, item.fullId);
228
+ this.enabledIds = toggle(this.enabledIds, this.allIds, item.fullId);
231
229
  this.isDirty = true;
232
230
  this.refresh();
233
231
  this.notifyChange();
@@ -1,5 +1,5 @@
1
1
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
- import type { Transport } from "@earendil-works/pi-ai";
2
+ import { type Model, type Transport } from "@earendil-works/pi-ai";
3
3
  import { Container, type ScrollViewScrollbar, SettingsList } from "@earendil-works/pi-tui";
4
4
  import type { DefaultProjectTrust, FullscreenExitOutput, TuiMode, WarningSettings } from "../../../core/settings-manager.ts";
5
5
  import { type TerminalTheme } from "../theme/theme.ts";
@@ -29,6 +29,10 @@ export interface SettingsConfig {
29
29
  httpIdleTimeoutMs: number;
30
30
  thinkingLevel: ThinkingLevel;
31
31
  availableThinkingLevels: ThinkingLevel[];
32
+ defaultModel: string;
33
+ currentModel?: Model<any>;
34
+ availableDefaultModels: readonly Model<any>[];
35
+ modelThinkingLevels: Record<string, ThinkingLevel>;
32
36
  currentTheme: string;
33
37
  terminalTheme: TerminalTheme;
34
38
  availableThemes: string[];
@@ -67,6 +71,8 @@ export interface SettingsCallbacks {
67
71
  onFollowUpModeChange: (mode: "all" | "one-at-a-time") => void;
68
72
  onTransportChange: (transport: Transport) => void;
69
73
  onHttpIdleTimeoutMsChange: (timeoutMs: number) => void;
74
+ onModelThinkingLevelChange: (provider: string, modelId: string, level: ThinkingLevel) => void;
75
+ onModelThinkingLevelRemove: (provider: string, modelId: string) => void;
70
76
  onThinkingLevelChange: (level: ThinkingLevel) => void;
71
77
  onThemeChange: (theme: string) => void;
72
78
  onThemePreview?: (theme: string) => void;
@@ -1,8 +1,11 @@
1
+ import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
1
2
  import { Container, getCapabilities, SelectList, SettingsList, Spacer, Text, } from "@earendil-works/pi-tui";
2
3
  import { formatHttpIdleTimeoutMs, HTTP_IDLE_TIMEOUT_CHOICES } from "../../../core/http-dispatcher.js";
3
4
  import { getSelectListTheme, getSettingsListTheme, parseAutoThemeSetting, theme, } from "../theme/theme.js";
4
5
  import { DynamicBorder } from "./dynamic-border.js";
5
6
  import { keyDisplayText } from "./keybinding-hints.js";
7
+ import { SteppedSubmenu } from "./settings-submenu.js";
8
+ const MODEL_PICKER_LAYOUT = { minPrimaryColumnWidth: 12, maxPrimaryColumnWidth: 46 };
6
9
  const SETTINGS_SUBMENU_SELECT_LIST_LAYOUT = {
7
10
  minPrimaryColumnWidth: 12,
8
11
  maxPrimaryColumnWidth: 32,
@@ -132,18 +135,21 @@ class SelectSubmenu extends Container {
132
135
  this.selectList.handleInput(data);
133
136
  }
134
137
  }
135
- function themeItems(availableThemes) {
136
- return availableThemes.map((name) => ({ value: name, label: name }));
138
+ function themeItems(availableThemes, currentTheme) {
139
+ return availableThemes.map((name) => ({
140
+ value: name,
141
+ label: `${name === currentTheme ? "✓ " : " "}${name}`,
142
+ }));
137
143
  }
138
144
  const AUTOMATIC_THEME_VALUE = "/";
139
- function singleModeThemeItems(availableThemes) {
145
+ function singleModeThemeItems(availableThemes, currentTheme) {
140
146
  return [
141
147
  {
142
148
  value: AUTOMATIC_THEME_VALUE,
143
- label: "Automatic",
149
+ label: " Automatic",
144
150
  description: "Use separate themes for light and dark terminal appearance",
145
151
  },
146
- ...themeItems(availableThemes),
152
+ ...themeItems(availableThemes, currentTheme),
147
153
  ];
148
154
  }
149
155
  function preferredTheme(availableThemes, preferred, fallback) {
@@ -203,7 +209,7 @@ class ThemeSubmenu extends Container {
203
209
  }
204
210
  showSingleMenu() {
205
211
  this.mode = "single";
206
- const menu = new SelectSubmenu("Theme", "Select a theme, or choose Automatic to follow terminal appearance.", singleModeThemeItems(this.availableThemes), this.singleTheme, (value) => {
212
+ const menu = new SelectSubmenu("Theme", "Select a theme, or choose Automatic to follow terminal appearance.", singleModeThemeItems(this.availableThemes, this.singleTheme), this.singleTheme, (value) => {
207
213
  if (value === AUTOMATIC_THEME_VALUE) {
208
214
  this.mode = "automatic";
209
215
  this.callbacks.onThemePreview?.(this.getThemeSetting());
@@ -280,7 +286,7 @@ class ThemeSubmenu extends Container {
280
286
  this.setContent(content, settingsList);
281
287
  }
282
288
  createThemeSelect(title, description, currentValue, done, onSelect) {
283
- return new SelectSubmenu(title, description, themeItems(this.availableThemes), currentValue, onSelect, () => {
289
+ return new SelectSubmenu(title, description, themeItems(this.availableThemes, currentValue), currentValue, onSelect, () => {
284
290
  this.callbacks.onThemePreview?.(this.getThemeSetting());
285
291
  done();
286
292
  }, (value) => this.callbacks.onThemePreview?.(value));
@@ -302,6 +308,22 @@ class ThemeSubmenu extends Container {
302
308
  this.onDone();
303
309
  }
304
310
  }
311
+ const CLEAR_OVERRIDE_VALUE = "__clear__";
312
+ function modelSettingKey(model) {
313
+ return `${model.provider}/${model.id}`;
314
+ }
315
+ function modelDisplayLabel(model) {
316
+ return `${model.id} [${model.provider}]`;
317
+ }
318
+ function modelThinkingOverridesSummary(overrides) {
319
+ const count = Object.keys(overrides).length;
320
+ if (count === 0)
321
+ return "none";
322
+ return `${count} configured`;
323
+ }
324
+ function modelItemLabel(model) {
325
+ return `${model.id} ${theme.fg("muted", `[${model.provider}]`)}`;
326
+ }
305
327
  /**
306
328
  * Main settings selector component.
307
329
  */
@@ -311,7 +333,12 @@ export class SettingsSelectorComponent extends Container {
311
333
  super();
312
334
  const supportsImages = getCapabilities().images;
313
335
  const followUpKey = keyDisplayText("app.message.followUp");
336
+ const cycleThinkingKey = keyDisplayText("app.thinking.cycle");
314
337
  let currentWarnings = { ...config.warnings };
338
+ const currentModelThinkingLevels = { ...config.modelThinkingLevels };
339
+ const defaultModelByValue = new Map(config.availableDefaultModels.map((model) => [modelSettingKey(model), model]));
340
+ const currentDefaultModelKey = defaultModelByValue.has(config.defaultModel) ? config.defaultModel : undefined;
341
+ const currentModelKey = config.currentModel ? modelSettingKey(config.currentModel) : undefined;
315
342
  let skillsChanged = false;
316
343
  const items = [
317
344
  {
@@ -373,7 +400,7 @@ export class SettingsSelectorComponent extends Container {
373
400
  {
374
401
  id: "cache-miss-notices",
375
402
  label: "Cache miss notices",
376
- description: "Show transcript notices for significant prompt-cache misses",
403
+ description: "Show transcript notices for cache costs and provider recovery diagnostics",
377
404
  currentValue: config.showCacheMissNotices ? "true" : "false",
378
405
  values: ["true", "false"],
379
406
  },
@@ -440,18 +467,99 @@ export class SettingsSelectorComponent extends Container {
440
467
  }, () => done()),
441
468
  },
442
469
  {
443
- id: "thinking",
444
- label: "Thinking level",
445
- description: "Reasoning depth for thinking-capable models",
446
- currentValue: config.thinkingLevel,
447
- submenu: (currentValue, done) => new SelectSubmenu("Thinking Level", "Select reasoning depth for thinking-capable models", config.availableThinkingLevels.map((level) => ({
448
- value: level,
449
- label: level,
450
- description: THINKING_DESCRIPTIONS[level],
451
- })), currentValue, (value) => {
452
- callbacks.onThinkingLevelChange(value);
453
- done(value);
454
- }, () => done()),
470
+ id: "model-thinking",
471
+ label: "Default thinking level per model",
472
+ description: `Override the default thinking level for specific models. ${cycleThinkingKey} cycles in-session.`,
473
+ currentValue: modelThinkingOverridesSummary(currentModelThinkingLevels),
474
+ submenu: (_currentValue, done) => {
475
+ const steps = [
476
+ {
477
+ key: "model",
478
+ title: "Per-Model Thinking Level",
479
+ description: "Select a model to configure",
480
+ options: () => {
481
+ const sorted = [...config.availableDefaultModels].sort((a, b) => {
482
+ const aKey = modelSettingKey(a);
483
+ const bKey = modelSettingKey(b);
484
+ if (aKey === currentModelKey)
485
+ return -1;
486
+ if (bKey === currentModelKey)
487
+ return 1;
488
+ if (aKey === currentDefaultModelKey)
489
+ return -1;
490
+ if (bKey === currentDefaultModelKey)
491
+ return 1;
492
+ return a.provider.localeCompare(b.provider);
493
+ });
494
+ const items = sorted.map((model) => {
495
+ const key = modelSettingKey(model);
496
+ const override = currentModelThinkingLevels[key];
497
+ return {
498
+ value: key,
499
+ label: modelItemLabel(model),
500
+ description: override ?? undefined,
501
+ };
502
+ });
503
+ if (items.length === 0) {
504
+ items.push({
505
+ value: "__none__",
506
+ label: "No models available",
507
+ description: "Log in to a provider or configure an API key first",
508
+ });
509
+ }
510
+ return items;
511
+ },
512
+ preselect: () => currentModelKey ?? currentDefaultModelKey,
513
+ searchable: true,
514
+ layout: MODEL_PICKER_LAYOUT,
515
+ },
516
+ {
517
+ key: "level",
518
+ title: (ctx) => {
519
+ const m = defaultModelByValue.get(ctx.model);
520
+ return `Thinking Level for ${m ? modelDisplayLabel(m) : ctx.model}`;
521
+ },
522
+ description: "Select default thinking level for this model",
523
+ options: (ctx) => {
524
+ const model = defaultModelByValue.get(ctx.model);
525
+ if (!model)
526
+ return [];
527
+ const levels = (model.reasoning ? getSupportedThinkingLevels(model) : ["off"]);
528
+ const activeLevel = currentModelThinkingLevels[ctx.model];
529
+ const items = levels.map((level) => ({
530
+ value: level,
531
+ label: `${level === activeLevel ? "✓ " : " "}${level}`,
532
+ description: THINKING_DESCRIPTIONS[level],
533
+ }));
534
+ if (currentModelThinkingLevels[ctx.model] !== undefined) {
535
+ items.push({
536
+ value: CLEAR_OVERRIDE_VALUE,
537
+ label: " (clear override)",
538
+ description: `Revert to global default (${config.thinkingLevel})`,
539
+ });
540
+ }
541
+ return items;
542
+ },
543
+ preselect: (ctx) => currentModelThinkingLevels[ctx.model],
544
+ },
545
+ ];
546
+ const summary = () => modelThinkingOverridesSummary(currentModelThinkingLevels);
547
+ return new SteppedSubmenu(steps, (selections) => {
548
+ const model = defaultModelByValue.get(selections.model);
549
+ if (!model)
550
+ return;
551
+ if (selections.level === CLEAR_OVERRIDE_VALUE) {
552
+ callbacks.onModelThinkingLevelRemove(model.provider, model.id);
553
+ delete currentModelThinkingLevels[selections.model];
554
+ }
555
+ else {
556
+ callbacks.onModelThinkingLevelChange(model.provider, model.id, selections.level);
557
+ currentModelThinkingLevels[selections.model] = selections.level;
558
+ }
559
+ }, () => {
560
+ done(summary());
561
+ }, { loop: true });
562
+ },
455
563
  },
456
564
  {
457
565
  id: "tui-mode",
@@ -0,0 +1,71 @@
1
+ import { Container, type SelectItem, type SelectListLayoutOptions } from "@earendil-works/pi-tui";
2
+ export interface SelectSubmenuOptions {
3
+ /** Enable type-to-search fuzzy filtering. */
4
+ searchable?: boolean;
5
+ /** Override the select list layout (column widths). */
6
+ layout?: SelectListLayoutOptions;
7
+ }
8
+ /**
9
+ * Single-step submenu that shows a titled select list.
10
+ * With `searchable: true`, typing filters the list using fuzzy matching.
11
+ */
12
+ export declare class SelectSubmenu extends Container {
13
+ private selectList;
14
+ private listChildIndex;
15
+ private allOptions;
16
+ private listLayout;
17
+ private searchInput;
18
+ private onSelectCb;
19
+ private onCancelCb;
20
+ private onSelectionChangeCb?;
21
+ constructor(title: string, description: string, options: SelectItem[], currentValue: string, onSelect: (value: string) => void, onCancel: () => void, onSelectionChange?: (value: string) => void, submenuOptions?: SelectSubmenuOptions);
22
+ private buildSelectList;
23
+ private applyFilter;
24
+ handleInput(data: string): void;
25
+ }
26
+ /** One step in a {@link SteppedSubmenu}. */
27
+ export interface SteppedSubmenuStep {
28
+ /** Unique key \u2014 the selected value is stored in the result context under this key. */
29
+ key: string;
30
+ /** Title shown at the top of the step. Receives prior selections. */
31
+ title: string | ((context: Record<string, string>) => string);
32
+ /** Description shown below the title. Receives prior selections. */
33
+ description: string | ((context: Record<string, string>) => string);
34
+ /** Build the option list for this step. Called fresh each time the step is shown. */
35
+ options: (context: Record<string, string>) => SelectItem[];
36
+ /** Optionally pre-select a value when entering this step. */
37
+ preselect?: (context: Record<string, string>) => string | undefined;
38
+ /** Enable type-to-search fuzzy filtering for this step. */
39
+ searchable?: boolean;
40
+ /** Override the select list layout (column widths) for this step. */
41
+ layout?: SelectListLayoutOptions;
42
+ }
43
+ interface SteppedSubmenuOptions {
44
+ /** Start at this step index (0-based), skipping earlier steps. Requires initialContext for skipped keys. */
45
+ startAtStep?: number;
46
+ /** Pre-fill selections for skipped steps. */
47
+ initialContext?: Record<string, string>;
48
+ /** After completing the last step, loop back to step 0 instead of closing. */
49
+ loop?: boolean;
50
+ }
51
+ /**
52
+ * Generic N-step submenu built on top of {@link SelectSubmenu}.
53
+ *
54
+ * Each step's options can depend on prior selections via the shared context.
55
+ * Esc goes back one step; Esc at step 0 cancels.
56
+ * With `loop: true`, completing the final step invokes `onComplete` then returns to step 0.
57
+ */
58
+ export declare class SteppedSubmenu extends Container {
59
+ private readonly steps;
60
+ private readonly onComplete;
61
+ private readonly onCancel;
62
+ private readonly opts;
63
+ private activeComponent;
64
+ private context;
65
+ constructor(steps: SteppedSubmenuStep[], onComplete: (context: Record<string, string>) => void, onCancel: () => void, opts?: SteppedSubmenuOptions);
66
+ private buildStep;
67
+ render(width: number): string[];
68
+ handleInput(data: string): void;
69
+ invalidate(): void;
70
+ }
71
+ export {};
@@ -0,0 +1,164 @@
1
+ import { Container, fuzzyFilter, getKeybindings, Input, SelectList, Spacer, Text, } from "@earendil-works/pi-tui";
2
+ import { getSelectListTheme, theme } from "../theme/theme.js";
3
+ const SUBMENU_SELECT_LIST_LAYOUT = {
4
+ minPrimaryColumnWidth: 12,
5
+ maxPrimaryColumnWidth: 32,
6
+ };
7
+ /**
8
+ * Single-step submenu that shows a titled select list.
9
+ * With `searchable: true`, typing filters the list using fuzzy matching.
10
+ */
11
+ export class SelectSubmenu extends Container {
12
+ selectList;
13
+ listChildIndex;
14
+ allOptions;
15
+ listLayout;
16
+ searchInput;
17
+ onSelectCb;
18
+ onCancelCb;
19
+ onSelectionChangeCb;
20
+ constructor(title, description, options, currentValue, onSelect, onCancel, onSelectionChange, submenuOptions) {
21
+ super();
22
+ this.allOptions = options;
23
+ this.listLayout = submenuOptions?.layout ?? SUBMENU_SELECT_LIST_LAYOUT;
24
+ this.onSelectCb = onSelect;
25
+ this.onCancelCb = onCancel;
26
+ this.onSelectionChangeCb = onSelectionChange;
27
+ // Title
28
+ this.addChild(new Text(theme.bold(theme.fg("accent", title)), 0, 0));
29
+ // Description
30
+ if (description) {
31
+ this.addChild(new Spacer(1));
32
+ this.addChild(new Text(theme.fg("muted", description), 0, 0));
33
+ }
34
+ // Search input
35
+ if (submenuOptions?.searchable) {
36
+ this.addChild(new Spacer(1));
37
+ this.searchInput = new Input();
38
+ this.searchInput.onSubmit = () => {
39
+ this.selectList.handleInput("\r");
40
+ };
41
+ this.addChild(this.searchInput);
42
+ }
43
+ // Spacer
44
+ this.addChild(new Spacer(1));
45
+ // Select list
46
+ this.selectList = this.buildSelectList(options, currentValue);
47
+ this.listChildIndex = this.children.length;
48
+ this.addChild(this.selectList);
49
+ // Hint
50
+ this.addChild(new Spacer(1));
51
+ const hint = submenuOptions?.searchable
52
+ ? " Type to filter \u00b7 Enter to select \u00b7 Esc to go back"
53
+ : " Enter to select \u00b7 Esc to go back";
54
+ this.addChild(new Text(theme.fg("dim", hint), 0, 0));
55
+ }
56
+ buildSelectList(options, preselect) {
57
+ const list = new SelectList(options, Math.min(options.length, 10), getSelectListTheme(), this.listLayout);
58
+ const idx = options.findIndex((o) => o.value === preselect);
59
+ if (idx !== -1)
60
+ list.setSelectedIndex(idx);
61
+ list.onSelect = (item) => this.onSelectCb(item.value);
62
+ list.onCancel = this.onCancelCb;
63
+ if (this.onSelectionChangeCb) {
64
+ const cb = this.onSelectionChangeCb;
65
+ list.onSelectionChange = (item) => cb(item.value);
66
+ }
67
+ return list;
68
+ }
69
+ applyFilter(query) {
70
+ const filtered = query
71
+ ? fuzzyFilter(this.allOptions, query, (item) => `${item.label} ${item.description ?? ""}`)
72
+ : this.allOptions;
73
+ const newList = this.buildSelectList(filtered, "");
74
+ this.children[this.listChildIndex] = newList;
75
+ this.selectList = newList;
76
+ }
77
+ handleInput(data) {
78
+ if (this.searchInput) {
79
+ const kb = getKeybindings();
80
+ const isNav = kb.matches(data, "tui.select.up") ||
81
+ kb.matches(data, "tui.select.down") ||
82
+ kb.matches(data, "tui.select.confirm") ||
83
+ kb.matches(data, "tui.select.cancel");
84
+ if (isNav) {
85
+ this.selectList.handleInput(data);
86
+ }
87
+ else {
88
+ this.searchInput.handleInput(data);
89
+ this.applyFilter(this.searchInput.getValue());
90
+ }
91
+ }
92
+ else {
93
+ this.selectList.handleInput(data);
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Generic N-step submenu built on top of {@link SelectSubmenu}.
99
+ *
100
+ * Each step's options can depend on prior selections via the shared context.
101
+ * Esc goes back one step; Esc at step 0 cancels.
102
+ * With `loop: true`, completing the final step invokes `onComplete` then returns to step 0.
103
+ */
104
+ export class SteppedSubmenu extends Container {
105
+ steps;
106
+ onComplete;
107
+ onCancel;
108
+ opts;
109
+ activeComponent;
110
+ context;
111
+ constructor(steps, onComplete, onCancel, opts = {}) {
112
+ super();
113
+ this.steps = steps;
114
+ this.onComplete = onComplete;
115
+ this.onCancel = onCancel;
116
+ this.opts = opts;
117
+ this.context = { ...(opts.initialContext ?? {}) };
118
+ this.activeComponent = this.buildStep(opts.startAtStep ?? 0);
119
+ }
120
+ buildStep(stepIndex) {
121
+ const step = this.steps[stepIndex];
122
+ const total = this.steps.length;
123
+ const stepLabel = total > 1 ? `Step ${stepIndex + 1}/${total} \u00b7 ` : "";
124
+ const title = typeof step.title === "function" ? step.title(this.context) : step.title;
125
+ const desc = typeof step.description === "function" ? step.description(this.context) : step.description;
126
+ const items = step.options(this.context);
127
+ const preselect = step.preselect?.(this.context) ?? "";
128
+ return new SelectSubmenu(title, `${stepLabel}${desc}`, items, preselect, (value) => {
129
+ this.context[step.key] = value;
130
+ if (stepIndex < total - 1) {
131
+ // Advance to next step
132
+ this.activeComponent = this.buildStep(stepIndex + 1);
133
+ }
134
+ else {
135
+ // Final step \u2014 deliver result
136
+ this.onComplete({ ...this.context });
137
+ if (this.opts.loop) {
138
+ this.context = {};
139
+ this.activeComponent = this.buildStep(0);
140
+ }
141
+ else {
142
+ this.onCancel();
143
+ }
144
+ }
145
+ }, () => {
146
+ if (stepIndex > 0) {
147
+ delete this.context[step.key];
148
+ this.activeComponent = this.buildStep(stepIndex - 1);
149
+ }
150
+ else {
151
+ this.onCancel();
152
+ }
153
+ }, undefined, step.searchable || step.layout ? { searchable: step.searchable, layout: step.layout } : undefined);
154
+ }
155
+ render(width) {
156
+ return this.activeComponent.render(width);
157
+ }
158
+ handleInput(data) {
159
+ this.activeComponent.handleInput?.(data);
160
+ }
161
+ invalidate() {
162
+ this.activeComponent.invalidate?.();
163
+ }
164
+ }
@@ -7,7 +7,9 @@ export declare class StatusIndicator extends Loader {
7
7
  dispose(): void;
8
8
  }
9
9
  export declare class WorkingStatusIndicator extends StatusIndicator {
10
- constructor(ui: TUI, message: string, indicator?: WorkingIndicatorOptions);
10
+ constructor(ui: TUI, message: string, indicator?: WorkingIndicatorOptions, colorFn?: (text: string) => string);
11
+ renderInBorder(width: number): string;
12
+ renderSpinnerInBorder(width: number): string;
11
13
  }
12
14
  export declare class ImageCaptioningStatusIndicator extends StatusIndicator {
13
15
  constructor(ui: TUI);
@@ -1,4 +1,4 @@
1
- import { Loader } from "@earendil-works/pi-tui";
1
+ import { Loader, truncateToWidth } from "@earendil-works/pi-tui";
2
2
  import { theme } from "../theme/theme.js";
3
3
  import { CountdownTimer } from "./countdown-timer.js";
4
4
  import { keyText } from "./keybinding-hints.js";
@@ -13,8 +13,15 @@ export class StatusIndicator extends Loader {
13
13
  }
14
14
  }
15
15
  export class WorkingStatusIndicator extends StatusIndicator {
16
- constructor(ui, message, indicator) {
17
- super("working", ui, (spinner) => theme.fg("accent", spinner), (text) => theme.fg("muted", text), message, indicator);
16
+ constructor(ui, message, indicator, colorFn) {
17
+ super("working", ui, colorFn ?? ((text) => theme.fg("accent", text)), colorFn ?? ((text) => theme.fg("muted", text)), message, indicator);
18
+ }
19
+ renderInBorder(width) {
20
+ const line = super.render(width + 2)[1] ?? "";
21
+ return truncateToWidth(line.startsWith(" ") ? line.slice(1).trimEnd() : line.trimEnd(), width, "");
22
+ }
23
+ renderSpinnerInBorder(width) {
24
+ return truncateToWidth(this.getRenderedIndicator(), width, "");
18
25
  }
19
26
  }
20
27
  export class ImageCaptioningStatusIndicator extends StatusIndicator {
@@ -1,10 +1,22 @@
1
1
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
- import { Container, SelectList } from "@earendil-works/pi-tui";
2
+ import { Container, type Focusable, SelectList } from "@earendil-works/pi-tui";
3
3
  /**
4
4
  * Component that renders a thinking level selector with borders
5
5
  */
6
- export declare class ThinkingSelectorComponent extends Container {
6
+ export declare class ThinkingSelectorComponent extends Container implements Focusable {
7
+ private searchInput;
7
8
  private selectList;
8
- constructor(currentLevel: ThinkingLevel, availableLevels: ThinkingLevel[], onSelect: (level: ThinkingLevel) => void, onCancel: () => void);
9
+ private selectListChildIndex;
10
+ private allItems;
11
+ private onSelect;
12
+ private onCancel;
13
+ private onSelectAsDefault?;
14
+ private _focused;
15
+ get focused(): boolean;
16
+ set focused(value: boolean);
17
+ constructor(currentLevel: ThinkingLevel, availableLevels: ThinkingLevel[], onSelect: (level: ThinkingLevel) => void, onCancel: () => void, onSelectAsDefault?: (level: ThinkingLevel) => void, defaultThinkingLevel?: ThinkingLevel);
18
+ private buildSelectList;
19
+ private applyFilter;
20
+ handleInput(keyData: string): void;
9
21
  getSelectList(): SelectList;
10
22
  }