worker: support typed initial submit on spawn

This commit is contained in:
2026-08-09 23:19:29 +09:00
parent 068ba9afa5
commit b9dadb6a08
13 changed files with 367 additions and 94 deletions
@@ -509,7 +509,7 @@ Deno.test("workspace Worker sidebar links New to the dedicated create page", asy
);
assert(
newWorkerPage.includes("worker-launch-form") &&
newWorkerPage.includes("buildBrowserCreateWorkerRequest") &&
newWorkerPage.includes("buildCreateWorkspaceWorkerRequest") &&
newWorkerPage.includes("/workers/launch-options"),
"New Worker page should own launch options and creation form behavior",
);
@@ -1,5 +1,5 @@
import {
buildBrowserCreateWorkerRequest,
buildCreateWorkspaceWorkerRequest,
defaultWorkerLaunchForm,
} from "./worker-launch.ts";
import type { WorkerLaunchOptionsResponse } from "./types.ts";
@@ -182,8 +182,8 @@ Deno.test("defaultWorkerLaunchForm preserves a Ticket repository target", () =>
assertEquals(form.working_directory_selector, "work/ticket");
});
Deno.test("buildBrowserCreateWorkerRequest sends working_directory id and relative cwd only", () => {
const request = buildBrowserCreateWorkerRequest({
Deno.test("buildCreateWorkspaceWorkerRequest sends working_directory id and relative cwd only", () => {
const request = buildCreateWorkspaceWorkerRequest({
runtime_id: "embedded",
display_name: "Worker",
profile: "builtin:coder",
@@ -198,7 +198,7 @@ Deno.test("buildBrowserCreateWorkerRequest sends working_directory id and relati
runtime_id: "embedded",
display_name: "Worker",
profile: "builtin:coder",
initial_text: "go",
initial_submit: [{ kind: "text", content: "go" }],
working_directory: {
working_directory_id: "wd-1-repo",
relative_cwd: "crates/yoi",
@@ -206,8 +206,23 @@ Deno.test("buildBrowserCreateWorkerRequest sends working_directory id and relati
});
});
Deno.test("buildBrowserCreateWorkerRequest omits working_directory for embedded no-workdir launches", () => {
const request = buildBrowserCreateWorkerRequest({
Deno.test("buildCreateWorkspaceWorkerRequest sends no initial segments for an empty draft", () => {
const request = buildCreateWorkspaceWorkerRequest({
runtime_id: "embedded",
display_name: "Worker",
profile: "builtin:companion",
initial_text: " ",
working_directory_id: "",
working_directory_repository_id: "",
working_directory_selector: "",
relative_cwd: "",
});
assertEquals(request.initial_submit, []);
});
Deno.test("buildCreateWorkspaceWorkerRequest omits working_directory for embedded no-workdir launches", () => {
const request = buildCreateWorkspaceWorkerRequest({
runtime_id: "embedded",
display_name: "Worker",
profile: "builtin:companion",
@@ -222,6 +237,6 @@ Deno.test("buildBrowserCreateWorkerRequest omits working_directory for embedded
runtime_id: "embedded",
display_name: "Worker",
profile: "builtin:companion",
initial_text: "chat",
initial_submit: [{ kind: "text", content: "chat" }],
});
});
@@ -1,3 +1,5 @@
import type { Segment } from "$lib/generated/protocol";
import type {
BrowserWorkerWorkingDirectorySelection,
WorkerLaunchOptionsResponse,
@@ -14,11 +16,11 @@ export type WorkerLaunchFormState = {
relative_cwd: string;
};
export type BrowserCreateWorkerRequest = {
export type CreateWorkspaceWorkerRequest = {
runtime_id: string;
display_name: string;
profile: string;
initial_text: string;
initial_submit: Segment[];
working_directory?: BrowserWorkerWorkingDirectorySelection;
};
@@ -92,14 +94,16 @@ export function defaultWorkerLaunchForm(
};
}
export function buildBrowserCreateWorkerRequest(
export function buildCreateWorkspaceWorkerRequest(
form: WorkerLaunchFormState,
): BrowserCreateWorkerRequest {
const request: BrowserCreateWorkerRequest = {
): CreateWorkspaceWorkerRequest {
const request: CreateWorkspaceWorkerRequest = {
runtime_id: form.runtime_id,
display_name: form.display_name,
profile: form.profile,
initial_text: form.initial_text,
initial_submit: form.initial_text.trim()
? [{ kind: "text", content: form.initial_text }]
: [],
};
if (form.working_directory_id) {
request.working_directory = {
@@ -3,7 +3,7 @@
import { untrack } from 'svelte';
import { workspaceApiPath } from '$lib/workspace/api/http';
import { formatCurrentWorkdirRevision } from '$lib/workspace/settings/workdir-revision';
import { buildBrowserCreateWorkerRequest, defaultWorkerLaunchForm } from '$lib/workspace/sidebar/worker-launch';
import { buildCreateWorkspaceWorkerRequest, defaultWorkerLaunchForm } from '$lib/workspace/sidebar/worker-launch';
import type {
BrowserCreateWorkerResponse,
BrowserWorkingDirectoryCreateResponse,
@@ -210,7 +210,7 @@
const response = await fetch(workerApiPath('/workers'), {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify(buildBrowserCreateWorkerRequest({
body: JSON.stringify(buildCreateWorkspaceWorkerRequest({
runtime_id: runtimeId,
display_name: displayName,
profile,