Skip to content
Open
Show file tree
Hide file tree
Changes from 64 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
a05830c
feat(experiments): add dynamic thinking effort experimental setting
easonliang28 Aug 21, 2026
1cf4f0d
test(experiments): cover explicit false and omitted dynamic thinking …
easonliang28 Aug 21, 2026
6ea45b3
feat(task): task-local thinking effort state, per-request override, a…
easonliang28 Aug 21, 2026
5db5cf4
Merge remote-tracking branch 'upstream/main' into feat/dte-1-experiment
easonliang28 Aug 21, 2026
9275aa1
Merge remote-tracking branch 'upstream/main' into feat/dte-2-task-state
easonliang28 Aug 22, 2026
14d1f35
fix(task): keep override restore value current across profile switches
easonliang28 Aug 22, 2026
90b47b0
docs(task): JSDoc for diff-touched functions flagged by CodeRabbit
easonliang28 Aug 22, 2026
cce1aea
Merge remote-tracking branch 'upstream/main' into feat/dte-5-orchestr…
easonliang28 Aug 22, 2026
d64a473
Merge remote-tracking branch 'upstream/main' into feat/dte-3-native-tool
easonliang28 Aug 22, 2026
2d53e91
Merge remote-tracking branch 'origin/feat/dte-1-experiment' into feat…
easonliang28 Aug 22, 2026
fcc3cf4
feat(task): set_thinking_effort native tool
easonliang28 Aug 23, 2026
0ab4a60
Merge remote-tracking branch 'upstream/main' into feat/dte-3-native-tool
easonliang28 Aug 23, 2026
146c5c8
feat(task): orchestrator new_task thinking_effort
easonliang28 Aug 23, 2026
f6410bb
Merge remote-tracking branch 'upstream/main' into feat/dte-5-orchestr…
easonliang28 Aug 23, 2026
19954d3
fix(task): harden set_thinking_effort per review feedback
easonliang28 Aug 23, 2026
6ad8d86
test(e2e): new_task thinking_effort pass-through (DTE addendum)
easonliang28 Aug 23, 2026
4eb13a9
fix(task): new_task thinking_effort review fixes (boolean capability,…
easonliang28 Aug 23, 2026
f6e1178
Merge branch 'feat/dte-5-orchestrator' into feat/dte-5-e2e
easonliang28 Aug 23, 2026
c3df095
feat(webview): thinking effort surfaces — header chip, composer toggl…
easonliang28 Aug 23, 2026
4a6ee69
fix(task): forward new_task thinking_effort through native tool-call …
easonliang28 Aug 23, 2026
d301642
Merge branch 'feat/dte-5-orchestrator' into feat/dte-5-e2e
easonliang28 Aug 23, 2026
7dde456
fix(webview): add accessible name to the icon-only thinking effort to…
easonliang28 Aug 23, 2026
b8d878f
test(e2e): assert negative new_task thinking_effort rejection at the …
easonliang28 Aug 23, 2026
018f165
fix(task): keep new_task delegation alive when the fallback effort sa…
easonliang28 Aug 23, 2026
630c49d
Merge branch 'feat/dte-5-orchestrator' into feat/dte-5-e2e
easonliang28 Aug 23, 2026
026bca7
test(task): document partial provider double and assert delegation me…
easonliang28 Aug 23, 2026
ada7c56
test(webview): cover the task-local thinking effort state push branch
easonliang28 Aug 23, 2026
3ea9f63
webview(chat): localize new_task thinking effort selector labels
easonliang28 Aug 23, 2026
4f88bce
test(e2e): allow the live Anthropic upstream in the effort proxy guard
easonliang28 Aug 23, 2026
471490b
Merge branch 'feat/dte-5-orchestrator' into feat/dte-5-e2e
easonliang28 Aug 23, 2026
96cf256
test(webview): assert the localized accessible name on the thinking e…
easonliang28 Aug 24, 2026
ac84f5e
test(webview): model the no-override thinking effort shape after the …
easonliang28 Aug 24, 2026
e83af72
test(e2e): set_thinking_effort mid-task workflow (DTE addendum)
easonliang28 Aug 24, 2026
3ae54d1
Merge branch 'feat/dte-4-webview-ui' into feat/dte-trial-all
easonliang28 Aug 24, 2026
5b33232
Merge branch 'feat/dte-5-orchestrator' into feat/dte-trial-all
easonliang28 Aug 24, 2026
ce0e90b
Merge branch 'feat/dte-5-e2e' into feat/dte-trial-all
easonliang28 Aug 24, 2026
f152b98
Merge branch 'feat/dte-3-e2e' into feat/dte-trial-all
easonliang28 Aug 24, 2026
784ee90
feat(webview): show thinking-effort toggle + chip without the experim…
easonliang28 Aug 24, 2026
42b423d
test(e2e): temporary DTE-DEBUG capture of request shapes (revert afte…
easonliang28 Aug 24, 2026
396a9b1
fix(tool): reject capability arrays with no settable effort
easonliang28 Aug 24, 2026
e502417
test(webview): type thinking-effort test helpers
easonliang28 Aug 24, 2026
27dea9b
feat(i18n): translate dynamic thinking effort setting (11 locales)
easonliang28 Aug 24, 2026
bbec2f9
fix(e2e): match post-tool DTE request by model + tool result
easonliang28 Aug 24, 2026
2a1a597
fix(e2e): keep DTE fixture file valid JSON
easonliang28 Aug 24, 2026
cfa6a64
Merge branch 'feat/dte-3-native-tool' into feat/dte-3-e2e
easonliang28 Aug 24, 2026
5f2e229
Merge branch 'feat/dte-3-native-tool' into feat/dte-trial-all (refresh)
easonliang28 Aug 24, 2026
efdc86b
Merge branch 'feat/dte-4-webview-ui' into feat/dte-trial-all (refresh…
easonliang28 Aug 24, 2026
1396736
feat(i18n): translate dynamic thinking effort setting (5 more locales)
easonliang28 Aug 24, 2026
9b6c8bc
fix(webview): include source in thinking-effort say-tool test type (t…
easonliang28 Aug 24, 2026
f309d3a
Merge branch 'feat/dte-3-native-tool' into feat/dte-3-e2e
easonliang28 Aug 24, 2026
f7057f0
test(webview): include source in thinking-effort say-tool test type
easonliang28 Aug 24, 2026
1270e7a
Merge branch 'feat/dte-3-native-tool' into feat/dte-3-e2e
easonliang28 Aug 24, 2026
e1f3429
feat(dte): let OpenAI-compatible profiles declare supported reasoning…
easonliang28 Aug 24, 2026
37c8040
test(e2e): set_thinking_effort switching workflow (DTE addendum)
easonliang28 Aug 24, 2026
d5d7f8a
Merge feat/dte-3-e2e: fixed DTE e2e fixture matching + switching suite
easonliang28 Aug 24, 2026
2983975
test(e2e): document DTE capture proxy + switching helper functions
easonliang28 Aug 24, 2026
549a85c
Merge feat/dte-3-e2e docstring commit
easonliang28 Aug 24, 2026
f756aab
test(e2e): settle expected display says before detaching listener (CI…
easonliang28 Aug 24, 2026
6d911e9
Merge feat/dte-3-e2e: display-say settle fix (CI event race)
easonliang28 Aug 24, 2026
2620a5f
docs(api): document provider getModel overrides touched by the F7 fil…
easonliang28 Aug 24, 2026
136d2b0
docs: document remaining DTE functions touched by the stacked diff
easonliang28 Aug 24, 2026
106a389
fix(dte): address CodeRabbit full-review findings on the stacked diff
easonliang28 Aug 24, 2026
a6c5ac1
fix(webview): surface DTE controls for OpenAI-compatible profiles
easonliang28 Aug 25, 2026
f11c19e
fix(webview): treat 'disable' effort selection as unchecking reasoning
easonliang28 Aug 25, 2026
86c40fb
feat(i18n): translate supported effort levels setting (17 locales)
easonliang28 Aug 25, 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
84 changes: 84 additions & 0 deletions apps/vscode-e2e/fixtures/thinking-effort-switching.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"fixtures": [
{
"match": {
"model": "openai/gpt-5.1",
"hasToolResult": false,
"turnIndex": 0
},
"response": {
"toolCalls": [
{
"name": "set_thinking_effort",
"arguments": "{\"effort\": \"medium\", \"reason\": \"start at medium\"}",
"id": "call_dte_sw_001"
}
]
}
},
{
"match": {
"model": "openai/gpt-5.1",
"hasToolResult": true,
"turnIndex": 1
},
"response": {
"toolCalls": [
{
"name": "set_thinking_effort",
"arguments": "{\"effort\": \"medium\", \"reason\": \"confirm current level\"}",
"id": "call_dte_sw_002"
}
]
}
},
{
"match": {
"model": "openai/gpt-5.1",
"hasToolResult": true,
"turnIndex": 2
},
"response": {
"toolCalls": [
{
"name": "set_thinking_effort",
"arguments": "{\"effort\": \"high\", \"reason\": \"raise to high\"}",
"id": "call_dte_sw_003"
}
]
}
},
{
"match": {
"model": "openai/gpt-5.1",
"hasToolResult": true,
"turnIndex": 3
},
"response": {
"toolCalls": [
{
"name": "set_thinking_effort",
"arguments": "{\"effort\": \"medium\", \"reason\": \"try returning to medium\"}",
"id": "call_dte_sw_004"
}
]
}
},
{
"match": {
"model": "openai/gpt-5.1",
"hasToolResult": true,
"turnIndex": 4
},
"response": {
"toolCalls": [
{
"name": "attempt_completion",
"arguments": "{\"result\": \"DTE_E2E_SWITCH_DONE\"}",
"id": "call_dte_sw_005"
}
]
}
}
]
}
35 changes: 35 additions & 0 deletions apps/vscode-e2e/fixtures/thinking-effort-tool.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"fixtures": [
{
"match": {
"sequenceIndex": 0,
"userMessage": "DTE_E2E_EFFORT_APPLY: answer the math question"
},
"response": {
"toolCalls": [
{
"name": "set_thinking_effort",
"arguments": "{\"effort\": \"high\", \"reason\": \"multi-step math\"}",
"id": "call_dte_e2e_001"
}
]
}
},
{
"match": {
"model": "openai/gpt-5",
"hasToolResult": true,
"turnIndex": 1
},
"response": {
"toolCalls": [
{
"name": "attempt_completion",
"arguments": "{\"result\": \"42\"}",
"id": "call_dte_e2e_002"
}
]
}
}
]
}
189 changes: 189 additions & 0 deletions apps/vscode-e2e/src/fixtures/subtasks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -627,3 +627,192 @@ export function addSubtaskFixtures(mock: InstanceType<typeof LLMock>) {
},
})
}

