@x-otto/tui 0.1.0-alpha.15 → 0.1.0-alpha.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.
- package/dist/compat.d.ts +11 -2
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js.map +1 -1
- package/package.json +6 -6
package/dist/compat.d.ts
CHANGED
|
@@ -32,8 +32,17 @@ interface CommandContext {
|
|
|
32
32
|
}>;
|
|
33
33
|
/** 当前模型 ID。 */
|
|
34
34
|
currentModel?: string;
|
|
35
|
-
/**
|
|
36
|
-
|
|
35
|
+
/**
|
|
36
|
+
* 模型切换回调。
|
|
37
|
+
*
|
|
38
|
+
* 返回值类型刻意保持 `unknown`(2026-09-08):本层只用它做"宿主是否具备切换能力"
|
|
39
|
+
* 的存在性判断(见下方 execute 里的 `ctx.onModelChange` 分支),从不调用、更不读
|
|
40
|
+
* 返回值——真正的调用与结果处理在宿主侧(cli 的 InteractiveMode)。宿主的
|
|
41
|
+
* `applyModel` 已从裸 string 升级为结构化 `{ ok, message }`,若此处跟着写死具体
|
|
42
|
+
* 形状,等于让 tui(能力层)反向依赖 cli(宿主层)的类型,违反分层且每次宿主
|
|
43
|
+
* 调整返回值都要连带改这里。
|
|
44
|
+
*/
|
|
45
|
+
onModelChange?: (modelId: string) => Promise<unknown>;
|
|
37
46
|
/** 任务列表(供 /tasks 命令)。 */
|
|
38
47
|
tasks?: Array<{
|
|
39
48
|
subject: string;
|
package/dist/compat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compat.d.ts","names":[],"sources":["../src/compat.ts"],"mappings":";;AAgBA;;;;;;;;;;AAQA;;UARiB,aAAA;EACf,OAAA;EACA,YAAA;EACA,aAAA;EACA,SAAA;AAAA;;UAIe,cAAA;EAEP;EAAR,MAAA,EAAQ,WAAA;EAIR;EAFA,KAAA;EAEiB;EAAjB,MAAA,GAAS,KAAA;IAAQ,EAAA;IAAY,IAAA;IAAc,QAAA;EAAA;
|
|
1
|
+
{"version":3,"file":"compat.d.ts","names":[],"sources":["../src/compat.ts"],"mappings":";;AAgBA;;;;;;;;;;AAQA;;UARiB,aAAA;EACf,OAAA;EACA,YAAA;EACA,aAAA;EACA,SAAA;AAAA;;UAIe,cAAA;EAEP;EAAR,MAAA,EAAQ,WAAA;EAIR;EAFA,KAAA;EAEiB;EAAjB,MAAA,GAAS,KAAA;IAAQ,EAAA;IAAY,IAAA;IAAc,QAAA;EAAA;EAaN;EAXrC,YAAA;EAaQ;;;;;AAGV;;;;;EALE,aAAA,IAAiB,OAAA,aAAoB,OAAA;EAYd;EAVvB,KAAA,GAAQ,KAAA;IAAQ,OAAA;IAAiB,MAAA;EAAA;AAAA;AAAA,KAGvB,WAAA;;;;;;KAOA,aAAA;EACN,IAAA;EAAc,OAAA;AAAA;EACd,IAAA;AAAA;EACA,IAAA;AAAA;EACA,IAAA;AAAA;EACA,IAAA;AAAA;EACA,IAAA;AAAA;EACA,IAAA;EAAe,OAAA;AAAA;AAAA,KAET,aAAA,YAAyB,aAAA;AAAA,UAEpB,OAAA;EAMf;EAJA,IAAA;EAMM;EAJN,WAAA;EAWA;EATA,OAAA;EAeU;EAbV,IAAA,EAAM,WAAA;EAakB;EAXxB,MAAA;EAWgE;;;;EANhE,UAAA;EAS0B;;;;EAH1B,OAAA,GAAU,IAAA,UAAc,GAAA,EAAK,cAAA,KAAmB,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,cAG7D,eAAA;EAAA,QACH,QAAA;EAAA;EAGR,QAAA,CAAS,GAAA,EAAK,OAAA;EAAA;EAQd,GAAA,CAAI,IAAA,WAAe,OAAA;EAAnB;EAKA,IAAA,CAAK,WAAA,WAAsB,OAAA;EALR;EAenB,IAAA,CAAA,GAAQ,OAAA;EAVH;EAeL,KAAA,CAAA;EALA;EAUA,GAAA,CAAI,IAAA;EALJ;EAUA,UAAA,CAAW,IAAA;AAAA;;iBAMG,qBAAA,CAAA,GAAyB,eAAA;AAAA,UAgGxB,aAAA;EACf,OAAA;EACA,IAAA;AAAA;;;;AAFF;iBASgB,kBAAA,CACd,SAAA,EAAW,OAAA,IACX,MAAA,GAAS,MAAA,CAAO,UAAA,EAChB,OAAA,GAAU,MAAA,CAAO,WAAA,GAChB,OAAA,CAAQ,aAAA"}
|
package/dist/compat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compat.js","names":[],"sources":["../src/compat.ts"],"sourcesContent":["/**\n * compat.ts — Backward-compatible exports for packages/cli(modes/interactive-mode.ts).\n *\n * ESM 入口(`@x-otto/tui/compat`):根入口 ESM 图含 yoga-layout 顶层\n * await,若消费方在自身模块顶层同步 `require()` 会必败,故本文件保持零 Ink/React 依赖,\n * 允许消费方直接 `import`。\n *\n * 命令系统为 M52 前 commands.ts 的原样保留(CommandRegistry + 内置命令)。\n * 控制类命令返回 `CommandAction` 判别联合(RFC-089 A1:取代原 __exit__/__clear__\n * 字符串哨兵协议),interactive-mode._handleCommandResult 按 kind 分发消费。\n * showCommandPalette 在 V2 下退化为路由 /help(Ink 持有 stdin raw\n * mode,旧 readline 选择器会争抢输入流)。\n */\n\nimport { i18next } from './i18n'\n\nexport interface RenderOptions {\n columns?: number\n showThinking?: boolean\n contextWindow?: number\n startTime?: number\n}\n\n/** 命令执行上下文。 */\nexport interface CommandContext {\n /** 中止信号。 */\n signal: AbortSignal\n /** 终端宽度。 */\n width: number\n /** 可用模型列表(供 /model 命令)。 */\n models?: Array<{ id: string; name: string; provider: string }>\n /** 当前模型 ID。 */\n currentModel?: string\n
|
|
1
|
+
{"version":3,"file":"compat.js","names":[],"sources":["../src/compat.ts"],"sourcesContent":["/**\n * compat.ts — Backward-compatible exports for packages/cli(modes/interactive-mode.ts).\n *\n * ESM 入口(`@x-otto/tui/compat`):根入口 ESM 图含 yoga-layout 顶层\n * await,若消费方在自身模块顶层同步 `require()` 会必败,故本文件保持零 Ink/React 依赖,\n * 允许消费方直接 `import`。\n *\n * 命令系统为 M52 前 commands.ts 的原样保留(CommandRegistry + 内置命令)。\n * 控制类命令返回 `CommandAction` 判别联合(RFC-089 A1:取代原 __exit__/__clear__\n * 字符串哨兵协议),interactive-mode._handleCommandResult 按 kind 分发消费。\n * showCommandPalette 在 V2 下退化为路由 /help(Ink 持有 stdin raw\n * mode,旧 readline 选择器会争抢输入流)。\n */\n\nimport { i18next } from './i18n'\n\nexport interface RenderOptions {\n columns?: number\n showThinking?: boolean\n contextWindow?: number\n startTime?: number\n}\n\n/** 命令执行上下文。 */\nexport interface CommandContext {\n /** 中止信号。 */\n signal: AbortSignal\n /** 终端宽度。 */\n width: number\n /** 可用模型列表(供 /model 命令)。 */\n models?: Array<{ id: string; name: string; provider: string }>\n /** 当前模型 ID。 */\n currentModel?: string\n /**\n * 模型切换回调。\n *\n * 返回值类型刻意保持 `unknown`(2026-09-08):本层只用它做\"宿主是否具备切换能力\"\n * 的存在性判断(见下方 execute 里的 `ctx.onModelChange` 分支),从不调用、更不读\n * 返回值——真正的调用与结果处理在宿主侧(cli 的 InteractiveMode)。宿主的\n * `applyModel` 已从裸 string 升级为结构化 `{ ok, message }`,若此处跟着写死具体\n * 形状,等于让 tui(能力层)反向依赖 cli(宿主层)的类型,违反分层且每次宿主\n * 调整返回值都要连带改这里。\n */\n onModelChange?: (modelId: string) => Promise<unknown>\n /** 任务列表(供 /tasks 命令)。 */\n tasks?: Array<{ subject: string; status: 'pending' | 'in_progress' | 'completed' | 'blocked' }>\n}\n\nexport type CommandType = 'action' | 'prompt'\n\n/**\n * 命令执行的结构化结果(RFC-089 A1:取代原 `__exit__`/`__model:id__` 字符串哨兵协议)。\n * 控制类命令返回判别联合(run-modes 按 kind 分发);文本类命令(模型列表/插件命令等)\n * 继续返回 string(透传为系统消息)。消除了「字符串哨兵 + startsWith 解析」的类型擦除反模式。\n */\nexport type CommandAction =\n | { kind: 'exit'; restart?: boolean }\n | { kind: 'help' }\n | { kind: 'clear' }\n | { kind: 'abort' }\n | { kind: 'status' }\n | { kind: 'copy' }\n | { kind: 'model'; modelId: string }\n\nexport type CommandResult = string | CommandAction\n\nexport interface Command {\n /** 命令名(不含 / 前缀)。 */\n name: string\n /** 简短描述。 */\n description: string\n /** 别名。 */\n aliases?: string[]\n /** 命令类型。 */\n type: CommandType\n /** 来源。 */\n source?: 'builtin' | 'plugin' | 'skill' | 'mcp'\n /**\n * 已弃用命令(RFC-369):命令名已收敛为某父命令的子命令,仅作过渡期别名保留。\n * 由 CLI 目录 `SLASH_COMMANDS.deprecated` 派生,供斜杠面板弱化展示。\n */\n deprecated?: boolean\n\n /**\n * action: 本地执行,返回结果(CommandAction 控制指令 或 string 文本)。\n * prompt: 返回注入 agent 对话的 prompt 文本。\n */\n execute: (args: string, ctx: CommandContext) => CommandResult | Promise<CommandResult>\n}\n\nexport class CommandRegistry {\n private commands = new Map<string, Command>()\n\n /** 注册命令。重名时抛出。 */\n register(cmd: Command): void {\n if (this.commands.has(cmd.name)) {\n throw new Error(`Command \"/${cmd.name}\" is already registered`)\n }\n this.commands.set(cmd.name, cmd)\n }\n\n /** 按名称获取命令。 */\n get(name: string): Command | undefined {\n return this.commands.get(name)\n }\n\n /** 按名称或别名查找。 */\n find(nameOrAlias: string): Command | undefined {\n const byName = this.commands.get(nameOrAlias)\n if (byName) return byName\n for (const cmd of this.commands.values()) {\n if (cmd.aliases?.includes(nameOrAlias)) return cmd\n }\n return undefined\n }\n\n /** 列出所有命令。 */\n list(): Command[] {\n return [...this.commands.values()]\n }\n\n /** 列出命令名。 */\n names(): string[] {\n return [...this.commands.keys()]\n }\n\n /** 是否存在。 */\n has(name: string): boolean {\n return this.commands.has(name)\n }\n\n /** 注销命令。 */\n unregister(name: string): boolean {\n return this.commands.delete(name)\n }\n}\n\n/** 创建内置命令注册表(对标 CC COMMANDS())。 */\nexport function createBuiltinCommands(): CommandRegistry {\n const registry = new CommandRegistry()\n\n registry.register({\n name: 'help',\n description: i18next.t('cmdDesc.help')!,\n aliases: ['h', '?'],\n type: 'action',\n source: 'builtin',\n execute: () => ({ kind: 'help' }),\n })\n\n registry.register({\n name: 'exit',\n description: i18next.t('cmdDesc.exit')!,\n aliases: ['quit', 'q'],\n type: 'action',\n source: 'builtin',\n execute: (args) => {\n const trimmed = args?.trim() ?? ''\n if (trimmed === '--restart' || trimmed === '-r') return { kind: 'exit', restart: true }\n return { kind: 'exit' }\n },\n })\n\n registry.register({\n name: 'clear',\n description: i18next.t('cmdDesc.clear')!,\n type: 'action',\n source: 'builtin',\n execute: () => ({ kind: 'clear' }),\n })\n\n registry.register({\n name: 'abort',\n description: i18next.t('cmdDesc.abort')!,\n type: 'action',\n source: 'builtin',\n execute: () => ({ kind: 'abort' }),\n })\n\n registry.register({\n name: 'copy',\n description: i18next.t('cmdDesc.copy')!,\n type: 'action',\n source: 'builtin',\n execute: () => ({ kind: 'copy' }),\n })\n\n registry.register({\n name: 'model',\n description: i18next.t('cmdDesc.model')!,\n aliases: ['m'],\n type: 'action',\n source: 'builtin',\n execute: (args, ctx) => {\n if (!ctx.models || ctx.models.length === 0) {\n return i18next.t('model.noRegistry')\n }\n if (args && ctx.onModelChange) {\n const target = ctx.models.find((m) => m.id === args || m.name === args)\n if (target) {\n return { kind: 'model', modelId: target.id }\n }\n return i18next.t('model.notFound', { name: args })\n }\n const byProvider = new Map<string, typeof ctx.models>()\n for (const m of ctx.models) {\n const list = byProvider.get(m.provider) ?? []\n list.push(m)\n byProvider.set(m.provider, list)\n }\n const lines: string[] = ['']\n for (const [provider, models] of byProvider) {\n lines.push(` ${provider}:`)\n for (const m of models) {\n const marker = m.id === ctx.currentModel ? ' *' : ' '\n lines.push(` ${marker} ${m.id} — ${m.name}`)\n }\n }\n lines.push('', i18next.t('model.listFooter'))\n return lines.join('\\n')\n },\n })\n\n registry.register({\n name: 'status',\n description: i18next.t('cmdDesc.status')!,\n type: 'action',\n source: 'builtin',\n execute: () => ({ kind: 'status' }),\n })\n\n return registry\n}\n\nexport interface PaletteResult {\n command: string | null\n args: string\n}\n\n/**\n * V2 下 Ink 持有 stdin raw mode,旧 readline 选择器会争抢输入流——\n * bare '/' 退化为路由 /help(列出全部命令),不再弹交互式菜单。\n */\nexport function showCommandPalette(\n _commands: Command[],\n _stdin?: NodeJS.ReadStream,\n _stdout?: NodeJS.WriteStream,\n): Promise<PaletteResult> {\n return Promise.resolve({ command: 'help', args: '' })\n}\n"],"mappings":"uCA0FA,IAAa,EAAb,KAA6B,CAC3B,SAAmB,IAAI,IAGvB,SAAS,EAAoB,CAC3B,GAAI,KAAK,SAAS,IAAI,EAAI,KAAK,CAC7B,MAAU,MAAM,aAAa,EAAI,KAAK,yBAAyB,CAEjE,KAAK,SAAS,IAAI,EAAI,KAAM,EAAI,CAIlC,IAAI,EAAmC,CACrC,OAAO,KAAK,SAAS,IAAI,EAAK,CAIhC,KAAK,EAA0C,CAC7C,IAAM,EAAS,KAAK,SAAS,IAAI,EAAY,CAC7C,GAAI,EAAQ,OAAO,EACnB,IAAK,IAAM,KAAO,KAAK,SAAS,QAAQ,CACtC,GAAI,EAAI,SAAS,SAAS,EAAY,CAAE,OAAO,EAMnD,MAAkB,CAChB,MAAO,CAAC,GAAG,KAAK,SAAS,QAAQ,CAAC,CAIpC,OAAkB,CAChB,MAAO,CAAC,GAAG,KAAK,SAAS,MAAM,CAAC,CAIlC,IAAI,EAAuB,CACzB,OAAO,KAAK,SAAS,IAAI,EAAK,CAIhC,WAAW,EAAuB,CAChC,OAAO,KAAK,SAAS,OAAO,EAAK,GAKrC,SAAgB,GAAyC,CACvD,IAAM,EAAW,IAAI,EA4FrB,OA1FA,EAAS,SAAS,CAChB,KAAM,OACN,YAAa,EAAQ,EAAE,eAAe,CACtC,QAAS,CAAC,IAAK,IAAI,CACnB,KAAM,SACN,OAAQ,UACR,aAAgB,CAAE,KAAM,OAAQ,EACjC,CAAC,CAEF,EAAS,SAAS,CAChB,KAAM,OACN,YAAa,EAAQ,EAAE,eAAe,CACtC,QAAS,CAAC,OAAQ,IAAI,CACtB,KAAM,SACN,OAAQ,UACR,QAAU,GAAS,CACjB,IAAM,EAAU,GAAM,MAAM,EAAI,GAEhC,OADI,IAAY,aAAe,IAAY,KAAa,CAAE,KAAM,OAAQ,QAAS,GAAM,CAChF,CAAE,KAAM,OAAQ,EAE1B,CAAC,CAEF,EAAS,SAAS,CAChB,KAAM,QACN,YAAa,EAAQ,EAAE,gBAAgB,CACvC,KAAM,SACN,OAAQ,UACR,aAAgB,CAAE,KAAM,QAAS,EAClC,CAAC,CAEF,EAAS,SAAS,CAChB,KAAM,QACN,YAAa,EAAQ,EAAE,gBAAgB,CACvC,KAAM,SACN,OAAQ,UACR,aAAgB,CAAE,KAAM,QAAS,EAClC,CAAC,CAEF,EAAS,SAAS,CAChB,KAAM,OACN,YAAa,EAAQ,EAAE,eAAe,CACtC,KAAM,SACN,OAAQ,UACR,aAAgB,CAAE,KAAM,OAAQ,EACjC,CAAC,CAEF,EAAS,SAAS,CAChB,KAAM,QACN,YAAa,EAAQ,EAAE,gBAAgB,CACvC,QAAS,CAAC,IAAI,CACd,KAAM,SACN,OAAQ,UACR,SAAU,EAAM,IAAQ,CACtB,GAAI,CAAC,EAAI,QAAU,EAAI,OAAO,SAAW,EACvC,OAAO,EAAQ,EAAE,mBAAmB,CAEtC,GAAI,GAAQ,EAAI,cAAe,CAC7B,IAAM,EAAS,EAAI,OAAO,KAAM,GAAM,EAAE,KAAO,GAAQ,EAAE,OAAS,EAAK,CAIvE,OAHI,EACK,CAAE,KAAM,QAAS,QAAS,EAAO,GAAI,CAEvC,EAAQ,EAAE,iBAAkB,CAAE,KAAM,EAAM,CAAC,CAEpD,IAAM,EAAa,IAAI,IACvB,IAAK,IAAM,KAAK,EAAI,OAAQ,CAC1B,IAAM,EAAO,EAAW,IAAI,EAAE,SAAS,EAAI,EAAE,CAC7C,EAAK,KAAK,EAAE,CACZ,EAAW,IAAI,EAAE,SAAU,EAAK,CAElC,IAAM,EAAkB,CAAC,GAAG,CAC5B,IAAK,GAAM,CAAC,EAAU,KAAW,EAAY,CAC3C,EAAM,KAAK,KAAK,EAAS,GAAG,CAC5B,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAS,EAAE,KAAO,EAAI,aAAe,KAAO,KAClD,EAAM,KAAK,MAAM,EAAO,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAIlD,OADA,EAAM,KAAK,GAAI,EAAQ,EAAE,mBAAmB,CAAC,CACtC,EAAM,KAAK;EAAK,EAE1B,CAAC,CAEF,EAAS,SAAS,CAChB,KAAM,SACN,YAAa,EAAQ,EAAE,iBAAiB,CACxC,KAAM,SACN,OAAQ,UACR,aAAgB,CAAE,KAAM,SAAU,EACnC,CAAC,CAEK,EAYT,SAAgB,EACd,EACA,EACA,EACwB,CACxB,OAAO,QAAQ,QAAQ,CAAE,QAAS,OAAQ,KAAM,GAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x-otto/tui",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.18",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -33,15 +33,15 @@
|
|
|
33
33
|
"string-width": "^8.2.0",
|
|
34
34
|
"wrap-ansi": "^10.0.0",
|
|
35
35
|
"zustand": "^5.0.8",
|
|
36
|
-
"@x-otto/env": "0.1.0-alpha.
|
|
37
|
-
"@x-otto/
|
|
38
|
-
"@x-otto/
|
|
39
|
-
"@x-otto/
|
|
36
|
+
"@x-otto/env": "0.1.0-alpha.18",
|
|
37
|
+
"@x-otto/shared": "0.1.0-alpha.18",
|
|
38
|
+
"@x-otto/interchange": "0.1.0-alpha.18",
|
|
39
|
+
"@x-otto/session-contract": "0.1.0-alpha.18"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/react": "^19.2.2",
|
|
43
43
|
"ink-testing-library": "4",
|
|
44
|
-
"@x-otto/runtime": "0.1.0-alpha.
|
|
44
|
+
"@x-otto/runtime": "0.1.0-alpha.18"
|
|
45
45
|
},
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"access": "public",
|