farming-code 2.2.14 → 2.2.16

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 (119) hide show
  1. package/README.md +1 -1
  2. package/README.zh_cn.md +1 -1
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/backend/acp/packaged-codex-acp.js +13 -0
  5. package/backend/acp-runtime.js +192 -14
  6. package/backend/agent-manager.js +176 -510
  7. package/backend/agent-runtime-binding.js +9 -55
  8. package/backend/chat-runtime.js +28 -0
  9. package/backend/codex-transcript.js +2 -1
  10. package/backend/config-manager.js +22 -14
  11. package/backend/control-api.js +3 -1
  12. package/backend/farming-app-cli.js +13 -0
  13. package/backend/farming-session-store.js +2 -1
  14. package/backend/npm-update-helper.js +65 -7
  15. package/backend/provider-adapters.js +6 -2
  16. package/backend/server.js +89 -104
  17. package/backend/storage-layout.js +0 -16
  18. package/backend/update-service.js +94 -5
  19. package/dist/acp/LICENSE.codex-acp +190 -0
  20. package/dist/acp/codex-acp-1.1.4.js +30718 -0
  21. package/dist/assets/App-y6p2yRar.js +206 -0
  22. package/dist/assets/{FileEditorMarkdownPreview-UlVd0O4D.js → FileEditorMarkdownPreview-R0jwwLME.js} +4 -4
  23. package/dist/assets/FileEditorPane-DNy3LAqS.js +2 -0
  24. package/dist/assets/{IconGlyphs-AU22gPDY.js → IconGlyphs-BsUfqpKN.js} +1 -1
  25. package/dist/assets/ProjectFilesSection-BhDEUVHA.js +12 -0
  26. package/dist/assets/{ReviewPage-CeDKDyZh.js → ReviewPage-ChtByBe3.js} +1 -1
  27. package/dist/assets/{abnfDiagram-VRR7QNED-BgawzDQT.js → abnfDiagram-VRR7QNED-nnglrXFi.js} +1 -1
  28. package/dist/assets/{architectureDiagram-ZJ3FMSHR-DUShwPg0.js → architectureDiagram-ZJ3FMSHR-BEXMaFfY.js} +1 -1
  29. package/dist/assets/{blockDiagram-677ZJIJ3-CeGZviXR.js → blockDiagram-677ZJIJ3-1mCezSBk.js} +1 -1
  30. package/dist/assets/{c4Diagram-LMCZKHZV-CLhYht6S.js → c4Diagram-LMCZKHZV-DhTiI6Uv.js} +1 -1
  31. package/dist/assets/channel-BVWNatUB.js +1 -0
  32. package/dist/assets/{chunk-32BRIVSS-LFYpT-Cu.js → chunk-32BRIVSS-CCdsKd73.js} +1 -1
  33. package/dist/assets/{chunk-52WLFC77-BH6jDw9J.js → chunk-52WLFC77-Gncjk4LF.js} +1 -1
  34. package/dist/assets/{chunk-C7G6YPKG-B_mIUlb7.js → chunk-C7G6YPKG-CiDVUP82.js} +1 -1
  35. package/dist/assets/{chunk-EX3LRPZG-C63hVuAJ.js → chunk-EX3LRPZG-z6gXP2_N.js} +1 -1
  36. package/dist/assets/{chunk-FWX5IMBZ-CboX-WF_.js → chunk-FWX5IMBZ-DMZBccQa.js} +2 -2
  37. package/dist/assets/{chunk-HOUHSVGY-BOgSd6Un.js → chunk-HOUHSVGY-D8tIeoPk.js} +1 -1
  38. package/dist/assets/{chunk-ICXQ74PX-C0K-pgZt.js → chunk-ICXQ74PX-b6oQ2Q17.js} +1 -1
  39. package/dist/assets/{chunk-MOJQB5TN-CVMfwN_7.js → chunk-MOJQB5TN-DAVH_p2a.js} +1 -1
  40. package/dist/assets/{chunk-OGEWGWER-DLT3pxyw.js → chunk-OGEWGWER-DxoiMCI-.js} +1 -1
  41. package/dist/assets/{chunk-PUDLZKDR-Cd079yIQ.js → chunk-PUDLZKDR-NsOWh7HM.js} +1 -1
  42. package/dist/assets/{chunk-Q4XR5HBZ-D0jHa6SO.js → chunk-Q4XR5HBZ-Di4H7L21.js} +1 -1
  43. package/dist/assets/{chunk-V7JOEXUC-CVDtR75H.js → chunk-V7JOEXUC-DttpZg9Y.js} +1 -1
  44. package/dist/assets/{chunk-VAUOI2AC-B-W2_9Ot.js → chunk-VAUOI2AC-UHNr_yhX.js} +1 -1
  45. package/dist/assets/{chunk-VR4S4FIN-FD3kWh32.js → chunk-VR4S4FIN-D-Fmtd4Z.js} +1 -1
  46. package/dist/assets/{chunk-WYO6CB5R-C2bGaS5r.js → chunk-WYO6CB5R-CUxMtfK2.js} +4 -4
  47. package/dist/assets/{chunk-ZGVPDNZ5-ymgts0zo.js → chunk-ZGVPDNZ5-CoV2QEl0.js} +1 -1
  48. package/dist/assets/classDiagram-OUVF2IWQ-Db0ib5iE.js +1 -0
  49. package/dist/assets/classDiagram-v2-EOCWNBFH-Bkf69XF9.js +1 -0
  50. package/dist/assets/code-dark-DKBGxoPX.css +1 -0
  51. package/dist/assets/{cynefinDiagram-TSTJHNR4-CwpobXIl.js → cynefinDiagram-TSTJHNR4-0xPI92Lg.js} +1 -1
  52. package/dist/assets/{dagre-VKFMJZFB-Dkhlfjna.js → dagre-VKFMJZFB-DfuMG4gU.js} +1 -1
  53. package/dist/assets/{diagram-FQU43EPY-hA8dicp6.js → diagram-FQU43EPY-CT00bLZ6.js} +1 -1
  54. package/dist/assets/{diagram-G47NLZAW-BTY6JTzO.js → diagram-G47NLZAW-Xbh7zXUx.js} +1 -1
  55. package/dist/assets/{diagram-NH7WQ7WH-xkaHHX9M.js → diagram-NH7WQ7WH-SRDVPfn7.js} +1 -1
  56. package/dist/assets/{diagram-OA4YK3LP-gk_fg9UU.js → diagram-OA4YK3LP-CQRli4Np.js} +1 -1
  57. package/dist/assets/{diagram-WEI45ONY-BvC8xd6T.js → diagram-WEI45ONY-DMf17WQi.js} +1 -1
  58. package/dist/assets/{ebnfDiagram-CCIWWBDH-CR7RaNat.js → ebnfDiagram-CCIWWBDH-DhpFkgJ5.js} +1 -1
  59. package/dist/assets/{erDiagram-Q63AITRT-_M-JFPbj.js → erDiagram-Q63AITRT-1IwxWmJo.js} +1 -1
  60. package/dist/assets/file-icons-DpbrD5ZP.js +1 -0
  61. package/dist/assets/flowDiagram-23GEKE2U-DYFo2xmB.js +1 -0
  62. package/dist/assets/{ganttDiagram-NO4QXBWP-Bl8P1yf_.js → ganttDiagram-NO4QXBWP-BNCdfyr1.js} +1 -1
  63. package/dist/assets/{gitGraphDiagram-IHSO6WYX-DoHa5ysz.js → gitGraphDiagram-IHSO6WYX-pbyWZuiX.js} +1 -1
  64. package/dist/assets/{index-BA-iH2Kg.js → index-iKBvPjWS.js} +2 -2
  65. package/dist/assets/{infoDiagram-FWYZ7A6U-DSFcSuUs.js → infoDiagram-FWYZ7A6U-BcTOgDbe.js} +1 -1
  66. package/dist/assets/{ishikawaDiagram-FXEZZL3T-DdkqullI.js → ishikawaDiagram-FXEZZL3T-DCdvGKrn.js} +1 -1
  67. package/dist/assets/{journeyDiagram-5HDEW3XC-B4hRnQJr.js → journeyDiagram-5HDEW3XC-BZ-1q_IT.js} +1 -1
  68. package/dist/assets/{kanban-definition-HUTT4EX6-tm2FZB2E.js → kanban-definition-HUTT4EX6-BIgejCjj.js} +1 -1
  69. package/dist/assets/{line-CmsjK4kn.js → line-CfptFMmX.js} +1 -1
  70. package/dist/assets/main-CdkLOXYl.css +1 -0
  71. package/dist/assets/{mermaid.core-C7UT_EEL.js → mermaid.core-gSpX30pV.js} +3 -3
  72. package/dist/assets/{mindmap-definition-LN4V7U3C-DplfjGms.js → mindmap-definition-LN4V7U3C-BKBaI4LW.js} +1 -1
  73. package/dist/assets/{pegDiagram-2B236MQR-lu3SdkQs.js → pegDiagram-2B236MQR-sBvDY3VX.js} +1 -1
  74. package/dist/assets/{pieDiagram-ENE6RG2P-3fHbmDf9.js → pieDiagram-ENE6RG2P-DWlWcu08.js} +1 -1
  75. package/dist/assets/{quadrantDiagram-ABIIQ3AL-a5qoWz-X.js → quadrantDiagram-ABIIQ3AL-DZutUd3J.js} +1 -1
  76. package/dist/assets/{railroadDiagram-RFXS5EU6-D2TOuXW9.js → railroadDiagram-RFXS5EU6-DQb3lXGM.js} +1 -1
  77. package/dist/assets/{requirementDiagram-TGXJPOKE-LQBWpUvd.js → requirementDiagram-TGXJPOKE-DqFGXu2e.js} +1 -1
  78. package/dist/assets/{sankeyDiagram-HTMAVEWB-B1ohYoyK.js → sankeyDiagram-HTMAVEWB-d7ECahnO.js} +1 -1
  79. package/dist/assets/{sequenceDiagram-DBY2YBRQ-C3vM-hMq.js → sequenceDiagram-DBY2YBRQ-DdsbKqct.js} +1 -1
  80. package/dist/assets/{stateDiagram-2N3HPSRC-BvFhOryI.js → stateDiagram-2N3HPSRC-P6iSrgwR.js} +1 -1
  81. package/dist/assets/stateDiagram-v2-6OUMAXLB-DIYSf_qh.js +1 -0
  82. package/dist/assets/{swimlanes-5IMT3BWC-DKF_b-2s.js → swimlanes-5IMT3BWC-BGnZJx1M.js} +1 -1
  83. package/dist/assets/swimlanesDiagram-G3AALYLV-BIkrlKrZ.js +8 -0
  84. package/dist/assets/{timeline-definition-FHXFAJF6-vAs11ux_.js → timeline-definition-FHXFAJF6-rA-r3aUR.js} +1 -1
  85. package/dist/assets/{vennDiagram-L72KCM5P-BybTX_9B.js → vennDiagram-L72KCM5P-DiVKUjA9.js} +1 -1
  86. package/dist/assets/{wardleyDiagram-EHGQE667-CicUmMBR.js → wardleyDiagram-EHGQE667-Cfxh7UOn.js} +1 -1
  87. package/dist/assets/workspace-editor-model-D0Im34S5.js +1 -0
  88. package/dist/assets/{workspace-editor-monaco-BICJESG0.js → workspace-editor-monaco-BIpqcWf1.js} +1 -1
  89. package/dist/assets/workspace-editor-monaco-DLlws5Ig.js +1 -0
  90. package/dist/assets/{workspace-view-state-DvYG_9PH.js → workspace-view-state-BpPINu84.js} +1 -1
  91. package/dist/assets/{xychartDiagram-FW5EYKEG-BhWDyCX-.js → xychartDiagram-FW5EYKEG--hmryQeL.js} +1 -1
  92. package/dist/crt-mermaid-renderer.js +313 -313
  93. package/dist/index.html +1 -1
  94. package/frontend/session-bridge.js +24 -2
  95. package/frontend/skins/crt/app.js +194 -82
  96. package/frontend/skins/crt/index.html +2 -11
  97. package/frontend/skins/crt/styles/effects.css +2 -34
  98. package/package.json +23 -9
  99. package/shared/browser-protocol.js +3 -3
  100. package/backend/app-server-api.js +0 -917
  101. package/backend/codex-app-server-home.js +0 -39
  102. package/backend/codex-app-server-runtime.js +0 -901
  103. package/dist/assets/App-Bumi772v.js +0 -206
  104. package/dist/assets/FileEditorPane-Dxx4rKOg.js +0 -2
  105. package/dist/assets/ProjectFilesSection-DE7Nb9Jk.js +0 -12
  106. package/dist/assets/channel-Uw90AO0b.js +0 -1
  107. package/dist/assets/classDiagram-OUVF2IWQ-DKW_dtku.js +0 -1
  108. package/dist/assets/classDiagram-v2-EOCWNBFH-C8Fi7-yv.js +0 -1
  109. package/dist/assets/code-dark-DPiuyeSp.css +0 -1
  110. package/dist/assets/code-mobile-3C2Rr-CN.css +0 -1
  111. package/dist/assets/file-icons-Bw2qd5iT.js +0 -1
  112. package/dist/assets/flowDiagram-23GEKE2U-DAiS5Y7G.js +0 -1
  113. package/dist/assets/main-Bqtb5kuz.css +0 -1
  114. package/dist/assets/stateDiagram-v2-6OUMAXLB-WMrz4PNo.js +0 -1
  115. package/dist/assets/swimlanesDiagram-G3AALYLV-BGswC9oC.js +0 -8
  116. package/dist/assets/workspace-editor-model-BQol4qbA.js +0 -1
  117. package/dist/assets/workspace-editor-monaco-DRJ7IaXk.js +0 -1
  118. package/scripts/sync-ghostty-vendor.js +0 -66
  119. /package/dist/assets/{core-D0LFJkDt.js → core-B9MwRjDE.js} +0 -0