// ---------------------------------------------------------------------------
// DTE series 5/5 — new_task thinking_effort pass-through (e2e).
//
// Three scenarios with unique, stable markers (no timestamps, no environment
// details):
// - INHERIT: the parent's new_task call carries NO thinking_effort — the child
// starts with the parent's current effective effort (PR-2 resolution) and the
// child's real request must carry it.
// - EXPLICIT: the parent's new_task call carries thinking_effort "high" on a
// model with a capability array — validation passes and the child subtask
// runs to completion on the real host.
// - NEGATIVE: the parent's new_task call carries thinking_effort on a model
// without a capability array — the tool rejects before the approval ask, no
// child is created, and the error is visible to the model.
export const DTE_NT_INHERIT_PARENT_MARKER = "DTE_E2E_NT_INHERIT_PARENT"
export const DTE_NT_INHERIT_CHILD_MARKER = "DTE_E2E_NT_INHERIT_CHILD"
const DTE_NT_INHERIT_CHILD_PROMPT = `${DTE_NT_INHERIT_CHILD_MARKER}: Complete immediately with the exact result "DTE inherit child completed".`
export const DTE_NT_INHERIT_PARENT_PROMPT = `${DTE_NT_INHERIT_PARENT_MARKER}: Use the new_task tool exactly once. Create an ask-mode subtask with this exact message: "${DTE_NT_INHERIT_CHILD_PROMPT}" Do not answer directly. When the subtask returns, complete with the exact result "DTE inherit parent resumed".`
export const DTE_NT_INHERIT_CHILD_RESULT = "DTE inherit child completed"
export const DTE_NT_INHERIT_PARENT_RESULT = "DTE inherit parent resumed"

