Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
19f2030
feat: add Devin provider support
rafael-franca Aug 11, 2026
7adc2cc
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 11, 2026
80cab23
fix(server): improve Devin usage tracking and reasoning variant matching
rafael-franca Aug 12, 2026
22c04f9
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 12, 2026
b117ec1
fix(devin): apply Macroscope review feedback and add mobile support
rafael-franca Aug 12, 2026
c109ae9
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 12, 2026
71544c9
fix(server,web,acp): apply Macroscope round-2 review feedback
rafael-franca Aug 12, 2026
ab6f2d8
fix(server): remove devin thread lock entries on session stop
rafael-franca Aug 12, 2026
b7afac7
fix(web): show model description tooltip when description exists
rafael-franca Aug 12, 2026
03d4094
test(web): update Devin settings field order expectation
rafael-franca Aug 12, 2026
771c598
Merge remote-tracking branch 'origin/main' into rafaelfranca/add-devi…
rafael-franca Aug 12, 2026
7c04fd9
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 12, 2026
02aa3f6
feat(web,contracts): add Devin Desktop to editor picker
rafael-franca Aug 12, 2026
f379487
feat(marketing,server): add Devin to marketing page and improve adapter
rafael-franca Aug 13, 2026
d98293f
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 13, 2026
d6385c0
test(server): reformat DevinAcpSupport tests and remove unused import
rafael-franca Aug 13, 2026
0b6c835
test(server): add token usage snapshot tests and refactor calculation…
rafael-franca Aug 13, 2026
de511f8
Merge remote-tracking branch 'origin/main' into rafaelfranca/add-devi…
rafael-franca Aug 13, 2026
6d51d47
Increase Devin version probe timeout from 4s to 15s
rafael-franca Aug 13, 2026
71edcec
fix(server): resolve Devin adapter PR feedback
rafael-franca Aug 13, 2026
86dbbd4
Merge branch 'pingdotgg:main' into rafaelfranca/add-devin-provider
rafael-franca Aug 13, 2026
5886ba6
fix(server): make Devin session stop uninterruptible
rafael-franca Aug 13, 2026
b74da06
test(server): rehydrate version dots in Devin model slugs
rafael-franca Aug 13, 2026
1d9451c
fix(server): ProviderProbeError carries stage and exit code structurally
rafael-franca Aug 13, 2026
00e4b44
Merge branch 'pingdotgg:main' into rafaelfranca/add-devin-provider
rafael-franca Aug 14, 2026
5d7375e
fix(server): make ProviderProbeError failure kinds and stages typed
rafael-franca Aug 14, 2026
a1c6197
Update apps/server/src/provider/Drivers/DevinDriver.ts
rafael-franca Aug 14, 2026
6a5f2c0
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 17, 2026
faba634
fix(server): address Cursor Bugbot Devin usage findings
rafael-franca Aug 17, 2026
43fa427
Update apps/marketing/src/pages/index.astro
rafael-franca Aug 17, 2026
3964471
Update apps/web/src/components/settings/ProviderModelsSection.tsx
rafael-franca Aug 17, 2026
42265ec
Update apps/server/src/provider/Layers/DevinAdapter.ts
rafael-franca Aug 17, 2026
28b3e8d
Update apps/server/src/provider/Layers/DevinAdapter.ts
rafael-franca Aug 17, 2026
9fbb60d
Update apps/server/src/provider/Layers/DevinAdapter.ts
rafael-franca Aug 17, 2026
feb8162
fix(web, marketing): select field a11y and remove stray hero brace
rafael-franca Aug 17, 2026
2403425
Merge remote-tracking branch 'origin/rafaelfranca/add-devin-provider'
rafael-franca Aug 17, 2026
4902999
fix(server): restore ProviderAdapterProcessError in Devin startSession
rafael-franca Aug 17, 2026
a848be1
fix(web): add empty state and disable reorder while filtering models
rafael-franca Aug 17, 2026
c881862
Update DevinAdapter.ts
rafael-franca Aug 17, 2026
c6a638a
Merge branch 'rafaelfranca/add-devin-provider' of github.com:rafael-f…
rafael-franca Aug 17, 2026
cfdda8e
fix(web): show schema default in provider settings select
rafael-franca Aug 17, 2026
2785263
Merge remote-tracking branch 'origin/main' into rafaelfranca/add-devi…
rafael-franca Aug 17, 2026
b88c4a6
fix(server): handle Devin context compaction in usage tracking
rafael-franca Aug 17, 2026
5034747
fix(server): correct Devin usage delta and baseline accounting
rafael-franca Aug 17, 2026
70e2260
fix(server): remove thread lock around Devin notification handler
rafael-franca Aug 17, 2026
ba8e4f7
fix(web): only show model search empty state while filtering
rafael-franca Aug 18, 2026
f3d48b9
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 18, 2026
b46f941
fix(server): address Bugbot permission mode and multi-home usage find…
rafael-franca Aug 18, 2026
5e839fe
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 18, 2026
9c36282
Merge branch 'main' into rafaelfranca/add-devin-provider
rafael-franca Aug 19, 2026
4a808ef
fix(server): match underscored reasoning config option ids
rafael-franca Aug 19, 2026
b6f4d51
test(devin): expand the ACP integration harness
Noshkasss Aug 19, 2026
6e838d3
feat(contracts): expose complete Devin runtime settings
Noshkasss Aug 19, 2026
c8ed300
feat(devin): expose complete CLI runtime controls
Noshkasss Aug 19, 2026
15afe12
fix(devin): make ACP sessions reusable and model changes reliable
Noshkasss Aug 19, 2026
f5e3289
fix(devin): preserve commands and delayed output
Noshkasss Aug 19, 2026
f151cff
fix(devin): scan the effective CLI profiles
Noshkasss Aug 19, 2026
cd67d7d
test(web): cover complete Devin settings and usage
Noshkasss Aug 19, 2026
c507897
docs(devin): explain the complete CLI workflow
Noshkasss Aug 19, 2026
3306dca
test(devin): expand the ACP integration harness
Noshkasss Aug 19, 2026
1313b81
test(devin): verify all models preserve context
Noshkasss Aug 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

