@scotthuang/agent-knock-knock 0.12.37 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +3 -0
  3. package/dist/src/agent-session-provider.d.ts +5 -0
  4. package/dist/src/agent-session-provider.js +10 -1
  5. package/dist/src/agent-session-provider.js.map +1 -1
  6. package/dist/src/callback-outbox-service.d.ts +2 -0
  7. package/dist/src/callback-outbox-service.js +1 -1
  8. package/dist/src/callback-outbox-service.js.map +1 -1
  9. package/dist/src/callback-transport.d.ts +7 -0
  10. package/dist/src/callback-transport.js +1 -1
  11. package/dist/src/callback-transport.js.map +1 -1
  12. package/dist/src/cli-core.js +35 -32
  13. package/dist/src/cli-core.js.map +1 -1
  14. package/dist/src/codex-store-adapter.d.ts +1 -1
  15. package/dist/src/codex-store-adapter.js +35 -8
  16. package/dist/src/codex-store-adapter.js.map +1 -1
  17. package/dist/src/deferred-foreground-authority-cli-adapter.d.ts +20 -0
  18. package/dist/src/deferred-foreground-authority-cli-adapter.js +216 -8
  19. package/dist/src/deferred-foreground-authority-cli-adapter.js.map +1 -1
  20. package/dist/src/host-adapter.d.ts +1 -1
  21. package/dist/src/host-adapter.js +1 -1
  22. package/dist/src/host-bridge-tools.js +2 -2
  23. package/dist/src/managed-turn-recovery-service.d.ts +8 -1
  24. package/dist/src/managed-turn-recovery-service.js +55 -13
  25. package/dist/src/managed-turn-recovery-service.js.map +1 -1
  26. package/dist/src/mutation-transaction.d.ts +1 -0
  27. package/dist/src/mutation-transaction.js +19 -15
  28. package/dist/src/mutation-transaction.js.map +1 -1
  29. package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +39 -3
  30. package/dist/src/native-thread-lifecycle-cli-adapter.js +307 -7
  31. package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
  32. package/dist/src/openclaw-plugin-callback-adapter.js +17 -7
  33. package/dist/src/openclaw-plugin-callback-adapter.js.map +1 -1
  34. package/dist/src/openclaw-plugin-command-adapter.js +297 -83
  35. package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
  36. package/dist/src/openclaw-plugin-schemas.d.ts +57 -0
  37. package/dist/src/openclaw-plugin-schemas.js +59 -1
  38. package/dist/src/openclaw-plugin-schemas.js.map +1 -1
  39. package/dist/src/openclaw-private-authority-offers.d.ts +17 -0
  40. package/dist/src/openclaw-private-authority-offers.js +75 -3
  41. package/dist/src/openclaw-private-authority-offers.js.map +1 -1
  42. package/dist/src/store.d.ts +1 -1
  43. package/dist/src/store.js +6 -4
  44. package/dist/src/store.js.map +1 -1
  45. package/dist/src/terminal-acceptance-application-service.js +2 -2
  46. package/dist/src/terminal-acceptance-application-service.js.map +1 -1
  47. package/dist/src/terminal-acceptance-cli-adapter.d.ts +11 -1
  48. package/dist/src/terminal-acceptance-cli-adapter.js +290 -16
  49. package/dist/src/terminal-acceptance-cli-adapter.js.map +1 -1
  50. package/dist/src/terminal-action-projection.d.ts +1 -1
  51. package/dist/src/terminal-action-projection.js +6 -0
  52. package/dist/src/terminal-action-projection.js.map +1 -1
  53. package/dist/src/terminal-agent-adapter.d.ts +9 -0
  54. package/dist/src/terminal-agent-adapter.js.map +1 -1
  55. package/dist/src/terminal-agent-bridge.d.ts +52 -8
  56. package/dist/src/terminal-agent-bridge.js +111 -94
  57. package/dist/src/terminal-agent-bridge.js.map +1 -1
  58. package/dist/src/terminal-authority-policy.js +3 -0
  59. package/dist/src/terminal-authority-policy.js.map +1 -1
  60. package/dist/src/terminal-binding-authority.d.ts +2 -0
  61. package/dist/src/terminal-binding-authority.js +8 -0
  62. package/dist/src/terminal-binding-authority.js.map +1 -1
  63. package/dist/src/terminal-command-cli-adapter.d.ts +17 -1
  64. package/dist/src/terminal-command-cli-adapter.js +784 -286
  65. package/dist/src/terminal-command-cli-adapter.js.map +1 -1
  66. package/dist/src/terminal-delegate-cli-adapter.js +21 -7
  67. package/dist/src/terminal-delegate-cli-adapter.js.map +1 -1
  68. package/dist/src/terminal-dispatch-application.d.ts +3 -1
  69. package/dist/src/terminal-dispatch-application.js +13 -5
  70. package/dist/src/terminal-dispatch-application.js.map +1 -1
  71. package/dist/src/terminal-dispatch-composition.d.ts +43 -0
  72. package/dist/src/terminal-dispatch-execution.d.ts +2 -2
  73. package/dist/src/terminal-dispatch-execution.js +53 -3
  74. package/dist/src/terminal-dispatch-execution.js.map +1 -1
  75. package/dist/src/terminal-dispatch-policy.d.ts +20 -0
  76. package/dist/src/terminal-dispatch-policy.js +33 -1
  77. package/dist/src/terminal-dispatch-policy.js.map +1 -1
  78. package/dist/src/terminal-dispatch-presenter.d.ts +45 -0
  79. package/dist/src/terminal-dispatch-presenter.js +220 -18
  80. package/dist/src/terminal-dispatch-presenter.js.map +1 -1
  81. package/dist/src/terminal-dispatch-receipt.d.ts +5 -1
  82. package/dist/src/terminal-dispatch-receipt.js +26 -3
  83. package/dist/src/terminal-dispatch-receipt.js.map +1 -1
  84. package/dist/src/terminal-identity-authority-cli-adapter.js +103 -4
  85. package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -1
  86. package/dist/src/terminal-interaction-authority.d.ts +48 -1
  87. package/dist/src/terminal-interaction-authority.js +30 -0
  88. package/dist/src/terminal-interaction-authority.js.map +1 -1
  89. package/dist/src/terminal-interaction-cli-adapter.js +9 -0
  90. package/dist/src/terminal-interaction-cli-adapter.js.map +1 -1
  91. package/dist/src/terminal-interaction-core.d.ts +104 -0
  92. package/dist/src/terminal-interaction-core.js +407 -0
  93. package/dist/src/terminal-interaction-core.js.map +1 -0
  94. package/dist/src/terminal-interaction-protocol.d.ts +89 -0
  95. package/dist/src/terminal-interaction-protocol.js +199 -0
  96. package/dist/src/terminal-interaction-protocol.js.map +1 -1
  97. package/dist/src/terminal-list-cli-adapter.d.ts +5 -0
  98. package/dist/src/terminal-list-cli-adapter.js +190 -40
  99. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  100. package/dist/src/terminal-list-renderer.js +60 -7
  101. package/dist/src/terminal-list-renderer.js.map +1 -1
  102. package/dist/src/terminal-maintenance-cli-adapter.js +14 -3
  103. package/dist/src/terminal-maintenance-cli-adapter.js.map +1 -1
  104. package/dist/src/terminal-monitor-application-service.d.ts +1 -0
  105. package/dist/src/terminal-monitor-application-service.js +72 -10
  106. package/dist/src/terminal-monitor-application-service.js.map +1 -1
  107. package/dist/src/terminal-monitor-cli-adapter.d.ts +3 -0
  108. package/dist/src/terminal-monitor-cli-adapter.js +24 -8
  109. package/dist/src/terminal-monitor-cli-adapter.js.map +1 -1
  110. package/dist/src/terminal-monitor-state-cli-adapter.js +15 -2
  111. package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
  112. package/dist/src/terminal-mutation-cli-runtime.d.ts +11 -1
  113. package/dist/src/terminal-mutation-cli-runtime.js +9 -4
  114. package/dist/src/terminal-mutation-cli-runtime.js.map +1 -1
  115. package/dist/src/terminal-status-cli-adapter.d.ts +1 -7
  116. package/dist/src/terminal-status-cli-adapter.js +29 -3
  117. package/dist/src/terminal-status-cli-adapter.js.map +1 -1
  118. package/dist/src/terminal-status-facts.d.ts +17 -1
  119. package/dist/src/terminal-status-facts.js +59 -0
  120. package/dist/src/terminal-status-facts.js.map +1 -1
  121. package/dist/src/terminal-submission-acceptance.d.ts +37 -2
  122. package/dist/src/terminal-submission-acceptance.js +633 -30
  123. package/dist/src/terminal-submission-acceptance.js.map +1 -1
  124. package/dist/src/terminal-submission-facts.d.ts +5 -0
  125. package/dist/src/terminal-submission-facts.js.map +1 -1
  126. package/dist/src/terminal-watch-callback-cli-adapter.d.ts +2 -1
  127. package/dist/src/terminal-watch-callback-cli-adapter.js +2 -1
  128. package/dist/src/terminal-watch-callback-cli-adapter.js.map +1 -1
  129. package/dist/src/terminal-watch-cli-adapter.d.ts +6 -2
  130. package/dist/src/terminal-watch-cli-adapter.js +1051 -15
  131. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  132. package/dist/src/terminal-watch-service.d.ts +15 -1
  133. package/dist/src/terminal-watch-service.js +169 -13
  134. package/dist/src/terminal-watch-service.js.map +1 -1
  135. package/dist/src/terminal-watch-store.d.ts +72 -3
  136. package/dist/src/terminal-watch-store.js +407 -27
  137. package/dist/src/terminal-watch-store.js.map +1 -1
  138. package/docs/host-bridge-profiles.md +2 -2
  139. package/docs/quickstart-herdr.md +5 -3
  140. package/docs/quickstart-tmux.md +7 -5
  141. package/openclaw.plugin.json +8 -0
  142. package/package.json +1 -1
  143. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +15 -11