const DTE_NT_EXPLICIT_PARENT_MARKER = "DTE_E2E_NT_EXPLICIT_PARENT"
const DTE_NT_EXPLICIT_CHILD_MARKER = "DTE_E2E_NT_EXPLICIT_CHILD"
const DTE_NT_EXPLICIT_CHILD_PROMPT = `${DTE_NT_EXPLICIT_CHILD_MARKER}: Complete immediately with the exact result "DTE explicit child completed".`
export const DTE_NT_EXPLICIT_PARENT_PROMPT = `${DTE_NT_EXPLICIT_PARENT_MARKER}: Use the new_task tool exactly once. Create an ask-mode subtask with this exact message: "${DTE_NT_EXPLICIT_CHILD_PROMPT}" Do not answer directly. When the subtask returns, complete with the exact result "DTE explicit parent resumed".`
export const DTE_NT_EXPLICIT_CHILD_RESULT = "DTE explicit child completed"
export const DTE_NT_EXPLICIT_PARENT_RESULT = "DTE explicit parent resumed"

export const DTE_NT_NEGATIVE_PARENT_MARKER = "DTE_E2E_NT_NEGATIVE_PARENT"
const DTE_NT_NEGATIVE_CHILD_MARKER = "DTE_E2E_NT_NEGATIVE_CHILD"
const DTE_NT_NEGATIVE_CHILD_PROMPT = `${DTE_NT_NEGATIVE_CHILD_MARKER}: Complete immediately with the exact result "DTE negative child completed".`
export const DTE_NT_NEGATIVE_PARENT_PROMPT = `${DTE_NT_NEGATIVE_PARENT_MARKER}: Use the new_task tool exactly once, with thinking_effort set to "high". Create an ask-mode subtask with this exact message: "${DTE_NT_NEGATIVE_CHILD_PROMPT}" Do not answer directly. If the tool call is rejected, complete with the exact result "DTE negative parent completed".`
export const DTE_NT_NEGATIVE_PARENT_RESULT = "DTE negative parent completed"

