Merge remote-tracking branch 'refs/remotes/origin/worktree/web-multimodal-image-input' into worktree/pr555-simplify

# Conflicts:
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.i18n.yaml
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.md
#	.agents/notes/implemented/feature/2026-07-22-web-multimodal-image-input-and-durable-attachments.zh.md
#	apps/cli/README.i18n.yaml
#	apps/cli/README.md
#	apps/cli/README.zh.md
#	apps/cli/src/app-cli-entry.ts
#	packages/client/connection/src/client/fixture.ts
#	packages/client/ui-conversation/src/client/service.ts
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/host.schema.ts
#	packages/host/apiproxy/src/api/host.ts
#	packages/host/apiproxy/tests/fetch-carrier.spec.ts
This commit is contained in:
Tianyi Cui
2026-07-30 01:16:58 +08:00
97 files changed
+1375 -447

No files matched your search

-6
View File
@@ -115,10 +115,6 @@ export interface AppCLIEntryOptions {
port?: number
/** Parent directory for name-created Workspaces; undefined uses the gateway's cwd fallback. */
workspaceRoot?: string
/** Host default provider override; the shipped tree must register the route. */
provider?: string
/** Host default model override. */
model?: string
/** Extra authorities for the /api browser-trust fence (`host` or `host:port`), appended to the derived LAN IP literals. */
trustedHosts?: string[]
}
@@ -201,8 +197,6 @@ export class AppCLIEntry {
if (this.options.host !== undefined) put('webserver', 'host', this.options.host)
if (this.options.port !== undefined) put('webserver', 'port', this.options.port)
if (this.options.workspaceRoot !== undefined) put('api-gateway', 'workspaceRoot', this.options.workspaceRoot)
if (this.options.provider !== undefined) put('api-gateway', 'provider', this.options.provider)
if (this.options.model !== undefined) put('api-gateway', 'model', this.options.model)
// Source 2b: authorities for the /api browser-trust fence (rationale on
// resolveLanTrust).
-9
View File
@@ -33,7 +33,6 @@ interface HeadlessInvocation {
* value fails loud at boot). `port` is `Number`-coerced only because the schema
* wants a number, not a string. `dev` mounts the client HMR driver;
* `workspaceRoot` is the parent directory for name-created workspaces.
* `provider` and `model` override the host's default model route.
*/
interface WebInvocation {
mode: 'web'
@@ -41,8 +40,6 @@ interface WebInvocation {
port?: number
dev: boolean
workspaceRoot?: string
provider?: string
model?: string
/** Extra authorities for the /api browser-trust fence (`host` or `host:port`); LAN IP literals are derived, not listed here. */
trustedHosts?: string[]
}
@@ -56,8 +53,6 @@ interface WebOptions {
port?: string
dev?: boolean
workspaceRoot?: string
provider?: string
model?: string
trustedHost?: string[]
}
@@ -74,8 +69,6 @@ function resolveWeb(options: WebOptions): WebInvocation {
...options.port !== undefined && { port: Number(options.port) },
dev: options.dev === true,
...options.workspaceRoot !== undefined && { workspaceRoot: options.workspaceRoot },
...options.provider !== undefined && { provider: options.provider },
...options.model !== undefined && { model: options.model },
...options.trustedHost !== undefined && { trustedHosts: options.trustedHost },
}
}
@@ -128,8 +121,6 @@ export function parseDshArgs(argv: readonly string[], version: string): DshInvoc
.option('--port <port>', 'override the config listen port (0 requests an OS-assigned port)')
.option('--dev', 'mount the client HMR driver and watch plugin bundles for rebuilds')
.option('--workspace-root <path>', 'parent directory for name-created workspaces')
.option('--provider <name>', 'override the host default provider')
.option('--model <id>', 'override the host default model')
.option('--trusted-host <authority...>', 'extra authority the /api browser-trust fence accepts (host or host:port; repeatable)')
.action((options: WebOptions) => {
// Commander parses the parent (default-surface) options on either side of
-2
View File
@@ -35,8 +35,6 @@ switch (invocation.mode) {
invocation.port,
invocation.dev,
invocation.workspaceRoot,
invocation.provider,
invocation.model,
invocation.trustedHosts,
)
break
-6
View File
@@ -22,8 +22,6 @@ const LOOPBACK_HOST = '127.0.0.1'
* @param port - the listen port (`0` requests an OS-assigned port), or `undefined` to keep the config default.
* @param dev - mount the client HMR driver and watch plugin bundles for rebuilds.
* @param workspaceRoot - parent directory for name-created workspaces, or `undefined` for the gateway's cwd fallback.
* @param provider - provider override, or `undefined` to keep the profile/config route.
* @param model - model override, or `undefined` to keep the profile/config route.
* @param trustedHosts - extra authorities for the /api browser-trust fence, or `undefined` for the derived LAN literals alone.
*/
export async function runWeb(
@@ -31,8 +29,6 @@ export async function runWeb(
port: number | undefined,
dev: boolean,
workspaceRoot: string | undefined,
provider: string | undefined,
model: string | undefined,
trustedHosts: string[] | undefined,
): Promise<void> {
const entry = new AppCLIEntry({
@@ -41,8 +37,6 @@ export async function runWeb(
...host !== undefined && { host },
...port !== undefined && { port },
...workspaceRoot !== undefined && { workspaceRoot },
...provider !== undefined && { provider },
...model !== undefined && { model },
...trustedHosts !== undefined && { trustedHosts },
})
const { ctx, port: boundPort } = await entry.run()