@@ -584,11 +584,13 @@ async function terminalControlledListEntry(session, activeSessions, options, bri
584
584
  terminalState,
585
585
  nativeIdentityObservation,
586
586
  nativeAgentIdentity,
587
+ nativeIdentityAuthorityObservation: authorityNativeIdentityObservation,
588
+ codexOpenRootRolloutInventory,
587
589
  nativeProcessUuid,
588
590
  nativeProcessBirth
589
591
  });
590
592
  const terminalStatusSnapshot = effectiveTerminalState._terminal_status_snapshot
591
- ? terminalBridgeStatusWithActivity(effectiveTerminalState._terminal_status_snapshot, effectiveTerminalState.activity_state, effectiveTerminalState.activity_reason)
593
+ ? terminalBridgeStatusWithProjection(effectiveTerminalState._terminal_status_snapshot, effectiveTerminalState)
592
594
  : undefined;
593
595
  const statusCardObservation = session.agent === "codex" &&
594
596
  typeof effectiveTerminalState.screen_excerpt === "string"
@@ -685,6 +687,21 @@ async function terminalControlledListEntry(session, activeSessions, options, bri
685
687
  error: error instanceof Error ? error.message : String(error)
686
688
  });
687
689
  }
690
+ const commands = terminalListCommands({
691
+ agent: session.agent,
692
+ terminalControl,
693
+ terminalState: effectiveTerminalState,
694
+ lifecycleCapability,
695
+ nativeInspectionCapability,
696
+ nativeAgentIdentity: authorityNativeAgentIdentity,
697
+ nativeProcessUuid,
698
+ nativeProcessBirth,
699
+ codexLifecycleIncarnationAvailable,
700
+ automatedInputComposerReady,
701
+ hasOrphanedDispatch: orphanedDispatch !== undefined,
702
+ terminalHasBlockingTurn,
703
+ terminalHasInteraction: terminalStatusSnapshot?.interaction_state !== undefined
704
+ });
688
705
  const entry = {
689
706
  id: bridge.terminalConversationId(session),
690
707
  short_ref: sessionShortRef(bridge.terminalConversationId(session)),
@@ -724,6 +741,11 @@ async function terminalControlledListEntry(session, activeSessions, options, bri
724
741
  approval_state: effectiveTerminalState.approval_state,
725
742
  activity_state: effectiveTerminalState.activity_state,
726
743
  activity_reason: effectiveTerminalState.activity_reason,
744
+ screen_state: effectiveTerminalState.screen_state,
745
+ screen_reason: effectiveTerminalState.screen_reason,
746
+ native_identity_state: effectiveTerminalState.native_identity_state,
747
+ durable_activity_state: effectiveTerminalState.durable_activity_state,
748
+ durable_activity_reason: effectiveTerminalState.durable_activity_reason,
727
749
  // Internal exact-observation evidence. The public projection strips this
728
750
  // object; raw terminal status reuses it so screen, approval, and activity
729
751
  // all describe the same capture.
@@ -768,20 +790,7 @@ async function terminalControlledListEntry(session, activeSessions, options, bri
768
790
  }
769
791
  }
770
792
  : {}),