export function addDteNewTaskEffortFixtures(mock: InstanceType<typeof LLMock>) {
// INHERIT: parent turn -> new_task without an explicit effort.
mock.addFixture({
match: {
userMessage: new RegExp(DTE_NT_INHERIT_PARENT_MARKER),
sequenceIndex: 0,
},
response: {
toolCalls: [
{
name: "new_task",
arguments: JSON.stringify({
mode: "ask",
message: DTE_NT_INHERIT_CHILD_PROMPT,
}),
id: "call_dte_nt_inherit_new_task_001",
},
],
},
})

// Child turn: the child prompt is embedded verbatim in the parent prompt, so the
// parent-marker exclusion keeps parent turns out of this fixture (same collision
// class as the fast-child fixture above).
mock.addFixture({
match: {
predicate: (req: ChatCompletionRequest) =>
lastUserMessageContains(req, DTE_NT_INHERIT_CHILD_MARKER) &&
!requestContains(req, [DTE_NT_INHERIT_PARENT_MARKER]),
},
response: {
toolCalls: [
{
name: "attempt_completion",
arguments: JSON.stringify({ result: DTE_NT_INHERIT_CHILD_RESULT }),
id: "call_dte_nt_inherit_child_completion_002",
},
],
},
})

// Parent resume turn: guarded on the child-result injection (not the child result
// text, which the parent prompt embeds verbatim).
mock.addFixture({
match: {
predicate: (req: ChatCompletionRequest) =>
requestContains(req, [DTE_NT_INHERIT_PARENT_MARKER, SUBTASK_RESULT_INJECTION]),
},
response: {
toolCalls: [
{
name: "attempt_completion",
arguments: JSON.stringify({ result: DTE_NT_INHERIT_PARENT_RESULT }),
id: "call_dte_nt_inherit_parent_completion_003",
},
],
},
})

// EXPLICIT: parent turn -> new_task with thinking_effort "high" (valid on models
// whose capability array accepts it, e.g. deepseek-v4-pro).
mock.addFixture({
match: {
userMessage: new RegExp(DTE_NT_EXPLICIT_PARENT_MARKER),
sequenceIndex: 0,
},
response: {
toolCalls: [
{
name: "new_task",
arguments: JSON.stringify({
mode: "ask",
message: DTE_NT_EXPLICIT_CHILD_PROMPT,
thinking_effort: "high",
}),
id: "call_dte_nt_explicit_new_task_001",
},
],
},
})

mock.addFixture({
match: {
predicate: (req: ChatCompletionRequest) =>
lastUserMessageContains(req, DTE_NT_EXPLICIT_CHILD_MARKER) &&
!requestContains(req, [DTE_NT_EXPLICIT_PARENT_MARKER]),
},
response: {
toolCalls: [
{
name: "attempt_completion",
arguments: JSON.stringify({ result: DTE_NT_EXPLICIT_CHILD_RESULT }),
id: "call_dte_nt_explicit_child_completion_002",
},
],
},
})

mock.addFixture({
match: {
predicate: (req: ChatCompletionRequest) =>
requestContains(req, [DTE_NT_EXPLICIT_PARENT_MARKER, SUBTASK_RESULT_INJECTION]),
},
response: {
toolCalls: [
{
name: "attempt_completion",
arguments: JSON.stringify({ result: DTE_NT_EXPLICIT_PARENT_RESULT }),
id: "call_dte_nt_explicit_parent_completion_003",
},
],
},
})

// NEGATIVE: parent turn -> new_task with thinking_effort "high" on a model without a
// capability array. The tool rejects before the approval ask, so the next parent
// turn is the error-recovery completion (matched on the tool-error text, which only
// appears in a request after the rejected call).
mock.addFixture({
match: {
userMessage: new RegExp(DTE_NT_NEGATIVE_PARENT_MARKER),
sequenceIndex: 0,
},
response: {
toolCalls: [
{
name: "new_task",
arguments: JSON.stringify({
mode: "ask",
message: DTE_NT_NEGATIVE_CHILD_PROMPT,
thinking_effort: "high",
}),
id: "call_dte_nt_negative_new_task_001",
},
],
},
})

mock.addFixture({
match: {
predicate: (req: ChatCompletionRequest) =>
requestContains(req, [DTE_NT_NEGATIVE_PARENT_MARKER, "Invalid thinking_effort"]),
},
response: {
toolCalls: [
{
name: "attempt_completion",
arguments: JSON.stringify({ result: DTE_NT_NEGATIVE_PARENT_RESULT }),
id: "call_dte_nt_negative_parent_completion_002",
},
],
},
})
}
3 changes: 2 additions & 1 deletion apps/vscode-e2e/src/runTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { addTerminalProfileResultFixtures } from "./fixtures/terminal-profile"
import { addListFilesResultFixtures } from "./fixtures/list-files"
import { addReadFileResultFixtures } from "./fixtures/read-file"
import { addSearchFilesResultFixtures } from "./fixtures/search-files"
import { addSubtaskFixtures } from "./fixtures/subtasks"
import { addDteNewTaskEffortFixtures, addSubtaskFixtures } from "./fixtures/subtasks"
import { addUseMcpToolResultFixtures } from "./fixtures/use-mcp-tool"
import { addWriteToFileResultFixtures } from "./fixtures/write-to-file"
import { createScenarioWorkspace, removeScenarioWorkspace } from "./restart/scenarioWorkspace"
Expand Down Expand Up @@ -140,6 +140,7 @@ async function main() {
addReadFileResultFixtures(mock)
addSearchFilesResultFixtures(mock)
addSubtaskFixtures(mock)
addDteNewTaskEffortFixtures(mock)
addUseMcpToolResultFixtures(mock)
addWriteToFileResultFixtures(mock)
addDeepSeekV4Fixtures(mock)
Expand Down
Loading
Loading