@@ -86,8 +86,7 @@
86
86
  }
87
87
 
88
88
  #farming-crt.no-crt .crt-phosphor-noise,
89
- #farming-crt.no-crt .crt-scan-beam,
90
- #farming-crt.no-crt .agent-output-afterimage {
89
+ #farming-crt.no-crt .crt-scan-beam {
91
90
  display: none;
92
91
  }
93
92
 
@@ -112,15 +111,6 @@
112
111
  }
113
112
  }
114
113
 
115
- #farming-crt .agent-output-afterimage {
116
- pointer-events: none;
117
- user-select: none;
118
- opacity: 0.34;
119
- filter: blur(0.35px);
120
- mix-blend-mode: screen;
121
- animation: crt-content-afterimage 620ms cubic-bezier(0.16, 0.72, 0.28, 1) forwards;
122
- }
123
-
124
114
  #farming-crt .xterm-screen {
125
115
  position: relative;
126
116
  }
@@ -150,30 +140,8 @@
150
140
  color: #b98282;
151
141
  }
152
142
 
153
- #farming-crt .agent-output-afterimage {
154
- position: absolute;
155
- inset: 0;
156
- z-index: 2;
157
- }
158
-
159
- @keyframes crt-content-afterimage {
160
- 0% {
161
- opacity: 0.34;
162
- filter: blur(0.25px) brightness(1.08);
163
- }
164
- 45% {
165
- opacity: 0.13;
166
- filter: blur(0.65px) brightness(0.94);
167
- }
168
- 100% {
169
- opacity: 0;
170
- filter: blur(1.2px) brightness(0.72);
171
- }
172
- }
173
-
174
143
  @media (prefers-reduced-motion: reduce) {
175
- #farming-crt .crt-scan-beam,
176
- #farming-crt .agent-output-afterimage {
144
+ #farming-crt .crt-scan-beam {
177
145
  display: none;
178
146
  }