771
- commands: terminalListCommands({
772
- agent: session.agent,
773
- terminalControl,
774
- terminalState: effectiveTerminalState,
775
- lifecycleCapability,
776
- nativeInspectionCapability,
777
- nativeAgentIdentity: authorityNativeAgentIdentity,
778
- nativeProcessUuid,
779
- nativeProcessBirth,
780
- codexLifecycleIncarnationAvailable,
781
- automatedInputComposerReady,
782
- hasOrphanedDispatch: orphanedDispatch !== undefined,
783
- terminalHasBlockingTurn
784
- })
793
+ commands
785
794
  };
786
795
  const renderedActions = renderAvailableListActions(entry);
787
796
  const terminalUserExplicitSendAuthority = decideTerminalUserExplicitSendAuthority({
@@ -817,17 +826,59 @@ async function terminalControlledListEntry(session, activeSessions, options, bri
817
826
  : {})
818
827
  }
819
828
  : undefined;
829
+ const foregroundIdentificationActions = terminalUserExplicitSendAuthority.eligible &&
830
+ commands.identify_foreground === true
831
+ ? {
832
+ identify_foreground: {
833
+ tool: "agent_knock_knock_identify_foreground",
834
+ arguments: {
835
+ terminal_id: entry.id,
836
+ expected_terminal_token: terminalUserExplicitSendAuthority.expectedTerminalToken
837
+ },
838
+ scope: "ephemeral_diagnostic_only",
839
+ grants_authority: false,
840
+ requires_user_intent: true
841
+ },
842
+ identify_and_send: {
843
+ tool: "agent_knock_knock_identify_and_send",
844
+ arguments: {
845
+ terminal_id: entry.id,
846
+ expected_terminal_token: terminalUserExplicitSendAuthority.expectedTerminalToken
847
+ },
848
+ missing_required: ["request"],
849
+ scope: "terminal_atomic_identify_and_send",
850
+ requires_user_intent: true
851
+ }
852
+ }
853
+ : {};
820
854
  const { commands: _commands, ...publicEntry } = entry;
821
855
  return {
822
856
  ...publicEntry,
823
857
  ...(terminalUserExplicitSendAction
824
858
  ? { _terminal_user_explicit_send_action: terminalUserExplicitSendAction }
825
859
  : {}),
826
- available_actions: renderedActions
860
+ available_actions: {
861
+ ...renderedActions,
862
+ ...foregroundIdentificationActions
863
+ }
827
864
  };
828
865
  }