T3 Code is an "agent harness control surface". It enables control of the agents on your machine with a best-in-class mobile app ([iOS](https://apps.apple.com/us/app/t3-code-remote-claude-more/id6787819824), [Android](https://play.google.com/store/apps/details?id=com.t3tools.t3code)), [web app](https://app.t3.codes) and [Electron-based desktop app](https://t3.codes).

Works with your subscriptions on Claude Code, Codex, Cursor, Grok Build, and OpenCode. If they're set up on your computer, T3 Code can control them.
Works with your subscriptions on Claude Code, Codex, Cursor, Devin, Grok Build, and OpenCode. If they're set up on your computer, T3 Code can control them.

## "Wait, what are you selling me?"

Expand All @@ -13,11 +13,12 @@ We wanted something performant, remote-ready, and truly open. If we ever go the
## Installation

> [!WARNING]
> T3 Code currently supports Codex, Claude, Cursor, Grok Build and OpenCode. Install and authenticate at least one provider before use:
> T3 Code currently supports Codex, Claude, Cursor, Devin, Grok Build and OpenCode. Install and authenticate at least one provider before use:
>
> - Codex: install [Codex CLI](https://developers.openai.com/codex/cli) and run `codex login`
> - Claude: install [Claude Code](https://claude.com/product/claude-code) and run `claude auth login`
> - Cursor: install [Cursor CLI](https://cursor.com/cli) and run `agent login`
> - Devin: install the [Devin CLI](https://devin.ai) and follow the Devin CLI documentation to authenticate
> - Grok Build: install [Grok Build CLI](https://x.ai/cli) and run `grok login`
> - OpenCode: install [OpenCode](https://opencode.ai) and run `opencode auth login`

Expand Down Expand Up @@ -82,7 +83,7 @@ Full docs live in [docs/](./docs). There's no docs site yet.
- [Remote access from a phone or another machine](./docs/user/remote-access.md)
- [Keeping app and server in sync](./docs/user/updating.md)
- [Source control integrations](./docs/user/source-control.md)
- Multiple accounts: [Codex](./docs/user/providers-codex.md) · [Claude](./docs/user/providers-claude.md)
- Multiple accounts: [Codex](./docs/user/providers-codex.md) · [Claude](./docs/user/providers-claude.md) · [Devin](./docs/user/providers-devin.md)
- Linux: [run T3 Code as a background service](./docs/user/background-service.md)

Building from source? Start at [docs/internals/overview.md](./docs/internals/overview.md).
Expand Down
3 changes: 3 additions & 0 deletions apps/marketing/public/harnesses/devin.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 31 additions & 3 deletions apps/marketing/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ const mobileEndorsementRows = [
<span class="hero-float-mark hf-grok" title="Grok">
<img src="/harnesses/grok-dark.svg" alt="" />
</span>
<span class="hero-float-mark hf-devin" title="Devin">
<img src="/harnesses/devin.svg" alt="" />
</span>
</div>

<div class="container hero-inner">
Expand All @@ -49,7 +52,7 @@ const mobileEndorsementRows = [
</h1>

<p class="hero-sub">
Orchestrate Claude Code, Codex, OpenCode, Cursor, and Grok from one surface.
Orchestrate Claude Code, Codex, OpenCode, Cursor, Grok, and Devin from one surface.
Bring your own subscription. Fork the whole thing.
</p>

Expand Down Expand Up @@ -228,6 +231,13 @@ const mobileEndorsementRows = [
<div class="harness-tag">grok login</div>
</div>
</div>
<div class="harness">
<div class="harness-mark"><img src="/harnesses/devin.svg" alt="" /></div>
<div class="harness-meta">
<div class="harness-name">Devin</div>
<div class="harness-tag">devin auth login</div>
</div>
</div>
</div>

<div class="harness-footer">
Expand Down Expand Up @@ -661,6 +671,7 @@ const mobileEndorsementRows = [
.hero-float-mark.hf-opencode { background: radial-gradient(circle at 30% 25%, rgba(255, 255, 255, 0.06), rgba(20, 20, 24, 0.92) 65%); top: 30%; left: 5%; animation-delay: -5s; transform: rotate(4deg); }
.hero-float-mark.hf-cursor { background: radial-gradient(circle at 30% 25%, rgba(255, 255, 255, 0.08), rgba(20, 20, 24, 0.92) 65%); top: 30%; right: 5%; animation-delay: -7s; transform: rotate(-5deg); }
.hero-float-mark.hf-grok { background: radial-gradient(circle at 30% 25%, rgba(255, 255, 255, 0.08), rgba(20, 20, 24, 0.92) 65%); top: 52%; left: 6%; animation-delay: -1.2s; transform: rotate(3deg); }
.hero-float-mark.hf-devin { background: radial-gradient(circle at 30% 25%, rgba(255, 255, 255, 0.06), rgba(20, 20, 24, 0.92) 65%); top: 52%; right: 6%; animation-delay: -4s; transform: rotate(-3deg); }

@media (max-width: 1180px) {
.hero-float-mark { width: 76px; height: 76px; border-radius: 20px; }
Expand All @@ -670,6 +681,7 @@ const mobileEndorsementRows = [
.hero-float-mark.hf-opencode { top: 26%; left: 2%; }
.hero-float-mark.hf-cursor { top: 24%; right: 2%; }
.hero-float-mark.hf-grok { top: 48%; left: 2%; transform: rotate(3deg); }
.hero-float-mark.hf-devin { top: 48%; right: 2%; transform: rotate(-3deg); }
}

@media (max-width: 820px) {
Expand Down Expand Up @@ -731,6 +743,13 @@ const mobileEndorsementRows = [
transform: rotate(8deg);
}

.hero-float-mark.hf-devin {
top: 360px;
right: 4px;
left: auto;
transform: rotate(4deg);
}

.hero-float-mark.hf-cursor {
top: 474px;
right: 4px;
Expand All @@ -748,6 +767,14 @@ const mobileEndorsementRows = [
border-radius: 14px;
}

.hero-float-mark.hf-grok {
left: 0;
}

.hero-float-mark.hf-devin {
right: 0;
}

.hero-float-mark.hf-opencode,
.hero-float-mark.hf-cursor {
top: 580px;
Expand All @@ -765,6 +792,7 @@ const mobileEndorsementRows = [
}

.hero-float-mark.hf-grok img,
.hero-float-mark.hf-devin img,
.hero-float-mark.hf-opencode img,
.hero-float-mark.hf-cursor img {
width: 30px;
Expand Down Expand Up @@ -811,7 +839,7 @@ const mobileEndorsementRows = [

.harness-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-columns: repeat(6, 1fr);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium pages/index.astro:842

At viewports just above the 960px responsive breakpoint, six columns leave each .harness card only about 68px of content width, so tags such as devin auth login are clipped by the grid's overflow: hidden. Use fewer desktop columns or move the two-column breakpoint higher.

Suggested change
grid-template-columns: repeat(6, 1fr);
grid-template-columns: repeat(5, 1fr);
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/marketing/src/pages/index.astro around line 842:

At viewports just above the `960px` responsive breakpoint, six columns leave each `.harness` card only about `68px` of content width, so tags such as `devin auth login` are clipped by the grid's `overflow: hidden`. Use fewer desktop columns or move the two-column breakpoint higher.

gap: 0;
border: 1px solid var(--border);
border-radius: var(--radius);
Expand Down Expand Up @@ -1266,7 +1294,7 @@ const mobileEndorsementRows = [
.harness-grid { grid-template-columns: 1fr 1fr; }
.harness { border-right: 0; border-bottom: 1px solid var(--border); }
.harness:nth-child(odd) { border-right: 1px solid var(--border); }
.harness:nth-child(5):last-child {
.harness:nth-child(odd):last-child {
grid-column: 1 / -1;
border-right: 0;
}
Expand Down
4 changes: 3 additions & 1 deletion apps/mobile/src/features/usage/usageProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import { useAppearancePreferences } from "../settings/appearance/AppearancePrefe
* Series and table order. The chart stacks providers from the bottom in this
* order, so it also fixes which band sits on top of the bars.
*/
export const PROVIDER_ORDER: readonly UsageProviderKind[] = ["codex", "claude"];
export const PROVIDER_ORDER: readonly UsageProviderKind[] = ["codex", "claude", "devin"];

export const PROVIDER_LABEL: Record<UsageProviderKind, string> = {
claude: "Claude Code",
codex: "Codex",
devin: "Devin",
};

/**
Expand All @@ -21,5 +22,6 @@ export function useProviderColors(): Record<UsageProviderKind, string> {
return {
claude: "#d97757",
codex: scheme === "dark" ? "#e6e6e6" : "#3c3c43",
devin: "#8a63d2",
};
}
1 change: 1 addition & 0 deletions apps/mobile/src/lib/modelOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ function providerDisplayLabel(provider: {
if (provider.displayName) return provider.displayName;
if (provider.driver === "codex") return "Codex";
if (provider.driver === "claudeAgent") return "Claude";
if (provider.driver === "devin") return "Devin";
return provider.instanceId;
}

Expand Down
122 changes: 111 additions & 11 deletions apps/server/scripts/acp-mock-agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,14 @@ const emitAskQuestion = process.env.T3_ACP_EMIT_ASK_QUESTION === "1";
const emitXAiAskUserQuestion = process.env.T3_ACP_EMIT_XAI_ASK_USER_QUESTION === "1";
const emitXAiPromptCompleteThenHang = process.env.T3_ACP_EMIT_XAI_PROMPT_COMPLETE_THEN_HANG === "1";
const emitForeignSessionUpdates = process.env.T3_ACP_EMIT_FOREIGN_SESSION_UPDATES === "1";
const emitStartupCommands = process.env.T3_ACP_EMIT_STARTUP_COMMANDS === "1";
const hangPromptForever = process.env.T3_ACP_HANG_PROMPT_FOREVER === "1";
const hangFirstPromptForever = process.env.T3_ACP_HANG_FIRST_PROMPT_FOREVER === "1";
const emitLateUpdateAfterCancel = process.env.T3_ACP_EMIT_LATE_UPDATE_AFTER_CANCEL === "1";
const emitDelayedCompactCompletion = process.env.T3_ACP_EMIT_DELAYED_COMPACT_COMPLETION === "1";
const delayedCompactCompletionMs = Number(
process.env.T3_ACP_DELAYED_COMPACT_COMPLETION_MS ?? "1500",
);
const omitXAiPromptCompleteStopReason =
process.env.T3_ACP_OMIT_XAI_PROMPT_COMPLETE_STOP_REASON === "1";
const failLoadSession = process.env.T3_ACP_FAIL_LOAD_SESSION === "1";
Expand All @@ -36,10 +41,22 @@ const emitStaleXAiPromptCompleteBeforeSecondHang =
const emitOverlappingXAiPromptCompleteOutOfOrder =
process.env.T3_ACP_EMIT_OVERLAPPING_XAI_PROMPT_COMPLETE_OUT_OF_ORDER === "1";
const failPrompt = process.env.T3_ACP_FAIL_PROMPT === "1";
const requireAuthenticationForPrompt = process.env.T3_ACP_REQUIRE_AUTHENTICATION_FOR_PROMPT === "1";
const failSetConfigOption = process.env.T3_ACP_FAIL_SET_CONFIG_OPTION === "1";
const exitOnSetConfigOption = process.env.T3_ACP_EXIT_ON_SET_CONFIG_OPTION === "1";
const promptResponseText = process.env.T3_ACP_PROMPT_RESPONSE_TEXT;
const promptDelayMs = Number(process.env.T3_ACP_PROMPT_DELAY_MS ?? "0");
const advertisedAuthMethods = (() => {
const raw = process.env.T3_ACP_AUTH_METHODS;
if (!raw) {
return undefined;
}
try {
return JSON.parse(raw) as ReadonlyArray<AcpSchema.AuthMethod>;
} catch {
return undefined;
}
})();
const permissionOptionIds = {
allowOnce: process.env.T3_ACP_ALLOW_ONCE_OPTION_ID ?? "allow-once",
allowAlways: process.env.T3_ACP_ALLOW_ALWAYS_OPTION_ID ?? "allow-always",
Expand All @@ -54,6 +71,7 @@ let currentReasoning = "medium";
let currentContext = "272k";
let currentFast = false;
let promptCount = 0;
let authenticated = false;
let overlappingFirstPromptId: string | undefined;
const cancelledSessions = new Set<string>();

Expand All @@ -79,6 +97,19 @@ function writeJsonRpcNotification(method: string, params: unknown): void {
process.stdout.write(`${JSON.stringify({ jsonrpc: "2.0", method, params })}\n`);
}

function availableCommandsUpdate(targetSessionId: string): AcpSchema.SessionNotification {
return {
sessionId: targetSessionId,
update: {
sessionUpdate: "available_commands_update",
availableCommands: [
{ name: "compact", description: "Compact the conversation" },
{ name: "context", description: "Show context usage" },
],
},
};
}

process.once("SIGTERM", () => {
logExit("SIGTERM");
process.exit(0);
Expand Down Expand Up @@ -218,7 +249,10 @@ function configOptions(): ReadonlyArray<AcpSchema.SessionConfigOption> {
{ value: "default", name: "Auto" },
{ value: "composer-2", name: "Composer 2" },
{ value: "composer-2[fast=true]", name: "Composer 2 Fast" },
{ value: "gpt-5.3-codex[reasoning=medium,fast=false]", name: "Codex 5.3" },
{
value: "gpt-5.3-codex[reasoning=medium,fast=false]",
name: "Codex 5.3",
},
],
},
];
Expand Down Expand Up @@ -303,18 +337,29 @@ const program = Effect.gen(function* () {
return {
protocolVersion: 1,
agentCapabilities: { loadSession: true },
...(advertisedAuthMethods !== undefined ? { authMethods: advertisedAuthMethods } : {}),
};
}),
);

yield* agent.handleAuthenticate(() => Effect.succeed({}));
yield* agent.handleAuthenticate(() =>
Effect.sync(() => {
authenticated = true;
return {};
}),
);

yield* agent.handleCreateSession(() =>
Effect.succeed({
sessionId,
modes: modeState(),
models: modelState(),
configOptions: configOptions(),
Effect.gen(function* () {
if (emitStartupCommands) {
yield* agent.client.sessionUpdate(availableCommandsUpdate(sessionId));
}
return {
sessionId,
modes: modeState(),
models: modelState(),
configOptions: configOptions(),
};
}),
);

Expand Down Expand Up @@ -346,6 +391,9 @@ const program = Effect.gen(function* () {
if (failLoadSession) {
return yield* AcpError.AcpRequestError.internalError("Mock load session failure");
}
if (emitStartupCommands) {
yield* agent.client.sessionUpdate(availableCommandsUpdate(requestedSessionId));
}
if (hangLoadSessionAfterReplay || delayLoadSessionAfterReplay) {
emitLoadReplayNotifications(requestedSessionId);
yield* agent.client.sessionUpdate({
Expand Down Expand Up @@ -465,6 +513,44 @@ const program = Effect.gen(function* () {
return yield* AcpError.AcpRequestError.internalError("Mock prompt failure");
}

if (requireAuthenticationForPrompt && !authenticated) {
return yield* AcpError.AcpRequestError.internalError(
"Authentication failed: Please authenticate to continue. Run `/login` to log in.",
);
}

if (emitDelayedCompactCompletion) {
writeJsonRpcNotification("session/update", {
sessionId: requestedSessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: "Compacting context…" },
},
});
yield* Effect.gen(function* () {
yield* Effect.sleep(
`${Number.isFinite(delayedCompactCompletionMs) ? delayedCompactCompletionMs : 1500} millis`,
);
yield* Effect.sync(() => {
writeJsonRpcNotification("session/update", {
sessionId: requestedSessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: "Context comp" },
},
});
writeJsonRpcNotification("session/update", {
sessionId: requestedSessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: "acted" },
},
});
});
}).pipe(Effect.forkDetach);
return { stopReason: "end_turn" };
}

if (emitStaleXAiPromptCompleteBeforeSecondHang && promptCount === 1) {
return {
stopReason: "end_turn",
Expand Down Expand Up @@ -674,13 +760,21 @@ const program = Effect.gen(function* () {
],
},
options: [
{ optionId: permissionOptionIds.allowOnce, name: "Allow once", kind: "allow_once" },
{
optionId: permissionOptionIds.allowOnce,
name: "Allow once",
kind: "allow_once",
},
{
optionId: permissionOptionIds.allowAlways,
name: "Allow always",
kind: "allow_always",
},
{ optionId: permissionOptionIds.rejectOnce, name: "Reject", kind: "reject_once" },
{
optionId: permissionOptionIds.rejectOnce,
name: "Reject",
kind: "reject_once",
},
],
});

Expand Down Expand Up @@ -784,7 +878,10 @@ const program = Effect.gen(function* () {
question: "Which scope should Grok use?",
multiSelect: null,
options: [
{ label: "Workspace", description: "Use the current workspace" },
{
label: "Workspace",
description: "Use the current workspace",
},
{ label: "Session", description: "Only use this session" },
],
},
Expand Down Expand Up @@ -869,7 +966,10 @@ const program = Effect.gen(function* () {
sessionId: requestedSessionId,
update: {
sessionUpdate: "agent_message_chunk",
content: { type: "text", text: promptResponseText ?? "hello from mock" },
content: {
type: "text",
text: promptResponseText ?? "hello from mock",
},
},
});

Expand Down
Loading
Loading