Skip to content

Commit 508be74

Browse files
author
SqlRush
committed
Accept wrapped resize action payloads
1 parent 433e20a commit 508be74

5 files changed

Lines changed: 105 additions & 3 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,8 @@ M7 补充:prompt history `LogEntry` 读取现在接受 `sessionID`/`session`/`
588588

589589
本轮补充:interaction script action/type/kind/name/operation 动作判别字段现在接受 compact/camel fixture aliases,例如 `typeText``inputText``insertText``keyPress``pressKey``keySequence``pasteText``pastedText``clipboardText``setStatus``statusLine``terminalSize``screenSize`
590590

591+
本轮补充:interaction script 的 resize/terminalSize/screenSize action payload 现在递归解包 `value`/`payload`/`data`/`resource`/`attributes`/`properties`/`attrs`/`edge.node` 等 wrapper,JSON:API/GraphQL fixture 中的 columns/rows 可直接驱动 screen resize。
592+
591593
本轮补充:interaction script action/type/kind/name/operation 动作判别字段现在也接受 compact/camel event/media aliases,包括 `focusIn``focusOut``mouseEvent``pasteImage``imagePaste`
592594

593595
本轮补充:interaction script action/type/kind/name/operation 动作判别字段现在也能驱动 runtime/dialog mutation,支持 `requestPermission``taskStatus``showTasks``cancelTasks``removeTask``showDialog` 等动作,并从 `value`/`payload`/`data`/`body` 载荷解析 permission/task/dialog 对象、task/permission ID 或取消原因。

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ test/parity/ # golden tests against TS/official behavior
305305
- 本轮补充:interaction script 的 `keys` 字段支持 printable text chunk 和空格分隔 named-key sequence,例如 `ctrl-x ctrl-k`,减少官方脚本把连续输入拆成数组的改写成本。
306306
- 本轮补充:interaction script key input 接受 press-style aliases,包括 `press``keyPress``keypress``shortcutKey``presses``keyPresses``shortcuts`
307307
- 本轮补充:interaction script action/type/kind/name/operation 动作判别字段接受 compact/camel fixture aliases,包括 `typeText``inputText``insertText``keyPress``pressKey``keySequence``pasteText``pastedText``clipboardText``setStatus``statusLine``terminalSize``screenSize`
308+
- 本轮补充:interaction script resize/terminalSize/screenSize action payload 现在递归解包 `value`/`payload`/`data`/`resource`/`attributes`/`properties`/`attrs`/`edge.node` 等 wrapper,官方/API fixture 可把 columns/rows 放在 JSON:API 或 GraphQL envelope 内。
308309
- 本轮补充:interaction script action/type/kind/name/operation 动作判别字段继续接受 compact/camel event/media aliases,包括 `focusIn``focusOut``mouseEvent``pasteImage``imagePaste`
309310
- 本轮补充:interaction script action/type/kind/name/operation 动作判别字段也可驱动 runtime/dialog mutation,支持 `requestPermission``taskStatus``showTasks``cancelTasks``removeTask``showDialog` 等动作,并从 `value`/`payload`/`data`/`body` 载荷解析对象、ID 或取消原因。
310311
- 本轮补充:terminal CSI-u/kitty keyboard parser 接受 `codepoint:alternate``modifier:event-type` 冒号字段,按主 codepoint/modifier 解析 ctrl/alt/shift/rune 键,覆盖 kitty progressive keyboard protocol 的常见变体。

docs/first-second-parity-audit.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ M7 progress now includes:
359359
- `internal/contracts`/`internal/session`: content block decoding now accepts text aliases such as `body`/`message`/`value`/`output`/`contentText`/`content_text` and string `content` for `text`/`thinking` blocks, so transcript resume preserves these nested block variants.
360360
- `internal/tui`: interaction script steps now accept `action`/`type`/`kind`/`name`/`operation` discriminator aliases for common actions such as key press, key sequences, text input, paste, status updates, resize, mouse/image, and focus/blur.
361361
- `internal/tui`: interaction script action discriminators now accept compact/camel fixture names such as `typeText`, `inputText`, `insertText`, `keyPress`, `pressKey`, `keySequence`, `pasteText`, `pastedText`, `clipboardText`, `setStatus`, `statusLine`, `terminalSize`, and `screenSize`.
362+
- `internal/tui`: resize, terminal-size, and screen-size action payloads now recursively unwrap JSON:API/GraphQL-style wrappers such as `resource.attributes` and `edge.node.attrs`, preserving columns/rows from API-shaped interaction fixtures.
362363
- `internal/tui`: interaction script action discriminators now also accept compact event/media fixture names such as `focusIn`, `focusOut`, `mouseEvent`, `pasteImage`, and `imagePaste`.
363364
- `internal/tui`: interaction script action discriminators can now drive runtime/dialog mutations such as `requestPermission`, `taskStatus`, `showTasks`, `cancelTasks`, `removeTask`, and `showDialog`, using `value`/`payload`/`data`/`body` payloads for objects, IDs, and cancel reasons.
364365
- `internal/contracts`/`internal/session`: image content blocks now normalize source aliases such as `mediaType`/`mimeType`/`contentType` and `base64`/`payload`, including top-level image block fields, into canonical `ImageSource` values during transcript resume.

internal/tui/script_aliases.go

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,73 @@ func scriptSizeJSONField(fields map[string]json.RawMessage, names ...string) *sc
155155
if !ok {
156156
continue
157157
}
158-
var size scriptSize
159-
if err := json.Unmarshal(raw, &size); err == nil {
160-
return &size
158+
if size, ok := scriptSizeFromJSON(raw, 0); ok {
159+
return size
161160
}
162161
}
163162
return nil
164163
}
165164

165+
func scriptSizeFromJSON(raw json.RawMessage, depth int) (*scriptSize, bool) {
166+
raw = bytes.TrimSpace(raw)
167+
if len(raw) == 0 || bytes.Equal(raw, []byte("null")) {
168+
return nil, false
169+
}
170+
var size scriptSize
171+
if err := json.Unmarshal(raw, &size); err == nil && scriptSizeHasData(size) {
172+
return &size, true
173+
}
174+
if depth >= 8 {
175+
return nil, false
176+
}
177+
if raw[0] == '[' {
178+
var items []json.RawMessage
179+
if err := json.Unmarshal(raw, &items); err != nil {
180+
return nil, false
181+
}
182+
for _, item := range items {
183+
if size, ok := scriptSizeFromJSON(item, depth+1); ok {
184+
return size, true
185+
}
186+
}
187+
return nil, false
188+
}
189+
if raw[0] != '{' {
190+
return nil, false
191+
}
192+
fields := map[string]json.RawMessage{}
193+
if err := json.Unmarshal(raw, &fields); err != nil {
194+
return nil, false
195+
}
196+
for _, name := range scriptRuntimePayloadWrapperNames(
197+
"size",
198+
"dimensions",
199+
"resize",
200+
"resize_to",
201+
"resizeTo",
202+
"screen_size",
203+
"screenSize",
204+
"terminal_size",
205+
"terminalSize",
206+
"viewport",
207+
"screen",
208+
"terminal",
209+
) {
210+
nested, ok := fields[name]
211+
if !ok {
212+
continue
213+
}
214+
if size, ok := scriptSizeFromJSON(nested, depth+1); ok {
215+
return size, true
216+
}
217+
}
218+
return nil, false
219+
}
220+
221+
func scriptSizeHasData(size scriptSize) bool {
222+
return size.Width > 0 || size.Height > 0
223+
}
224+
166225
func scriptFocusKey(focused bool) string {
167226
if focused {
168227
return "focus-in"

internal/tui/tui_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5496,6 +5496,45 @@ func TestRunInteractionScriptAcceptsCompactActionDiscriminatorAliases(t *testing
54965496
}
54975497
}
54985498

5499+
func TestRunInteractionScriptAcceptsWrappedResizeActionPayloads(t *testing.T) {
5500+
steps, err := ParseInteractionScript([]byte(`[
5501+
{
5502+
"action": "resize",
5503+
"payload": {
5504+
"resource": {
5505+
"type": "terminal-size",
5506+
"attributes": {
5507+
"columns": "52",
5508+
"rows": "10"
5509+
}
5510+
}
5511+
},
5512+
"expectScreen": {"columns": 52, "rows": 10}
5513+
},
5514+
{
5515+
"operation": "terminalSize",
5516+
"payload": {
5517+
"edge": {
5518+
"node": {
5519+
"attrs": {
5520+
"terminalWidth": "54",
5521+
"terminalHeight": "11"
5522+
}
5523+
}
5524+
}
5525+
},
5526+
"expectScreen": {"columns": 54, "rows": 11}
5527+
}
5528+
]`))
5529+
if err != nil {
5530+
t.Fatal(err)
5531+
}
5532+
screen := NewREPLScreen(40, 8, nil)
5533+
if _, err := RunInteractionScriptChecked(&screen, steps); err != nil {
5534+
t.Fatal(err)
5535+
}
5536+
}
5537+
54995538
func TestRunInteractionScriptAcceptsCompactEventActionAliases(t *testing.T) {
55005539
steps, err := ParseInteractionScript([]byte(`[
55015540
{"action":"focusOut","expectEvent":{"type":"focus_out"},"expectFocused":false},

0 commit comments

Comments
 (0)