829
866
  function terminalListCommands(input) {
830
- const { agent, terminalControl, terminalState, lifecycleCapability, nativeInspectionCapability, nativeAgentIdentity, nativeProcessUuid, nativeProcessBirth, codexLifecycleIncarnationAvailable, automatedInputComposerReady, hasOrphanedDispatch, terminalHasBlockingTurn } = input;
867
+ const { agent, terminalControl, terminalState, lifecycleCapability, nativeInspectionCapability, nativeAgentIdentity, nativeProcessUuid, nativeProcessBirth, codexLifecycleIncarnationAvailable, automatedInputComposerReady, hasOrphanedDispatch, terminalHasBlockingTurn, terminalHasInteraction } = input;
868
+ const foregroundIdentificationEligible = agent === "codex" &&
869
+ nativeInspectionCapability.status === "supported" &&
870
+ nativeInspectionCapability.statusInspection === true &&
871
+ terminalState.screen_state === "idle" &&
872
+ terminalState.native_identity_state !== "resolved" &&
873
+ terminalState.approval_state.scanned === true &&
874
+ terminalState.approval_state.blocked !== true &&
875
+ automatedInputComposerReady &&
876
+ codexLifecycleIncarnationAvailable &&
877
+ terminalControl.capabilities.includes("send_keys") &&
878
+ terminalControl.capabilities.includes("screen_status") &&
879
+ !terminalHasInteraction &&
880
+ !hasOrphanedDispatch &&
881
+ !terminalHasBlockingTurn;
831
882
  return {
832
883
  send: !terminalHasBlockingTurn,
833
884
  approve: terminalControl.capabilities.includes("terminal_approval") &&
@@ -854,31 +905,61 @@ function terminalListCommands(input) {
854
905
  nativeAgentIdentity.processUuid)) &&
855
906
  !hasOrphanedDispatch &&
856
907
  !terminalHasBlockingTurn,
908
+ identify_foreground: foregroundIdentificationEligible,
909
+ identify_and_send: foregroundIdentificationEligible,
857
910
  watch: terminalControl.capabilities.includes("screen_status") ||
858
911
  Boolean(nativeAgentIdentity?.sessionId &&
859
912
  (agent !== "codex" || nativeAgentIdentity.rollout))
860
913
  };
