1
00:00:00,340 --> 00:00:01,320
Morning, everyone.

2
00:00:02,060 --> 00:00:08,119
Before anything else, thanks to Jellypod
for helping make this daily show a reality.

3
00:00:08,920 --> 00:00:15,520
It's Thursday, October 15th, and today's
topic is how Codex now tells your terminal

4
00:00:15,700 --> 00:00:17,240
exactly what it's doing.

5
00:00:17,903 --> 00:00:23,583
On October 14th, commit dec5491, pull
request

6
00:00:24,143 --> 00:00:28,583
54114 from contributor cconger, landed on
main.

7
00:00:29,383 --> 00:00:34,363
It makes the Codex TUI speak Mitchell
Hashimoto's Program Status Protocol,

8
00:00:34,823 --> 00:00:36,863
which he published on October 6th.

9
00:00:37,483 --> 00:00:42,543
It's carried over OSC 7501, a terminal
escape sequence.

10
00:00:43,183 --> 00:00:49,383
It's in the 0.163.0 prerelease builds,
including alpha 11.

11
00:00:50,083 --> 00:00:55,743
The latest stable is still 0.162.1, so you
won't see it there yet.

12
00:00:56,482 --> 00:01:00,662
Let me set up why this matters, because
the before picture is where the pain is.

13
00:01:01,162 --> 00:01:06,702
Before this change, the TUI collapsed
completed turns and failed turns into the same

14
00:01:06,762 --> 00:01:07,982
generic idle state.

15
00:01:08,582 --> 00:01:10,862
When it was blocked on a prompt, it didn't
say why.

16
00:01:11,422 --> 00:01:15,482
And blocking detection depended on whether
you had terminal title changes enabled at

17
00:01:15,582 --> 00:01:15,762
all.

18
00:01:16,383 --> 00:01:20,903
If you run several sessions across tmux
panes, Zellij tabs,

19
00:01:21,063 --> 00:01:25,023
Ghostty windows, or an agent manager, you
know the workaround.

20
00:01:25,483 --> 00:01:29,843
Tools scrape the screen or watch the
window title, and they match patterns like

21
00:01:30,023 --> 00:01:33,043
spinner glyphs to guess whether an agent
is working.

22
00:01:33,603 --> 00:01:36,263
It's fragile, and it breaks when a glyph
changes.

23
00:01:36,762 --> 00:01:38,502
Here's what Codex emits now.

24
00:01:39,322 --> 00:01:46,022
The sequence is escape, right bracket,
7501, semicolon, then key

25
00:01:46,082 --> 00:01:49,902
value fields separated by colons, then a
string terminator.

26
00:01:50,802 --> 00:01:55,142
When a live turn finishes successfully, it
sends state equals done,

27
00:01:55,582 --> 00:01:57,602
colon, app equals codex.

28
00:01:58,322 --> 00:02:01,182
When a live turn fails, state equals
error.

29
00:02:01,902 --> 00:02:06,822
And when it's stuck waiting on you, it
sends state equals blocked with an extra

30
00:02:06,882 --> 00:02:07,922
field, kind.

31
00:02:08,712 --> 00:02:10,132
There are three kinds.

32
00:02:10,752 --> 00:02:16,112
Permission covers tool execution
approvals, filesystem grant prompts,

33
00:02:16,692 --> 00:02:21,392
apply_patch confirmations, MCP elicitation
approval actions,

34
00:02:22,032 --> 00:02:25,152
and app link install or enable requests.

35
00:02:26,212 --> 00:02:32,052
Question covers request_user_input, MCP
elicitation in form mode,

36
00:02:32,552 --> 00:02:37,152
and unanswered asynchronous questions once
the agent has stopped.

37
00:02:38,392 --> 00:02:44,492
Auth covers user verification overlays and
Gov MCP authentication prompts.

38
00:02:45,652 --> 00:02:51,212
Per the commit, this classification also
catches requests hidden behind another view

39
00:02:51,692 --> 00:02:56,892
or delayed while you're typing, and it no
longer depends on your title settings.

40
00:02:57,468 --> 00:03:00,088
The detail I'd focus on is latching.

41
00:03:00,528 --> 00:03:04,068
Done and error stay set until you
deliberately interact.

42
00:03:04,468 --> 00:03:08,508
That means any key press that isn't a key
release, a non empty paste,

43
00:03:08,968 --> 00:03:11,048
or a mouse click, drag, or scroll.

44
00:03:11,388 --> 00:03:12,808
Mouse movement does not count.

45
00:03:13,368 --> 00:03:17,008
The commit has a test for exactly this: it
completes or fails a turn,

46
00:03:17,368 --> 00:03:22,688
hovers the mouse, confirms the status is
unchanged, then clicks and confirms it

47
00:03:22,728 --> 00:03:23,468
drops to idle.

48
00:03:24,050 --> 00:03:28,230
Practically, that means a badge on a
background tab won't clear because your cursor

49
00:03:28,290 --> 00:03:29,370
happened to cross the window.

50
00:03:29,550 --> 00:03:32,270
It stays until you actually attend to that
pane.

51
00:03:33,167 --> 00:03:37,987
On how to use it: there's no flag, as far
as the change describes.

52
00:03:38,727 --> 00:03:45,487
It's on in the TUI on main and in 0.163.0

53
00:03:45,827 --> 00:03:47,127
alpha 11 and later.

54
00:03:48,067 --> 00:03:52,707
Terminals that don't recognize OSC 7501
ignore it.

55
00:03:53,367 --> 00:03:58,767
Terminals that do, like Ghostty through
libghostty, can consume it natively.

56
00:03:59,443 --> 00:04:01,983
If yours doesn't, you can read it
yourself.

57
00:04:02,843 --> 00:04:08,163
Match the stream with a pattern that
captures the state value after state equals,