179
147
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "farming-code",
3
- "version": "2.2.14",
3
+ "version": "2.2.16",
4
4
  "description": "Remote browser workspace for supervising AI coding agents",
5
5
  "main": "backend/server.js",
6
6
  "bin": {
@@ -19,7 +19,6 @@
19
19
  "frontend/themes/",
20
20
  "frontend/vendor/ghostty-web/",
21
21
  "shared/",
22
- "scripts/sync-ghostty-vendor.js",
23
22
  "LICENSE",
24
23
  "README.md",
25
24
  "README.zh_cn.md",
@@ -29,18 +28,20 @@
29
28
  ],
30
29
  "scripts": {
31
30
  "sync:ghostty-vendor": "node scripts/sync-ghostty-vendor.js",
32
- "postinstall": "node scripts/sync-ghostty-vendor.js",
31
+ "prepare:acp-vendor": "node scripts/prepare-codex-acp-vendor.js --copy",
32
+ "prebuild": "node scripts/sync-ghostty-vendor.js && node scripts/prepare-codex-acp-vendor.js",
33
33
  "prepack": "FARMING_BASE_PATH=/farming npm run build",
34
+ "pretest": "npm run prepare:acp-vendor",
34
35
  "start": "npm run build && node backend/server.js",
35
36
  "start:net": "node backend/farming-net-server.js",
36
37
  "start:no-auth": "FARMING_DISABLE_AUTH=1 npm start",
37
- "predev:backend": "npm run build:crt-markdown",
38
+ "predev:backend": "npm run prepare:acp-vendor && npm run build:crt-markdown",
38
39
  "dev:backend": "node backend/server.js",
39
40
  "dev:frontend": "vite",
40
- "predev": "npm run build:crt-markdown",
41
+ "predev": "npm run prepare:acp-vendor && npm run build:crt-markdown",
41
42
  "dev": "node backend/server.js & vite --open & wait",
42
43
  "build:crt-markdown": "node -e \"require('fs').rmSync('dist/crt-markdown-assets',{recursive:true,force:true})\" && esbuild src/crt-markdown-renderer.tsx --bundle --outdir=dist --entry-names=crt-markdown-renderer --asset-names=crt-markdown-assets/[name]-[hash] --platform=browser --format=iife --target=es2022 --loader:.woff=file --loader:.woff2=file --loader:.ttf=file --minify && esbuild src/crt-mermaid-runtime.ts --bundle --outfile=dist/crt-mermaid-renderer.js --platform=browser --format=iife --target=es2022 --minify",
43
- "build": "vite build && npm run build:crt-markdown",
44
+ "build": "vite build && npm run build:crt-markdown && npm run prepare:acp-vendor",
44
45
  "deploy:remote": "./scripts/deploy.sh up",
45
46
  "deploy:remote:no-auth": "./scripts/deploy.sh up --disable-auth",
46
47
  "release:cli": "./scripts/package-cli-release.sh",
@@ -55,7 +56,6 @@
55
56
  "release:remote:linux-compat": "./scripts/install-remote-linux-compat-release.sh",
56
57
  "docs:product:screenshots": "node scripts/capture-product-screenshots.js",
57
58
  "test": "node scripts/run-tests.js",
58
- "test:codex-app-server:real": "FARMING_REAL_CODEX_APP_SERVER_SMOKE=1 node scripts/smoke-codex-app-server.js",
59
59
  "test:pre-release:codex-ui": "FARMING_REAL_CODEX_BIN=\"$(command -v codex)\" FARMING_CODEX_BIN=\"$PWD/tests/e2e/fixtures/real-codex-no-update\" FARMING_REAL_CODEX_RELEASE_CASE=1 FARMING_E2E_REAL_CODEX=1 FARMING_PLAYWRIGHT_INTERNAL=1 playwright test tests/e2e/internal/real-codex-release-case.spec.ts --project=chromium --workers=1 --retries=0 --trace=retain-on-failure",
60
60
  "test:pre-release:terminal-input": "playwright test tests/e2e/terminal-input-performance.spec.ts --project=chromium --workers=1 --retries=0 --trace=retain-on-failure",
61
61
  "test:performance:audit": "node tests/performance/agent-usage-hotpath.js && FARMING_PLAYWRIGHT_INTERNAL=1 playwright test tests/e2e/internal/performance-bottlenecks.spec.ts --project=chromium --workers=1 --retries=0 --trace=retain-on-failure",
@@ -68,6 +68,7 @@
68
68
  "test:e2e:local": "FARMING_BASE_PATH=/farming npm run build && node scripts/e2e.js local",
69
69
  "test:e2e:remote": "FARMING_BASE_PATH=/farming npm run build && node scripts/e2e.js remote",
70
70
  "test:remote-terminal:smoke": "node scripts/smoke-remote-terminal.js",
71
+ "test:remote-terminal:chaos": "node scripts/smoke-remote-terminal-chaos.js",
71
72
  "test:e2e:workspaces:local": "FARMING_BASE_PATH=/farming npm run build && node scripts/e2e-workspaces.js local",
72
73
  "test:e2e:workspaces:remote": "FARMING_BASE_PATH=/farming npm run build && node scripts/e2e-workspaces.js remote",
73
74
  "typecheck": "tsc --noEmit",
@@ -112,7 +113,7 @@
112
113
  "ansi-to-html": "^0.7.2",
113
114
  "chokidar": "^5.0.0",
114
115
  "diff": "^9.0.0",
115
- "express": "^4.18.2",
116
+ "express": "^4.22.2",
116
117
  "ghostty-web": "^0.4.0",
117
118
  "highlight.js": "^11.11.1",
118
119
  "katex": "^0.17.0",
@@ -142,13 +143,26 @@
142
143
  "@yao-pkg/pkg": "6.20.0",
143
144
  "esbuild": "^0.27.7",
144
145
  "eslint": "^10.2.0",
146
+ "patch-package": "8.0.1",
145
147
  "puppeteer": "^24.40.0",
146
148
  "tsx": "^4.21.0",
147
149
  "typescript": "^6.0.2",
148
150
  "vite": "^8.0.3"
149
151
  },
