@oh-my-pi/pi-coding-agent 15.12.4 → 15.13.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 (291) hide show
  1. package/CHANGELOG.md +304 -6
  2. package/dist/cli.js +1015 -881
  3. package/dist/types/async/job-manager.d.ts +15 -0
  4. package/dist/types/autolearn/controller.d.ts +25 -0
  5. package/dist/types/autolearn/managed-skills.d.ts +45 -0
  6. package/dist/types/autoresearch/state.d.ts +1 -1
  7. package/dist/types/autoresearch/types.d.ts +1 -1
  8. package/dist/types/cli/args.d.ts +19 -1
  9. package/dist/types/cli/session-picker.d.ts +1 -1
  10. package/dist/types/cli/setup-cli.d.ts +1 -1
  11. package/dist/types/cli/setup-model-picker.d.ts +14 -0
  12. package/dist/types/collab/protocol.d.ts +1 -1
  13. package/dist/types/commands/say.d.ts +24 -0
  14. package/dist/types/config/keybindings.d.ts +3 -3
  15. package/dist/types/config/model-registry.d.ts +10 -0
  16. package/dist/types/config/models-config-schema.d.ts +12 -0
  17. package/dist/types/config/models-config.d.ts +8 -2
  18. package/dist/types/config/settings-schema.d.ts +261 -58
  19. package/dist/types/export/html/index.d.ts +2 -1
  20. package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
  21. package/dist/types/extensibility/extensions/runner.d.ts +3 -1
  22. package/dist/types/extensibility/extensions/types.d.ts +47 -1
  23. package/dist/types/extensibility/hooks/index.d.ts +2 -1
  24. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +9 -0
  25. package/dist/types/extensibility/plugins/loader.d.ts +11 -0
  26. package/dist/types/extensibility/shared-events.d.ts +1 -1
  27. package/dist/types/extensibility/skills.d.ts +10 -0
  28. package/dist/types/goals/guided-setup.d.ts +18 -0
  29. package/dist/types/goals/state.d.ts +1 -1
  30. package/dist/types/hindsight/transcript.d.ts +1 -1
  31. package/dist/types/index.d.ts +5 -0
  32. package/dist/types/internal-urls/local-protocol.d.ts +4 -2
  33. package/dist/types/main.d.ts +4 -3
  34. package/dist/types/mcp/startup-events.d.ts +11 -0
  35. package/dist/types/memories/index.d.ts +7 -0
  36. package/dist/types/memory-backend/local-backend.d.ts +4 -3
  37. package/dist/types/mnemopi/config.d.ts +4 -4
  38. package/dist/types/modes/components/agent-hub.d.ts +6 -0
  39. package/dist/types/modes/components/assistant-message.d.ts +1 -2
  40. package/dist/types/modes/components/compaction-summary-message.d.ts +15 -1
  41. package/dist/types/modes/components/custom-editor.d.ts +39 -1
  42. package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
  43. package/dist/types/modes/components/session-selector.d.ts +1 -1
  44. package/dist/types/modes/components/tool-execution.d.ts +26 -16
  45. package/dist/types/modes/components/transcript-container.d.ts +23 -2
  46. package/dist/types/modes/components/tree-selector.d.ts +1 -1
  47. package/dist/types/modes/components/usage-row.d.ts +3 -0
  48. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  49. package/dist/types/modes/controllers/input-controller.d.ts +14 -0
  50. package/dist/types/modes/controllers/selector-controller.d.ts +3 -1
  51. package/dist/types/modes/gradient-highlight.d.ts +9 -4
  52. package/dist/types/modes/image-references.d.ts +6 -0
  53. package/dist/types/modes/interactive-mode.d.ts +27 -3
  54. package/dist/types/modes/magic-keywords.d.ts +13 -1
  55. package/dist/types/modes/rpc/rpc-mode.d.ts +35 -1
  56. package/dist/types/modes/rpc/rpc-types.d.ts +9 -1
  57. package/dist/types/modes/runtime-init.d.ts +4 -0
  58. package/dist/types/modes/theme/theme.d.ts +13 -2
  59. package/dist/types/modes/types.d.ts +8 -2
  60. package/dist/types/modes/utils/ui-helpers.d.ts +1 -1
  61. package/dist/types/registry/agent-registry.d.ts +17 -0
  62. package/dist/types/secrets/obfuscator.d.ts +1 -1
  63. package/dist/types/session/agent-session.d.ts +14 -2
  64. package/dist/types/session/indexed-session-storage.d.ts +3 -4
  65. package/dist/types/session/session-context.d.ts +39 -0
  66. package/dist/types/session/session-entries.d.ts +159 -0
  67. package/dist/types/session/session-listing.d.ts +69 -0
  68. package/dist/types/session/session-loader.d.ts +16 -0
  69. package/dist/types/session/session-manager.d.ts +82 -474
  70. package/dist/types/session/session-migrations.d.ts +12 -0
  71. package/dist/types/session/session-paths.d.ts +25 -0
  72. package/dist/types/session/session-persistence.d.ts +8 -0
  73. package/dist/types/session/session-storage.d.ts +11 -12
  74. package/dist/types/session/snapcompact-inline.d.ts +12 -1
  75. package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
  76. package/dist/types/session/tool-choice-queue.d.ts +6 -6
  77. package/dist/types/stt/asr-client.d.ts +90 -0
  78. package/dist/types/stt/asr-protocol.d.ts +97 -0
  79. package/dist/types/stt/asr-worker.d.ts +2 -0
  80. package/dist/types/stt/downloader.d.ts +38 -0
  81. package/dist/types/stt/endpointer.d.ts +59 -0
  82. package/dist/types/stt/index.d.ts +5 -1
  83. package/dist/types/stt/models.d.ts +120 -0
  84. package/dist/types/stt/recorder.d.ts +17 -0
  85. package/dist/types/stt/stt-controller.d.ts +6 -0
  86. package/dist/types/stt/transcriber.d.ts +5 -7
  87. package/dist/types/stt/wav.d.ts +29 -0
  88. package/dist/types/system-prompt.d.ts +4 -0
  89. package/dist/types/task/executor.d.ts +2 -0
  90. package/dist/types/task/index.d.ts +9 -1
  91. package/dist/types/task/types.d.ts +36 -0
  92. package/dist/types/tools/bash.d.ts +2 -2
  93. package/dist/types/tools/eval-render.d.ts +1 -1
  94. package/dist/types/tools/index.d.ts +11 -1
  95. package/dist/types/tools/irc.d.ts +1 -0
  96. package/dist/types/tools/learn.d.ts +51 -0
  97. package/dist/types/tools/manage-skill.d.ts +40 -0
  98. package/dist/types/tools/plan-mode-guard.d.ts +10 -0
  99. package/dist/types/tools/renderers.d.ts +7 -11
  100. package/dist/types/tools/ssh.d.ts +1 -1
  101. package/dist/types/tools/todo.d.ts +1 -1
  102. package/dist/types/tools/tts.d.ts +25 -0
  103. package/dist/types/tools/write.d.ts +1 -1
  104. package/dist/types/tts/downloader.d.ts +20 -0
  105. package/dist/types/tts/index.d.ts +8 -0
  106. package/dist/types/tts/models.d.ts +82 -0
  107. package/dist/types/tts/player.d.ts +32 -0
  108. package/dist/types/tts/runtime.d.ts +6 -0
  109. package/dist/types/tts/streaming-player.d.ts +41 -0
  110. package/dist/types/tts/tts-client.d.ts +93 -0
  111. package/dist/types/tts/tts-protocol.d.ts +95 -0
  112. package/dist/types/tts/tts-worker.d.ts +2 -0
  113. package/dist/types/tts/vocalizer.d.ts +41 -0
  114. package/dist/types/tts/wav.d.ts +8 -0
  115. package/dist/types/utils/tool-choice.d.ts +8 -0
  116. package/dist/types/utils/tools-manager.d.ts +2 -1
  117. package/dist/types/utils/tools-manager.test.d.ts +1 -0
  118. package/dist/types/web/scrapers/github.d.ts +1 -1
  119. package/package.json +15 -14
  120. package/src/async/job-manager.ts +49 -0
  121. package/src/autolearn/controller.ts +139 -0
  122. package/src/autolearn/managed-skills.ts +257 -0
  123. package/src/autoresearch/state.ts +1 -1
  124. package/src/autoresearch/types.ts +1 -1
  125. package/src/cli/args.ts +56 -2
  126. package/src/cli/session-picker.ts +2 -1
  127. package/src/cli/setup-cli.ts +148 -47
  128. package/src/cli/setup-model-picker.ts +43 -0
  129. package/src/cli-commands.ts +1 -0
  130. package/src/cli.ts +45 -13
  131. package/src/collab/host.ts +1 -1
  132. package/src/collab/protocol.ts +1 -1
  133. package/src/commands/say.ts +102 -0
  134. package/src/commands/setup.ts +1 -1
  135. package/src/commit/agentic/tools/analyze-file.ts +3 -0
  136. package/src/config/keybindings.ts +2 -2
  137. package/src/config/model-discovery.ts +11 -5
  138. package/src/config/model-registry.ts +64 -9
  139. package/src/config/models-config-schema.ts +4 -1
  140. package/src/config/models-config.ts +2 -1
  141. package/src/config/settings-schema.ts +248 -32
  142. package/src/config/settings.ts +10 -0
  143. package/src/discovery/builtin.ts +23 -1
  144. package/src/discovery/claude-plugins.ts +44 -5
  145. package/src/discovery/helpers.ts +41 -1
  146. package/src/eval/__tests__/budget-bridge.test.ts +1 -1
  147. package/src/eval/js/shared/prelude.txt +69 -17
  148. package/src/export/html/index.ts +3 -6
  149. package/src/extensibility/extensions/model-api.ts +41 -0
  150. package/src/extensibility/extensions/runner.ts +4 -0
  151. package/src/extensibility/extensions/types.ts +52 -1
  152. package/src/extensibility/extensions/wrapper.ts +41 -5
  153. package/src/extensibility/hooks/index.ts +2 -1
  154. package/src/extensibility/plugins/legacy-pi-compat.ts +43 -13
  155. package/src/extensibility/plugins/loader.ts +30 -19
  156. package/src/extensibility/plugins/manager.ts +221 -90
  157. package/src/extensibility/shared-events.ts +1 -1
  158. package/src/extensibility/skills.ts +96 -15
  159. package/src/goals/guided-setup.ts +133 -0
  160. package/src/goals/state.ts +1 -1
  161. package/src/hindsight/transcript.ts +1 -1
  162. package/src/index.ts +5 -0
  163. package/src/internal-urls/docs-index.generated.ts +10 -10
  164. package/src/internal-urls/history-protocol.ts +1 -1
  165. package/src/internal-urls/local-protocol.ts +29 -7
  166. package/src/main.ts +27 -7
  167. package/src/mcp/startup-events.ts +21 -0
  168. package/src/mcp/transports/stdio.ts +2 -1
  169. package/src/memories/index.ts +146 -11
  170. package/src/memory-backend/local-backend.ts +11 -5
  171. package/src/mnemopi/backend.ts +1 -0
  172. package/src/mnemopi/config.ts +26 -10
  173. package/src/modes/acp/acp-agent.ts +3 -5
  174. package/src/modes/components/agent-hub.ts +49 -4
  175. package/src/modes/components/assistant-message.ts +4 -37
  176. package/src/modes/components/compaction-summary-message.ts +125 -26
  177. package/src/modes/components/custom-editor.test.ts +96 -0
  178. package/src/modes/components/custom-editor.ts +164 -8
  179. package/src/modes/components/session-selector.ts +1 -1
  180. package/src/modes/components/settings-defs.ts +7 -0
  181. package/src/modes/components/tool-execution.ts +82 -43
  182. package/src/modes/components/transcript-container.ts +70 -1
  183. package/src/modes/components/tree-selector.ts +1 -1
  184. package/src/modes/components/usage-row.ts +18 -0
  185. package/src/modes/components/user-message.ts +4 -2
  186. package/src/modes/controllers/command-controller.ts +14 -4
  187. package/src/modes/controllers/event-controller.ts +78 -11
  188. package/src/modes/controllers/extension-ui-controller.ts +6 -0
  189. package/src/modes/controllers/input-controller.ts +258 -27
  190. package/src/modes/controllers/selector-controller.ts +12 -2
  191. package/src/modes/gradient-highlight.ts +21 -9
  192. package/src/modes/image-references.ts +20 -0
  193. package/src/modes/interactive-mode.ts +286 -40
  194. package/src/modes/magic-keywords.ts +27 -5
  195. package/src/modes/rpc/rpc-mode.ts +146 -14
  196. package/src/modes/rpc/rpc-subagents.ts +2 -2
  197. package/src/modes/rpc/rpc-types.ts +8 -2
  198. package/src/modes/runtime-init.ts +28 -3
  199. package/src/modes/theme/theme.ts +98 -50
  200. package/src/modes/types.ts +6 -2
  201. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  202. package/src/modes/utils/ui-helpers.ts +34 -6
  203. package/src/priority.json +5 -1
  204. package/src/prompts/agents/task.md +1 -0
  205. package/src/prompts/goals/guided-goal-interview.md +8 -0
  206. package/src/prompts/goals/guided-goal-system.md +12 -0
  207. package/src/prompts/memories/read-path.md +6 -0
  208. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  209. package/src/prompts/system/autolearn-guidance.md +7 -0
  210. package/src/prompts/system/autolearn-nudge.md +3 -0
  211. package/src/prompts/system/eager-task.md +7 -0
  212. package/src/prompts/system/eager-todo.md +11 -6
  213. package/src/prompts/system/subagent-system-prompt.md +4 -0
  214. package/src/prompts/system/system-prompt.md +10 -5
  215. package/src/prompts/system/title-marker-instruction.md +1 -0
  216. package/src/prompts/system/title-system-marker.md +16 -0
  217. package/src/prompts/tools/job.md +1 -0
  218. package/src/prompts/tools/learn.md +7 -0
  219. package/src/prompts/tools/manage-skill.md +9 -0
  220. package/src/prompts/tools/task.md +3 -0
  221. package/src/registry/agent-registry.ts +30 -0
  222. package/src/sdk.ts +88 -24
  223. package/src/secrets/obfuscator.ts +1 -1
  224. package/src/session/agent-session.ts +209 -87
  225. package/src/session/history-storage.ts +2 -2
  226. package/src/session/indexed-session-storage.ts +7 -17
  227. package/src/session/session-context.ts +352 -0
  228. package/src/session/session-entries.ts +194 -0
  229. package/src/session/session-listing.ts +588 -0
  230. package/src/session/session-loader.ts +106 -0
  231. package/src/session/session-manager.ts +933 -3145
  232. package/src/session/session-migrations.ts +78 -0
  233. package/src/session/session-paths.ts +193 -0
  234. package/src/session/session-persistence.ts +131 -0
  235. package/src/session/session-storage.ts +91 -50
  236. package/src/session/snapcompact-inline.ts +21 -1
  237. package/src/session/snapcompact-savings-journal.ts +113 -0
  238. package/src/session/tool-choice-queue.ts +23 -11
  239. package/src/slash-commands/builtin-registry.ts +25 -3
  240. package/src/stt/asr-client.ts +520 -0
  241. package/src/stt/asr-protocol.ts +65 -0
  242. package/src/stt/asr-worker.ts +790 -0
  243. package/src/stt/downloader.ts +107 -47
  244. package/src/stt/endpointer.ts +259 -0
  245. package/src/stt/index.ts +5 -1
  246. package/src/stt/models.ts +150 -0
  247. package/src/stt/recorder.ts +247 -60
  248. package/src/stt/stt-controller.ts +201 -22
  249. package/src/stt/transcriber.ts +37 -68
  250. package/src/stt/wav.ts +173 -0
  251. package/src/system-prompt.ts +8 -0
  252. package/src/task/agents.ts +1 -2
  253. package/src/task/executor.ts +49 -15
  254. package/src/task/index.ts +60 -6
  255. package/src/task/render.ts +83 -8
  256. package/src/task/types.ts +53 -0
  257. package/src/tools/ask.ts +8 -0
  258. package/src/tools/bash.ts +4 -3
  259. package/src/tools/eval-render.ts +4 -3
  260. package/src/tools/index.ts +40 -4
  261. package/src/tools/irc.ts +10 -2
  262. package/src/tools/job.ts +14 -2
  263. package/src/tools/learn.ts +144 -0
  264. package/src/tools/manage-skill.ts +104 -0
  265. package/src/tools/plan-mode-guard.ts +53 -19
  266. package/src/tools/renderers.ts +7 -11
  267. package/src/tools/ssh.ts +4 -3
  268. package/src/tools/todo.ts +1 -1
  269. package/src/tools/tts.ts +203 -92
  270. package/src/tools/write.ts +18 -2
  271. package/src/tts/downloader.ts +64 -0
  272. package/src/tts/index.ts +8 -0
  273. package/src/tts/models.ts +137 -0
  274. package/src/tts/player.ts +137 -0
  275. package/src/tts/runtime.ts +21 -0
  276. package/src/tts/streaming-player.ts +266 -0
  277. package/src/tts/tts-client.ts +647 -0
  278. package/src/tts/tts-protocol.ts +60 -0
  279. package/src/tts/tts-worker.ts +497 -0
  280. package/src/tts/vocalizer.ts +162 -0
  281. package/src/tts/wav.ts +58 -0
  282. package/src/utils/title-generator.ts +48 -5
  283. package/src/utils/tool-choice.ts +16 -0
  284. package/src/utils/tools-manager.test.ts +25 -0
  285. package/src/utils/tools-manager.ts +19 -1
  286. package/src/web/scrapers/github.ts +96 -0
  287. package/src/web/search/index.ts +13 -0
  288. package/src/web/search/providers/searxng.ts +13 -1
  289. package/dist/types/stt/setup.d.ts +0 -18
  290. package/src/stt/setup.ts +0 -52
  291. package/src/stt/transcribe.py +0 -70
