Repository navigation
feat(desktop): start a coding agent from New task's prompt-first composer, with Plan mode for a call with Luke - #3717
Merged
Conversation
…t the name field The name field is a plain name again: typing in it lists no Linear issues and searches nothing. Where the workspace the task starts in has Linear connected, a Linear chip stands after the repository chip, and a press on it, or Command-L from the card, opens the shared searchable menu over the workspace's issues: those read as the card opened with nothing typed, the same narrowing, rested Linear search, and key or link lookup as before (moved unchanged into linear-issue-chip.tsx). Choosing an issue starts its task at once, as choosing one did; Escape closes the menu and not the card; a switch of workspace closes it and reads that workspace's issues. SearchableMenu takes an onSearch for an owner that answers the search itself, listing its rows unfiltered. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Resolves the conflicts with main's SearchableMenu move onto SearchField and ComboboxList: onSearch now rides the SearchField's onChange, and the Linear chip caps its list with --luke-combobox-list-max as the repository chip does. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…oser, with Plan mode for a call with Luke New task's name field becomes the agent composer card: words, files, dictation, the model chip, and Start, with the repository and Linear chips and a Plan toggle at its foot. Agent mode starts the task without planning and opens it on a draft agent tab that sends the words at once, so a refused agent keeps them with Retry. A Linear issue picked becomes a chip whose mention leads the agent's prompt. Plan mode starts today's plan and call, named by the words until the brief lands. An Untitled task's tasks are read again as its first agent's title lands. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Resolves the conflict with #3694's move of the renderer runtime into @luke/panel: the Linear chip's search atom reads it from there. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…s menu shut across a reconnect or a composing key - SearchableMenu holds a moved highlight by its row's id as well as its place, so an owner's search answering after the arrows moved, with an issue sorted ahead, leaves the highlight and Return on the issue chosen. - The Linear chip closes its menu when Linear is let go, so its coming back draws nothing until the chip is pressed. - Command-L opens nothing while an input method is composing. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…s ask Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…-prompt-composer Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…field lands Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…ts Plan mode's files in the task-names allowlist Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…-prompt-composer Takes main's @luke/panel move (New task's mode now lives at @luke/panel/tasks/new-task-mode) and #3693's Start agent… from an issue: the composer stands in Agent mode with no Plan toggle for it, and an agent on a workspace issue with nothing written starts on the task's plan through NewTaskStart.agent; the composer's words go as NewTaskStart.handed. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
… model is not kept as default, and offer no server reconnect where no servers are handed Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
13 of 14 tasks
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Oct 18, 2026
…tings changes the default (#3718) Main's #3718 made Settings the one place the coding agents' default model is written, so the composer's chip no longer writes it: it starts on the default and a pick runs the agent New task starts. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…oser New task now draws the agent composer card, which puts about 0.7 KB gzipped into panel.js's own chunk (95,596 to 96,306 bytes); main already stood about 480 bytes under the old ceiling, so this crossed it. Baseline 901,571 to 946,875 gzipped bytes, panel.js alone. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
… for them, and size its issue chip's Linear mark Drawn in a browser, the 520px wide card squeezed the foot's chips to ellipses (acm…, L…, P…, Opus 5…) and the issue chip's Linear mark filled its slot unsized. @luke/ui's Dialog gains a composer size (620px), the short chips stand whole while the repository's name gives way, and the issue chip's mark is drawn at the caption size. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Takes #3725's move of the panel's second band: Tooltip now comes from @luke/panel/tooltip. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
luke-agent Bot
added a commit
that referenced
this pull request
Oct 18, 2026
Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…row for one row A narrow window zoomed in left the foot's whole chips no room, so the round Start ran past the card; the foot now wraps, its presses kept at the right, as a 380px-wide render shows. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
luke-agent Bot
added a commit
that referenced
this pull request
Oct 18, 2026
Takes main's New task composer, dialog, and tasks tab from #3717 as it merged, and re-applies Home's composer onto main's DetailPage Home: the composer at the top of the page's content in place of the New task action, standing in one place while the list is read and once it lands, and under Luke's line in a new account's welcome. Keeps the shared mode store and its test; drops the cross-card default-model sync and its tests, which #3718's removal of writeDefault left nothing to follow. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
This was referenced Oct 18, 2026
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR 2 of the "New task, prompt first" redesign, stacked on #3697. New task's name field is now the shared agent composer card. Its words start a coding agent on the new task. A Plan toggle brings back the old flow: plan template plus a call with Luke.
Summary
tasks/new-task-composer.tsx, mounted by the dialog so PR 8 can put it on Home): this is the agent box itself (AgentComposer), not a fork of it. It has the words field, "+"/paste/drop for files, dictation, the model chip and the round Start button. The repository chip and feat(desktop): choose a New task's Linear issue from its own chip, not the name field #3697'sLinearIssueChipnow sit in its foot. The workspace chip stays in the title. To make this possible,AgentComposertakes a few optional slots:wording,above,tools,actions,sendable,onKey,onLeave,focusedByOwner. Itsserversprop is now optional. The pickers' Escape fallback can belong to the owner.@luke/panel/tasks/new-task-modereplaces@luke/panel/tasks/new-task-planning):AGENT | PLAN. You switch it with the Plan toggle chip or with Shift+Tab from the field. It is kept under a new key,luke.new-task-mode, and defaults to Agent. The old Plan switch's key is ignored.TASKS_STARTwithplanning: false, plus the repository, the workspace,linearIssueId, and the issue's title as the name.startTaskthen gives the new task a draft agent throughuseCodingAgents.onHandDraft. That draft holds the prompt, the attachments and the chosen model, uses a fresh idempotency key, and is markedsendsOnOpen. The task opens on that draft's tab (mainTabs.onShow).DraftAgentTabsends it oncestart.availableis true. If the agent start is refused, you stay on the draft tab with your words, the reason and Retry, which is the draft tab's existing behaviour.agentPromptOf(issue, words)in@luke/ui/tasks-model:[@KEY Title](url), a blank line, then the words, or the mention alone if there are no words. This comes with a unit test. Switching workspace drops a picked issue.planning: true, the call opens), using the issue if one was picked. The model chip is hidden and Start is always enabled. Until PR 5, the words become the task name: first line, trimmed toTASK_BOUNDS.MAX_NAME_CHARS(taskNameOfWords).planning: false, no agent). Escape closes an open menu or dictation first, then the card. ⌘L opens Linear, and is ignored while an input method is composing, as in feat(desktop): choose a New task's Linear issue from its own chip, not the name field #3697.Untitled, the window sendsTASKS_REFRESHonce, so the name PR 3 gives it on the service shows up.agent: true) keeps the card in Agent mode with no Plan toggle and titles it "New agent from …". In Agent mode, a card opened on a workspace issue with nothing written starts the agent on the task's plan throughNewTaskStart.agent, as feat(desktop,service,database): start an agent from an issue, and move its issue into progress as it starts #3693 does. Once words or files are written, they go to the agent asNewTaskStart.handed.newTask.startkeeps its five parameters.Screenshots
These come from the real
NewTaskDialog, drawn in Chromium with fake data in the dark theme, not from the packaged app.Agent mode, words typed:
A Linear issue attached above the words:
Plan mode (Shift+Tab): the model chip is hidden:
No repository: Start is disabled and the reason shows under the card:
Evidence
pnpm check:affected: it ran out of memory in the sandbox (typecheck,discarded-effectanddesktop-shell.test.tswere OOM-killed, andapp-menu.test.tsneeds an Electron binary the sandbox lacks). I re-ran each of those on its own:tsc --noEmitfor@luke/desktopand@luke/ui: pass.pnpm discarded-effect(6 GB heap): "No discarded Effect, Stream, or Layer in 2358 files."pnpm knip,pnpm lint(biome + oxlint),scripts/repository-checks.sh(task-names included): pass.vitest runonnew-task-dialog,new-task-workspace,draft-agent-tab,use-tasks-tab,desktop-shell,modals, theagent-composer*tests andpackages/ui/src/tasks-model.test.ts: pass.modals.test.ts. I fixed it: the card now holds focus until the editor lands.Screenshots: drawn from the real
NewTaskDialogin headless Chromium, not the packaged app (evidence.shonly runs on macOS). Drawing it showed two bugs, now fixed: the foot's chips were squeezed to ellipses in the 520px card (fixed with a new 620pxDIALOG_SIZE.COMPOSER), and the issue chip's Linear mark was unsized.Bundle budget: the
renderer/panel.jsbaseline moves from 901,571 to 946,875 gzipped bytes (+45,304), so the ceiling moves from 946,649 to 994,218. Measured at this head, panel.js and the chunks it loads come to 946,875 bytes. Main alone measures about 946,165, already about 480 bytes under the old ceiling: most of the gap between the old baseline and today is main's own growth, which used up the 5% slack. This PR adds about 710 bytes, all in panel.js's own chunk (95,596 → 96,306), because New task now draws the agent composer card. That is what pushed it over. Only that one entry was re-recorded, at today's measured size.Tests (new and rewritten)
new-task-dialog.test.ts:draft-agent-tab.test.ts: a handed draft sends itself once it can start, and a refusal leaves the words with Retry.use-tasks-tab.test.ts:TASKS_REFRESH, and a named task asks nothing.tasks-model.test.ts:agentPromptOfandtaskNameOfWords.new-task-workspace.test.tsanddesktop-shell.test.ts: Create task and Cancel changed to Plan mode's Start and Escape.Invariants
./scripts/check.shgreen. (CI)astype assertion.Effect.runPromise/runSync/runForkoutside the edges.new-task-planning.tsdeleted, replaced bynew-task-mode.ts.CLAUDE.md/AGENTS.mdsentence names a changed part.PRIVACY.mdunchanged.Notes
Made with Luke