150
152
  "overrides": {
153
+ "@hono/node-server": "2.0.11",
154
+ "express@^4.22.2": {
155
+ ".": "$express",
156
+ "body-parser": "1.20.6"
157
+ },
151
158
  "qs": "6.15.3",
152
- "dompurify": "3.4.11"
159
+ "dompurify": "3.4.12"
160
+ },
161
+ "allowScripts": {
162
+ "esbuild@0.27.7": true,
163
+ "esbuild@0.28.1": true,
164
+ "node-pty@1.2.0-beta.12": true,
165
+ "fsevents": false,
166
+ "puppeteer": false
153
167
  }
154
168
  }
@@ -6,7 +6,6 @@ const CLIENT_MESSAGE_TYPES = new Set([
6
6
  'start-agent',
7
7
  'input',
8
8
  'composer-input',
9
- 'app-server-request-response',
10
9
  'acp-permission-response',
11
10
  'interrupt-agent',
12
11
  'focus-agent',
@@ -24,6 +23,7 @@ const SERVER_MESSAGE_TYPES = new Set([
24
23
  'command-ack',
25
24
  'state',
26
25
  'error',
26
+ 'composer-input-result',
27
27
  'agent-started',
28
28
  'session-output',
29
29
  'session-preview',
@@ -80,8 +80,7 @@ function validateClientMessage(value) {
80
80
  case 'protocol-hello': valid = Number.isInteger(value.protocolVersion); break;
81
81
  case 'start-agent': valid = stringField(value, 'command'); break;
82
82
  case 'input': valid = stringField(value, 'agentId', true) && (typeof value.input === 'string' || Array.isArray(value.inputParts)); break;
83
- case 'composer-input': valid = stringField(value, 'message') && stringField(value, 'agentId', true); break;
84
- case 'app-server-request-response':
83
+ case 'composer-input': valid = stringField(value, 'message') && stringField(value, 'agentId', true) && stringField(value, 'requestId', true); break;
85
84
  case 'acp-permission-response': valid = stringField(value, 'agentId') && stringField(value, 'requestId'); break;
86
85
  case 'focus-agent': valid = value.agentId === null || stringField(value, 'agentId'); break;
87
86
  case 'resize-agent': valid = stringField(value, 'agentId') && finiteField(value, 'cols') && finiteField(value, 'rows'); break;
@@ -102,6 +101,7 @@ function validateServerMessage(value) {
102
101
  case 'error': valid = stringField(value, 'message'); break;
103
102
  case 'command-ack': valid = stringField(value, 'requestId') && stringField(value, 'command'); break;
104
103
  case 'state': valid = objectMessage(value.state) && Array.isArray(value.state.agents); break;
104
+ case 'composer-input-result': valid = stringField(value, 'requestId') && stringField(value, 'agentId') && typeof value.accepted === 'boolean' && stringField(value, 'message', true); break;
105
105
  case 'agent-started': valid = stringField(value, 'agentId'); break;
106
106
  case 'session-output': valid = objectMessage(value.stream) && stringField(value.stream, 'agentId'); break;
107
107
  case 'session-preview': valid = objectMessage(value.preview) && stringField(value.preview, 'agentId'); break;