Merge latest invariant service seam

# Conflicts:
#	docs/module-graph.md
#	package.json
#	packages/examples/tui-demo/package.json
#	packages/examples/tui-demo/src/invariant.ts
#	packages/ui/stdio/package.json
#	packages/ui/stdio/tests/stdio.spec.ts
#	packages/ui/stdio/tsconfig.json
#	pnpm-lock.yaml
This commit is contained in:
Tianyi Cui
2026-07-20 21:02:52 +08:00
176 changed files with 1352 additions and 4308 deletions

View File

@@ -61,7 +61,7 @@ function createProgram(): Command {
.option('--base-url <url>')
.option('--api-key <key>')
.option('--model <name>')
.addOption(new Option('--interface <name>').choices(['acp', 'stdio', 'embed']))
.addOption(new Option('--interface <name>').choices(['acp', 'tui', 'embed']))
.addOption(new Option('--pm <name>').choices(['npm', 'pnpm', 'yarn']))
.addOption(new Option('--install').default(undefined))
.addOption(new Option('--no-install').default(undefined))

View File

@@ -169,10 +169,10 @@ const PROJECT_QUESTION_STEPS: readonly WizardStep<ProjectAnswerState>[] = [
message: 'Run interface',
options: [
{ value: 'acp', label: 'ACP server' },
{ value: 'stdio', label: 'Terminal REPL' },
{ value: 'tui', label: 'Terminal TUI' },
{ value: 'embed', label: 'Embedded context' },
],
initialValue: 'stdio',
initialValue: 'tui',
}),
prefilled: state => state.args.runInterface,
apply: (state, value) => { state.runInterface = value },

View File

@@ -6,7 +6,7 @@ Options:
--base-url <url>
--api-key <key>
--model <name>
--interface <acp|stdio|embed>
--interface <acp|tui|embed>
--pm <npm|pnpm|yarn>
--install / --no-install
--config <path>

View File

@@ -179,12 +179,12 @@ describe('create-sdk terminal contract', () => {
"message": "DeepSeek API key",
},
{
"initialValue": "stdio",
"initialValue": "tui",
"kind": "select",
"message": "Run interface",
"options": [
"ACP server",
"Terminal REPL",
"Terminal TUI",
"Embedded context",
],
},

View File

@@ -151,7 +151,7 @@ describe('create arguments', () => {
expect(() => parseCreateArgs(['--link-packages-workspace'])).toThrow("unknown option '--link-packages-workspace'")
expect(parseCreateArgs(['--provider=custom']).provider).toBe('custom')
expect(parseCreateArgs(['--help']).help).toBe(true)
expect(() => parseCreateArgs(['--interface=bad'])).toThrow('Allowed choices are acp, stdio, embed')
expect(() => parseCreateArgs(['--interface=bad'])).toThrow('Allowed choices are acp, tui, embed')
expect(() => parseCreateArgs(['--unknown'])).toThrow("unknown option '--unknown'")
expect(() => parseCreateArgs(['one', 'two'])).toThrow('too many arguments')
})
@@ -208,7 +208,7 @@ describe('CreateWizard and scaffolder', () => {
'--provider=deepseek',
'--api-key=deepseek-key',
'--model=deepseek-v4-flash',
'--interface=stdio',
'--interface=tui',
'--pm=npm',
'--no-install',
'--link-workspace',
@@ -247,7 +247,7 @@ describe('CreateWizard and scaffolder', () => {
const resolved = await new CreateWizard({
args: parseCreateArgs([
'my-agent', '--description=demo', '--provider=deepseek', '--api-key=deepseek-key',
'--model=deepseek-v4-flash', '--interface=stdio', '--pm=npm', '--no-install',
'--model=deepseek-v4-flash', '--interface=tui', '--pm=npm', '--no-install',
]),
port: new HeadlessPromptPort(),
cwd,
@@ -275,7 +275,7 @@ describe('CreateWizard and scaffolder', () => {
await expect(new CreateWizard({
args: parseCreateArgs([
'my-agent', '--description=demo', '--provider=deepseek', '--api-key=k',
'--model=m', '--interface=stdio', '--pm=npm', '--no-install',
'--model=m', '--interface=tui', '--pm=npm', '--no-install',
]),
port: new HeadlessPromptPort(),
cwd,