861
914
  }
862
915
  function effectiveTerminalListState(input) {
863
- const { session, terminalState, nativeIdentityObservation, nativeAgentIdentity, nativeProcessUuid, nativeProcessBirth } = input;
864
- if (session.agent !== "codex" ||
865
- terminalState.activity_state === "working" ||
866
- terminalState.activity_state === "awaiting_approval" ||
867
- terminalState.approval_state.blocked === true) {
868
- return terminalState;
916
+ const { session, terminalState, nativeIdentityObservation, nativeAgentIdentity, nativeIdentityAuthorityObservation, codexOpenRootRolloutInventory, nativeProcessUuid, nativeProcessBirth } = input;
917
+ const nativeIdentityState = terminalNativeIdentityState({
918
+ observation: nativeIdentityAuthorityObservation,
919
+ codexOpenRootRolloutInventory
920
+ });
921
+ if (session.agent !== "codex") {
922
+ return terminalListStateWithStatusAxes({
923
+ terminalState,
924
+ legacyState: terminalState,
925
+ nativeIdentityState,
926
+ durableActivityState: "unknown",
927
+ durableActivityReason: `durable activity evidence is unavailable for ${session.agent} terminals`
928
+ });
869
929
  }
930
+ const liveScreenStateWins = terminalState.activity_state === "working" ||
931
+ terminalState.activity_state === "awaiting_approval" ||
932
+ terminalState.approval_state.blocked === true;
870
933
  if (nativeIdentityObservation.status === "verified_absent") {
871
- return terminalState;
934
+ return terminalListStateWithStatusAxes({
935
+ terminalState,
936
+ legacyState: terminalState,
937
+ nativeIdentityState,
938
+ durableActivityState: "unknown",
939
+ durableActivityReason: "durable Codex activity is unknown because no open native rollout was observed"
940
+ });
872
941
  }
873
942
  if (nativeIdentityObservation.status !== "resolved" ||
874
943
  !nativeAgentIdentity?.rollout ||
875
944
  !nativeAgentIdentity.sessionId ||
876
945
  !nativeProcessUuid ||
877
946
  !nativeProcessBirth) {
878
- return terminalListStateWithUnavailableDurableActivity(terminalState, nativeIdentityObservation.status === "unavailable"
947
+ const reason = nativeIdentityObservation.status === "unavailable"
879
948
  ? nativeIdentityObservation.reason ??
880
949
  "exact Codex identity observation failed"
881
- : "exact Codex rollout/process identity is incomplete");
950
+ : nativeIdentityState === "ambiguous"
951
+ ? "the foreground Codex native identity is ambiguous"
952
+ : "exact Codex rollout/process identity is incomplete";
953
+ const legacyState = liveScreenStateWins
954
+ ? terminalState
955
+ : terminalListStateWithUnavailableDurableActivity(terminalState, reason);
956
+ return terminalListStateWithStatusAxes({
957
+ terminalState,
958
+ legacyState,
959
+ nativeIdentityState,
960
+ durableActivityState: "unknown",
961
+ durableActivityReason: `durable Codex activity evidence is unavailable: ${reason}`
962
+ });
882
963
  }
883
964
  const currentIdentity = {
884
965
  sessionId: nativeAgentIdentity.sessionId,
@@ -887,14 +968,31 @@ function effectiveTerminalListState(input) {
887
968
  rollout: nativeAgentIdentity.rollout
888
969
  };
889
970
  try {
890
- if (!captureCodexHumanStartedActiveTaskAnchor({ currentIdentity })) {
891
- return terminalState;
892
- }
893
- return {
894
- ...terminalState,
895
- activity_state: "working",
896
- activity_reason: "Codex rollout contains an exact unfinished human-started task"
897
- };
971
+ const activeTask = Boolean(captureCodexHumanStartedActiveTaskAnchor({ currentIdentity }));
972
+ const activeTaskReason = "Codex rollout contains an exact unfinished human-started task";
973
+ const durableActivityState = nativeIdentityState === "resolved"
974
+ ? activeTask ? "working" : "idle"
975
+ : "unknown";
976
+ const durableActivityReason = nativeIdentityState !== "resolved"
977
+ ? `durable Codex activity evidence is unavailable because the ` +
978
+ `foreground native identity is ${nativeIdentityState}`
979
+ : activeTask
980
+ ? activeTaskReason
981
+ : "exact Codex rollout contains no unfinished human-started task";
982
+ const legacyState = liveScreenStateWins || !activeTask
983
+ ? terminalState
984
+ : {
985
+ ...terminalState,
986
+ activity_state: "working",
987
+ activity_reason: activeTaskReason
988
+ };
989
+ return terminalListStateWithStatusAxes({
990
+ terminalState,
991
+ legacyState,
992
+ nativeIdentityState,
993
+ durableActivityState,
994
+ durableActivityReason
995
+ });
898
996
  }
899
997
  catch (error) {
900
998
  const reason = error instanceof Error ? error.message : String(error);
@@ -903,8 +1001,40 @@ function effectiveTerminalListState(input) {
903
1001
  pid: session.pid,
904
1002
  reason
905
1003
  });
906
- return terminalListStateWithUnavailableDurableActivity(terminalState, reason);
1004
+ const legacyState = liveScreenStateWins
1005
+ ? terminalState
1006
+ : terminalListStateWithUnavailableDurableActivity(terminalState, reason);
1007
+ return terminalListStateWithStatusAxes({
1008
+ terminalState,
1009
+ legacyState,
1010
+ nativeIdentityState,
1011
+ durableActivityState: "unknown",
1012
+ durableActivityReason: `durable Codex activity evidence is unavailable: ${reason}`
1013
+ });
1014
+ }
1015
+ }
1016
+ function terminalNativeIdentityState(input) {
1017
+ if (input.observation.status === "resolved") {
1018
+ return "resolved";
1019
+ }
1020
+ if (input.codexOpenRootRolloutInventory?.status === "unbound") {
1021
+ return "ambiguous";
1022
+ }
1023
+ if (input.observation.status === "verified_absent" ||
1024
+ input.codexOpenRootRolloutInventory?.status === "verified_absent") {
1025
+ return "verified_absent";
907
1026
  }
1027
+ return "unavailable";
1028
+ }
1029
+ function terminalListStateWithStatusAxes(input) {
1030
+ return {
1031
+ ...input.legacyState,
1032
+ screen_state: input.terminalState.screen_state,
1033
+ screen_reason: input.terminalState.screen_reason,
1034
+ native_identity_state: input.nativeIdentityState,
1035
+ durable_activity_state: input.durableActivityState,
1036
+ durable_activity_reason: input.durableActivityReason
1037
+ };
908
1038
  }
909
1039
  function terminalListStateWithUnavailableDurableActivity(terminalState, reason) {
910
1040
  return {
@@ -913,20 +1043,34 @@ function terminalListStateWithUnavailableDurableActivity(terminalState, reason)
913
1043
  activity_reason: `durable Codex activity evidence is unavailable: ${reason}`
914
1044
  };
915
1045
  }
916
- function terminalBridgeStatusWithActivity(status, activityState, activityReason) {
1046
+ function terminalBridgeStatusWithProjection(status, projection) {
917
1047
  const descriptors = Object.getOwnPropertyDescriptors(status);
918
1048
  descriptors.activity_state = {
919
1049
  configurable: true,
920
1050
  enumerable: true,
921
- value: activityState,
1051
+ value: projection.activity_state,
922
1052
  writable: true
923
1053
  };
924
1054
  descriptors.activity_reason = {
925
1055
  configurable: true,
926
1056
  enumerable: true,
927
- value: activityReason,
1057
+ value: projection.activity_reason,
928
1058
  writable: true
929
1059
  };
1060
+ for (const [field, value] of Object.entries({
1061
+ screen_state: projection.screen_state,
1062
+ screen_reason: projection.screen_reason,
1063
+ native_identity_state: projection.native_identity_state,
1064
+ durable_activity_state: projection.durable_activity_state,
1065
+ durable_activity_reason: projection.durable_activity_reason
1066
+ })) {
1067
+ descriptors[field] = {
1068
+ configurable: true,
1069
+ enumerable: true,
1070
+ value,
1071
+ writable: true
1072
+ };
1073
+ }
930
1074
  return Object.create(Object.getPrototypeOf(status), descriptors);
931
1075
  }
932
1076
  async function observeTerminalNativeListIdentity(session, terminalControl, options, bridge) {
@@ -2584,7 +2728,9 @@ async function listStateForTerminal(agent, terminalControl, options, bridge = te
2584
2728
  reason: "approval scan disabled"
2585
2729
  },
2586
2730
  activity_state: "unknown",
2587
- activity_reason: "terminal screen scan disabled"
2731
+ activity_reason: "terminal screen scan disabled",
2732
+ screen_state: "unknown",
2733
+ screen_reason: "terminal screen scan disabled"
2588
2734
  };
2589
2735
  }
2590
2736
  try {
@@ -2599,6 +2745,8 @@ async function listStateForTerminal(agent, terminalControl, options, bridge = te
2599
2745
  },
2600
2746
  activity_state: status.activity_state,
2601
2747
  activity_reason: status.activity_reason,
2748
+ screen_state: status.screen_state ?? status.activity_state,
2749
+ screen_reason: status.screen_reason ?? status.activity_reason,
2602
2750
  capability_limitation: status.capability_limitation,
2603
2751
  _terminal_status_snapshot: status,
2604
2752
  // Internal projection evidence; terminalControlledListEntry selects all
@@ -2615,7 +2763,9 @@ async function listStateForTerminal(agent, terminalControl, options, bridge = te
2615
2763
  error: error instanceof Error ? error.message : String(error)
2616
2764
  },
2617
2765
  activity_state: "unknown",
2618
- activity_reason: error instanceof Error ? error.message : String(error)
2766
+ activity_reason: error instanceof Error ? error.message : String(error),
2767
+ screen_state: "unknown",
2768
+ screen_reason: error instanceof Error ? error.message : String(error)
2619
2769
  };
2620
2770
  }
2621
2771
  }