@@ -81,6 +81,21 @@ export declare class AsyncJobManager {
81
81
  hasPendingDeliveries(filter?: AsyncJobFilter): boolean;
82
82
  watchJobs(jobIds: string[]): number;
83
83
  unwatchJobs(jobIds: string[]): number;
84
+ /**
85
+ * Compute the next adaptive ("smart") wait (ms) for a blocking `job` poll by
86
+ * the given owner. Consecutive polls — those starting within
87
+ * POLL_ESCALATION_RESET_MS of the previous poll returning — climb
88
+ * POLL_WAIT_LADDER_MS so a tight wait loop backs off; a longer gap means the
89
+ * agent left to do real work, so the wait resets to the floor. Pair each call
90
+ * with `recordPollWaitEnd()` once the wait returns.
91
+ */
92
+ nextPollWaitMs(ownerId: string | undefined, now?: number): number;
93
+ /**
94
+ * Mark a blocking poll wait as finished so the idle-reset window is measured
95
+ * from now. Polling again before POLL_ESCALATION_RESET_MS elapses keeps
96
+ * climbing the ladder; waiting longer resets it to the floor.
97
+ */
98
+ recordPollWaitEnd(ownerId: string | undefined, now?: number): void;
84
99
  acknowledgeDeliveries(jobIds: string[]): number;
85
100
  /**
86
101
  * Lift a foreground-wait suppression set via `acknowledgeDeliveries`. If the
@@ -0,0 +1,25 @@
1
+ import type { Settings } from "../config/settings";
2
+ import type { AgentSession } from "../session/agent-session";
3
+ /**
4
+ * Build the standing auto-learn guidance for the system prompt from the tools
5
+ * actually present in the active set, or null when `manage_skill` is absent.
6
+ *
7
+ * Driven by tool presence rather than live settings: the `learn`/`manage_skill`
8
+ * registry is built ONCE at session start (and only for top-level sessions), so
9
+ * keying the guidance on `autolearn.enabled` would let a mid-session enable — or
10
+ * a subagent that filtered the tools out — inject guidance pointing at tools the
11
+ * session never built. The `learn` addendum is included only when the `learn`
12
+ * tool is present (it requires a memory backend).
13
+ */
14
+ export declare function buildAutoLearnInstructions(available: {
15
+ manageSkill: boolean;
16
+ learn: boolean;
17
+ }): string | null;
18
+ export interface AutoLearnControllerOptions {
19
+ session: AgentSession;
20
+ settings: Settings;
21
+ }
22
+ export declare class AutoLearnController {
23
+ #private;
24
+ constructor(options: AutoLearnControllerOptions);
25
+ }
@@ -0,0 +1,45 @@
1
+ /** Provider id stamped on discovered managed skills (distinguishes them from authored). */
2
+ export declare const MANAGED_SKILLS_PROVIDER_ID = "omp-managed";
3
+ /** Hard cap on a managed SKILL.md body to keep generated skills bounded. */
4
+ export declare const MAX_MANAGED_SKILL_BYTES = 64000;
5
+ /** Resolve the isolated managed-skills directory (`~/.omp/agent/managed-skills`). */
6
+ export declare function getManagedSkillsDir(home?: string): string;
7
+ /**
8
+ * Validate + normalize a managed-skill name. Throws on anything outside the
9
+ * strict allowlist so a bad name can never escape `getManagedSkillsDir()`
10
+ * (blocks `..`, slashes, empty, and uppercase).
11
+ */
12
+ export declare function sanitizeSkillName(raw: string): string;
13
+ /**
14
+ * Whether `name` is a safe managed-skill name (the exact post-sanitize shape).
15
+ * Used to validate names read from disk at discovery time — a managed
16
+ * `SKILL.md` whose `frontmatter.name` was not produced by `sanitizeSkillName`
17
+ * (e.g. hand-placed) must not render unescaped into the system prompt.
18
+ */
19
+ export declare function isValidManagedSkillName(name: string): boolean;
20
+ /**
21
+ * Neutralize a machine-generated managed-skill description so it cannot break
22
+ * out of the system prompt's `<skills>` listing. Managed descriptions are
23
+ * generated from prior task content and persist across sessions, so this is a
24
+ * trust boundary: strip control/format chars, angle brackets (`<system-directive>`
25
+ * / `</skills>`), and Markdown fence delimiters (backticks, `~~~`), then collapse
26
+ * to a single line. Applied on BOTH write and read so existing files are safe too.
27
+ */
28
+ export declare function sanitizeManagedDescription(raw: string): string;
29
+ /**
30
+ * Serialize the minimal `name`/`description` frontmatter block via the repo's
31
+ * YAML helper (round-trips through `parseFrontmatter`).
32
+ */
33
+ export declare function toSkillFrontmatter(name: string, description: string): string;
34
+ export interface WriteManagedSkillInput {
35
+ action: "create" | "update";
36
+ name: string;
37
+ description: string;
38
+ body: string;
39
+ }
40
+ /** Create or update a managed `SKILL.md`. Returns the resolved file path. */
41
+ export declare function writeManagedSkill(input: WriteManagedSkillInput): Promise<{
42
+ path: string;
43
+ }>;
44
+ /** Delete a managed skill directory. Throws when it does not exist. */
45
+ export declare function deleteManagedSkill(name: string): Promise<void>;
@@ -1,4 +1,4 @@
1
- import type { SessionEntry } from "../session/session-manager";
1
+ import type { SessionEntry } from "../session/session-entries";
2
2
  import type { RunRow, SessionRow } from "./storage";
3
3
  import type { AutoresearchRuntime, ExperimentResult, ExperimentState, MetricDef, MetricDirection, NumericMetricMap, ReconstructedControlState, RuntimeStore } from "./types";
4
4
  export declare function createExperimentState(): ExperimentState;
@@ -1,6 +1,6 @@
1
1
  import type { AgentToolResult } from "@oh-my-pi/pi-agent-core";
2
2
  import type { ExtensionAPI, ExtensionContext } from "../extensibility/extensions";
3
- import type { SessionEntry } from "../session/session-manager";
3
+ import type { SessionEntry } from "../session/session-entries";
4
4
  import type { TruncationResult } from "../session/streaming-output";
5
5
  export type MetricDirection = "lower" | "higher";
6
6
  export type ExperimentStatus = "keep" | "discard" | "crash" | "checks_failed";
@@ -47,11 +47,29 @@ export interface Args {
47
47
  approvalMode?: "always-ask" | "write" | "yolo";
48
48
  messages: string[];
49
49
  fileArgs: string[];
50
- /** Unknown flags (potentially extension flags) - map of flag name to value */
50
+ /** Extension-registered flags this parse recognized name to value. */
51
51
  unknownFlags: Map<string, boolean | string>;
52
+ /**
53
+ * `--`/`-` prefixed tokens this parse could not match against any built-in
54
+ * or {@link extensionFlags} entry. The startup parse runs *before*
55
+ * extensions load, so it always lists every extension-registered flag here;
56
+ * the post-extension reparse in {@link applyExtensionFlags} clears those
57
+ * once the real flag set is known. Anything still present after that
58
+ * reparse is a genuine typo or stale flag and {@link reportUnrecognizedFlags}
59
+ * surfaces it as a hard error so the agent does not silently start a
60
+ * session with the misparsed positionals as a prompt (issue #2459).
61
+ */
62
+ unrecognizedFlags: string[];
52
63
  }
53
64
  export declare function parseArgs(inputArgs: string[], extensionFlags?: Map<string, {
54
65
  type: "boolean" | "string";
55
66
  }>): Args;
67
+ /**
68
+ * Emit a stderr error listing the unrecognized flags and return `true` when
69
+ * there were any. Caller is expected to exit with a non-zero status. Splitting
70
+ * the print from the exit keeps the helper unit-testable without forking a
71
+ * process (issue #2459).
72
+ */
73
+ export declare function reportUnrecognizedFlags(args: Pick<Args, "unrecognizedFlags">, write?: (text: string) => void): boolean;
56
74
  export declare function getExtraHelpText(): string;
57
75
  export declare function printHelp(): void;
@@ -1,4 +1,4 @@
1
- import { type SessionInfo } from "../session/session-manager";
1
+ import type { SessionInfo } from "../session/session-listing";
2
2
  /**
3
3
  * Show the TUI session selector and return the selected session, or null if
4
4
  * cancelled. Tab toggles between current-folder and all-projects scope; the
@@ -1,4 +1,4 @@
1
- export type SetupComponent = "python" | "stt";
1
+ export type SetupComponent = "python" | "speech";
2
2
  export interface SetupCommandArgs {
3
3
  component: SetupComponent;
4
4
  flags: {
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Standalone TUI model picker used by `omp setup speech`.
3
+ *
4
+ * Mirrors {@link ./session-picker.ts} for the standalone-TUI lifecycle: spin up
5
+ * a one-shot {@link TUI} over a {@link SelectList}, resolve on select/cancel, and
6
+ * tear the UI down. The standalone TUI auto-renders on input, so no manual
7
+ * render wiring is needed beyond `addChild`/`setFocus`/`start`.
8
+ */
9
+ import { type SelectItem } from "@oh-my-pi/pi-tui";
10
+ /**
11
+ * Show a single-column model picker and resolve with the chosen item's value,
12
+ * or `null` if the user cancelled. `currentValue` pre-selects the matching row.
13
+ */
14
+ export declare function selectSetupModel(title: string, items: SelectItem[], currentValue: string): Promise<string | null>;
@@ -11,7 +11,7 @@ import type { BusChannel, GuestFrame, ParsedCollabLink, Participant, SessionStat
11
11
  import { DEFAULT_RELAY_URL, ENVELOPE_HEADER_LENGTH, ROOM_ID_BYTES } from "@oh-my-pi/pi-wire";
12
12
  import type { ContextUsage } from "../extensibility/extensions/types";
13
13
  import type { AgentSessionEvent } from "../session/agent-session";
14
- import type { SessionEntry, SessionHeader } from "../session/session-manager";
14
+ import type { SessionEntry, SessionHeader } from "../session/session-entries";
15
15
  export type { CollabPromptDetails, ParsedCollabLink, RelayControlMessage, RelayControlToGuest, RelayControlToHost, } from "@oh-my-pi/pi-wire";
16
16
  export { COLLAB_PROMPT_MESSAGE_TYPE, COLLAB_PROTO } from "@oh-my-pi/pi-wire";
17
17
  export { DEFAULT_RELAY_URL, ENVELOPE_HEADER_LENGTH, ROOM_ID_BYTES };
@@ -0,0 +1,24 @@
1
+ import { Command } from "@oh-my-pi/pi-utils/cli";
2
+ export default class Say extends Command {
3
+ static description: string;
4
+ static args: {
5
+ text: import("@oh-my-pi/pi-utils/cli").ArgDescriptor & {
6
+ required: true;
7
+ description: string;
8
+ };
9
+ };
10
+ static flags: {
11
+ voice: import("@oh-my-pi/pi-utils/cli").FlagDescriptor<"string"> & {
12
+ description: string;
13
+ };
14
+ model: import("@oh-my-pi/pi-utils/cli").FlagDescriptor<"string"> & {
15
+ description: string;
16
+ };
17
+ out: import("@oh-my-pi/pi-utils/cli").FlagDescriptor<"string"> & {
18
+ char: string;
19
+ description: string;
20
+ };
21
+ };
22
+ static examples: string[];
23
+ run(): Promise<void>;
24
+ }
@@ -138,7 +138,7 @@ export declare const KEYBINDINGS: {
138
138
  readonly description: "Undo";
139
139
  };
140
140
  readonly "tui.input.newLine": {
141
- readonly defaultKeys: "shift+enter";
141
+ readonly defaultKeys: ["shift+enter", "ctrl+j"];
142
142
  readonly description: "Insert newline";
143
143
  };
144
144
  readonly "tui.input.submit": {
@@ -314,8 +314,8 @@ export declare const KEYBINDINGS: {
314
314
  readonly description: "Search history";
315
315
  };
316
316
  readonly "app.stt.toggle": {
317
- readonly defaultKeys: "alt+h";
318
- readonly description: "Toggle speech-to-text";
317
+ readonly defaultKeys: [];
318
+ readonly description: "Toggle speech-to-text (default gesture: hold Space)";
319
319
  };
320
320
  };
321
321
  declare function migrateKeybindingsConfigFile(agentDir: string): void;
@@ -29,9 +29,19 @@ interface ProviderOverride {
29
29
  * `token-plan-sgp.xiaomimimo.com` at discovery time)
30
30
  * 3. Existing bundled baseUrl (the host baked into `models.json`)
31
31
  *
32
+ * `transport` resolution priority:
33
+ * 1. `providerOverride.transport` (e.g. `pi-native` for auth-gateway users)
34
+ * 2. `existing.transport` (carried over from boot-time override application)
35
+ * 3. `model.transport` (rarely set — discovery defaults omit it)
36
+ *
32
37
  * Without (1), the user's override would lose to discovery; without (2)
33
38
  * preferred over (3), the bundled `api.xiaomimimo.com` would shadow the
34
39
  * tp- token-plan host and produce 401s on the first stream call.
40
+ * Without explicit transport propagation, an openrouter (or any) entry
41
+ * marked `transport: pi-native` in models.yml silently reverts to the
42
+ * default openai-completions transport after the background catalog
43
+ * refresh — so the first `/model` switch after boot hits the raw OpenAI
44
+ * chat-completions URL instead of the gateway's `/v1/pi/stream` (#2555).
35
45
  * See `xiaomi-tp-discovery-merge.test.ts` and the `refresh()` baseUrl-override
36
46
  * regression in `model-registry.test.ts`.
37
47
  */
@@ -29,6 +29,7 @@ export declare const OpenAICompatSchema: z.ZodObject<{
29
29
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
30
30
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
31
31
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
32
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
32
33
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
33
34
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
34
35
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -92,6 +93,7 @@ export declare const OpenAICompatSchema: z.ZodObject<{
92
93
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
93
94
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
94
95
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
96
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
95
97
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
96
98
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
97
99
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -254,6 +256,7 @@ export declare const ModelOverrideSchema: z.ZodObject<{
254
256
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
255
257
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
256
258
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
259
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
257
260
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
258
261
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
259
262
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -317,6 +320,7 @@ export declare const ModelOverrideSchema: z.ZodObject<{
317
320
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
318
321
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
319
322
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
323
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
320
324
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
321
325
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
322
326
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -378,6 +382,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
378
382
  api: z.ZodOptional<z.ZodEnum<{
379
383
  "anthropic-messages": "anthropic-messages";
380
384
  "azure-openai-responses": "azure-openai-responses";
385
+ "google-gemini-cli": "google-gemini-cli";
381
386
  "google-generative-ai": "google-generative-ai";
382
387
  "google-vertex": "google-vertex";
383
388
  "openai-codex-responses": "openai-codex-responses";
@@ -415,6 +420,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
415
420
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
416
421
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
417
422
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
423
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
418
424
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
419
425
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
420
426
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -478,6 +484,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
478
484
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
479
485
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
480
486
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
487
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
481
488
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
482
489
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
483
490
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -534,6 +541,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
534
541
  api: z.ZodOptional<z.ZodEnum<{
535
542
  "anthropic-messages": "anthropic-messages";
536
543
  "azure-openai-responses": "azure-openai-responses";
544
+ "google-gemini-cli": "google-gemini-cli";
537
545
  "google-generative-ai": "google-generative-ai";
538
546
  "google-vertex": "google-vertex";
539
547
  "openai-codex-responses": "openai-codex-responses";
@@ -666,6 +674,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
666
674
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
667
675
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
668
676
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
677
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
669
678
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
670
679
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
671
680
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -729,6 +738,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
729
738
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
730
739
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
731
740
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
741
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
732
742
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
733
743
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
734
744
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -893,6 +903,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
893
903
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
894
904
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
895
905
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
906
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
896
907
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
897
908
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
898
909
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -956,6 +967,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
956
967
  allowsSyntheticReasoningContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
957
968
  requiresAssistantContentForToolCalls: z.ZodOptional<z.ZodBoolean>;
958
969
  supportsToolChoice: z.ZodOptional<z.ZodBoolean>;
970
+ supportsForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
959
971
  disableReasoningOnForcedToolChoice: z.ZodOptional<z.ZodBoolean>;
960
972
  disableReasoningOnToolChoice: z.ZodOptional<z.ZodBoolean>;
961
973
  thinkingFormat: z.ZodOptional<z.ZodEnum<{
@@ -29,7 +29,7 @@ export declare const ModelsConfigFile: ConfigFile<{
29
29
  providers?: Record<string, {
30
30
  baseUrl?: string | undefined;
31
31
  apiKey?: string | undefined;
32
- api?: "anthropic-messages" | "azure-openai-responses" | "google-generative-ai" | "google-vertex" | "openai-codex-responses" | "openai-completions" | "openai-responses" | undefined;
32
+ api?: "anthropic-messages" | "azure-openai-responses" | "google-gemini-cli" | "google-generative-ai" | "google-vertex" | "openai-codex-responses" | "openai-completions" | "openai-responses" | undefined;
33
33
  headers?: Record<string, string> | undefined;
34
34
  compat?: {
35
35
  supportsStore?: boolean | undefined;
@@ -54,6 +54,7 @@ export declare const ModelsConfigFile: ConfigFile<{
54
54
  allowsSyntheticReasoningContentForToolCalls?: boolean | undefined;
55
55
  requiresAssistantContentForToolCalls?: boolean | undefined;
56
56
  supportsToolChoice?: boolean | undefined;
57
+ supportsForcedToolChoice?: boolean | undefined;
57
58
  disableReasoningOnForcedToolChoice?: boolean | undefined;
58
59
  disableReasoningOnToolChoice?: boolean | undefined;
59
60
  thinkingFormat?: "openai" | "openrouter" | "qwen" | "qwen-chat-template" | "zai" | undefined;
@@ -99,6 +100,7 @@ export declare const ModelsConfigFile: ConfigFile<{
99
100
  allowsSyntheticReasoningContentForToolCalls?: boolean | undefined;
100
101
  requiresAssistantContentForToolCalls?: boolean | undefined;
101
102
  supportsToolChoice?: boolean | undefined;
103
+ supportsForcedToolChoice?: boolean | undefined;
102
104
  disableReasoningOnForcedToolChoice?: boolean | undefined;
103
105
  disableReasoningOnToolChoice?: boolean | undefined;
104
106
  thinkingFormat?: "openai" | "openrouter" | "qwen" | "qwen-chat-template" | "zai" | undefined;
@@ -131,7 +133,7 @@ export declare const ModelsConfigFile: ConfigFile<{
131
133
  models?: {
132
134
  id: string;
133
135
  name?: string | undefined;
134
- api?: "anthropic-messages" | "azure-openai-responses" | "google-generative-ai" | "google-vertex" | "openai-codex-responses" | "openai-completions" | "openai-responses" | undefined;
136
+ api?: "anthropic-messages" | "azure-openai-responses" | "google-gemini-cli" | "google-generative-ai" | "google-vertex" | "openai-codex-responses" | "openai-completions" | "openai-responses" | undefined;
135
137
  baseUrl?: string | undefined;
136
138
  reasoning?: boolean | undefined;
137
139
  thinking?: {
@@ -182,6 +184,7 @@ export declare const ModelsConfigFile: ConfigFile<{
182
184
  allowsSyntheticReasoningContentForToolCalls?: boolean | undefined;
183
185
  requiresAssistantContentForToolCalls?: boolean | undefined;
184
186
  supportsToolChoice?: boolean | undefined;
187
+ supportsForcedToolChoice?: boolean | undefined;
185
188
  disableReasoningOnForcedToolChoice?: boolean | undefined;
186
189
  disableReasoningOnToolChoice?: boolean | undefined;
187
190
  thinkingFormat?: "openai" | "openrouter" | "qwen" | "qwen-chat-template" | "zai" | undefined;
@@ -227,6 +230,7 @@ export declare const ModelsConfigFile: ConfigFile<{
227
230
  allowsSyntheticReasoningContentForToolCalls?: boolean | undefined;
228
231
  requiresAssistantContentForToolCalls?: boolean | undefined;
229
232
  supportsToolChoice?: boolean | undefined;
233
+ supportsForcedToolChoice?: boolean | undefined;
230
234
  disableReasoningOnForcedToolChoice?: boolean | undefined;
231
235
  disableReasoningOnToolChoice?: boolean | undefined;
232
236
  thinkingFormat?: "openai" | "openrouter" | "qwen" | "qwen-chat-template" | "zai" | undefined;
@@ -304,6 +308,7 @@ export declare const ModelsConfigFile: ConfigFile<{
304
308
  allowsSyntheticReasoningContentForToolCalls?: boolean | undefined;
305
309
  requiresAssistantContentForToolCalls?: boolean | undefined;
306
310
  supportsToolChoice?: boolean | undefined;
311
+ supportsForcedToolChoice?: boolean | undefined;
307
312
  disableReasoningOnForcedToolChoice?: boolean | undefined;
308
313
  disableReasoningOnToolChoice?: boolean | undefined;
309
314
  thinkingFormat?: "openai" | "openrouter" | "qwen" | "qwen-chat-template" | "zai" | undefined;
@@ -349,6 +354,7 @@ export declare const ModelsConfigFile: ConfigFile<{
349
354
  allowsSyntheticReasoningContentForToolCalls?: boolean | undefined;
350
355
  requiresAssistantContentForToolCalls?: boolean | undefined;
351
356
  supportsToolChoice?: boolean | undefined;
357
+ supportsForcedToolChoice?: boolean | undefined;
352
358
  disableReasoningOnForcedToolChoice?: boolean | undefined;
353
359
  disableReasoningOnToolChoice?: boolean | undefined;
354
360
  thinkingFormat?: "openai" | "openrouter" | "qwen" | "qwen-chat-template" | "zai" | undefined;