返回 DeepSeek-Reasonix
session_display_pager_probe.go
根目录 / internal / agent / session_display_pager_probe.go
1 package agent
2
3 import (
4 "context"
5 "encoding/json"
6 "io"
7 "os"
8
9 "reasonix/internal/historywork"
10 )
11
12 // Native writers put identifying fields first. Legacy writers may reorder JSON
13 // fields, so a bounded-prefix miss falls back to a cancellable token walk, not
14 // a Decode of the entire event (which may contain all session messages).
15 func probeDisplayEventHeader(ctx context.Context, file *os.File) (int, string, bool, error) {
16 schema, kind, known := probeSessionEventHeader(&historywork.Reader{Context: ctx, Source: file})
17 if known || ctx.Err() != nil {
18 return schema, kind, known, ctx.Err()
19 }
20 if _, err := file.Seek(0, io.SeekStart); err != nil {
21 return 0, "", false, err
22 }
23 decoder := json.NewDecoder(&historywork.Reader{Context: ctx, Source: file})
24 token, err := decoder.Token()
25 if err != nil || token != json.Delim('{') {
26 return 0, "", false, ctx.Err()
27 }
28 haveSchema, haveType := false, false
29 for decoder.More() {
30 name, err := decoder.Token()
31 if err != nil {
32 return 0, "", false, ctx.Err()
33 }
34 switch name {
35 case "schema_version":
36 err = decoder.Decode(&schema)
37 haveSchema = err == nil
38 case "type":
39 err = decoder.Decode(&kind)
40 haveType = err == nil
41 default:
42 err = skipDisplayJSONValue(ctx, decoder)
43 }
44 if err != nil {
45 return 0, "", false, ctx.Err()
46 }
47 if haveSchema && haveType {
48 return schema, kind, true, nil
49 }
50 }
51 return 0, "", false, ctx.Err()
52 }
53
53 lines GO