@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.
- package/CHANGELOG.md +304 -6
- package/dist/cli.js +1015 -881
- package/dist/types/async/job-manager.d.ts +15 -0
- package/dist/types/autolearn/controller.d.ts +25 -0
- package/dist/types/autolearn/managed-skills.d.ts +45 -0
- package/dist/types/autoresearch/state.d.ts +1 -1
- package/dist/types/autoresearch/types.d.ts +1 -1
- package/dist/types/cli/args.d.ts +19 -1
- package/dist/types/cli/session-picker.d.ts +1 -1
- package/dist/types/cli/setup-cli.d.ts +1 -1
- package/dist/types/cli/setup-model-picker.d.ts +14 -0
- package/dist/types/collab/protocol.d.ts +1 -1
- package/dist/types/commands/say.d.ts +24 -0
- package/dist/types/config/keybindings.d.ts +3 -3
- package/dist/types/config/model-registry.d.ts +10 -0
- package/dist/types/config/models-config-schema.d.ts +12 -0
- package/dist/types/config/models-config.d.ts +8 -2
- package/dist/types/config/settings-schema.d.ts +261 -58
- package/dist/types/export/html/index.d.ts +2 -1
- package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -1
- package/dist/types/extensibility/extensions/types.d.ts +47 -1
- package/dist/types/extensibility/hooks/index.d.ts +2 -1
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +9 -0
- package/dist/types/extensibility/plugins/loader.d.ts +11 -0
- package/dist/types/extensibility/shared-events.d.ts +1 -1
- package/dist/types/extensibility/skills.d.ts +10 -0
- package/dist/types/goals/guided-setup.d.ts +18 -0
- package/dist/types/goals/state.d.ts +1 -1
- package/dist/types/hindsight/transcript.d.ts +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/internal-urls/local-protocol.d.ts +4 -2
- package/dist/types/main.d.ts +4 -3
- package/dist/types/mcp/startup-events.d.ts +11 -0
- package/dist/types/memories/index.d.ts +7 -0
- package/dist/types/memory-backend/local-backend.d.ts +4 -3
- package/dist/types/mnemopi/config.d.ts +4 -4
- package/dist/types/modes/components/agent-hub.d.ts +6 -0
- package/dist/types/modes/components/assistant-message.d.ts +1 -2
- package/dist/types/modes/components/compaction-summary-message.d.ts +15 -1
- package/dist/types/modes/components/custom-editor.d.ts +39 -1
- package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
- package/dist/types/modes/components/session-selector.d.ts +1 -1
- package/dist/types/modes/components/tool-execution.d.ts +26 -16
- package/dist/types/modes/components/transcript-container.d.ts +23 -2
- package/dist/types/modes/components/tree-selector.d.ts +1 -1
- package/dist/types/modes/components/usage-row.d.ts +3 -0
- package/dist/types/modes/controllers/command-controller.d.ts +2 -2
- package/dist/types/modes/controllers/input-controller.d.ts +14 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +3 -1
- package/dist/types/modes/gradient-highlight.d.ts +9 -4
- package/dist/types/modes/image-references.d.ts +6 -0
- package/dist/types/modes/interactive-mode.d.ts +27 -3
- package/dist/types/modes/magic-keywords.d.ts +13 -1
- package/dist/types/modes/rpc/rpc-mode.d.ts +35 -1
- package/dist/types/modes/rpc/rpc-types.d.ts +9 -1
- package/dist/types/modes/runtime-init.d.ts +4 -0
- package/dist/types/modes/theme/theme.d.ts +13 -2
- package/dist/types/modes/types.d.ts +8 -2
- package/dist/types/modes/utils/ui-helpers.d.ts +1 -1
- package/dist/types/registry/agent-registry.d.ts +17 -0
- package/dist/types/secrets/obfuscator.d.ts +1 -1
- package/dist/types/session/agent-session.d.ts +14 -2
- package/dist/types/session/indexed-session-storage.d.ts +3 -4
- package/dist/types/session/session-context.d.ts +39 -0
- package/dist/types/session/session-entries.d.ts +159 -0
- package/dist/types/session/session-listing.d.ts +69 -0
- package/dist/types/session/session-loader.d.ts +16 -0
- package/dist/types/session/session-manager.d.ts +82 -474
- package/dist/types/session/session-migrations.d.ts +12 -0
- package/dist/types/session/session-paths.d.ts +25 -0
- package/dist/types/session/session-persistence.d.ts +8 -0
- package/dist/types/session/session-storage.d.ts +11 -12
- package/dist/types/session/snapcompact-inline.d.ts +12 -1
- package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
- package/dist/types/session/tool-choice-queue.d.ts +6 -6
- package/dist/types/stt/asr-client.d.ts +90 -0
- package/dist/types/stt/asr-protocol.d.ts +97 -0
- package/dist/types/stt/asr-worker.d.ts +2 -0
- package/dist/types/stt/downloader.d.ts +38 -0
- package/dist/types/stt/endpointer.d.ts +59 -0
- package/dist/types/stt/index.d.ts +5 -1
- package/dist/types/stt/models.d.ts +120 -0
- package/dist/types/stt/recorder.d.ts +17 -0
- package/dist/types/stt/stt-controller.d.ts +6 -0
- package/dist/types/stt/transcriber.d.ts +5 -7
- package/dist/types/stt/wav.d.ts +29 -0
- package/dist/types/system-prompt.d.ts +4 -0
- package/dist/types/task/executor.d.ts +2 -0
- package/dist/types/task/index.d.ts +9 -1
- package/dist/types/task/types.d.ts +36 -0
- package/dist/types/tools/bash.d.ts +2 -2
- package/dist/types/tools/eval-render.d.ts +1 -1
- package/dist/types/tools/index.d.ts +11 -1
- package/dist/types/tools/irc.d.ts +1 -0
- package/dist/types/tools/learn.d.ts +51 -0
- package/dist/types/tools/manage-skill.d.ts +40 -0
- package/dist/types/tools/plan-mode-guard.d.ts +10 -0
- package/dist/types/tools/renderers.d.ts +7 -11
- package/dist/types/tools/ssh.d.ts +1 -1
- package/dist/types/tools/todo.d.ts +1 -1
- package/dist/types/tools/tts.d.ts +25 -0
- package/dist/types/tools/write.d.ts +1 -1
- package/dist/types/tts/downloader.d.ts +20 -0
- package/dist/types/tts/index.d.ts +8 -0
- package/dist/types/tts/models.d.ts +82 -0
- package/dist/types/tts/player.d.ts +32 -0
- package/dist/types/tts/runtime.d.ts +6 -0
- package/dist/types/tts/streaming-player.d.ts +41 -0
- package/dist/types/tts/tts-client.d.ts +93 -0
- package/dist/types/tts/tts-protocol.d.ts +95 -0
- package/dist/types/tts/tts-worker.d.ts +2 -0
- package/dist/types/tts/vocalizer.d.ts +41 -0
- package/dist/types/tts/wav.d.ts +8 -0
- package/dist/types/utils/tool-choice.d.ts +8 -0
- package/dist/types/utils/tools-manager.d.ts +2 -1
- package/dist/types/utils/tools-manager.test.d.ts +1 -0
- package/dist/types/web/scrapers/github.d.ts +1 -1
- package/package.json +15 -14
- package/src/async/job-manager.ts +49 -0
- package/src/autolearn/controller.ts +139 -0
- package/src/autolearn/managed-skills.ts +257 -0
- package/src/autoresearch/state.ts +1 -1
- package/src/autoresearch/types.ts +1 -1
- package/src/cli/args.ts +56 -2
- package/src/cli/session-picker.ts +2 -1
- package/src/cli/setup-cli.ts +148 -47
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli-commands.ts +1 -0
- package/src/cli.ts +45 -13
- package/src/collab/host.ts +1 -1
- package/src/collab/protocol.ts +1 -1
- package/src/commands/say.ts +102 -0
- package/src/commands/setup.ts +1 -1
- package/src/commit/agentic/tools/analyze-file.ts +3 -0
- package/src/config/keybindings.ts +2 -2
- package/src/config/model-discovery.ts +11 -5
- package/src/config/model-registry.ts +64 -9
- package/src/config/models-config-schema.ts +4 -1
- package/src/config/models-config.ts +2 -1
- package/src/config/settings-schema.ts +248 -32
- package/src/config/settings.ts +10 -0
- package/src/discovery/builtin.ts +23 -1
- package/src/discovery/claude-plugins.ts +44 -5
- package/src/discovery/helpers.ts +41 -1
- package/src/eval/__tests__/budget-bridge.test.ts +1 -1
- package/src/eval/js/shared/prelude.txt +69 -17
- package/src/export/html/index.ts +3 -6
- package/src/extensibility/extensions/model-api.ts +41 -0
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +52 -1
- package/src/extensibility/extensions/wrapper.ts +41 -5
- package/src/extensibility/hooks/index.ts +2 -1
- package/src/extensibility/plugins/legacy-pi-compat.ts +43 -13
- package/src/extensibility/plugins/loader.ts +30 -19
- package/src/extensibility/plugins/manager.ts +221 -90
- package/src/extensibility/shared-events.ts +1 -1
- package/src/extensibility/skills.ts +96 -15
- package/src/goals/guided-setup.ts +133 -0
- package/src/goals/state.ts +1 -1
- package/src/hindsight/transcript.ts +1 -1
- package/src/index.ts +5 -0
- package/src/internal-urls/docs-index.generated.ts +10 -10
- package/src/internal-urls/history-protocol.ts +1 -1
- package/src/internal-urls/local-protocol.ts +29 -7
- package/src/main.ts +27 -7
- package/src/mcp/startup-events.ts +21 -0
- package/src/mcp/transports/stdio.ts +2 -1
- package/src/memories/index.ts +146 -11
- package/src/memory-backend/local-backend.ts +11 -5
- package/src/mnemopi/backend.ts +1 -0
- package/src/mnemopi/config.ts +26 -10
- package/src/modes/acp/acp-agent.ts +3 -5
- package/src/modes/components/agent-hub.ts +49 -4
- package/src/modes/components/assistant-message.ts +4 -37
- package/src/modes/components/compaction-summary-message.ts +125 -26
- package/src/modes/components/custom-editor.test.ts +96 -0
- package/src/modes/components/custom-editor.ts +164 -8
- package/src/modes/components/session-selector.ts +1 -1
- package/src/modes/components/settings-defs.ts +7 -0
- package/src/modes/components/tool-execution.ts +82 -43
- package/src/modes/components/transcript-container.ts +70 -1
- package/src/modes/components/tree-selector.ts +1 -1
- package/src/modes/components/usage-row.ts +18 -0
- package/src/modes/components/user-message.ts +4 -2
- package/src/modes/controllers/command-controller.ts +14 -4
- package/src/modes/controllers/event-controller.ts +78 -11
- package/src/modes/controllers/extension-ui-controller.ts +6 -0
- package/src/modes/controllers/input-controller.ts +258 -27
- package/src/modes/controllers/selector-controller.ts +12 -2
- package/src/modes/gradient-highlight.ts +21 -9
- package/src/modes/image-references.ts +20 -0
- package/src/modes/interactive-mode.ts +286 -40
- package/src/modes/magic-keywords.ts +27 -5
- package/src/modes/rpc/rpc-mode.ts +146 -14
- package/src/modes/rpc/rpc-subagents.ts +2 -2
- package/src/modes/rpc/rpc-types.ts +8 -2
- package/src/modes/runtime-init.ts +28 -3
- package/src/modes/theme/theme.ts +98 -50
- package/src/modes/types.ts +6 -2
- package/src/modes/utils/hotkeys-markdown.ts +1 -1
- package/src/modes/utils/ui-helpers.ts +34 -6
- package/src/priority.json +5 -1
- package/src/prompts/agents/task.md +1 -0
- package/src/prompts/goals/guided-goal-interview.md +8 -0
- package/src/prompts/goals/guided-goal-system.md +12 -0
- package/src/prompts/memories/read-path.md +6 -0
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge.md +3 -0
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +11 -6
- package/src/prompts/system/subagent-system-prompt.md +4 -0
- package/src/prompts/system/system-prompt.md +10 -5
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system-marker.md +16 -0
- package/src/prompts/tools/job.md +1 -0
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/task.md +3 -0
- package/src/registry/agent-registry.ts +30 -0
- package/src/sdk.ts +88 -24
- package/src/secrets/obfuscator.ts +1 -1
- package/src/session/agent-session.ts +209 -87
- package/src/session/history-storage.ts +2 -2
- package/src/session/indexed-session-storage.ts +7 -17
- package/src/session/session-context.ts +352 -0
- package/src/session/session-entries.ts +194 -0
- package/src/session/session-listing.ts +588 -0
- package/src/session/session-loader.ts +106 -0
- package/src/session/session-manager.ts +933 -3145
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +193 -0
- package/src/session/session-persistence.ts +131 -0
- package/src/session/session-storage.ts +91 -50
- package/src/session/snapcompact-inline.ts +21 -1
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/tool-choice-queue.ts +23 -11
- package/src/slash-commands/builtin-registry.ts +25 -3
- package/src/stt/asr-client.ts +520 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +790 -0
- package/src/stt/downloader.ts +107 -47
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +5 -1
- package/src/stt/models.ts +150 -0
- package/src/stt/recorder.ts +247 -60
- package/src/stt/stt-controller.ts +201 -22
- package/src/stt/transcriber.ts +37 -68
- package/src/stt/wav.ts +173 -0
- package/src/system-prompt.ts +8 -0
- package/src/task/agents.ts +1 -2
- package/src/task/executor.ts +49 -15
- package/src/task/index.ts +60 -6
- package/src/task/render.ts +83 -8
- package/src/task/types.ts +53 -0
- package/src/tools/ask.ts +8 -0
- package/src/tools/bash.ts +4 -3
- package/src/tools/eval-render.ts +4 -3
- package/src/tools/index.ts +40 -4
- package/src/tools/irc.ts +10 -2
- package/src/tools/job.ts +14 -2
- package/src/tools/learn.ts +144 -0
- package/src/tools/manage-skill.ts +104 -0
- package/src/tools/plan-mode-guard.ts +53 -19
- package/src/tools/renderers.ts +7 -11
- package/src/tools/ssh.ts +4 -3
- package/src/tools/todo.ts +1 -1
- package/src/tools/tts.ts +203 -92
- package/src/tools/write.ts +18 -2
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +8 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/player.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/streaming-player.ts +266 -0
- package/src/tts/tts-client.ts +647 -0
- package/src/tts/tts-protocol.ts +60 -0
- package/src/tts/tts-worker.ts +497 -0
- package/src/tts/vocalizer.ts +162 -0
- package/src/tts/wav.ts +58 -0
- package/src/utils/title-generator.ts +48 -5
- package/src/utils/tool-choice.ts +16 -0
- package/src/utils/tools-manager.test.ts +25 -0
- package/src/utils/tools-manager.ts +19 -1
- package/src/web/scrapers/github.ts +96 -0
- package/src/web/search/index.ts +13 -0
- package/src/web/search/providers/searxng.ts +13 -1
- package/dist/types/stt/setup.d.ts +0 -18
- package/src/stt/setup.ts +0 -52
- 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-
|
|
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-
|
|
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";
|
package/dist/types/cli/args.d.ts
CHANGED
|
@@ -47,11 +47,29 @@ export interface Args {
|
|
|
47
47
|
approvalMode?: "always-ask" | "write" | "yolo";
|
|
48
48
|
messages: string[];
|
|
49
49
|
fileArgs: string[];
|
|
50
|
-
/**
|
|
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 {
|
|
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
|
|
@@ -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-
|
|
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:
|
|
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;
|