58
00:04:08,683 --> 00:04:10,583
plus the optional kind field.

59
00:04:11,483 --> 00:04:12,623
Then wire it up.

60
00:04:13,643 --> 00:04:19,323
When state is blocked and kind is
permission, fire a desktop notification with

61
00:04:19,403 --> 00:04:23,583
notify send on Linux or osascript on
macOS.

62
00:04:24,643 --> 00:04:27,423
When state is done, flash the pane border.

63
00:04:28,523 --> 00:04:32,503
A blocked permission prompt is the one
worth interrupting yourself for,

64
00:04:32,983 --> 00:04:36,123
since the agent can't do anything until
you answer.

65
00:04:36,737 --> 00:04:38,977
Existing iTerm2 support is preserved.

66
00:04:39,357 --> 00:04:44,857
The OSC 21337 integration still works,
with done and error mapping to Idle,

67
00:04:45,157 --> 00:04:45,977
shown in green.

68
00:04:46,457 --> 00:04:48,617
Blocked maps to Waiting, in blue.

69
00:04:49,057 --> 00:04:50,197
Working is orange.

70
00:04:50,860 --> 00:04:55,080
Now the caveats, because they decide
whether your notifications are trustworthy.

71
00:04:55,820 --> 00:05:01,400
Replayed turns, from thread history or a
resumed session, are classified as idle,

72
00:05:01,740 --> 00:05:04,420
so you won't get a false done alert when
you resume.

73
00:05:05,120 --> 00:05:11,020
Interrupted turns, whether you hit Ctrl+C
or Escape, also go to idle rather than

74
00:05:11,120 --> 00:05:11,420
error.

75
00:05:11,860 --> 00:05:14,900
So error means a real failure, not you
cancelling.

76
00:05:15,648 --> 00:05:20,028
And pending follow up work and active
goals keep the state at working.

77
00:05:20,488 --> 00:05:24,268
In a multi turn goal, you won't get a done
between intermediate steps.

78
00:05:24,688 --> 00:05:26,408
Only the final result fires.

79
00:05:26,968 --> 00:05:31,828
One more thing: this is prerelease, so I'd
treat the exact field set as subject to

80
00:05:31,888 --> 00:05:33,408
change until it ships stable.

81
00:05:34,108 --> 00:05:36,448
A few smaller items from the last day.

82
00:05:37,188 --> 00:05:41,408
The biggest is a cleanup, and it connects
to our October 2nd episode.

83
00:05:42,308 --> 00:05:49,128
We told you to set features.worktrees
equals true in ~/.codex/config.toml

84
00:05:49,448 --> 00:05:51,348
to enable managed worktrees.

85
00:05:52,268 --> 00:05:57,748
Pull request 54175, merged October 15th,
retires that flag.

86
00:05:58,380 --> 00:06:04,760
Managed worktree creation and repository
aware session discovery no longer check any

87
00:06:04,900 --> 00:06:05,520
feature flag.

88
00:06:06,400 --> 00:06:09,440
They still require a trusted local
workspace.

89
00:06:10,260 --> 00:06:16,340
features.worktrees is now ignored, and so
is features.realtime_conversation.

90
00:06:17,400 --> 00:06:21,440
Voice availability in the TUI now follows
platform support.

91
00:06:22,420 --> 00:06:27,540
Leftover lines in your config won't break
anything, but Codex warns if managed

92
00:06:27,580 --> 00:06:32,100
requirements reference them, and both
flags are hidden from /experimental.

93
00:06:33,120 --> 00:06:34,380
You can delete those lines.

94
00:06:34,965 --> 00:06:40,325
Second, pull request 54216 adds image
previews in the fullscreen transcript.

95
00:06:40,925 --> 00:06:46,605
Local viewed images and generated image
artifacts render as bounded thumbnails using

96
00:06:46,685 --> 00:06:48,185
Kitty or Sixel graphics.

97
00:06:48,765 --> 00:06:52,565
Viewed images show when their activity is
expanded or in detailed presentation.

98
00:06:53,225 --> 00:06:56,005
Generated images appear next to their
saved path entry.

99
00:06:56,645 --> 00:07:01,085
Previews are removed when overlays open,
and image rows stay out of search and text

100
00:07:01,105 --> 00:07:01,545
selection.

101
00:07:02,245 --> 00:07:05,685
On remote workspaces, unsupported
terminals, missing files,

102
00:07:05,845 --> 00:07:08,605
or oversized images, you just get the text
entry.

103
00:07:09,237 --> 00:07:10,177
Two more fixes.

104
00:07:10,877 --> 00:07:17,077
Pull request 54169 reloads the model
catalog after you sign in or out,

105
00:07:17,657 --> 00:07:23,237
so the model list no longer holds stale
provider settings or needs a restart after

106
00:07:23,337 --> 00:07:25,357
managed provider requirements change.

107
00:07:25,957 --> 00:07:32,857
And pull request 54135 removes the 8 KiB
inbound request limit on direct

108
00:07:33,017 --> 00:07:34,517
exec server WebSockets.

109
00:07:34,997 --> 00:07:40,777
Previously, a larger fs/writeFile request
would disconnect the executor.

110
00:07:41,517 --> 00:07:43,757
Message and frame limits still apply.

111
00:07:44,382 --> 00:07:51,322
If you want something to try today,
install the 0.163.0 alpha 11 build and run a

112
00:07:51,442 --> 00:07:53,202
long task in a background tab.

113
00:07:53,662 --> 00:07:58,442
Then see whether your multiplexer or
terminal reacts to the blocked and done states.

114
00:07:58,862 --> 00:08:02,382
That's the quickest way to find out
whether you can drop your screen scraping

115
00:08:02,462 --> 00:08:02,862
scripts.

