grok-bot-cli 0.4.5 → 0.6.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.
package/dist/bin/gbot.mjs CHANGED
@@ -5,11 +5,11 @@ import * as __rspack_external_node_child_process_cd435d64 from "node:child_proce
5
5
  import * as __rspack_external_node_crypto_2e7c4b46 from "node:crypto";
6
6
  import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
7
7
  import * as __rspack_external_node_fs_promises_3b710708 from "node:fs/promises";
8
- import * as __rspack_external_node_module_9de3fa2f from "node:module";
9
8
  import * as __rspack_external_node_net_5ed819e1 from "node:net";
10
9
  import * as __rspack_external_node_os_4f3c9d58 from "node:os";
11
10
  import * as __rspack_external_node_path_806ed179 from "node:path";
12
11
  import * as __rspack_external_node_readline_d8f53bef from "node:readline";
12
+ import * as __rspack_external_node_string_decoder_69b9bd04 from "node:string_decoder";
13
13
  import * as __rspack_external_node_url_3991086a from "node:url";
14
14
  import * as __rspack_external_node_worker_threads_28ca7740 from "node:worker_threads";
15
15
  import { createRequire as __rspack_createRequire } from "node:module";
@@ -11456,6 +11456,376 @@ __webpack_require__.d(__webpack_exports__, {
11456
11456
  });
11457
11457
 
11458
11458
 
11459
+ },
11460
+ "./src/cli/codex/bridge/respond.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11461
+ __webpack_require__.r(__webpack_exports__);
11462
+ /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
11463
+ /* import */ var _agent_bundle_runtime__rspack_import_3 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
11464
+ /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
11465
+ /* import */ var _core_relay_routes_js__rspack_import_1 = __webpack_require__("./src/core/relay/routes.ts");
11466
+ /* import */ var _core_codex_contract_js__rspack_import_2 = __webpack_require__("./src/core/codex/contract.js");
11467
+
11468
+
11469
+
11470
+
11471
+
11472
+ const config = {
11473
+ description: 'Managed Grok/Codex bridge respond.',
11474
+ exitCode: 'result',
11475
+ inputJsonSchema: {
11476
+ type: 'object',
11477
+ properties: {
11478
+ interactionId: {
11479
+ type: 'string'
11480
+ },
11481
+ generation: {
11482
+ type: 'string'
11483
+ },
11484
+ threadId: {
11485
+ type: 'string'
11486
+ },
11487
+ turnId: {
11488
+ type: 'string'
11489
+ },
11490
+ bindingId: {
11491
+ type: 'string'
11492
+ },
11493
+ exchangeId: {
11494
+ type: 'string'
11495
+ },
11496
+ decision: {
11497
+ type: 'string',
11498
+ enum: [
11499
+ 'accept',
11500
+ 'decline',
11501
+ 'cancel'
11502
+ ]
11503
+ },
11504
+ answersJson: {
11505
+ type: 'string',
11506
+ description: 'JSON object mapping each advertised question ID to {"answers":["answer"]}; exact IDs required.'
11507
+ }
11508
+ },
11509
+ required: [
11510
+ 'interactionId',
11511
+ 'generation',
11512
+ 'threadId',
11513
+ 'turnId'
11514
+ ],
11515
+ additionalProperties: false
11516
+ }
11517
+ };
11518
+ async function route({ input }) {
11519
+ let out;
11520
+ try {
11521
+ out = {
11522
+ ...await (0,_core_relay_routes_js__rspack_import_1/* .bridgeOperation */.n1)('respond', input, await (0,_agent_bundle_runtime__rspack_import_3/* .agent */.MA)()),
11523
+ exitCode: 0
11524
+ };
11525
+ } catch (error) {
11526
+ out = (0,_core_codex_contract_js__rspack_import_2/* .outcomeFromError */.DG)(error);
11527
+ }
11528
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Result */.g6.Result, {
11529
+ value: out,
11530
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Text */.g6.Text, {
11531
+ children: JSON.stringify(out)
11532
+ })
11533
+ });
11534
+ }
11535
+
11536
+ __webpack_require__.d(__webpack_exports__, {
11537
+ "default": () => (route),
11538
+ inputSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.v1),
11539
+ resultSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.Ax)
11540
+ }, {
11541
+ config: config
11542
+ });
11543
+
11544
+
11545
+ },
11546
+ "./src/cli/codex/bridge/run.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11547
+ __webpack_require__.r(__webpack_exports__);
11548
+ /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
11549
+ /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
11550
+ /* import */ var _agent_bundle_runtime__rspack_import_5 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
11551
+ /* import */ var node_child_process__rspack_import_1 = __webpack_require__("node:child_process");
11552
+ /* import */ var zod__rspack_import_3 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
11553
+ /* import */ var _core_relay_managed_js__rspack_import_2 = __webpack_require__("./src/core/relay/managed.js");
11554
+
11555
+
11556
+
11557
+
11558
+
11559
+ const inputSchema = zod__rspack_import_3/* .object */.Ikc({
11560
+ lifetimeMs: zod__rspack_import_3/* .number */.aig().int().min(100).max(82800000).default(82800000)
11561
+ }).strict();
11562
+ const resultSchema = zod__rspack_import_3/* .object */.Ikc({
11563
+ state: zod__rspack_import_3/* .string */.YjP(),
11564
+ exitCode: zod__rspack_import_3/* .number */.aig()
11565
+ });
11566
+ const config = {
11567
+ description: 'Run a bounded foreground relay (up to 23 hours). Use the packaged gbot-relay.mjs script for unlimited service lifetime.',
11568
+ exitCode: 'result',
11569
+ render: {
11570
+ maxElapsedMs: 86400000
11571
+ },
11572
+ inputJsonSchema: {
11573
+ type: 'object',
11574
+ properties: {
11575
+ lifetimeMs: {
11576
+ type: 'number',
11577
+ description: 'Foreground lifetime in milliseconds (100..82800000; default 23h).'
11578
+ }
11579
+ },
11580
+ additionalProperties: false
11581
+ }
11582
+ };
11583
+ async function route({ signal, input }) {
11584
+ const context = await (0,_agent_bundle_runtime__rspack_import_4/* .agent */.MA)();
11585
+ const script = await (0,_core_relay_managed_js__rspack_import_2/* .resolveRelayWorker */._v)({
11586
+ pluginRoot: context.plugin.state === 'available' ? context.plugin.value.root : undefined
11587
+ });
11588
+ // The renderer may terminate immediately on abort. The separate worker can finish
11589
+ // asynchronous socket/ledger cleanup after the synchronous termination signal.
11590
+ const child = (0,node_child_process__rspack_import_1.spawn)(process.execPath, [
11591
+ script,
11592
+ '--lifetime-ms',
11593
+ String(input.lifetimeMs),
11594
+ '--parent-pid',
11595
+ String(process.pid)
11596
+ ], {
11597
+ stdio: [
11598
+ 'ignore',
11599
+ 'ignore',
11600
+ 'inherit'
11601
+ ]
11602
+ });
11603
+ const stop = ()=>{
11604
+ child.kill('SIGTERM');
11605
+ };
11606
+ signal.addEventListener('abort', stop, {
11607
+ once: true
11608
+ });
11609
+ if (signal.aborted) stop();
11610
+ let exitCode;
11611
+ try {
11612
+ exitCode = await new Promise((resolve, reject)=>{
11613
+ child.once('error', reject);
11614
+ child.once('exit', (code)=>resolve(code ?? 1));
11615
+ });
11616
+ } finally{
11617
+ signal.removeEventListener('abort', stop);
11618
+ }
11619
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_5/* .Agent.Result */.g6.Result, {
11620
+ value: {
11621
+ state: 'stopped',
11622
+ exitCode
11623
+ },
11624
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_5/* .Agent.Text */.g6.Text, {
11625
+ children: "Relay worker stopped."
11626
+ })
11627
+ });
11628
+ }
11629
+
11630
+ __webpack_require__.d(__webpack_exports__, {
11631
+ "default": () => (route)
11632
+ }, {
11633
+ config: config,
11634
+ inputSchema: inputSchema,
11635
+ resultSchema: resultSchema
11636
+ });
11637
+
11638
+
11639
+ },
11640
+ "./src/cli/codex/bridge/start.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11641
+ __webpack_require__.r(__webpack_exports__);
11642
+ /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
11643
+ /* import */ var _agent_bundle_runtime__rspack_import_3 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
11644
+ /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
11645
+ /* import */ var _core_relay_routes_js__rspack_import_1 = __webpack_require__("./src/core/relay/routes.ts");
11646
+ /* import */ var _core_codex_contract_js__rspack_import_2 = __webpack_require__("./src/core/codex/contract.js");
11647
+
11648
+
11649
+
11650
+
11651
+
11652
+ const config = {
11653
+ description: 'Managed Grok/Codex bridge start.',
11654
+ exitCode: 'result',
11655
+ positionals: [
11656
+ 'grokTarget'
11657
+ ],
11658
+ inputJsonSchema: {
11659
+ type: 'object',
11660
+ properties: {
11661
+ grokTarget: {
11662
+ type: 'string'
11663
+ },
11664
+ codexThreadId: {
11665
+ type: 'string'
11666
+ },
11667
+ expectedCwd: {
11668
+ type: 'string'
11669
+ },
11670
+ busyPolicy: {
11671
+ type: 'string',
11672
+ enum: [
11673
+ 'steer',
11674
+ 'reject'
11675
+ ]
11676
+ },
11677
+ requestId: {
11678
+ type: 'string'
11679
+ }
11680
+ },
11681
+ required: [
11682
+ 'grokTarget'
11683
+ ],
11684
+ additionalProperties: false
11685
+ }
11686
+ };
11687
+ async function route({ input }) {
11688
+ let out;
11689
+ try {
11690
+ out = {
11691
+ ...await (0,_core_relay_routes_js__rspack_import_1/* .bridgeOperation */.n1)('startBinding', input, await (0,_agent_bundle_runtime__rspack_import_3/* .agent */.MA)()),
11692
+ exitCode: 0
11693
+ };
11694
+ } catch (error) {
11695
+ out = (0,_core_codex_contract_js__rspack_import_2/* .outcomeFromError */.DG)(error);
11696
+ }
11697
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Result */.g6.Result, {
11698
+ value: out,
11699
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Text */.g6.Text, {
11700
+ children: JSON.stringify(out)
11701
+ })
11702
+ });
11703
+ }
11704
+
11705
+ __webpack_require__.d(__webpack_exports__, {
11706
+ "default": () => (route),
11707
+ inputSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.xD),
11708
+ resultSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.Ax)
11709
+ }, {
11710
+ config: config
11711
+ });
11712
+
11713
+
11714
+ },
11715
+ "./src/cli/codex/bridge/status.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11716
+ __webpack_require__.r(__webpack_exports__);
11717
+ /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
11718
+ /* import */ var _agent_bundle_runtime__rspack_import_3 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
11719
+ /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
11720
+ /* import */ var _core_relay_routes_js__rspack_import_1 = __webpack_require__("./src/core/relay/routes.ts");
11721
+ /* import */ var _core_codex_contract_js__rspack_import_2 = __webpack_require__("./src/core/codex/contract.js");
11722
+
11723
+
11724
+
11725
+
11726
+
11727
+ const config = {
11728
+ description: 'Managed Grok/Codex bridge status.',
11729
+ exitCode: 'result',
11730
+ inputJsonSchema: {
11731
+ type: 'object',
11732
+ properties: {
11733
+ bindingId: {
11734
+ type: 'string'
11735
+ },
11736
+ limit: {
11737
+ type: 'number'
11738
+ }
11739
+ },
11740
+ additionalProperties: false
11741
+ }
11742
+ };
11743
+ async function route({ input }) {
11744
+ let out;
11745
+ try {
11746
+ out = {
11747
+ ...await (0,_core_relay_routes_js__rspack_import_1/* .bridgeOperation */.n1)('status', input, await (0,_agent_bundle_runtime__rspack_import_3/* .agent */.MA)()),
11748
+ exitCode: 0
11749
+ };
11750
+ } catch (error) {
11751
+ out = (0,_core_codex_contract_js__rspack_import_2/* .outcomeFromError */.DG)(error);
11752
+ }
11753
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Result */.g6.Result, {
11754
+ value: out,
11755
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Text */.g6.Text, {
11756
+ children: JSON.stringify(out)
11757
+ })
11758
+ });
11759
+ }
11760
+
11761
+ __webpack_require__.d(__webpack_exports__, {
11762
+ "default": () => (route),
11763
+ inputSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.np),
11764
+ resultSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.Ax)
11765
+ }, {
11766
+ config: config
11767
+ });
11768
+
11769
+
11770
+ },
11771
+ "./src/cli/codex/bridge/stop.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11772
+ __webpack_require__.r(__webpack_exports__);
11773
+ /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
11774
+ /* import */ var _agent_bundle_runtime__rspack_import_3 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
11775
+ /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
11776
+ /* import */ var _core_relay_routes_js__rspack_import_1 = __webpack_require__("./src/core/relay/routes.ts");
11777
+ /* import */ var _core_codex_contract_js__rspack_import_2 = __webpack_require__("./src/core/codex/contract.js");
11778
+
11779
+
11780
+
11781
+
11782
+
11783
+ const config = {
11784
+ description: 'Managed Grok/Codex bridge stop.',
11785
+ exitCode: 'result',
11786
+ inputJsonSchema: {
11787
+ type: 'object',
11788
+ properties: {
11789
+ bindingId: {
11790
+ type: 'string'
11791
+ },
11792
+ all: {
11793
+ type: 'boolean'
11794
+ },
11795
+ worker: {
11796
+ type: 'boolean'
11797
+ }
11798
+ },
11799
+ additionalProperties: false
11800
+ }
11801
+ };
11802
+ async function route({ input }) {
11803
+ let out;
11804
+ try {
11805
+ out = {
11806
+ ...await (0,_core_relay_routes_js__rspack_import_1/* .bridgeOperation */.n1)('stop', input, await (0,_agent_bundle_runtime__rspack_import_3/* .agent */.MA)()),
11807
+ exitCode: 0
11808
+ };
11809
+ } catch (error) {
11810
+ out = (0,_core_codex_contract_js__rspack_import_2/* .outcomeFromError */.DG)(error);
11811
+ }
11812
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Result */.g6.Result, {
11813
+ value: out,
11814
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Text */.g6.Text, {
11815
+ children: JSON.stringify(out)
11816
+ })
11817
+ });
11818
+ }
11819
+
11820
+ __webpack_require__.d(__webpack_exports__, {
11821
+ "default": () => (route),
11822
+ inputSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.d5),
11823
+ resultSchema: () => (/* reexport safe */ _core_relay_routes_js__rspack_import_1.Ax)
11824
+ }, {
11825
+ config: config
11826
+ });
11827
+
11828
+
11459
11829
  },
11460
11830
  "./src/cli/codex/desktop-shim.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11461
11831
  __webpack_require__.r(__webpack_exports__);
@@ -11766,117 +12136,145 @@ __webpack_require__.d(__webpack_exports__, {
11766
12136
  "./src/cli/codex/send.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11767
12137
  __webpack_require__.r(__webpack_exports__);
11768
12138
  /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
11769
- /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
12139
+ /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
12140
+ /* import */ var _agent_bundle_runtime__rspack_import_5 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
11770
12141
  /* import */ var zod__rspack_import_3 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
11771
- /* import */ var _core_codex_bridge_js__rspack_import_1 = __webpack_require__("./src/core/codex-bridge.js");
11772
- /* import */ var _core_codex_contract_js__rspack_import_2 = __webpack_require__("./src/core/codex/contract.js");
12142
+ /* import */ var _core_codex_routes_js__rspack_import_1 = __webpack_require__("./src/core/codex/routes.ts");
12143
+ /* import */ var _core_relay_routes_js__rspack_import_2 = __webpack_require__("./src/core/relay/routes.ts");
11773
12144
 
11774
12145
 
11775
12146
 
11776
12147
 
11777
12148
 
12149
+ const resultSchema = zod__rspack_import_3/* .union */.KCZ([
12150
+ _core_codex_routes_js__rspack_import_1/* .resultSchema */.FD,
12151
+ _core_relay_routes_js__rspack_import_2/* .relayResultSchema */.Ax
12152
+ ]);
12153
+ const inputSchema = zod__rspack_import_3/* .object */.Ikc({
12154
+ ..._core_codex_routes_js__rspack_import_1/* .sendFields */.at,
12155
+ whenBusy: zod__rspack_import_3/* ["enum"] */.k5n([
12156
+ 'reject',
12157
+ 'queue',
12158
+ 'steer'
12159
+ ]).optional(),
12160
+ replyToGrok: zod__rspack_import_3/* .string */.YjP().min(1).optional(),
12161
+ bindingId: zod__rspack_import_3/* .string */.YjP().min(1).optional(),
12162
+ requestId: zod__rspack_import_3/* .string */.YjP().min(1).max(128).optional(),
12163
+ correlationId: zod__rspack_import_3/* .string */.YjP().min(1).optional(),
12164
+ replyTo: zod__rspack_import_3/* .string */.YjP().min(1).optional(),
12165
+ message: zod__rspack_import_3/* .array */.YOg(zod__rspack_import_3/* .string */.YjP()).min(1)
12166
+ }).strict();
11778
12167
  const config = {
11779
- description: 'Send a message to a Codex thread. Options go before <threadId>; `--` protects flag-like text.',
12168
+ description: 'Send to Codex; acceptance is distinct from completion. Options precede threadId.',
11780
12169
  exitCode: 'result',
12170
+ render: {
12171
+ maxElapsedMs: 660000
12172
+ },
12173
+ positionals: [
12174
+ 'threadId',
12175
+ 'message'
12176
+ ],
11781
12177
  inputJsonSchema: {
12178
+ type: 'object',
11782
12179
  additionalProperties: false,
11783
12180
  properties: {
12181
+ replyToGrok: {
12182
+ type: 'string'
12183
+ },
12184
+ bindingId: {
12185
+ type: 'string'
12186
+ },
12187
+ requestId: {
12188
+ type: 'string'
12189
+ },
12190
+ threadId: {
12191
+ type: 'string'
12192
+ },
12193
+ expectedCwd: {
12194
+ type: 'string'
12195
+ },
12196
+ timeoutMs: {
12197
+ type: 'number',
12198
+ description: 'Observation timeout: 1-600000 milliseconds.'
12199
+ },
11784
12200
  correlationId: {
11785
- description: 'Stable correlation id for multi-hop replies',
11786
12201
  type: 'string'
11787
12202
  },
11788
12203
  envelope: {
11789
- description: 'Prepend the [gbot …] header to the message body',
11790
12204
  type: 'boolean'
11791
12205
  },
11792
12206
  hop: {
11793
- description: 'Hop count; refused at GROK_BOT_MAX_HOPS',
11794
12207
  type: 'number'
11795
12208
  },
11796
- message: {
11797
- items: {
11798
- type: 'string'
11799
- },
11800
- type: 'array'
11801
- },
11802
12209
  replyTo: {
11803
- description: 'Prior message id this send replies to',
11804
12210
  type: 'string'
11805
12211
  },
11806
- threadId: {
11807
- type: 'string'
12212
+ expectedTurnId: {
12213
+ type: 'string',
12214
+ description: 'Required active-turn guard for steer; stale guards reject.'
12215
+ },
12216
+ wait: {
12217
+ type: 'boolean'
12218
+ },
12219
+ maxOutputBytes: {
12220
+ type: 'number',
12221
+ description: 'Reply budget: 1-4194304 bytes.'
11808
12222
  },
11809
12223
  whenBusy: {
11810
- description: 'reject (default) or queue (needs GROK_BOT_CODEX_EXPERIMENTAL=1)',
12224
+ type: 'string',
11811
12225
  enum: [
11812
12226
  'reject',
11813
- 'queue'
11814
- ],
11815
- type: 'string'
12227
+ 'queue',
12228
+ 'steer'
12229
+ ]
12230
+ },
12231
+ message: {
12232
+ type: 'array',
12233
+ items: {
12234
+ type: 'string'
12235
+ }
11816
12236
  }
11817
12237
  },
11818
12238
  required: [
11819
12239
  'threadId',
11820
12240
  'message'
11821
- ],
11822
- type: 'object'
11823
- },
11824
- positionals: [
11825
- 'threadId',
11826
- 'message'
11827
- ]
12241
+ ]
12242
+ }
11828
12243
  };
11829
- const inputSchema = zod__rspack_import_3/* .object */.Ikc({
11830
- correlationId: zod__rspack_import_3/* .string */.YjP().min(1).optional(),
11831
- envelope: zod__rspack_import_3/* .boolean */.zMY().optional(),
11832
- hop: zod__rspack_import_3/* .number */.aig().int().min(0).optional(),
11833
- message: zod__rspack_import_3/* .array */.YOg(zod__rspack_import_3/* .string */.YjP()).min(1),
11834
- replyTo: zod__rspack_import_3/* .string */.YjP().min(1).optional(),
11835
- threadId: zod__rspack_import_3/* .string */.YjP().min(1),
11836
- whenBusy: zod__rspack_import_3/* ["enum"] */.k5n([
11837
- 'reject',
11838
- 'queue'
11839
- ]).default('reject')
11840
- }).strict();
11841
- const resultSchema = zod__rspack_import_3/* .object */.Ikc({
11842
- delivery: zod__rspack_import_3/* ["enum"] */.k5n([
11843
- 'accepted',
11844
- 'queued',
11845
- 'rejected',
11846
- 'unknown'
11847
- ]),
11848
- exitCode: zod__rspack_import_3/* .union */.KCZ([
11849
- zod__rspack_import_3/* .literal */.euz(0),
11850
- zod__rspack_import_3/* .literal */.euz(1)
11851
- ])
11852
- }).passthrough();
11853
- async function codexSend({ input }) {
11854
- let out;
11855
- try {
11856
- const envelope = (0,_core_codex_bridge_js__rspack_import_1/* .buildEnvelope */.nq)({
11857
- correlationId: input.correlationId,
11858
- envelope: Boolean(input.envelope),
11859
- hop: input.hop,
11860
- replyTo: input.replyTo
11861
- });
11862
- out = await (0,_core_codex_bridge_js__rspack_import_1/* .sendToCodexThread */.ZS)(input.threadId, input.message.join(' ').trim(), {
11863
- envelope,
11864
- whenBusy: input.whenBusy
12244
+ async function route({ input, signal }) {
12245
+ const context = await (0,_agent_bundle_runtime__rspack_import_4/* .agent */.MA)();
12246
+ if (input.replyToGrok || input.bindingId) {
12247
+ const out = await (0,_core_relay_routes_js__rspack_import_2/* .codexReturnOperation */.lt)({
12248
+ ...input,
12249
+ message: input.message.join(' ').trim()
12250
+ }, context);
12251
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_5/* .Agent.Result */.g6.Result, {
12252
+ value: {
12253
+ ...out,
12254
+ exitCode: out.delivery === 'rejected' ? 1 : 0
12255
+ },
12256
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_5/* .Agent.Text */.g6.Text, {
12257
+ children: `Delivery ${out.delivery}; terminal answer returns to Grok automatically.`
12258
+ })
11865
12259
  });
11866
- } catch (error) {
11867
- out = (0,_core_codex_contract_js__rspack_import_2/* .outcomeFromError */.DG)(error);
11868
12260
  }
11869
- const text = out.delivery === 'queued' && typeof out.queuedSubmissionId === 'string' ? `Queued ${out.queuedSubmissionId} on busy Codex thread ${out.threadId}; message ${out.messageId}` : out.exitCode === 0 ? `Started turn ${out.turnId} (${out.turnStatus}) on Codex thread ${out.threadId}; message ${out.messageId}` : typeof out.error === 'string' ? out.error : `Codex delivery ${out.delivery} on thread ${out.threadId}`;
11870
- return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Result */.g6.Result, {
12261
+ const out = await (0,_core_codex_routes_js__rspack_import_1/* .sendOperation */.UP)({
12262
+ ...input,
12263
+ whenBusy: input.whenBusy ?? 'reject',
12264
+ message: input.message.join(' ').trim()
12265
+ }, signal, (message)=>context.progress.report({
12266
+ message
12267
+ }), true);
12268
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_5/* .Agent.Result */.g6.Result, {
11871
12269
  value: out,
11872
- children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_4/* .Agent.Text */.g6.Text, {
11873
- children: text
12270
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_5/* .Agent.Text */.g6.Text, {
12271
+ children: (0,_core_codex_routes_js__rspack_import_1/* .resultText */.D6)(out)
11874
12272
  })
11875
12273
  });
11876
12274
  }
11877
12275
 
11878
12276
  __webpack_require__.d(__webpack_exports__, {
11879
- "default": () => (codexSend)
12277
+ "default": () => (route)
11880
12278
  }, {
11881
12279
  config: config,
11882
12280
  inputSchema: inputSchema,
@@ -11932,6 +12330,146 @@ __webpack_require__.d(__webpack_exports__, {
11932
12330
  });
11933
12331
 
11934
12332
 
12333
+ },
12334
+ "./src/cli/codex/wait.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
12335
+ __webpack_require__.r(__webpack_exports__);
12336
+ /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
12337
+ /* import */ var _agent_bundle_runtime__rspack_import_2 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
12338
+ /* import */ var _agent_bundle_runtime__rspack_import_3 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
12339
+ /* import */ var _core_codex_routes_js__rspack_import_1 = __webpack_require__("./src/core/codex/routes.ts");
12340
+
12341
+
12342
+
12343
+
12344
+ const config = {
12345
+ description: 'Bounded Codex wait observation; never interrupts execution.',
12346
+ exitCode: 'result',
12347
+ render: {
12348
+ maxElapsedMs: 660000
12349
+ },
12350
+ positionals: [
12351
+ 'threadId',
12352
+ 'turnId'
12353
+ ],
12354
+ inputJsonSchema: {
12355
+ type: 'object',
12356
+ additionalProperties: false,
12357
+ properties: {
12358
+ "threadId": {
12359
+ "type": "string"
12360
+ },
12361
+ "expectedCwd": {
12362
+ "type": "string"
12363
+ },
12364
+ "timeoutMs": {
12365
+ "type": "number",
12366
+ "description": "Observation timeout: 1-600000 milliseconds."
12367
+ },
12368
+ "turnId": {
12369
+ "type": "string"
12370
+ },
12371
+ "messageId": {
12372
+ "type": "string"
12373
+ },
12374
+ "maxOutputBytes": {
12375
+ "type": "number",
12376
+ "description": "Reply budget: 1-4194304 bytes."
12377
+ }
12378
+ },
12379
+ required: [
12380
+ 'threadId',
12381
+ 'turnId'
12382
+ ]
12383
+ }
12384
+ };
12385
+ async function route({ input, signal }) {
12386
+ const context = await (0,_agent_bundle_runtime__rspack_import_2/* .agent */.MA)();
12387
+ const out = await (0,_core_codex_routes_js__rspack_import_1/* .observeOperation */.gT)('wait', input, signal, (message)=>context.progress.report({
12388
+ message
12389
+ }));
12390
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_3/* .Agent.Result */.g6.Result, {
12391
+ value: out,
12392
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_3/* .Agent.Text */.g6.Text, {
12393
+ children: (0,_core_codex_routes_js__rspack_import_1/* .resultText */.D6)(out)
12394
+ })
12395
+ });
12396
+ }
12397
+
12398
+ __webpack_require__.d(__webpack_exports__, {
12399
+ "default": () => (route),
12400
+ inputSchema: () => (/* reexport safe */ _core_codex_routes_js__rspack_import_1.jS),
12401
+ resultSchema: () => (/* reexport safe */ _core_codex_routes_js__rspack_import_1.FD)
12402
+ }, {
12403
+ config: config
12404
+ });
12405
+
12406
+
12407
+ },
12408
+ "./src/cli/codex/watch.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
12409
+ __webpack_require__.r(__webpack_exports__);
12410
+ /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
12411
+ /* import */ var _agent_bundle_runtime__rspack_import_2 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
12412
+ /* import */ var _agent_bundle_runtime__rspack_import_3 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
12413
+ /* import */ var _core_codex_routes_js__rspack_import_1 = __webpack_require__("./src/core/codex/routes.ts");
12414
+
12415
+
12416
+
12417
+
12418
+ const config = {
12419
+ description: 'Bounded Codex watch observation; never interrupts execution.',
12420
+ exitCode: 'result',
12421
+ render: {
12422
+ maxElapsedMs: 660000
12423
+ },
12424
+ positionals: [
12425
+ 'threadId'
12426
+ ],
12427
+ inputJsonSchema: {
12428
+ type: 'object',
12429
+ additionalProperties: false,
12430
+ properties: {
12431
+ "threadId": {
12432
+ "type": "string"
12433
+ },
12434
+ "expectedCwd": {
12435
+ "type": "string"
12436
+ },
12437
+ "timeoutMs": {
12438
+ "type": "number",
12439
+ "description": "Observation timeout: 1-600000 milliseconds."
12440
+ },
12441
+ "maxEvents": {
12442
+ "type": "number",
12443
+ "description": "Maximum observed events: 1-500."
12444
+ }
12445
+ },
12446
+ required: [
12447
+ 'threadId'
12448
+ ]
12449
+ }
12450
+ };
12451
+ async function route({ input, signal }) {
12452
+ const context = await (0,_agent_bundle_runtime__rspack_import_2/* .agent */.MA)();
12453
+ const out = await (0,_core_codex_routes_js__rspack_import_1/* .observeOperation */.gT)('watch', input, signal, (message)=>context.progress.report({
12454
+ message
12455
+ }));
12456
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_3/* .Agent.Result */.g6.Result, {
12457
+ value: out,
12458
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_3/* .Agent.Text */.g6.Text, {
12459
+ children: (0,_core_codex_routes_js__rspack_import_1/* .resultText */.D6)(out)
12460
+ })
12461
+ });
12462
+ }
12463
+
12464
+ __webpack_require__.d(__webpack_exports__, {
12465
+ "default": () => (route),
12466
+ inputSchema: () => (/* reexport safe */ _core_codex_routes_js__rspack_import_1.R9),
12467
+ resultSchema: () => (/* reexport safe */ _core_codex_routes_js__rspack_import_1.FD)
12468
+ }, {
12469
+ config: config
12470
+ });
12471
+
12472
+
11935
12473
  },
11936
12474
  "./src/cli/doctor.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
11937
12475
  __webpack_require__.r(__webpack_exports__);
@@ -12805,12 +13343,15 @@ __webpack_require__.d(__webpack_exports__, {
12805
13343
  "./src/cli/send.tsx"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
12806
13344
  __webpack_require__.r(__webpack_exports__);
12807
13345
  /* import */ var react_jsx_runtime__rspack_import_0 = __webpack_require__("./node_modules/react/jsx-runtime.js");
12808
- /* import */ var _agent_bundle_runtime__rspack_import_6 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
12809
- /* import */ var zod__rspack_import_5 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
12810
- /* import */ var _core_codex_bridge_js__rspack_import_1 = __webpack_require__("./src/core/codex-bridge.js");
12811
- /* import */ var _core_codex_contract_js__rspack_import_2 = __webpack_require__("./src/core/codex/contract.js");
12812
- /* import */ var _core_history_js__rspack_import_3 = __webpack_require__("./src/core/history.js");
12813
- /* import */ var _shared_js__rspack_import_4 = __webpack_require__("./src/cli/_shared.ts");
13346
+ /* import */ var _agent_bundle_runtime__rspack_import_7 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
13347
+ /* import */ var _agent_bundle_runtime__rspack_import_8 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/506.js");
13348
+ /* import */ var zod__rspack_import_6 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
13349
+ /* import */ var _core_relay_routes_js__rspack_import_1 = __webpack_require__("./src/core/relay/routes.ts");
13350
+ /* import */ var _core_codex_bridge_js__rspack_import_2 = __webpack_require__("./src/core/codex-bridge.js");
13351
+ /* import */ var _core_codex_contract_js__rspack_import_3 = __webpack_require__("./src/core/codex/contract.js");
13352
+ /* import */ var _core_history_js__rspack_import_4 = __webpack_require__("./src/core/history.js");
13353
+ /* import */ var _shared_js__rspack_import_5 = __webpack_require__("./src/cli/_shared.ts");
13354
+
12814
13355
 
12815
13356
 
12816
13357
 
@@ -12824,6 +13365,25 @@ const config = {
12824
13365
  inputJsonSchema: {
12825
13366
  additionalProperties: false,
12826
13367
  properties: {
13368
+ replyMode: {
13369
+ type: 'string',
13370
+ enum: [
13371
+ 'auto',
13372
+ 'manual'
13373
+ ]
13374
+ },
13375
+ codexThreadId: {
13376
+ type: 'string'
13377
+ },
13378
+ bindingId: {
13379
+ type: 'string'
13380
+ },
13381
+ expectedCwd: {
13382
+ type: 'string'
13383
+ },
13384
+ requestId: {
13385
+ type: 'string'
13386
+ },
12827
13387
  correlationId: {
12828
13388
  description: 'Stable correlation id for multi-hop replies',
12829
13389
  type: 'string'
@@ -12881,52 +13441,58 @@ const config = {
12881
13441
  'message'
12882
13442
  ]
12883
13443
  };
12884
- const inputSchema = _shared_js__rspack_import_4/* .backendFlagsSchema.extend */.lK.extend({
12885
- correlationId: zod__rspack_import_5/* .string */.YjP().min(1).optional(),
12886
- envelope: zod__rspack_import_5/* .boolean */.zMY().default(false),
12887
- historyDir: zod__rspack_import_5/* .string */.YjP().min(1).optional(),
12888
- hop: zod__rspack_import_5/* .number */.aig().int().min(0).optional(),
12889
- message: zod__rspack_import_5/* .array */.YOg(zod__rspack_import_5/* .string */.YjP()).min(1),
12890
- noHistory: zod__rspack_import_5/* .boolean */.zMY().default(false),
12891
- replyTo: zod__rspack_import_5/* .string */.YjP().min(1).optional(),
12892
- target: zod__rspack_import_5/* .string */.YjP().min(1)
13444
+ const inputSchema = _shared_js__rspack_import_5/* .backendFlagsSchema.extend */.lK.extend({
13445
+ ..._core_relay_routes_js__rspack_import_1/* .routeFields */.zK,
13446
+ replyMode: zod__rspack_import_6/* ["enum"] */.k5n([
13447
+ 'auto',
13448
+ 'manual'
13449
+ ]).optional(),
13450
+ correlationId: zod__rspack_import_6/* .string */.YjP().min(1).optional(),
13451
+ envelope: zod__rspack_import_6/* .boolean */.zMY().default(false),
13452
+ historyDir: zod__rspack_import_6/* .string */.YjP().min(1).optional(),
13453
+ hop: zod__rspack_import_6/* .number */.aig().int().min(0).optional(),
13454
+ message: zod__rspack_import_6/* .array */.YOg(zod__rspack_import_6/* .string */.YjP()).min(1),
13455
+ noHistory: zod__rspack_import_6/* .boolean */.zMY().default(false),
13456
+ replyTo: zod__rspack_import_6/* .string */.YjP().min(1).optional(),
13457
+ target: zod__rspack_import_6/* .string */.YjP().min(1)
12893
13458
  }).strict();
12894
- const receiptSchema = zod__rspack_import_5/* .object */.Ikc({
12895
- correlationId: zod__rspack_import_5/* .string */.YjP(),
12896
- delivery: zod__rspack_import_5/* ["enum"] */.k5n([
13459
+ const receiptSchema = zod__rspack_import_6/* .object */.Ikc({
13460
+ correlationId: zod__rspack_import_6/* .string */.YjP(),
13461
+ delivery: zod__rspack_import_6/* ["enum"] */.k5n([
12897
13462
  'accepted',
12898
13463
  'unknown'
12899
13464
  ]),
12900
- envelopeId: zod__rspack_import_5/* .string */.YjP(),
12901
- exitCode: zod__rspack_import_5/* .literal */.euz(0),
12902
- hop: zod__rspack_import_5/* .number */.aig().int().min(0),
12903
- id: zod__rspack_import_5/* .string */.YjP(),
12904
- kind: zod__rspack_import_5/* ["enum"] */.k5n([
13465
+ envelopeId: zod__rspack_import_6/* .string */.YjP(),
13466
+ exitCode: zod__rspack_import_6/* .literal */.euz(0),
13467
+ hop: zod__rspack_import_6/* .number */.aig().int().min(0),
13468
+ id: zod__rspack_import_6/* .string */.YjP(),
13469
+ kind: zod__rspack_import_6/* ["enum"] */.k5n([
12905
13470
  'bot',
12906
13471
  'group'
12907
13472
  ]),
12908
- maxHops: zod__rspack_import_5/* .number */.aig().int().min(0),
12909
- messageId: zod__rspack_import_5/* .string */.YjP().optional(),
12910
- name: zod__rspack_import_5/* .string */.YjP(),
12911
- replyTo: zod__rspack_import_5/* .string */.YjP().optional(),
12912
- result: zod__rspack_import_5/* .record */.g1P(zod__rspack_import_5/* .string */.YjP(), zod__rspack_import_5/* .json */.Pq9())
13473
+ maxHops: zod__rspack_import_6/* .number */.aig().int().min(0),
13474
+ messageId: zod__rspack_import_6/* .string */.YjP().optional(),
13475
+ name: zod__rspack_import_6/* .string */.YjP(),
13476
+ replyTo: zod__rspack_import_6/* .string */.YjP().optional(),
13477
+ result: zod__rspack_import_6/* .record */.g1P(zod__rspack_import_6/* .string */.YjP(), zod__rspack_import_6/* .json */.Pq9())
12913
13478
  }).strict();
12914
13479
  // Refusals and gateway failures are the same flat document `codex send` emits.
12915
- const resultSchema = zod__rspack_import_5/* .union */.KCZ([
13480
+ const resultSchema = zod__rspack_import_6/* .union */.KCZ([
12916
13481
  receiptSchema,
12917
- _shared_js__rspack_import_4/* .failureDocumentSchema */.R9
13482
+ _shared_js__rspack_import_5/* .failureDocumentSchema */.R9,
13483
+ _core_relay_routes_js__rspack_import_1/* .relayResultSchema */.Ax
12918
13484
  ]);
12919
13485
  const deliver = async (input)=>{
12920
- const envelope = (0,_core_codex_bridge_js__rspack_import_1/* .buildEnvelope */.nq)({
13486
+ const envelope = (0,_core_codex_bridge_js__rspack_import_2/* .buildEnvelope */.nq)({
12921
13487
  correlationId: input.correlationId,
12922
13488
  envelope: input.envelope,
12923
13489
  hop: input.hop,
12924
13490
  replyTo: input.replyTo
12925
13491
  });
12926
13492
  const message = input.message.join(' ').trim();
12927
- const backend = await (0,_shared_js__rspack_import_4/* .openBackendFromInput */.FS)(input);
12928
- const out = await backend.send(input.target, (0,_core_codex_bridge_js__rspack_import_1/* .withEnvelopeHeader */.Mr)(message, envelope));
12929
- (0,_core_history_js__rspack_import_3/* .saveHistory */.QX)(out, {
13493
+ const backend = await (0,_shared_js__rspack_import_5/* .openBackendFromInput */.FS)(input);
13494
+ const out = await backend.send(input.target, (0,_core_codex_bridge_js__rspack_import_2/* .withEnvelopeHeader */.Mr)(message, envelope));
13495
+ (0,_core_history_js__rspack_import_4/* .saveHistory */.QX)(out, {
12930
13496
  dir: input.historyDir,
12931
13497
  disabled: input.noHistory,
12932
13498
  event: 'send',
@@ -12954,14 +13520,38 @@ const deliver = async (input)=>{
12954
13520
  async function send({ input }) {
12955
13521
  let value;
12956
13522
  try {
13523
+ if (input.replyMode === 'auto' || input.codexThreadId || input.bindingId) {
13524
+ (0,_core_relay_routes_js__rspack_import_1/* .assertManagedSendOptions */.MB)(input);
13525
+ if (input.files) throw Error('Automatic routes require the gateway backend');
13526
+ const out = await (0,_core_relay_routes_js__rspack_import_1/* .grokSendOperation */.bv)({
13527
+ target: input.target,
13528
+ message: input.message.join(' ').trim(),
13529
+ replyMode: input.replyMode ?? 'auto',
13530
+ codexThreadId: input.codexThreadId,
13531
+ bindingId: input.bindingId,
13532
+ expectedCwd: input.expectedCwd,
13533
+ requestId: input.requestId,
13534
+ hop: input.hop,
13535
+ correlationId: input.correlationId
13536
+ }, await (0,_agent_bundle_runtime__rspack_import_7/* .agent */.MA)());
13537
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_8/* .Agent.Result */.g6.Result, {
13538
+ value: {
13539
+ ...out,
13540
+ exitCode: out.delivery === 'rejected' ? 1 : 0
13541
+ },
13542
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_8/* .Agent.Text */.g6.Text, {
13543
+ children: `Delivery ${out.delivery}; inspect codex bridge status for automatic reply delivery.`
13544
+ })
13545
+ });
13546
+ }
12957
13547
  value = await deliver(input);
12958
13548
  } catch (error) {
12959
- value = (0,_core_codex_contract_js__rspack_import_2/* .outcomeFromError */.DG)(error);
13549
+ value = (0,_core_codex_contract_js__rspack_import_3/* .outcomeFromError */.DG)(error);
12960
13550
  }
12961
13551
  const text = value.exitCode === 0 ? `Sent to ${value.kind} ${value.name} (${value.id})${value.messageId ? ` message ${value.messageId}` : ''}; envelope ${value.envelopeId}` : value.error;
12962
- return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_6/* .Agent.Result */.g6.Result, {
13552
+ return /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_8/* .Agent.Result */.g6.Result, {
12963
13553
  value: value,
12964
- children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_6/* .Agent.Text */.g6.Text, {
13554
+ children: /*#__PURE__*/ (0,react_jsx_runtime__rspack_import_0.jsx)(_agent_bundle_runtime__rspack_import_8/* .Agent.Text */.g6.Text, {
12965
13555
  children: text
12966
13556
  })
12967
13557
  });
@@ -12994,9 +13584,6 @@ __webpack_require__.r(__webpack_exports__);
12994
13584
 
12995
13585
 
12996
13586
  const config = {
12997
- aliases: [
12998
- 'chat'
12999
- ],
13000
13587
  description: 'Read the most recent messages in a Grok Bot bot or group thread.',
13001
13588
  inputJsonSchema: {
13002
13589
  additionalProperties: false,
@@ -13134,6 +13721,411 @@ __webpack_require__.d(__webpack_exports__, {
13134
13721
  });
13135
13722
 
13136
13723
 
13724
+ },
13725
+ "./src/core/codex/routes.ts"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
13726
+ /* import */ var zod__rspack_import_3 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
13727
+ /* import */ var _codex_bridge_js__rspack_import_0 = __webpack_require__("./src/core/codex-bridge.js");
13728
+ /* import */ var _contract_js__rspack_import_1 = __webpack_require__("./src/core/codex/contract.js");
13729
+ /* import */ var _conversation_js__rspack_import_2 = __webpack_require__("./src/core/codex/conversation.js");
13730
+
13731
+
13732
+
13733
+
13734
+ const id = zod__rspack_import_3/* .string */.YjP().regex(/^[A-Za-z0-9_.:-]{1,128}$/);
13735
+ const observationFields = {
13736
+ expectedCwd: zod__rspack_import_3/* .string */.YjP().min(1).optional(),
13737
+ threadId: id,
13738
+ timeoutMs: zod__rspack_import_3/* .number */.aig().int().min(1).max(600000).optional()
13739
+ };
13740
+ const sendFields = {
13741
+ ...observationFields,
13742
+ correlationId: id.optional(),
13743
+ envelope: zod__rspack_import_3/* .boolean */.zMY().optional(),
13744
+ hop: zod__rspack_import_3/* .number */.aig().int().min(0).optional(),
13745
+ replyTo: id.optional(),
13746
+ expectedTurnId: id.optional(),
13747
+ whenBusy: zod__rspack_import_3/* ["enum"] */.k5n([
13748
+ 'reject',
13749
+ 'queue',
13750
+ 'steer'
13751
+ ]).default('reject'),
13752
+ wait: zod__rspack_import_3/* .boolean */.zMY().default(false),
13753
+ maxOutputBytes: zod__rspack_import_3/* .number */.aig().int().min(1).max(4194304).optional()
13754
+ };
13755
+ const sendSchema = zod__rspack_import_3/* .object */.Ikc({
13756
+ ...sendFields,
13757
+ message: zod__rspack_import_3/* .string */.YjP().min(1).max(4194304)
13758
+ }).strict();
13759
+ const waitSchema = zod__rspack_import_3/* .object */.Ikc({
13760
+ ...observationFields,
13761
+ turnId: id,
13762
+ messageId: id.optional(),
13763
+ maxOutputBytes: zod__rspack_import_3/* .number */.aig().int().min(1).max(4194304).optional()
13764
+ }).strict();
13765
+ const watchSchema = zod__rspack_import_3/* .object */.Ikc({
13766
+ ...observationFields,
13767
+ maxEvents: zod__rspack_import_3/* .number */.aig().int().min(1).max(500).default(100)
13768
+ }).strict();
13769
+ const threadsSchema = zod__rspack_import_3/* .object */.Ikc({
13770
+ limit: zod__rspack_import_3/* .number */.aig().int().min(1).max(200).default(20),
13771
+ cursor: zod__rspack_import_3/* .string */.YjP().min(1).max(4096).optional()
13772
+ }).strict();
13773
+ const resultSchema = zod__rspack_import_3/* .object */.Ikc({
13774
+ exitCode: zod__rspack_import_3/* .number */.aig().int().min(0).max(1),
13775
+ threadId: zod__rspack_import_3/* .string */.YjP().optional(),
13776
+ turnId: zod__rspack_import_3/* .string */.YjP().optional(),
13777
+ messageId: zod__rspack_import_3/* .string */.YjP().optional(),
13778
+ delivery: zod__rspack_import_3/* ["enum"] */.k5n([
13779
+ 'accepted',
13780
+ 'queued',
13781
+ 'rejected',
13782
+ 'unknown'
13783
+ ]).optional(),
13784
+ execution: zod__rspack_import_3/* .object */.Ikc({
13785
+ state: zod__rspack_import_3/* ["enum"] */.k5n([
13786
+ 'completed',
13787
+ 'failed',
13788
+ 'interrupted',
13789
+ 'waiting-for-input',
13790
+ 'timeout',
13791
+ 'disconnected',
13792
+ 'unknown'
13793
+ ]),
13794
+ error: zod__rspack_import_3/* .unknown */.L5J().optional()
13795
+ }).optional(),
13796
+ reply: zod__rspack_import_3/* .object */.Ikc({
13797
+ text: zod__rspack_import_3/* .string */.YjP().max(4194304),
13798
+ items: zod__rspack_import_3/* .array */.YOg(zod__rspack_import_3/* .object */.Ikc({
13799
+ id: zod__rspack_import_3/* .string */.YjP(),
13800
+ type: zod__rspack_import_3/* .literal */.euz('agentMessage'),
13801
+ phase: zod__rspack_import_3/* ["enum"] */.k5n([
13802
+ 'final_answer'
13803
+ ]).nullable(),
13804
+ text: zod__rspack_import_3/* .string */.YjP().max(4194304)
13805
+ })).max(2000),
13806
+ truncated: zod__rspack_import_3/* .boolean */.zMY()
13807
+ }).optional(),
13808
+ interactions: zod__rspack_import_3/* .array */.YOg(zod__rspack_import_3/* .record */.g1P(zod__rspack_import_3/* .string */.YjP(), zod__rspack_import_3/* .unknown */.L5J())).max(500).optional(),
13809
+ events: zod__rspack_import_3/* .array */.YOg(zod__rspack_import_3/* .record */.g1P(zod__rspack_import_3/* .string */.YjP(), zod__rspack_import_3/* .unknown */.L5J())).max(500).optional(),
13810
+ reason: zod__rspack_import_3/* .string */.YjP().optional(),
13811
+ truncated: zod__rspack_import_3/* .boolean */.zMY().optional()
13812
+ }).passthrough();
13813
+ async function sendOperation(input, signal, progress, oneShot = false) {
13814
+ let envelope;
13815
+ let receipt;
13816
+ try {
13817
+ envelope = (0,_codex_bridge_js__rspack_import_0/* .buildEnvelope */.nq)(input);
13818
+ if (oneShot && !input.wait && input.whenBusy !== 'steer') {
13819
+ return await (0,_codex_bridge_js__rspack_import_0/* .sendToCodexThread */.ZS)(input.threadId, input.message, {
13820
+ envelope,
13821
+ whenBusy: input.whenBusy,
13822
+ expectedCwd: input.expectedCwd,
13823
+ signal
13824
+ });
13825
+ }
13826
+ await progress?.('Opening Codex conversation');
13827
+ const conversation = await (0,_conversation_js__rspack_import_2/* .openCodexConversation */.j)(input.threadId, {
13828
+ expectedCwd: input.expectedCwd,
13829
+ signal
13830
+ });
13831
+ try {
13832
+ receipt = await conversation.send(input.message, {
13833
+ envelope,
13834
+ whenBusy: input.whenBusy,
13835
+ expectedTurnId: input.expectedTurnId
13836
+ });
13837
+ if (!input.wait || receipt.delivery !== 'accepted' || !receipt.turnId) return receipt;
13838
+ await progress?.(`Accepted message ${receipt.messageId}; observing turn ${receipt.turnId}`);
13839
+ const result = await conversation.wait({
13840
+ turnId: receipt.turnId,
13841
+ messageId: receipt.messageId,
13842
+ timeoutMs: input.timeoutMs,
13843
+ maxOutputBytes: input.maxOutputBytes,
13844
+ signal
13845
+ });
13846
+ return {
13847
+ ...receipt,
13848
+ execution: result.execution,
13849
+ reply: result.reply,
13850
+ interactions: result.interactions,
13851
+ exitCode: result.execution.state === 'completed' ? 0 : 1
13852
+ };
13853
+ } finally{
13854
+ await conversation.close();
13855
+ }
13856
+ } catch (error) {
13857
+ if (receipt?.delivery === 'accepted') return {
13858
+ ...receipt,
13859
+ execution: {
13860
+ state: 'unknown',
13861
+ error: (0,_contract_js__rspack_import_1/* .outcomeFromError */.DG)(error).error
13862
+ },
13863
+ reply: {
13864
+ text: '',
13865
+ items: [],
13866
+ truncated: true
13867
+ },
13868
+ interactions: [],
13869
+ exitCode: 1
13870
+ };
13871
+ return {
13872
+ ...(0,_contract_js__rspack_import_1/* .outcomeFromError */.DG)(error),
13873
+ threadId: input.threadId,
13874
+ ...envelope ? {
13875
+ messageId: envelope.messageId,
13876
+ correlationId: envelope.correlationId,
13877
+ hop: envelope.hop
13878
+ } : {}
13879
+ };
13880
+ }
13881
+ }
13882
+ async function observeOperation(kind, input, signal, progress) {
13883
+ try {
13884
+ await progress?.(`Observing Codex thread ${input.threadId}`);
13885
+ const conversation = await (0,_conversation_js__rspack_import_2/* .openCodexConversation */.j)(input.threadId, {
13886
+ expectedCwd: input.expectedCwd,
13887
+ signal
13888
+ });
13889
+ try {
13890
+ if (kind === 'wait') {
13891
+ const result = await conversation.wait({
13892
+ ...input,
13893
+ signal
13894
+ });
13895
+ return {
13896
+ ...result,
13897
+ exitCode: result.execution.state === 'completed' ? 0 : 1
13898
+ };
13899
+ }
13900
+ const result = await conversation.watch({
13901
+ ...input,
13902
+ signal
13903
+ });
13904
+ return {
13905
+ ...result,
13906
+ exitCode: [
13907
+ 'timeout',
13908
+ 'event-limit'
13909
+ ].includes(result.reason) ? 0 : 1
13910
+ };
13911
+ } finally{
13912
+ await conversation.close();
13913
+ }
13914
+ } catch (error) {
13915
+ return {
13916
+ ...(0,_contract_js__rspack_import_1/* .outcomeFromError */.DG)(error),
13917
+ threadId: input.threadId,
13918
+ ...'turnId' in input ? {
13919
+ turnId: input.turnId,
13920
+ messageId: input.messageId
13921
+ } : {}
13922
+ };
13923
+ }
13924
+ }
13925
+ async function threadsOperation(input) {
13926
+ try {
13927
+ return {
13928
+ ...await listCodexThreads(input),
13929
+ exitCode: 0
13930
+ };
13931
+ } catch (error) {
13932
+ return outcomeFromError(error);
13933
+ }
13934
+ }
13935
+ function resultText(result) {
13936
+ if (result.execution && typeof result.execution === 'object' && 'state' in result.execution) return `Codex turn ${result.turnId}: ${result.execution.state}`;
13937
+ if (result.delivery === 'queued') return `Queued ${result.queuedSubmissionId} on busy Codex thread ${result.threadId}; message ${result.messageId}`;
13938
+ if (result.error) return String(result.error);
13939
+ if (result.delivery === 'accepted') return `Started turn ${result.turnId} (${result.turnStatus}) on Codex thread ${result.threadId}; message ${result.messageId}`;
13940
+ if (result.delivery) return `Codex delivery ${result.delivery} on thread ${result.threadId}`;
13941
+ if (result.reason) return `Codex observation: ${result.reason}`;
13942
+ if (Array.isArray(result.threads)) return `${result.threads.length} Codex threads`;
13943
+ return String(result.error ?? 'Codex observation complete');
13944
+ }
13945
+
13946
+ __webpack_require__.d(__webpack_exports__, {
13947
+ D6: () => (resultText),
13948
+ UP: () => (sendOperation),
13949
+ gT: () => (observeOperation)
13950
+ }, {
13951
+ FD: resultSchema,
13952
+ R9: watchSchema,
13953
+ at: sendFields,
13954
+ jS: waitSchema
13955
+ });
13956
+
13957
+
13958
+ },
13959
+ "./src/core/relay/routes.ts"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
13960
+ /* import */ var _agent_bundle_runtime__rspack_import_4 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/40.js");
13961
+ /* import */ var zod__rspack_import_3 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
13962
+ /* import */ var _managed_js__rspack_import_0 = __webpack_require__("./src/core/relay/managed.js");
13963
+ /* import */ var _gbot_js__rspack_import_1 = __webpack_require__("./src/gbot.ts");
13964
+ /* import */ var _codex_bridge_js__rspack_import_2 = __webpack_require__("./src/core/codex-bridge.js");
13965
+
13966
+
13967
+
13968
+
13969
+
13970
+ const id = zod__rspack_import_3/* .string */.YjP().min(1).max(128);
13971
+ const routeFields = {
13972
+ codexThreadId: id.optional(),
13973
+ expectedCwd: zod__rspack_import_3/* .string */.YjP().min(1).max(4096).optional(),
13974
+ bindingId: zod__rspack_import_3/* .string */.YjP().min(1).max(512).optional(),
13975
+ requestId: id.optional()
13976
+ };
13977
+ const grokSendSchema = zod__rspack_import_3/* .object */.Ikc({
13978
+ target: zod__rspack_import_3/* .string */.YjP().min(1),
13979
+ message: zod__rspack_import_3/* .string */.YjP().min(1),
13980
+ replyMode: zod__rspack_import_3/* ["enum"] */.k5n([
13981
+ "auto",
13982
+ "manual"
13983
+ ]).optional(),
13984
+ hop: zod__rspack_import_3/* .number */.aig().int().min(0).optional(),
13985
+ correlationId: id.optional(),
13986
+ ...routeFields
13987
+ }).strict();
13988
+ const bridgeStartSchema = zod__rspack_import_3/* .object */.Ikc({
13989
+ grokTarget: zod__rspack_import_3/* .string */.YjP().min(1),
13990
+ codexThreadId: id.optional(),
13991
+ expectedCwd: zod__rspack_import_3/* .string */.YjP().min(1).max(4096).optional(),
13992
+ busyPolicy: zod__rspack_import_3/* ["enum"] */.k5n([
13993
+ "steer",
13994
+ "reject"
13995
+ ]).optional(),
13996
+ requestId: id.optional()
13997
+ }).strict();
13998
+ const bridgeStatusSchema = zod__rspack_import_3/* .object */.Ikc({
13999
+ bindingId: zod__rspack_import_3/* .string */.YjP().min(1).max(512).optional(),
14000
+ limit: zod__rspack_import_3/* .number */.aig().int().min(1).max(100).optional()
14001
+ }).strict();
14002
+ const bridgeStopSchema = zod__rspack_import_3/* .object */.Ikc({
14003
+ bindingId: zod__rspack_import_3/* .string */.YjP().min(1).max(512).optional(),
14004
+ all: zod__rspack_import_3/* .boolean */.zMY().optional(),
14005
+ worker: zod__rspack_import_3/* .boolean */.zMY().optional()
14006
+ }).strict().refine((x)=>!!x.bindingId || x.all === true || x.worker === true, "Specify bindingId, all or worker");
14007
+ const respondSchema = zod__rspack_import_3/* .object */.Ikc({
14008
+ interactionId: zod__rspack_import_3/* .string */.YjP().min(1).max(512),
14009
+ generation: id,
14010
+ threadId: id,
14011
+ turnId: id,
14012
+ bindingId: zod__rspack_import_3/* .string */.YjP().min(1).max(512).optional(),
14013
+ exchangeId: zod__rspack_import_3/* .string */.YjP().min(1).max(512).optional(),
14014
+ decision: zod__rspack_import_3/* ["enum"] */.k5n([
14015
+ "accept",
14016
+ "decline",
14017
+ "cancel"
14018
+ ]).optional(),
14019
+ answersJson: zod__rspack_import_3/* .string */.YjP().min(2).max(65536).optional()
14020
+ }).strict().refine((x)=>!!x.bindingId || !!x.exchangeId, "Binding or exchange scope required").refine((x)=>!!x.decision !== !!x.answersJson, "Supply decision or answersJson");
14021
+ const answersSchema = zod__rspack_import_3/* .record */.g1P(zod__rspack_import_3/* .string */.YjP().min(1).max(128), zod__rspack_import_3/* .object */.Ikc({
14022
+ answers: zod__rspack_import_3/* .array */.YOg(zod__rspack_import_3/* .string */.YjP().max(8192)).max(20)
14023
+ }).strict());
14024
+ const relayResultSchema = zod__rspack_import_3/* .record */.g1P(zod__rspack_import_3/* .string */.YjP(), zod__rspack_import_3/* .json */.Pq9());
14025
+ function nativeCodexThread(context) {
14026
+ return context.host.state === "available" && (0,_agent_bundle_runtime__rspack_import_4/* .lineageHostFromClient */.bg)(context.host.value.name) === "codex" && context.lineage.state === "available" && context.lineage.source === "native" && context.lineage.value.resolution === "native" ? context.lineage.value.conversation : undefined;
14027
+ }
14028
+ function options(context) {
14029
+ return {
14030
+ pluginRoot: context?.plugin.state === "available" ? context.plugin.value.root : undefined,
14031
+ signal: context?.signal
14032
+ };
14033
+ }
14034
+ function destination(input, context) {
14035
+ const codexThreadId = input.codexThreadId ?? (context ? nativeCodexThread(context) : undefined);
14036
+ // Native workspace evidence belongs to the invocation, not the plugin installation directory.
14037
+ const workspace = context?.workspace;
14038
+ const expectedCwd = input.expectedCwd ?? (workspace?.state === "available" && workspace.source === "native" ? workspace.value.root : undefined);
14039
+ return {
14040
+ codexThreadId,
14041
+ expectedCwd
14042
+ };
14043
+ }
14044
+ async function grokSendOperation(input, context) {
14045
+ const route = destination(input, input.bindingId ? undefined : context);
14046
+ if (input.replyMode !== "manual" && (input.bindingId || route.codexThreadId)) return (0,_gbot_js__rspack_import_1/* .withRedactedErrors */.yF)(()=>(0,_managed_js__rspack_import_0/* .managedOperation */.Bb)("sendToGrok", {
14047
+ grokTarget: input.target,
14048
+ message: input.message,
14049
+ hop: input.hop,
14050
+ correlationId: input.correlationId,
14051
+ ...route,
14052
+ ...input.bindingId ? {
14053
+ bindingId: input.bindingId
14054
+ } : {},
14055
+ ...input.requestId ? {
14056
+ requestId: input.requestId
14057
+ } : {}
14058
+ }, options(context)));
14059
+ if (input.replyMode === "auto") throw Error("Automatic reply delivery requires a native Codex source, codexThreadId or bindingId");
14060
+ const message = input.hop !== undefined || input.correlationId !== undefined ? (0,_codex_bridge_js__rspack_import_2/* .withEnvelopeHeader */.Mr)(input.message, (0,_codex_bridge_js__rspack_import_2/* .buildEnvelope */.nq)(input)) : input.message;
14061
+ const sent = await (0,_gbot_js__rspack_import_1/* .withRedactedErrors */.yF)(async ()=>(0,_gbot_js__rspack_import_1/* .sendPrompt */.LV)(await (0,_gbot_js__rspack_import_1/* .connectGateway */.Vq)(), input.target, message));
14062
+ return {
14063
+ result: sent.result,
14064
+ target: (0,_gbot_js__rspack_import_1/* .summarizeTarget */.rW)(sent.target),
14065
+ delivery: sent.delivery === "accepted" ? "accepted" : "unknown",
14066
+ ...sent.delivery === "accepted" && typeof sent.messageId === "string" ? {
14067
+ messageId: sent.messageId
14068
+ } : {},
14069
+ replyRoute: {
14070
+ mode: "manual",
14071
+ reason: input.replyMode === "manual" ? "requested" : "source-unavailable"
14072
+ }
14073
+ };
14074
+ }
14075
+ async function bridgeOperation(method, input, context) {
14076
+ let routed = method === "startBinding" ? {
14077
+ ...input,
14078
+ ...destination(input, context)
14079
+ } : input;
14080
+ if (method === "respond") {
14081
+ const { decision, answersJson, ...scope } = respondSchema.parse(input);
14082
+ routed = {
14083
+ ...scope,
14084
+ result: decision ? {
14085
+ decision
14086
+ } : {
14087
+ answers: answersSchema.parse(JSON.parse(answersJson))
14088
+ }
14089
+ };
14090
+ }
14091
+ if (method === "startBinding" && !routed.codexThreadId) throw Error("Specify codexThreadId when native Codex source identity is unavailable");
14092
+ return (0,_gbot_js__rspack_import_1/* .withRedactedErrors */.yF)(()=>(0,_managed_js__rspack_import_0/* .managedOperation */.Bb)(method, routed, options(context)));
14093
+ }
14094
+ function assertManagedSendOptions(input) {
14095
+ if (input.expectedTurnId !== undefined) throw Error("Managed relay does not support expectedTurnId; omit it to use managed guarded steering, or use a plain Codex send for an explicit turn guard");
14096
+ if (input.replyTo !== undefined || input.envelope === true) throw Error("Managed relay does not support legacy replyTo/envelope options; omit them or use a plain send. Use hop/correlationId for explicit managed chains");
14097
+ }
14098
+ async function codexReturnOperation(input, context) {
14099
+ assertManagedSendOptions(input);
14100
+ if (input.whenBusy === "queue") throw Error("Managed relay supports steer or reject, not experimental queue");
14101
+ return (0,_gbot_js__rspack_import_1/* .withRedactedErrors */.yF)(()=>(0,_managed_js__rspack_import_0/* .managedOperation */.Bb)("sendToCodex", {
14102
+ grokTarget: input.replyToGrok,
14103
+ codexThreadId: input.threadId,
14104
+ expectedCwd: input.expectedCwd,
14105
+ bindingId: input.bindingId,
14106
+ message: input.message,
14107
+ requestId: input.requestId,
14108
+ busyPolicy: input.whenBusy,
14109
+ hop: input.hop,
14110
+ correlationId: input.correlationId
14111
+ }, options(context)));
14112
+ }
14113
+
14114
+ __webpack_require__.d(__webpack_exports__, {
14115
+ MB: () => (assertManagedSendOptions),
14116
+ bv: () => (grokSendOperation),
14117
+ lt: () => (codexReturnOperation),
14118
+ n1: () => (bridgeOperation)
14119
+ }, {
14120
+ Ax: relayResultSchema,
14121
+ d5: bridgeStopSchema,
14122
+ np: bridgeStatusSchema,
14123
+ v1: respondSchema,
14124
+ xD: bridgeStartSchema,
14125
+ zK: routeFields
14126
+ });
14127
+
14128
+
13137
14129
  },
13138
14130
  "./src/gbot.ts"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
13139
14131
  /* import */ var zod__rspack_import_2 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
@@ -13146,7 +14138,7 @@ __webpack_require__.d(__webpack_exports__, {
13146
14138
 
13147
14139
  // Hosts and the CLI print thrown error text (and stack), and a fetch or proxy failure can echo
13148
14140
  // a credential. Rewrap with a redacted message; keep `name` and own fields such as `reason`,
13149
- // `delivery`, `mode`, and `envelope` so outcome documents still classify the failure.
14141
+ // `delivery`, `mode`, and correlation ids so outcome documents still classify the failure.
13150
14142
  const withRedactedErrors = async (run)=>{
13151
14143
  try {
13152
14144
  return await run();
@@ -13238,7 +14230,10 @@ const transcriptEntries = (transcript)=>{
13238
14230
  };
13239
14231
 
13240
14232
  __webpack_require__.d(__webpack_exports__, {
14233
+ LV: () => (/* reexport safe */ _core_gateway_js__rspack_import_0.LV),
14234
+ Vq: () => (/* reexport safe */ _core_gateway_js__rspack_import_0.Vq)
13241
14235
  }, {
14236
+ rW: summarizeTarget,
13242
14237
  yF: withRedactedErrors
13243
14238
  });
13244
14239
 
@@ -13279,12 +14274,6 @@ module.exports = __rspack_external_node_fs_1b05aee1;
13279
14274
  module.exports = __rspack_external_node_fs_promises_3b710708;
13280
14275
 
13281
14276
 
13282
- },
13283
- "node:module"(module) {
13284
-
13285
- module.exports = __rspack_external_node_module_9de3fa2f;
13286
-
13287
-
13288
14277
  },
13289
14278
  "node:net"(module) {
13290
14279
 
@@ -13309,6 +14298,12 @@ module.exports = __rspack_external_node_path_806ed179;
13309
14298
  module.exports = __rspack_external_node_readline_d8f53bef;
13310
14299
 
13311
14300
 
14301
+ },
14302
+ "node:string_decoder"(module) {
14303
+
14304
+ module.exports = __rspack_external_node_string_decoder_69b9bd04;
14305
+
14306
+
13312
14307
  },
13313
14308
  "node:url"(module) {
13314
14309
 
@@ -14022,6 +15017,195 @@ __webpack_require__.d(__webpack_exports__, {
14022
15017
  });
14023
15018
 
14024
15019
 
15020
+ },
15021
+ "./node_modules/@agent-bundle/runtime/dist/40.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
15022
+ /* import */ var node_fs_promises__rspack_import_0 = __webpack_require__("node:fs/promises");
15023
+
15024
+
15025
+ const CODEX_ROLLOUT_HEAD_BYTES = 1048576;
15026
+ const ROLLOUT_BASENAME = /rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-([0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})\.jsonl$/iu;
15027
+ const codexThreadFromRolloutPath = (path)=>{
15028
+ if (void 0 === path) return;
15029
+ const match = ROLLOUT_BASENAME.exec(path);
15030
+ return match?.[1]?.toLowerCase();
15031
+ };
15032
+ const record = (value)=>null === value || 'object' != typeof value || Array.isArray(value) ? void 0 : value;
15033
+ const codex_rollout_text = (value)=>'string' == typeof value && '' !== value.trim() ? value : void 0;
15034
+ const parseCodexRolloutMeta = (head)=>{
15035
+ const newline = head.indexOf('\n');
15036
+ const line = (-1 === newline ? head : head.slice(0, newline)).trim();
15037
+ if ('' === line) return;
15038
+ let parsed;
15039
+ try {
15040
+ parsed = JSON.parse(line);
15041
+ } catch {
15042
+ return;
15043
+ }
15044
+ const item = record(parsed);
15045
+ if (item?.['type'] !== 'session_meta') return;
15046
+ const payload = record(item['payload']);
15047
+ const thread = codex_rollout_text(payload?.['id']);
15048
+ if (void 0 === payload || void 0 === thread) return;
15049
+ const root = codex_rollout_text(payload['session_id']);
15050
+ const source = record(payload['source']);
15051
+ const subagent = record(source?.['subagent']);
15052
+ if (void 0 === subagent) {
15053
+ const kind = codex_rollout_text(source?.['subagent']);
15054
+ return {
15055
+ ...void 0 === kind ? {} : {
15056
+ subagentKind: kind
15057
+ },
15058
+ ...void 0 === root ? {} : {
15059
+ root
15060
+ },
15061
+ thread
15062
+ };
15063
+ }
15064
+ const [subagentKind] = Object.keys(subagent);
15065
+ const spawn = record(subagent['thread_spawn']);
15066
+ const parent = codex_rollout_text(spawn?.['parent_thread_id']) ?? codex_rollout_text(payload['parent_thread_id']);
15067
+ const rawDepth = spawn?.['depth'];
15068
+ const depth = 'number' == typeof rawDepth && Number.isInteger(rawDepth) && rawDepth > 0 ? rawDepth : void 0;
15069
+ const agentPath = codex_rollout_text(spawn?.['agent_path']) ?? codex_rollout_text(payload['agent_path']);
15070
+ return {
15071
+ ...void 0 === agentPath ? {} : {
15072
+ agentPath
15073
+ },
15074
+ ...void 0 === depth ? {} : {
15075
+ depth
15076
+ },
15077
+ ...void 0 === parent ? {} : {
15078
+ parent
15079
+ },
15080
+ ...void 0 === root ? {} : {
15081
+ root
15082
+ },
15083
+ ...void 0 === subagentKind ? {} : {
15084
+ subagentKind
15085
+ },
15086
+ thread
15087
+ };
15088
+ };
15089
+ const readCodexRolloutHead = async (path)=>{
15090
+ let handle;
15091
+ try {
15092
+ handle = await promises_open(path, 'r');
15093
+ const buffer = Buffer.allocUnsafe(CODEX_ROLLOUT_HEAD_BYTES);
15094
+ let filled = 0;
15095
+ while(filled < buffer.length){
15096
+ const { bytesRead } = await handle.read(buffer, filled, buffer.length - filled, filled);
15097
+ if (0 === bytesRead) break;
15098
+ const newline = buffer.subarray(filled, filled + bytesRead).indexOf(0x0a);
15099
+ if (-1 !== newline) {
15100
+ filled += newline;
15101
+ break;
15102
+ }
15103
+ filled += bytesRead;
15104
+ }
15105
+ return buffer.subarray(0, filled).toString('utf8');
15106
+ } catch {
15107
+ return;
15108
+ } finally{
15109
+ await handle?.close().catch(()=>void 0);
15110
+ }
15111
+ };
15112
+ const readCodexSpawnLineage = async (path, thread, read = readCodexRolloutHead)=>{
15113
+ if (void 0 === path) return;
15114
+ const head = await read(path);
15115
+ if (void 0 === head) return;
15116
+ const meta = parseCodexRolloutMeta(head);
15117
+ if (void 0 === meta || meta.thread !== thread || void 0 === meta.parent || void 0 === meta.depth) return;
15118
+ return {
15119
+ ...meta,
15120
+ depth: meta.depth,
15121
+ parent: meta.parent
15122
+ };
15123
+ };
15124
+ const nativeString = (native, key)=>{
15125
+ const value = native[key];
15126
+ return 'string' == typeof value && '' !== value.trim() ? value : void 0;
15127
+ };
15128
+ const lineageHostFromClient = (clientName)=>{
15129
+ if (void 0 === clientName) return;
15130
+ if (clientName.startsWith('claude')) return 'claude';
15131
+ if (clientName.startsWith('codex')) return 'codex';
15132
+ if (clientName.startsWith('cursor')) return 'cursor';
15133
+ };
15134
+ const lineageCarrier = (host, native)=>{
15135
+ switch(host){
15136
+ case 'claude':
15137
+ return {
15138
+ conversation: nativeString(native, 'agent_id') ?? nativeString(native, 'session_id'),
15139
+ generation: nativeString(native, 'prompt_id'),
15140
+ root: nativeString(native, 'session_id')
15141
+ };
15142
+ case 'codex':
15143
+ return {
15144
+ conversation: nativeString(native, 'agent_id') ?? nativeString(native, 'session_id'),
15145
+ generation: nativeString(native, 'turn_id'),
15146
+ root: nativeString(native, 'session_id')
15147
+ };
15148
+ case 'cursor':
15149
+ return {
15150
+ conversation: nativeString(native, 'conversation_id') ?? nativeString(native, 'session_id'),
15151
+ generation: nativeString(native, 'generation_id'),
15152
+ root: void 0
15153
+ };
15154
+ default:
15155
+ {
15156
+ const unreachable = host;
15157
+ throw new Error(`Unhandled lineage host ${String(unreachable)}`);
15158
+ }
15159
+ }
15160
+ };
15161
+ const resolveNativeLineage = (host, native)=>{
15162
+ const carrier = lineageCarrier(host, native);
15163
+ if ('cursor' === host || void 0 === carrier.conversation || void 0 === carrier.root) return unavailable('no-shared-runtime');
15164
+ if (carrier.conversation !== carrier.root) return unavailable('no-shared-runtime');
15165
+ return available({
15166
+ conversation: carrier.root,
15167
+ depth: 0,
15168
+ ...void 0 === carrier.generation ? {} : {
15169
+ generation: carrier.generation
15170
+ },
15171
+ resolution: 'native',
15172
+ root: carrier.root
15173
+ }, 'native');
15174
+ };
15175
+ const resolveStandaloneLineage = async (host, native, read)=>{
15176
+ const fromPayload = resolveNativeLineage(host, native);
15177
+ if ('codex' !== host || 'available' === fromPayload.state) return fromPayload;
15178
+ const carrier = lineageCarrier(host, native);
15179
+ if (void 0 === carrier.conversation || void 0 === carrier.root) return fromPayload;
15180
+ const ownRollout = 'SubagentStop' === nativeString(native, 'hook_event_name') ? nativeString(native, "agent_transcript_path") : nativeString(native, "transcript_path");
15181
+ const spawn = await readCodexSpawnLineage(ownRollout, carrier.conversation, read);
15182
+ if (void 0 === spawn) return fromPayload;
15183
+ const type = nativeString(native, 'agent_type');
15184
+ return available({
15185
+ conversation: carrier.conversation,
15186
+ depth: spawn.depth,
15187
+ ...void 0 === carrier.generation ? {} : {
15188
+ generation: carrier.generation
15189
+ },
15190
+ parent: spawn.parent,
15191
+ resolution: "transcript",
15192
+ root: carrier.root,
15193
+ subagent: {
15194
+ id: carrier.conversation,
15195
+ ...void 0 === type ? {} : {
15196
+ type
15197
+ }
15198
+ }
15199
+ }, 'derived');
15200
+ };
15201
+
15202
+
15203
+ __webpack_require__.d(__webpack_exports__, {
15204
+ }, {
15205
+ bg: lineageHostFromClient
15206
+ });
15207
+
15208
+
14025
15209
  },
14026
15210
  "./node_modules/@agent-bundle/runtime/dist/49.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
14027
15211
  /* import */ var node_crypto__rspack_import_0 = __webpack_require__("node:crypto");
@@ -14502,6 +15686,7 @@ const providerRequest = ({ notices, state, ...axes })=>Object.freeze({
14502
15686
  __webpack_require__.d(__webpack_exports__, {
14503
15687
  r8: () => (AgentRequestError)
14504
15688
  }, {
15689
+ MA: agent,
14505
15690
  hU: unavailable,
14506
15691
  iC: runAgentRequest,
14507
15692
  qC: available
@@ -74603,6 +75788,7 @@ function preprocess(fn, schema) {
74603
75788
  __webpack_require__.d(__webpack_exports__, {
74604
75789
  Ikc: () => (object),
74605
75790
  KCZ: () => (union),
75791
+ L5J: () => (unknown),
74606
75792
  Pq9: () => (json),
74607
75793
  YOg: () => (array),
74608
75794
  YjP: () => (string),
@@ -82880,9 +84066,9 @@ __webpack_require__.d(__webpack_exports__, {
82880
84066
  __webpack_require__.a(__webpack_module__, async function (__rspack_load_async_deps, __rspack_async_done) { try {
82881
84067
  /* import */ var agent_bundle_launch_env_layer__rspack_import_0 = __webpack_require__("./.agent-bundle-virtual/bin-gbot-0.mjs");
82882
84068
  /* import */ var agent_bundle_cli_entry__rspack_import_1 = __webpack_require__("./node_modules/agent-bundle/dist/cli-entry.js");
82883
- /* import */ var _agent_bundle_runtime__rspack_import_27 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/49.js");
82884
- /* import */ var _agent_bundle_runtime__rspack_import_28 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
82885
- /* import */ var _agent_bundle_runtime__rspack_import_29 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/index.js");
84069
+ /* import */ var _agent_bundle_runtime__rspack_import_34 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/49.js");
84070
+ /* import */ var _agent_bundle_runtime__rspack_import_35 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/736.js");
84071
+ /* import */ var _agent_bundle_runtime__rspack_import_36 = __webpack_require__("./node_modules/@agent-bundle/runtime/dist/index.js");
82886
84072
  /* import */ var node_url__rspack_import_2 = __webpack_require__("node:url");
82887
84073
  /* import */ var node_worker_threads__rspack_import_3 = __webpack_require__("node:worker_threads");
82888
84074
  /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_bots_create_tsx__rspack_import_4 = __webpack_require__("./src/cli/bots/create.tsx");
@@ -82890,24 +84076,31 @@ __webpack_require__.a(__webpack_module__, async function (__rspack_load_async_de
82890
84076
  /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_bots_get_tsx__rspack_import_6 = __webpack_require__("./src/cli/bots/get.tsx");
82891
84077
  /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_bots_list_tsx__rspack_import_7 = __webpack_require__("./src/cli/bots/list.tsx");
82892
84078
  /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_bots_update_tsx__rspack_import_8 = __webpack_require__("./src/cli/bots/update.tsx");
82893
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_desktop_shim_tsx__rspack_import_9 = __webpack_require__("./src/cli/codex/desktop-shim.tsx");
82894
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_list_threads_tsx__rspack_import_10 = __webpack_require__("./src/cli/codex/list-threads.tsx");
82895
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_queue_tsx__rspack_import_11 = __webpack_require__("./src/cli/codex/queue.tsx");
82896
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_send_tsx__rspack_import_12 = __webpack_require__("./src/cli/codex/send.tsx");
82897
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_status_tsx__rspack_import_13 = __webpack_require__("./src/cli/codex/status.tsx");
82898
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_doctor_tsx__rspack_import_14 = __webpack_require__("./src/cli/doctor.tsx");
82899
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_add_tsx__rspack_import_15 = __webpack_require__("./src/cli/groups/add.tsx");
82900
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_create_tsx__rspack_import_16 = __webpack_require__("./src/cli/groups/create.tsx");
82901
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_delete_tsx__rspack_import_17 = __webpack_require__("./src/cli/groups/delete.tsx");
82902
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_get_tsx__rspack_import_18 = __webpack_require__("./src/cli/groups/get.tsx");
82903
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_list_tsx__rspack_import_19 = __webpack_require__("./src/cli/groups/list.tsx");
82904
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_members_tsx__rspack_import_20 = __webpack_require__("./src/cli/groups/members.tsx");
82905
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_remove_tsx__rspack_import_21 = __webpack_require__("./src/cli/groups/remove.tsx");
82906
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_set_tsx__rspack_import_22 = __webpack_require__("./src/cli/groups/set.tsx");
82907
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_update_tsx__rspack_import_23 = __webpack_require__("./src/cli/groups/update.tsx");
82908
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_history_tsx__rspack_import_24 = __webpack_require__("./src/cli/history.tsx");
82909
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_send_tsx__rspack_import_25 = __webpack_require__("./src/cli/send.tsx");
82910
- /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_thread_tsx__rspack_import_26 = __webpack_require__("./src/cli/thread.tsx");
84079
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_respond_tsx__rspack_import_9 = __webpack_require__("./src/cli/codex/bridge/respond.tsx");
84080
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_run_tsx__rspack_import_10 = __webpack_require__("./src/cli/codex/bridge/run.tsx");
84081
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_start_tsx__rspack_import_11 = __webpack_require__("./src/cli/codex/bridge/start.tsx");
84082
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_status_tsx__rspack_import_12 = __webpack_require__("./src/cli/codex/bridge/status.tsx");
84083
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_stop_tsx__rspack_import_13 = __webpack_require__("./src/cli/codex/bridge/stop.tsx");
84084
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_desktop_shim_tsx__rspack_import_14 = __webpack_require__("./src/cli/codex/desktop-shim.tsx");
84085
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_list_threads_tsx__rspack_import_15 = __webpack_require__("./src/cli/codex/list-threads.tsx");
84086
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_queue_tsx__rspack_import_16 = __webpack_require__("./src/cli/codex/queue.tsx");
84087
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_send_tsx__rspack_import_17 = __webpack_require__("./src/cli/codex/send.tsx");
84088
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_status_tsx__rspack_import_18 = __webpack_require__("./src/cli/codex/status.tsx");
84089
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_wait_tsx__rspack_import_19 = __webpack_require__("./src/cli/codex/wait.tsx");
84090
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_watch_tsx__rspack_import_20 = __webpack_require__("./src/cli/codex/watch.tsx");
84091
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_doctor_tsx__rspack_import_21 = __webpack_require__("./src/cli/doctor.tsx");
84092
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_add_tsx__rspack_import_22 = __webpack_require__("./src/cli/groups/add.tsx");
84093
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_create_tsx__rspack_import_23 = __webpack_require__("./src/cli/groups/create.tsx");
84094
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_delete_tsx__rspack_import_24 = __webpack_require__("./src/cli/groups/delete.tsx");
84095
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_get_tsx__rspack_import_25 = __webpack_require__("./src/cli/groups/get.tsx");
84096
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_list_tsx__rspack_import_26 = __webpack_require__("./src/cli/groups/list.tsx");
84097
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_members_tsx__rspack_import_27 = __webpack_require__("./src/cli/groups/members.tsx");
84098
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_remove_tsx__rspack_import_28 = __webpack_require__("./src/cli/groups/remove.tsx");
84099
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_set_tsx__rspack_import_29 = __webpack_require__("./src/cli/groups/set.tsx");
84100
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_update_tsx__rspack_import_30 = __webpack_require__("./src/cli/groups/update.tsx");
84101
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_history_tsx__rspack_import_31 = __webpack_require__("./src/cli/history.tsx");
84102
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_send_tsx__rspack_import_32 = __webpack_require__("./src/cli/send.tsx");
84103
+ /* import */ var _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_thread_tsx__rspack_import_33 = __webpack_require__("./src/cli/thread.tsx");
82911
84104
 
82912
84105
 
82913
84106
 
@@ -82924,42 +84117,56 @@ const route3 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok
82924
84117
 
82925
84118
  const route4 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_bots_update_tsx__rspack_import_8, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_bots_update_tsx__rspack_import_8);
82926
84119
 
82927
- const route5 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_desktop_shim_tsx__rspack_import_9, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_desktop_shim_tsx__rspack_import_9);
84120
+ const route5 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_respond_tsx__rspack_import_9, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_respond_tsx__rspack_import_9);
84121
+
84122
+ const route6 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_run_tsx__rspack_import_10, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_run_tsx__rspack_import_10);
84123
+
84124
+ const route7 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_start_tsx__rspack_import_11, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_start_tsx__rspack_import_11);
84125
+
84126
+ const route8 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_status_tsx__rspack_import_12, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_status_tsx__rspack_import_12);
84127
+
84128
+ const route9 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_stop_tsx__rspack_import_13, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_bridge_stop_tsx__rspack_import_13);
82928
84129
 
82929
- const route6 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_list_threads_tsx__rspack_import_10, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_list_threads_tsx__rspack_import_10);
84130
+ const route10 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_desktop_shim_tsx__rspack_import_14, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_desktop_shim_tsx__rspack_import_14);
82930
84131
 
82931
- const route7 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_queue_tsx__rspack_import_11, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_queue_tsx__rspack_import_11);
84132
+ const route11 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_list_threads_tsx__rspack_import_15, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_list_threads_tsx__rspack_import_15);
82932
84133
 
82933
- const route8 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_send_tsx__rspack_import_12, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_send_tsx__rspack_import_12);
84134
+ const route12 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_queue_tsx__rspack_import_16, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_queue_tsx__rspack_import_16);
82934
84135
 
82935
- const route9 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_status_tsx__rspack_import_13, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_status_tsx__rspack_import_13);
84136
+ const route13 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_send_tsx__rspack_import_17, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_send_tsx__rspack_import_17);
82936
84137
 
82937
- const route10 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_doctor_tsx__rspack_import_14, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_doctor_tsx__rspack_import_14);
84138
+ const route14 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_status_tsx__rspack_import_18, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_status_tsx__rspack_import_18);
82938
84139
 
82939
- const route11 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_add_tsx__rspack_import_15, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_add_tsx__rspack_import_15);
84140
+ const route15 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_wait_tsx__rspack_import_19, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_wait_tsx__rspack_import_19);
82940
84141
 
82941
- const route12 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_create_tsx__rspack_import_16, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_create_tsx__rspack_import_16);
84142
+ const route16 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_watch_tsx__rspack_import_20, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_codex_watch_tsx__rspack_import_20);
82942
84143
 
82943
- const route13 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_delete_tsx__rspack_import_17, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_delete_tsx__rspack_import_17);
84144
+ const route17 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_doctor_tsx__rspack_import_21, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_doctor_tsx__rspack_import_21);
82944
84145
 
82945
- const route14 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_get_tsx__rspack_import_18, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_get_tsx__rspack_import_18);
84146
+ const route18 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_add_tsx__rspack_import_22, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_add_tsx__rspack_import_22);
82946
84147
 
82947
- const route15 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_list_tsx__rspack_import_19, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_list_tsx__rspack_import_19);
84148
+ const route19 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_create_tsx__rspack_import_23, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_create_tsx__rspack_import_23);
82948
84149
 
82949
- const route16 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_members_tsx__rspack_import_20, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_members_tsx__rspack_import_20);
84150
+ const route20 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_delete_tsx__rspack_import_24, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_delete_tsx__rspack_import_24);
82950
84151
 
82951
- const route17 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_remove_tsx__rspack_import_21, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_remove_tsx__rspack_import_21);
84152
+ const route21 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_get_tsx__rspack_import_25, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_get_tsx__rspack_import_25);
82952
84153
 
82953
- const route18 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_set_tsx__rspack_import_22, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_set_tsx__rspack_import_22);
84154
+ const route22 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_list_tsx__rspack_import_26, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_list_tsx__rspack_import_26);
82954
84155
 
82955
- const route19 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_update_tsx__rspack_import_23, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_update_tsx__rspack_import_23);
84156
+ const route23 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_members_tsx__rspack_import_27, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_members_tsx__rspack_import_27);
82956
84157
 
82957
- const route20 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_history_tsx__rspack_import_24, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_history_tsx__rspack_import_24);
84158
+ const route24 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_remove_tsx__rspack_import_28, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_remove_tsx__rspack_import_28);
82958
84159
 
82959
- const route21 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_send_tsx__rspack_import_25, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_send_tsx__rspack_import_25);
84160
+ const route25 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_set_tsx__rspack_import_29, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_set_tsx__rspack_import_29);
82960
84161
 
82961
- const route22 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_thread_tsx__rspack_import_26, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_thread_tsx__rspack_import_26);
82962
- const pluginRoot = (0,_agent_bundle_runtime__rspack_import_27/* .resolvePluginRoot */.E7)({
84162
+ const route26 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_update_tsx__rspack_import_30, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_groups_update_tsx__rspack_import_30);
84163
+
84164
+ const route27 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_history_tsx__rspack_import_31, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_history_tsx__rspack_import_31);
84165
+
84166
+ const route28 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_send_tsx__rspack_import_32, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_send_tsx__rspack_import_32);
84167
+
84168
+ const route29 = Object.assign({}, Reflect.get(_home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_thread_tsx__rspack_import_33, 'default'), _home_runner_work_grok_bot_cli_grok_bot_cli_src_cli_thread_tsx__rspack_import_33);
84169
+ const pluginRoot = (0,_agent_bundle_runtime__rspack_import_34/* .resolvePluginRoot */.E7)({
82963
84170
  fallback: (0,node_url__rspack_import_2.fileURLToPath)(new URL('..', import.meta.url)),
82964
84171
  stateAnchor: 'user-data'
82965
84172
  });
@@ -82984,59 +84191,80 @@ const routes = Object.freeze({
82984
84191
  "cli:bots/update": Object.freeze({
82985
84192
  module: route4
82986
84193
  }),
82987
- "cli:codex/desktop-shim": Object.freeze({
84194
+ "cli:codex/bridge/respond": Object.freeze({
82988
84195
  module: route5
82989
84196
  }),
82990
- "cli:codex/list-threads": Object.freeze({
84197
+ "cli:codex/bridge/run": Object.freeze({
82991
84198
  module: route6
82992
84199
  }),
82993
- "cli:codex/queue": Object.freeze({
84200
+ "cli:codex/bridge/start": Object.freeze({
82994
84201
  module: route7
82995
84202
  }),
82996
- "cli:codex/send": Object.freeze({
84203
+ "cli:codex/bridge/status": Object.freeze({
82997
84204
  module: route8
82998
84205
  }),
82999
- "cli:codex/status": Object.freeze({
84206
+ "cli:codex/bridge/stop": Object.freeze({
83000
84207
  module: route9
83001
84208
  }),
83002
- "cli:doctor": Object.freeze({
84209
+ "cli:codex/desktop-shim": Object.freeze({
83003
84210
  module: route10
83004
84211
  }),
83005
- "cli:groups/add": Object.freeze({
84212
+ "cli:codex/list-threads": Object.freeze({
83006
84213
  module: route11
83007
84214
  }),
83008
- "cli:groups/create": Object.freeze({
84215
+ "cli:codex/queue": Object.freeze({
83009
84216
  module: route12
83010
84217
  }),
83011
- "cli:groups/delete": Object.freeze({
84218
+ "cli:codex/send": Object.freeze({
83012
84219
  module: route13
83013
84220
  }),
83014
- "cli:groups/get": Object.freeze({
84221
+ "cli:codex/status": Object.freeze({
83015
84222
  module: route14
83016
84223
  }),
83017
- "cli:groups/list": Object.freeze({
84224
+ "cli:codex/wait": Object.freeze({
83018
84225
  module: route15
83019
84226
  }),
83020
- "cli:groups/members": Object.freeze({
84227
+ "cli:codex/watch": Object.freeze({
83021
84228
  module: route16
83022
84229
  }),
83023
- "cli:groups/remove": Object.freeze({
84230
+ "cli:doctor": Object.freeze({
83024
84231
  module: route17
83025
84232
  }),
83026
- "cli:groups/set": Object.freeze({
84233
+ "cli:groups/add": Object.freeze({
83027
84234
  module: route18
83028
84235
  }),
83029
- "cli:groups/update": Object.freeze({
84236
+ "cli:groups/create": Object.freeze({
83030
84237
  module: route19
83031
84238
  }),
83032
- "cli:history": Object.freeze({
84239
+ "cli:groups/delete": Object.freeze({
83033
84240
  module: route20
83034
84241
  }),
83035
- "cli:send": Object.freeze({
84242
+ "cli:groups/get": Object.freeze({
83036
84243
  module: route21
83037
84244
  }),
83038
- "cli:thread": Object.freeze({
84245
+ "cli:groups/list": Object.freeze({
83039
84246
  module: route22
84247
+ }),
84248
+ "cli:groups/members": Object.freeze({
84249
+ module: route23
84250
+ }),
84251
+ "cli:groups/remove": Object.freeze({
84252
+ module: route24
84253
+ }),
84254
+ "cli:groups/set": Object.freeze({
84255
+ module: route25
84256
+ }),
84257
+ "cli:groups/update": Object.freeze({
84258
+ module: route26
84259
+ }),
84260
+ "cli:history": Object.freeze({
84261
+ module: route27
84262
+ }),
84263
+ "cli:send": Object.freeze({
84264
+ module: route28
84265
+ }),
84266
+ "cli:thread": Object.freeze({
84267
+ module: route29
83040
84268
  })
83041
84269
  });
83042
84270
  const commands = Object.freeze([
@@ -83336,6 +84564,224 @@ const commands = Object.freeze([
83336
84564
  "rendered": true,
83337
84565
  "routeId": "cli:bots/update"
83338
84566
  },
84567
+ {
84568
+ "aliases": [],
84569
+ "description": "Managed Grok/Codex bridge respond.",
84570
+ "exitCode": "result",
84571
+ "options": [
84572
+ {
84573
+ "description": "JSON object mapping each advertised question ID to {\"answers\":[\"answer\"]}; exact IDs required.",
84574
+ "key": "answersJson",
84575
+ "kind": "string",
84576
+ "option": "answers-json",
84577
+ "repeated": false,
84578
+ "required": false
84579
+ },
84580
+ {
84581
+ "key": "bindingId",
84582
+ "kind": "string",
84583
+ "option": "binding-id",
84584
+ "repeated": false,
84585
+ "required": false
84586
+ },
84587
+ {
84588
+ "choices": [
84589
+ "accept",
84590
+ "decline",
84591
+ "cancel"
84592
+ ],
84593
+ "key": "decision",
84594
+ "kind": "enum",
84595
+ "option": "decision",
84596
+ "repeated": false,
84597
+ "required": false
84598
+ },
84599
+ {
84600
+ "key": "exchangeId",
84601
+ "kind": "string",
84602
+ "option": "exchange-id",
84603
+ "repeated": false,
84604
+ "required": false
84605
+ },
84606
+ {
84607
+ "key": "generation",
84608
+ "kind": "string",
84609
+ "option": "generation",
84610
+ "repeated": false,
84611
+ "required": true
84612
+ },
84613
+ {
84614
+ "key": "interactionId",
84615
+ "kind": "string",
84616
+ "option": "interaction-id",
84617
+ "repeated": false,
84618
+ "required": true
84619
+ },
84620
+ {
84621
+ "key": "threadId",
84622
+ "kind": "string",
84623
+ "option": "thread-id",
84624
+ "repeated": false,
84625
+ "required": true
84626
+ },
84627
+ {
84628
+ "key": "turnId",
84629
+ "kind": "string",
84630
+ "option": "turn-id",
84631
+ "repeated": false,
84632
+ "required": true
84633
+ }
84634
+ ],
84635
+ "path": [
84636
+ "codex",
84637
+ "bridge",
84638
+ "respond"
84639
+ ],
84640
+ "rendered": true,
84641
+ "routeId": "cli:codex/bridge/respond"
84642
+ },
84643
+ {
84644
+ "aliases": [],
84645
+ "description": "Run a bounded foreground relay (up to 23 hours). Use the packaged gbot-relay.mjs script for unlimited service lifetime.",
84646
+ "exitCode": "result",
84647
+ "options": [
84648
+ {
84649
+ "description": "Foreground lifetime in milliseconds (100..82800000; default 23h).",
84650
+ "key": "lifetimeMs",
84651
+ "kind": "number",
84652
+ "option": "lifetime-ms",
84653
+ "repeated": false,
84654
+ "required": false
84655
+ }
84656
+ ],
84657
+ "path": [
84658
+ "codex",
84659
+ "bridge",
84660
+ "run"
84661
+ ],
84662
+ "render": {
84663
+ "maxElapsedMs": 86400000
84664
+ },
84665
+ "rendered": true,
84666
+ "routeId": "cli:codex/bridge/run"
84667
+ },
84668
+ {
84669
+ "aliases": [],
84670
+ "description": "Managed Grok/Codex bridge start.",
84671
+ "exitCode": "result",
84672
+ "options": [
84673
+ {
84674
+ "choices": [
84675
+ "steer",
84676
+ "reject"
84677
+ ],
84678
+ "key": "busyPolicy",
84679
+ "kind": "enum",
84680
+ "option": "busy-policy",
84681
+ "repeated": false,
84682
+ "required": false
84683
+ },
84684
+ {
84685
+ "key": "codexThreadId",
84686
+ "kind": "string",
84687
+ "option": "codex-thread-id",
84688
+ "repeated": false,
84689
+ "required": false
84690
+ },
84691
+ {
84692
+ "key": "expectedCwd",
84693
+ "kind": "string",
84694
+ "option": "expected-cwd",
84695
+ "repeated": false,
84696
+ "required": false
84697
+ },
84698
+ {
84699
+ "key": "grokTarget",
84700
+ "kind": "string",
84701
+ "option": "grok-target",
84702
+ "positional": 0,
84703
+ "repeated": false,
84704
+ "required": true
84705
+ },
84706
+ {
84707
+ "key": "requestId",
84708
+ "kind": "string",
84709
+ "option": "request-id",
84710
+ "repeated": false,
84711
+ "required": false
84712
+ }
84713
+ ],
84714
+ "path": [
84715
+ "codex",
84716
+ "bridge",
84717
+ "start"
84718
+ ],
84719
+ "rendered": true,
84720
+ "routeId": "cli:codex/bridge/start"
84721
+ },
84722
+ {
84723
+ "aliases": [],
84724
+ "description": "Managed Grok/Codex bridge status.",
84725
+ "exitCode": "result",
84726
+ "options": [
84727
+ {
84728
+ "key": "bindingId",
84729
+ "kind": "string",
84730
+ "option": "binding-id",
84731
+ "repeated": false,
84732
+ "required": false
84733
+ },
84734
+ {
84735
+ "key": "limit",
84736
+ "kind": "number",
84737
+ "option": "limit",
84738
+ "repeated": false,
84739
+ "required": false
84740
+ }
84741
+ ],
84742
+ "path": [
84743
+ "codex",
84744
+ "bridge",
84745
+ "status"
84746
+ ],
84747
+ "rendered": true,
84748
+ "routeId": "cli:codex/bridge/status"
84749
+ },
84750
+ {
84751
+ "aliases": [],
84752
+ "description": "Managed Grok/Codex bridge stop.",
84753
+ "exitCode": "result",
84754
+ "options": [
84755
+ {
84756
+ "key": "all",
84757
+ "kind": "boolean",
84758
+ "option": "all",
84759
+ "repeated": false,
84760
+ "required": false
84761
+ },
84762
+ {
84763
+ "key": "bindingId",
84764
+ "kind": "string",
84765
+ "option": "binding-id",
84766
+ "repeated": false,
84767
+ "required": false
84768
+ },
84769
+ {
84770
+ "key": "worker",
84771
+ "kind": "boolean",
84772
+ "option": "worker",
84773
+ "repeated": false,
84774
+ "required": false
84775
+ }
84776
+ ],
84777
+ "path": [
84778
+ "codex",
84779
+ "bridge",
84780
+ "stop"
84781
+ ],
84782
+ "rendered": true,
84783
+ "routeId": "cli:codex/bridge/stop"
84784
+ },
83339
84785
  {
83340
84786
  "aliases": [],
83341
84787
  "description": "Install, remove, or check the ChatGPT Desktop shim: a CODEX_CLI_PATH wrapper that bridges Desktop stdio onto the managed Codex daemon (stock app-server proxy hangs). macOS persists via LaunchAgent; always fails open to real Codex.",
@@ -83416,11 +84862,17 @@ const commands = Object.freeze([
83416
84862
  },
83417
84863
  {
83418
84864
  "aliases": [],
83419
- "description": "Send a message to a Codex thread. Options go before <threadId>; `--` protects flag-like text.",
84865
+ "description": "Send to Codex; acceptance is distinct from completion. Options precede threadId.",
83420
84866
  "exitCode": "result",
83421
84867
  "options": [
83422
84868
  {
83423
- "description": "Stable correlation id for multi-hop replies",
84869
+ "key": "bindingId",
84870
+ "kind": "string",
84871
+ "option": "binding-id",
84872
+ "repeated": false,
84873
+ "required": false
84874
+ },
84875
+ {
83424
84876
  "key": "correlationId",
83425
84877
  "kind": "string",
83426
84878
  "option": "correlation-id",
@@ -83428,7 +84880,6 @@ const commands = Object.freeze([
83428
84880
  "required": false
83429
84881
  },
83430
84882
  {
83431
- "description": "Prepend the [gbot …] header to the message body",
83432
84883
  "key": "envelope",
83433
84884
  "kind": "boolean",
83434
84885
  "option": "envelope",
@@ -83436,13 +84887,35 @@ const commands = Object.freeze([
83436
84887
  "required": false
83437
84888
  },
83438
84889
  {
83439
- "description": "Hop count; refused at GROK_BOT_MAX_HOPS",
84890
+ "key": "expectedCwd",
84891
+ "kind": "string",
84892
+ "option": "expected-cwd",
84893
+ "repeated": false,
84894
+ "required": false
84895
+ },
84896
+ {
84897
+ "description": "Required active-turn guard for steer; stale guards reject.",
84898
+ "key": "expectedTurnId",
84899
+ "kind": "string",
84900
+ "option": "expected-turn-id",
84901
+ "repeated": false,
84902
+ "required": false
84903
+ },
84904
+ {
83440
84905
  "key": "hop",
83441
84906
  "kind": "number",
83442
84907
  "option": "hop",
83443
84908
  "repeated": false,
83444
84909
  "required": false
83445
84910
  },
84911
+ {
84912
+ "description": "Reply budget: 1-4194304 bytes.",
84913
+ "key": "maxOutputBytes",
84914
+ "kind": "number",
84915
+ "option": "max-output-bytes",
84916
+ "repeated": false,
84917
+ "required": false
84918
+ },
83446
84919
  {
83447
84920
  "key": "message",
83448
84921
  "kind": "string",
@@ -83452,13 +84925,26 @@ const commands = Object.freeze([
83452
84925
  "required": true
83453
84926
  },
83454
84927
  {
83455
- "description": "Prior message id this send replies to",
83456
84928
  "key": "replyTo",
83457
84929
  "kind": "string",
83458
84930
  "option": "reply-to",
83459
84931
  "repeated": false,
83460
84932
  "required": false
83461
84933
  },
84934
+ {
84935
+ "key": "replyToGrok",
84936
+ "kind": "string",
84937
+ "option": "reply-to-grok",
84938
+ "repeated": false,
84939
+ "required": false
84940
+ },
84941
+ {
84942
+ "key": "requestId",
84943
+ "kind": "string",
84944
+ "option": "request-id",
84945
+ "repeated": false,
84946
+ "required": false
84947
+ },
83462
84948
  {
83463
84949
  "key": "threadId",
83464
84950
  "kind": "string",
@@ -83467,12 +84953,27 @@ const commands = Object.freeze([
83467
84953
  "repeated": false,
83468
84954
  "required": true
83469
84955
  },
84956
+ {
84957
+ "description": "Observation timeout: 1-600000 milliseconds.",
84958
+ "key": "timeoutMs",
84959
+ "kind": "number",
84960
+ "option": "timeout-ms",
84961
+ "repeated": false,
84962
+ "required": false
84963
+ },
84964
+ {
84965
+ "key": "wait",
84966
+ "kind": "boolean",
84967
+ "option": "wait",
84968
+ "repeated": false,
84969
+ "required": false
84970
+ },
83470
84971
  {
83471
84972
  "choices": [
83472
84973
  "reject",
83473
- "queue"
84974
+ "queue",
84975
+ "steer"
83474
84976
  ],
83475
- "description": "reject (default) or queue (needs GROK_BOT_CODEX_EXPERIMENTAL=1)",
83476
84977
  "key": "whenBusy",
83477
84978
  "kind": "enum",
83478
84979
  "option": "when-busy",
@@ -83484,6 +84985,9 @@ const commands = Object.freeze([
83484
84985
  "codex",
83485
84986
  "send"
83486
84987
  ],
84988
+ "render": {
84989
+ "maxElapsedMs": 660000
84990
+ },
83487
84991
  "rendered": true,
83488
84992
  "routeId": "cli:codex/send"
83489
84993
  },
@@ -83499,6 +85003,115 @@ const commands = Object.freeze([
83499
85003
  "rendered": true,
83500
85004
  "routeId": "cli:codex/status"
83501
85005
  },
85006
+ {
85007
+ "aliases": [],
85008
+ "description": "Bounded Codex wait observation; never interrupts execution.",
85009
+ "exitCode": "result",
85010
+ "options": [
85011
+ {
85012
+ "key": "expectedCwd",
85013
+ "kind": "string",
85014
+ "option": "expected-cwd",
85015
+ "repeated": false,
85016
+ "required": false
85017
+ },
85018
+ {
85019
+ "description": "Reply budget: 1-4194304 bytes.",
85020
+ "key": "maxOutputBytes",
85021
+ "kind": "number",
85022
+ "option": "max-output-bytes",
85023
+ "repeated": false,
85024
+ "required": false
85025
+ },
85026
+ {
85027
+ "key": "messageId",
85028
+ "kind": "string",
85029
+ "option": "message-id",
85030
+ "repeated": false,
85031
+ "required": false
85032
+ },
85033
+ {
85034
+ "key": "threadId",
85035
+ "kind": "string",
85036
+ "option": "thread-id",
85037
+ "positional": 0,
85038
+ "repeated": false,
85039
+ "required": true
85040
+ },
85041
+ {
85042
+ "description": "Observation timeout: 1-600000 milliseconds.",
85043
+ "key": "timeoutMs",
85044
+ "kind": "number",
85045
+ "option": "timeout-ms",
85046
+ "repeated": false,
85047
+ "required": false
85048
+ },
85049
+ {
85050
+ "key": "turnId",
85051
+ "kind": "string",
85052
+ "option": "turn-id",
85053
+ "positional": 1,
85054
+ "repeated": false,
85055
+ "required": true
85056
+ }
85057
+ ],
85058
+ "path": [
85059
+ "codex",
85060
+ "wait"
85061
+ ],
85062
+ "render": {
85063
+ "maxElapsedMs": 660000
85064
+ },
85065
+ "rendered": true,
85066
+ "routeId": "cli:codex/wait"
85067
+ },
85068
+ {
85069
+ "aliases": [],
85070
+ "description": "Bounded Codex watch observation; never interrupts execution.",
85071
+ "exitCode": "result",
85072
+ "options": [
85073
+ {
85074
+ "key": "expectedCwd",
85075
+ "kind": "string",
85076
+ "option": "expected-cwd",
85077
+ "repeated": false,
85078
+ "required": false
85079
+ },
85080
+ {
85081
+ "description": "Maximum observed events: 1-500.",
85082
+ "key": "maxEvents",
85083
+ "kind": "number",
85084
+ "option": "max-events",
85085
+ "repeated": false,
85086
+ "required": false
85087
+ },
85088
+ {
85089
+ "key": "threadId",
85090
+ "kind": "string",
85091
+ "option": "thread-id",
85092
+ "positional": 0,
85093
+ "repeated": false,
85094
+ "required": true
85095
+ },
85096
+ {
85097
+ "description": "Observation timeout: 1-600000 milliseconds.",
85098
+ "key": "timeoutMs",
85099
+ "kind": "number",
85100
+ "option": "timeout-ms",
85101
+ "repeated": false,
85102
+ "required": false
85103
+ }
85104
+ ],
85105
+ "path": [
85106
+ "codex",
85107
+ "watch"
85108
+ ],
85109
+ "render": {
85110
+ "maxElapsedMs": 660000
85111
+ },
85112
+ "rendered": true,
85113
+ "routeId": "cli:codex/watch"
85114
+ },
83502
85115
  {
83503
85116
  "aliases": [],
83504
85117
  "description": "Show which agents root and auth sources gbot can see.",
@@ -84103,6 +85716,20 @@ const commands = Object.freeze([
84103
85716
  "description": "Send a message to a Grok Bot bot or group by name or id.",
84104
85717
  "exitCode": "result",
84105
85718
  "options": [
85719
+ {
85720
+ "key": "bindingId",
85721
+ "kind": "string",
85722
+ "option": "binding-id",
85723
+ "repeated": false,
85724
+ "required": false
85725
+ },
85726
+ {
85727
+ "key": "codexThreadId",
85728
+ "kind": "string",
85729
+ "option": "codex-thread-id",
85730
+ "repeated": false,
85731
+ "required": false
85732
+ },
84106
85733
  {
84107
85734
  "description": "Stable correlation id for multi-hop replies",
84108
85735
  "key": "correlationId",
@@ -84127,6 +85754,13 @@ const commands = Object.freeze([
84127
85754
  "repeated": false,
84128
85755
  "required": false
84129
85756
  },
85757
+ {
85758
+ "key": "expectedCwd",
85759
+ "kind": "string",
85760
+ "option": "expected-cwd",
85761
+ "repeated": false,
85762
+ "required": false
85763
+ },
84130
85764
  {
84131
85765
  "description": "Force the on-disk agents store",
84132
85766
  "key": "files",
@@ -84175,6 +85809,17 @@ const commands = Object.freeze([
84175
85809
  "repeated": false,
84176
85810
  "required": false
84177
85811
  },
85812
+ {
85813
+ "choices": [
85814
+ "auto",
85815
+ "manual"
85816
+ ],
85817
+ "key": "replyMode",
85818
+ "kind": "enum",
85819
+ "option": "reply-mode",
85820
+ "repeated": false,
85821
+ "required": false
85822
+ },
84178
85823
  {
84179
85824
  "description": "Prior message id this send replies to",
84180
85825
  "key": "replyTo",
@@ -84183,6 +85828,13 @@ const commands = Object.freeze([
84183
85828
  "repeated": false,
84184
85829
  "required": false
84185
85830
  },
85831
+ {
85832
+ "key": "requestId",
85833
+ "kind": "string",
85834
+ "option": "request-id",
85835
+ "repeated": false,
85836
+ "required": false
85837
+ },
84186
85838
  {
84187
85839
  "key": "target",
84188
85840
  "kind": "string",
@@ -84199,9 +85851,7 @@ const commands = Object.freeze([
84199
85851
  "routeId": "cli:send"
84200
85852
  },
84201
85853
  {
84202
- "aliases": [
84203
- "chat"
84204
- ],
85854
+ "aliases": [],
84205
85855
  "description": "Read the most recent messages in a Grok Bot bot or group thread.",
84206
85856
  "exitCode": "zero",
84207
85857
  "options": [
@@ -84328,27 +85978,27 @@ const execute = async (command, input, context)=>{
84328
85978
  instanceId: processLifetime.instanceId,
84329
85979
  pid: processLifetime.pid
84330
85980
  };
84331
- const result = await (0,_agent_bundle_runtime__rspack_import_28/* .runAgentRequest */.iC)({
85981
+ const result = await (0,_agent_bundle_runtime__rspack_import_35/* .runAgentRequest */.iC)({
84332
85982
  capabilities: {
84333
- command: (0,_agent_bundle_runtime__rspack_import_28/* .unavailable */.hU)(),
84334
- filesystem: (0,_agent_bundle_runtime__rspack_import_28/* .unavailable */.hU)(),
84335
- network: (0,_agent_bundle_runtime__rspack_import_28/* .unavailable */.hU)(),
84336
- projectRoot: (0,_agent_bundle_runtime__rspack_import_28/* .available */.qC)({
85983
+ command: (0,_agent_bundle_runtime__rspack_import_35/* .unavailable */.hU)(),
85984
+ filesystem: (0,_agent_bundle_runtime__rspack_import_35/* .unavailable */.hU)(),
85985
+ network: (0,_agent_bundle_runtime__rspack_import_35/* .unavailable */.hU)(),
85986
+ projectRoot: (0,_agent_bundle_runtime__rspack_import_35/* .available */.qC)({
84337
85987
  root: cwd
84338
85988
  }, 'derived')
84339
85989
  },
84340
- host: (0,_agent_bundle_runtime__rspack_import_28/* .unavailable */.hU)('unsupported-surface'),
85990
+ host: (0,_agent_bundle_runtime__rspack_import_35/* .unavailable */.hU)('unsupported-surface'),
84341
85991
  invocation: {
84342
85992
  kind: 'cli',
84343
85993
  operationId: command.routeId,
84344
85994
  surface: command.path.join(' ')
84345
85995
  },
84346
- lineage: (0,_agent_bundle_runtime__rspack_import_28/* .unavailable */.hU)('unsupported-surface'),
85996
+ lineage: (0,_agent_bundle_runtime__rspack_import_35/* .unavailable */.hU)('unsupported-surface'),
84347
85997
  plugin: pluginRoot.identity,
84348
85998
  process: processHit,
84349
85999
  signal: context.signal,
84350
- terminal: (0,_agent_bundle_runtime__rspack_import_28/* .available */.qC)(context.terminal, 'native'),
84351
- workspace: (0,_agent_bundle_runtime__rspack_import_28/* .available */.qC)({
86000
+ terminal: (0,_agent_bundle_runtime__rspack_import_35/* .available */.qC)(context.terminal, 'native'),
86001
+ workspace: (0,_agent_bundle_runtime__rspack_import_35/* .available */.qC)({
84352
86002
  root: cwd
84353
86003
  }, 'derived')
84354
86004
  }, async ()=>route.module.default({
@@ -84455,7 +86105,7 @@ const openRenderedSession = ({ invocation, limits, props, request, routeId, sign
84455
86105
  return stream;
84456
86106
  }
84457
86107
  });
84458
- const dispatcher = (0,_agent_bundle_runtime__rspack_import_29/* .createAgentRenderDispatcher */.jK)(host);
86108
+ const dispatcher = (0,_agent_bundle_runtime__rspack_import_36/* .createAgentRenderDispatcher */.jK)(host);
84459
86109
  return Object.freeze({
84460
86110
  close: async ()=>{
84461
86111
  await worker.terminate();
@@ -84499,11 +86149,11 @@ const render = async (command, input, context)=>{
84499
86149
  if (import.meta.main) {
84500
86150
  await (0,agent_bundle_cli_entry__rspack_import_1/* .runGeneratedCliProcess */.yA)({
84501
86151
  commands,
84502
- description: "Message Grok Bot bots and groups and read their threads from Codex, Claude Code, and Cursor.",
86152
+ description: "Message Grok Bot from Codex, Claude Code, and Cursor, with managed automatic replies and explicit Codex conversation links.",
84503
86153
  execute,
84504
86154
  name: "gbot",
84505
86155
  render,
84506
- version: "0.4.5"
86156
+ version: "0.6.0"
84507
86157
  });
84508
86158
  }
84509
86159
 
@@ -84727,6 +86377,7 @@ function inspectGrokBotGatewaySession(options = {}) {
84727
86377
  __webpack_require__.d(__webpack_exports__, {
84728
86378
  Z2: () => (loadGrokBotGatewaySession),
84729
86379
  ZN: () => (hasGrokBotGatewaySession),
86380
+ dQ: () => (grokBotGatewayDescriptorPath),
84730
86381
  hd: () => (inspectGrokBotGatewaySession)
84731
86382
  });
84732
86383
 
@@ -84739,7 +86390,7 @@ __webpack_require__.d(__webpack_exports__, {
84739
86390
  /* import */ var node_os__rspack_import_3 = __webpack_require__("node:os");
84740
86391
  /* import */ var node_path__rspack_import_4 = __webpack_require__("node:path");
84741
86392
  /* import */ var node_child_process__rspack_import_5 = __webpack_require__("node:child_process");
84742
- /* import */ var node_module__rspack_import_6 = __webpack_require__("node:module");
86393
+ /* import */ var _package_json__rspack_import_6 = __webpack_require__("./package.json");
84743
86394
  /* import */ var _codex_contract_js__rspack_import_7 = __webpack_require__("./src/core/codex/contract.js");
84744
86395
  /* import */ var _desktop_shim_js__rspack_import_8 = __webpack_require__("./src/core/desktop-shim.js");
84745
86396
 
@@ -84765,10 +86416,12 @@ const WS_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
84765
86416
  const WS_MAX_HEADER_BYTES = 16 * 1024;
84766
86417
  const WS_MAX_MESSAGE_BYTES = 4 * 1024 * 1024;
84767
86418
  const WS_MAX_BUFFER_BYTES = 8 * 1024 * 1024;
86419
+ const WS_MAX_WRITE_BYTES = 8 * 1024 * 1024;
86420
+ const CODEX_MAX_REQUESTS = 128;
86421
+ const CODEX_MAX_LISTENERS = 128;
84768
86422
  const textDecoder = new TextDecoder("utf-8", {
84769
86423
  fatal: true
84770
86424
  });
84771
- const pkg = (0,node_module__rspack_import_6.createRequire)(import.meta.url)("../../package.json");
84772
86425
  function codexSocketPath(env = process.env) {
84773
86426
  // Explicit socket wins so status/send/queue agree with a shim-installed or
84774
86427
  // operator-exported CODEX_APP_SERVER_SOCK; otherwise derive from CODEX_HOME.
@@ -84905,15 +86558,27 @@ class CodexRpcError extends Error {
84905
86558
  }
84906
86559
  }
84907
86560
  class CodexSendError extends Error {
84908
- constructor(message, { delivery, threadId, turnId, refused, reason, envelope } = {}){
86561
+ constructor(message, { correlationId, delivery, hop, messageId, reason, refused, threadId, turnId } = {}){
84909
86562
  super(message);
84910
86563
  this.name = "CodexSendError";
84911
86564
  this.delivery = delivery;
86565
+ if (correlationId !== undefined) this.correlationId = correlationId;
86566
+ if (hop !== undefined) this.hop = hop;
86567
+ if (messageId !== undefined) this.messageId = messageId;
84912
86568
  if (reason !== undefined) this.reason = reason;
86569
+ if (refused !== undefined) this.refused = refused;
84913
86570
  if (threadId !== undefined) this.threadId = threadId;
84914
86571
  if (turnId !== undefined) this.turnId = turnId;
84915
- if (refused !== undefined) this.refused = refused;
84916
- if (envelope !== undefined) this.envelope = envelope;
86572
+ }
86573
+ }
86574
+ function attachEnvelope(error, envelope) {
86575
+ if (!error || typeof error !== "object") return;
86576
+ for (const key of [
86577
+ "messageId",
86578
+ "correlationId",
86579
+ "hop"
86580
+ ]){
86581
+ if (envelope?.[key] !== undefined) error[key] = envelope[key];
84917
86582
  }
84918
86583
  }
84919
86584
  /** The route to the app-server is unavailable; `mode` is a stable machine-readable state. */ class CodexRouteError extends Error {
@@ -84960,16 +86625,44 @@ function isObject(value) {
84960
86625
  }
84961
86626
  /**
84962
86627
  * Open a JSON-RPC session to the app-server over its Unix socket (WebSocket framing).
84963
- * Server-initiated requests (approvals, user input) are refused with a JSON-RPC error
84964
- * and recorded in `refused`; gbot never approves on the user's behalf.
84965
- */ function connectCodexAppServer(path, { timeoutMs = 15000 } = {}) {
86628
+ * Server requests are observed without answering by default. Legacy one-shot
86629
+ * callers arm ownership-scoped refusals; persistent sessions respond explicitly.
86630
+ */ function connectCodexAppServer(path, { timeoutMs = 15000, signal, onNotification, onServerRequest, onClose } = {}) {
84966
86631
  return new Promise((resolve, reject)=>{
86632
+ if (!Number.isInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 2147483647) {
86633
+ throw new RangeError("timeoutMs must be an integer 1-2147483647");
86634
+ }
86635
+ for (const listener of [
86636
+ onNotification,
86637
+ onServerRequest,
86638
+ onClose
86639
+ ]){
86640
+ if (listener !== undefined && typeof listener !== "function") throw new TypeError("Event listener must be a function");
86641
+ }
86642
+ if (signal !== undefined && !(signal instanceof AbortSignal)) throw new TypeError("signal must be an AbortSignal");
86643
+ if (signal?.aborted) throw new Error("Codex connection aborted", {
86644
+ cause: signal.reason
86645
+ });
84967
86646
  const socket = (0,node_net__rspack_import_2.createConnection)({
84968
86647
  path
84969
86648
  });
84970
86649
  const key = (0,node_crypto__rspack_import_0.randomBytes)(16).toString("base64");
84971
86650
  const pending = new Map();
84972
86651
  const refused = [];
86652
+ const serverRequests = new Map();
86653
+ const listeners = {
86654
+ notification: new Set(onNotification ? [
86655
+ onNotification
86656
+ ] : []),
86657
+ serverRequest: new Set(onServerRequest ? [
86658
+ onServerRequest
86659
+ ] : []),
86660
+ close: new Set(onClose ? [
86661
+ onClose
86662
+ ] : [])
86663
+ };
86664
+ let closeError;
86665
+ let writeTimer;
84973
86666
  let nextId = 1;
84974
86667
  let buf = Buffer.alloc(0);
84975
86668
  let upgraded = false;
@@ -84984,22 +86677,127 @@ function isObject(value) {
84984
86677
  const failAll = (err)=>{
84985
86678
  if (closed) return;
84986
86679
  closed = true;
86680
+ closeError = err;
84987
86681
  clearTimeout(handshakeTimer);
86682
+ clearTimeout(writeTimer);
86683
+ signal?.removeEventListener("abort", abort);
84988
86684
  if (err && err.delivery == null) err.delivery = pending.size ? "unknown" : "rejected";
84989
86685
  for (const { reject: rej } of pending.values())rej(err);
84990
86686
  pending.clear();
86687
+ serverRequests.clear();
86688
+ client.deferred.length = 0;
86689
+ buf = Buffer.alloc(0);
86690
+ fragParts = [];
86691
+ fragBytes = 0;
86692
+ const closeListeners = [
86693
+ ...listeners.close
86694
+ ];
86695
+ for (const group of Object.values(listeners))group.clear();
84991
86696
  try {
84992
86697
  socket.destroy();
84993
86698
  } catch {}
84994
86699
  reject(err);
86700
+ for (const listener of closeListeners)invoke(listener, err, true);
86701
+ };
86702
+ // Observers execute synchronously to preserve order, but failures never escape
86703
+ // the socket callback. Rejected async callbacks use the same cleanup path.
86704
+ const invoke = (listener, message, closing = false)=>{
86705
+ const failed = (cause)=>{
86706
+ if (!closing) failAll(new Error("Codex event listener failed", {
86707
+ cause
86708
+ }));
86709
+ };
86710
+ try {
86711
+ const result = listener(message);
86712
+ if (result && typeof result.then === "function") Promise.resolve(result).catch(failed);
86713
+ } catch (err) {
86714
+ failed(err);
86715
+ }
86716
+ };
86717
+ const dispatch = (kind, message)=>{
86718
+ for (const listener of [
86719
+ ...listeners[kind]
86720
+ ]){
86721
+ if (closed) break;
86722
+ if (listeners[kind].has(listener)) invoke(listener, message);
86723
+ }
84995
86724
  };
86725
+ const subscribe = (kind, listener)=>{
86726
+ if (typeof listener !== "function") throw new TypeError("Event listener must be a function");
86727
+ if (closed) {
86728
+ if (kind === "close") invoke(listener, closeError, true);
86729
+ return ()=>{};
86730
+ }
86731
+ const group = listeners[kind];
86732
+ if (!group.has(listener) && group.size >= CODEX_MAX_LISTENERS) {
86733
+ const err = new Error("Codex listener limit exceeds " + CODEX_MAX_LISTENERS);
86734
+ failAll(err);
86735
+ throw err;
86736
+ }
86737
+ group.add(listener);
86738
+ return ()=>group.delete(listener);
86739
+ };
86740
+ const abort = ()=>failAll(new Error("Codex connection aborted", {
86741
+ cause: signal.reason
86742
+ }));
84996
86743
  const failProtocol = (detail)=>failAll(new Error("Codex app-server violated the WebSocket protocol: " + detail));
84997
86744
  const write = (opcode, payload)=>{
84998
- if (!socket.destroyed) socket.write(encodeFrame(opcode, payload, (0,node_crypto__rspack_import_0.randomBytes)(4)));
86745
+ if (closed) throw closeError;
86746
+ const encodedBytes = payload.length + (payload.length < 126 ? 6 : payload.length < 65536 ? 8 : 14);
86747
+ if (socket.destroyed || encodedBytes + socket.writableLength > WS_MAX_WRITE_BYTES) {
86748
+ const err = new Error(socket.destroyed ? "Codex socket closed" : "Codex outbound write budget exceeds " + WS_MAX_WRITE_BYTES + " bytes");
86749
+ failAll(err);
86750
+ throw err;
86751
+ }
86752
+ try {
86753
+ if (!socket.write(encodeFrame(opcode, payload, (0,node_crypto__rspack_import_0.randomBytes)(4))) && !writeTimer) {
86754
+ // One absolute deadline for the whole backpressured interval: more
86755
+ // writes must not keep an unread socket alive indefinitely.
86756
+ writeTimer = setTimeout(()=>failAll(new Error("Codex outbound write did not drain within " + timeoutMs + "ms")), timeoutMs);
86757
+ writeTimer.unref();
86758
+ }
86759
+ } catch (err) {
86760
+ failAll(err);
86761
+ throw err;
86762
+ }
84999
86763
  };
85000
86764
  const sendJson = (obj)=>write(0x1, Buffer.from(JSON.stringify(obj)));
86765
+ const respondToRequest = (id, payload)=>{
86766
+ if (closed) throw closeError;
86767
+ if (!serverRequests.has(id)) throw new Error("Unknown or resolved server request: " + id);
86768
+ // Consume ownership before JSON.stringify can invoke caller-owned getters
86769
+ // or toJSON hooks. A failed serialization closes rather than restoring it.
86770
+ serverRequests.delete(id);
86771
+ client.deferred = client.deferred.filter((entry)=>entry.id !== id);
86772
+ try {
86773
+ sendJson({
86774
+ jsonrpc: "2.0",
86775
+ id,
86776
+ ...payload
86777
+ });
86778
+ } catch (cause) {
86779
+ if (closed) throw closeError;
86780
+ const err = new Error("Codex server response serialization failed", {
86781
+ cause
86782
+ });
86783
+ failAll(err);
86784
+ throw err;
86785
+ }
86786
+ };
85001
86787
  const client = {
85002
86788
  refused,
86789
+ get closed () {
86790
+ return closed;
86791
+ },
86792
+ onNotification: (listener)=>subscribe("notification", listener),
86793
+ onServerRequest: (listener)=>subscribe("serverRequest", listener),
86794
+ onClose: (listener)=>subscribe("close", listener),
86795
+ respond: (id, result)=>respondToRequest(id, {
86796
+ result
86797
+ }),
86798
+ rejectRequest: (id, error)=>respondToRequest(id, {
86799
+ error
86800
+ }),
85003
86801
  // Server-initiated requests are only *answered* once our own turn/start
85004
86802
  // is in flight, and then only when they name our own thread/turn:
85005
86803
  // anything earlier — or naming another thread or Desktop turn — belongs
@@ -85024,22 +86822,24 @@ function isObject(value) {
85024
86822
  const params = entry.params && typeof entry.params === "object" && !Array.isArray(entry.params) ? entry.params : null;
85025
86823
  const threadId = params ? params.threadId ?? params.thread_id : null;
85026
86824
  const namedTurnId = params ? params.turnId ?? params.turn_id ?? (params.turn && params.turn.id) : null;
85027
- if (threadId === client.expectedThreadId && namedTurnId === turnId) {
85028
- entry.answered = true;
85029
- sendJson({
85030
- jsonrpc: "2.0",
85031
- id: entry.id,
85032
- error: {
85033
- code: -32601,
85034
- message: "gbot codex does not answer " + entry.method + "; configure approval_policy on the daemon"
85035
- }
86825
+ if (threadId === client.expectedThreadId && namedTurnId === turnId && serverRequests.get(entry.id) === entry) {
86826
+ client.rejectRequest(entry.id, {
86827
+ code: -32601,
86828
+ message: "gbot codex does not answer " + entry.method + "; configure approval_policy on the daemon"
85036
86829
  });
86830
+ entry.answered = true;
85037
86831
  }
85038
86832
  }
85039
86833
  },
85040
86834
  request (method, params) {
85041
- const id = nextId++;
85042
86835
  return new Promise((res, rej)=>{
86836
+ if (closed) return rej(closeError);
86837
+ if (pending.size >= CODEX_MAX_REQUESTS) {
86838
+ const err = new Error("Codex pending request limit exceeds " + CODEX_MAX_REQUESTS);
86839
+ failAll(err);
86840
+ return rej(err);
86841
+ }
86842
+ const id = nextId++;
85043
86843
  const timer = setTimeout(()=>{
85044
86844
  pending.delete(id);
85045
86845
  rej(new Error("Codex app-server did not answer " + method + " within " + timeoutMs + "ms"));
@@ -85055,12 +86855,18 @@ function isObject(value) {
85055
86855
  rej(e);
85056
86856
  }
85057
86857
  });
85058
- sendJson({
85059
- jsonrpc: "2.0",
85060
- id,
85061
- method,
85062
- params
85063
- });
86858
+ try {
86859
+ sendJson({
86860
+ jsonrpc: "2.0",
86861
+ id,
86862
+ method,
86863
+ params
86864
+ });
86865
+ } catch (err) {
86866
+ const entry = pending.get(id);
86867
+ pending.delete(id);
86868
+ entry?.reject(err);
86869
+ }
85064
86870
  });
85065
86871
  },
85066
86872
  notify (method, params) {
@@ -85072,34 +86878,34 @@ function isObject(value) {
85072
86878
  },
85073
86879
  close () {
85074
86880
  if (closed) return;
85075
- closed = true;
85076
- clearTimeout(handshakeTimer);
85077
- const err = new Error("Codex client closed");
85078
- err.delivery = pending.size ? "unknown" : "rejected";
85079
- for (const { reject: rej } of pending.values())rej(err);
85080
- pending.clear();
85081
- // Best-effort close frame, then guaranteed destruction so no path leaks the socket.
85082
- if (!socket.destroyed && upgraded) write(0x8, Buffer.from([
85083
- 0x03,
85084
- 0xe8
85085
- ]));
85086
- if (socket.destroyed) return;
85087
- const forceDestroy = setTimeout(()=>{
85088
- try {
85089
- socket.destroy();
85090
- } catch {}
85091
- }, 1000);
85092
- if (typeof forceDestroy.unref === "function") forceDestroy.unref();
85093
- socket.end(()=>{
85094
- clearTimeout(forceDestroy);
85095
- try {
85096
- socket.destroy();
85097
- } catch {}
85098
- });
86881
+ // Best effort protocol close; cleanup never depends on the peer reading it.
86882
+ try {
86883
+ if (upgraded) write(0x8, Buffer.from([
86884
+ 0x03,
86885
+ 0xe8
86886
+ ]));
86887
+ } catch {}
86888
+ failAll(new Error("Codex client closed"));
85099
86889
  }
85100
86890
  };
86891
+ signal?.addEventListener("abort", abort, {
86892
+ once: true
86893
+ });
85101
86894
  const onMessage = (msg)=>{
85102
86895
  if (msg.id != null && msg.method) {
86896
+ if (serverRequests.has(msg.id)) return failProtocol("duplicate pending server request id");
86897
+ if (serverRequests.size >= CODEX_MAX_REQUESTS || refused.length >= CODEX_MAX_REQUESTS || client.deferred.length >= CODEX_MAX_REQUESTS) {
86898
+ return failAll(new Error("Codex remembered server request limit exceeds " + CODEX_MAX_REQUESTS));
86899
+ }
86900
+ const entry = {
86901
+ id: msg.id,
86902
+ method: msg.method,
86903
+ params: msg.params,
86904
+ answered: false
86905
+ };
86906
+ serverRequests.set(msg.id, entry);
86907
+ dispatch("serverRequest", msg);
86908
+ if (closed) return;
85103
86909
  let answered = client.answerServerRequests;
85104
86910
  let defer = false;
85105
86911
  // Approval ownership: only answer requests for the turn gbot itself
@@ -85119,28 +86925,30 @@ function isObject(value) {
85119
86925
  } else if (turnId !== client.expectedTurnId) answered = false;
85120
86926
  } else answered = false;
85121
86927
  }
85122
- const entry = {
85123
- id: msg.id,
85124
- method: msg.method,
85125
- params: msg.params,
85126
- answered
85127
- };
86928
+ answered = answered && serverRequests.has(msg.id);
86929
+ defer = defer && serverRequests.has(msg.id);
86930
+ entry.answered = answered;
85128
86931
  refused.push(entry);
85129
86932
  if (defer) {
85130
86933
  client.deferred.push(entry);
85131
86934
  return;
85132
86935
  }
85133
86936
  if (!answered) return;
85134
- sendJson({
85135
- jsonrpc: "2.0",
85136
- id: msg.id,
85137
- error: {
85138
- code: -32601,
85139
- message: "gbot codex does not answer " + msg.method + "; configure approval_policy on the daemon"
85140
- }
86937
+ client.rejectRequest(msg.id, {
86938
+ code: -32601,
86939
+ message: "gbot codex does not answer " + msg.method + "; configure approval_policy on the daemon"
85141
86940
  });
85142
86941
  return;
85143
86942
  }
86943
+ if (msg.id == null && msg.method) {
86944
+ if (msg.method === "serverRequest/resolved") {
86945
+ const id = msg.params?.requestId;
86946
+ serverRequests.delete(id);
86947
+ client.deferred = client.deferred.filter((entry)=>entry.id !== id);
86948
+ }
86949
+ dispatch("notification", msg);
86950
+ return;
86951
+ }
85144
86952
  if (msg.id == null || !pending.has(msg.id)) return;
85145
86953
  const entry = pending.get(msg.id);
85146
86954
  pending.delete(msg.id);
@@ -85166,12 +86974,21 @@ function isObject(value) {
85166
86974
  failAll(new Error("Codex app-server sent a malformed message"));
85167
86975
  return;
85168
86976
  }
85169
- onMessage(msg);
86977
+ try {
86978
+ onMessage(msg);
86979
+ } catch (err) {
86980
+ failAll(err);
86981
+ }
85170
86982
  };
86983
+ socket.on("drain", ()=>{
86984
+ clearTimeout(writeTimer);
86985
+ writeTimer = undefined;
86986
+ });
85171
86987
  socket.once("error", (err)=>failAll(new Error("Could not connect to Codex app-server at " + path + ": " + err.message)));
85172
86988
  socket.once("close", ()=>failAll(new Error("Codex app-server closed the connection")));
85173
86989
  socket.once("connect", ()=>socket.write(upgradeRequest(key)));
85174
86990
  socket.on("data", (chunk)=>{
86991
+ if (closed) return;
85175
86992
  buf = Buffer.concat([
85176
86993
  buf,
85177
86994
  chunk
@@ -85191,7 +87008,7 @@ function isObject(value) {
85191
87008
  clearTimeout(handshakeTimer);
85192
87009
  resolve(client);
85193
87010
  }
85194
- for(;;){
87011
+ while(!closed){
85195
87012
  const frame = decodeFrame(buf);
85196
87013
  if (!frame) {
85197
87014
  const claimed = peekFrameLength(buf);
@@ -85207,10 +87024,18 @@ function isObject(value) {
85207
87024
  if (frame.masked) return failProtocol("server frames must not be masked");
85208
87025
  if (frame.opcode >= 0x8) {
85209
87026
  if (!frame.fin || frame.payload.length > 125) return failProtocol("bad control frame");
85210
- if (frame.opcode === 0x9) write(0xa, frame.payload);
85211
- else if (frame.opcode === 0x8) {
85212
- write(0x8, frame.payload);
85213
- socket.end();
87027
+ if (frame.opcode === 0x9) {
87028
+ try {
87029
+ write(0xa, frame.payload);
87030
+ } catch {
87031
+ return;
87032
+ }
87033
+ } else if (frame.opcode === 0x8) {
87034
+ try {
87035
+ write(0x8, frame.payload);
87036
+ } catch {
87037
+ return;
87038
+ }
85214
87039
  failAll(new Error("Codex app-server closed the connection"));
85215
87040
  }
85216
87041
  continue; // pong and other control frames carry nothing for us
@@ -85266,12 +87091,12 @@ function appServerVersion(initResult) {
85266
87091
  }
85267
87092
  throw new CodexRouteError(unreachableMessage(path), "socket-absent");
85268
87093
  }
85269
- async function openSession(env = process.env, { experimental = false } = {}) {
87094
+ async function openCodexSession(env = process.env, { experimental = false, ...options } = {}) {
85270
87095
  const path = codexSocketPath(env);
85271
87096
  assertRoute(path);
85272
87097
  let client;
85273
87098
  try {
85274
- client = await connectCodexAppServer(path);
87099
+ client = await connectCodexAppServer(path, options);
85275
87100
  } catch (err) {
85276
87101
  throw connectError(err, path);
85277
87102
  }
@@ -85280,7 +87105,7 @@ async function openSession(env = process.env, { experimental = false } = {}) {
85280
87105
  init = await client.request("initialize", {
85281
87106
  clientInfo: {
85282
87107
  name: "gbot",
85283
- version: pkg.version
87108
+ version: _package_json__rspack_import_6/* .version */.rE
85284
87109
  },
85285
87110
  ...experimental ? {
85286
87111
  capabilities: {
@@ -85296,13 +87121,19 @@ async function openSession(env = process.env, { experimental = false } = {}) {
85296
87121
  client.close();
85297
87122
  throw new CodexProtocolError("initialize", "result is not an object");
85298
87123
  }
85299
- client.notify("initialized");
87124
+ try {
87125
+ client.notify("initialized");
87126
+ } catch (err) {
87127
+ client.close();
87128
+ throw handshakeError(err);
87129
+ }
85300
87130
  return {
85301
87131
  client,
85302
87132
  path,
85303
87133
  init
85304
87134
  };
85305
87135
  }
87136
+ const openSession = openCodexSession;
85306
87137
  const CODEX_VERSION_PROBE_TIMEOUT_MS = 3000;
85307
87138
  /** Bounded `codex --version` probe: `{ version, probe }` where probe is ok | missing | timeout | error. */ function probeLocalCodexVersion(timeoutMs = CODEX_VERSION_PROBE_TIMEOUT_MS) {
85308
87139
  const out = (0,node_child_process__rspack_import_5.spawnSync)("codex", [
@@ -85568,7 +87399,7 @@ const ID_PATTERN = /^[A-Za-z0-9_.:-]{1,128}$/;
85568
87399
  throw new CodexSendError("Refusing to send: hop " + hopCount + " reaches the relay bound " + bound + " (GROK_BOT_MAX_HOPS). " + "This message is an agent-to-agent relay that has already been forwarded too many times.", {
85569
87400
  delivery: "rejected",
85570
87401
  reason: "hop-limit",
85571
- envelope: out
87402
+ ...out
85572
87403
  });
85573
87404
  }
85574
87405
  return out;
@@ -85650,26 +87481,30 @@ function requireExperimental(env, what) {
85650
87481
  reason: "experimental-disabled"
85651
87482
  });
85652
87483
  }
85653
- function unsupportedOrRpc(err, method, threadId, envelope) {
87484
+ function unsupportedOrRpc(err, method, threadId, envelope, turnId) {
87485
+ const guarded = method === "turn/steer";
85654
87486
  if (err instanceof CodexRpcError && err.rpc && err.rpc.code === -32601) {
85655
- return new CodexSendError("Codex app-server does not offer " + method + " (daemon predates it, or experimentalApi was not granted). " + "Upgrade Codex or send without --when-busy queue.", {
87487
+ return new CodexSendError("Codex app-server does not offer " + method + " (daemon predates it, or experimentalApi was not granted). " + (guarded ? "Upgrade Codex before retrying guarded steering." : "Upgrade Codex or send without --when-busy queue."), {
85656
87488
  delivery: "rejected",
85657
87489
  reason: "unsupported",
85658
87490
  threadId,
85659
- envelope
87491
+ turnId,
87492
+ ...envelope
85660
87493
  });
85661
87494
  }
85662
87495
  if (err instanceof CodexRpcError) return new CodexSendError(err.message, {
85663
87496
  delivery: "rejected",
85664
87497
  reason: "rejected",
85665
87498
  threadId,
85666
- envelope
87499
+ turnId,
87500
+ ...envelope
85667
87501
  });
85668
- return new CodexSendError("Lost the Codex " + method + " response for thread " + threadId + ": " + (err && err.message || err) + ". Delivery is unknown; list the queue before resending.", {
87502
+ return new CodexSendError("Lost the Codex " + method + " response for thread " + threadId + ": " + (err && err.message || err) + (guarded ? ". Delivery is unknown; check thread " + threadId + " turn " + turnId + " before resending." : ". Delivery is unknown; list the queue before resending."), {
85669
87503
  delivery: err && err.delivery || "unknown",
85670
87504
  reason: "transport",
85671
87505
  threadId,
85672
- envelope
87506
+ turnId,
87507
+ ...envelope
85673
87508
  });
85674
87509
  }
85675
87510
  /** Read the daemon's queue for one thread (experimental `thread/queue/list`). */ async function listCodexQueue(threadId, { env = process.env, limit = 50, cursor } = {}) {
@@ -85707,30 +87542,70 @@ function unsupportedOrRpc(err, method, threadId, envelope) {
85707
87542
  /**
85708
87543
  * @param {string} threadId
85709
87544
  * @param {string} text
85710
- * @param {{ env?: NodeJS.ProcessEnv, envelope?: object, whenBusy?: "reject"|"queue" }} [opts]
87545
+ * @param {{ env?: NodeJS.ProcessEnv, envelope?: object, whenBusy?: "reject"|"queue"|"steer", session?: object, expectedTurnId?: string, expectedCwd?: string, signal?: AbortSignal }} [opts]
85711
87546
  */ async function sendToCodexThread(threadId, text, { env = process.env, envelope = buildEnvelope({
85712
87547
  env
85713
- }), whenBusy = "reject" } = {}) {
87548
+ }), whenBusy = "reject", session, expectedTurnId, expectedCwd, signal } = {}) {
85714
87549
  try {
85715
87550
  const receipt = await sendToCodexThreadInner(threadId, text, {
85716
87551
  env,
85717
87552
  envelope,
85718
- whenBusy
87553
+ whenBusy,
87554
+ session,
87555
+ expectedTurnId,
87556
+ expectedCwd,
87557
+ signal
85719
87558
  });
85720
87559
  return (0,_codex_contract_js__rspack_import_7/* .outcomeFromReceipt */.Dz)(receipt);
85721
87560
  } catch (err) {
85722
87561
  // Every receipt names the message, including refusals that never reached the daemon.
85723
- if ((err instanceof CodexSendError || err instanceof CodexRouteError || err instanceof CodexProtocolError) && err.envelope === undefined) err.envelope = envelope;
87562
+ if (err && typeof err === "object") {
87563
+ attachEnvelope(err, envelope);
87564
+ if (err.threadId === undefined) err.threadId = threadId;
87565
+ }
85724
87566
  return (0,_codex_contract_js__rspack_import_7/* .outcomeFromError */.DG)(err);
85725
87567
  }
85726
87568
  }
85727
- async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy }) {
85728
- if (whenBusy !== "reject" && whenBusy !== "queue") throw new RangeError("--when-busy must be reject or queue");
87569
+ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy, session, expectedTurnId, expectedCwd, signal }) {
87570
+ if (![
87571
+ "reject",
87572
+ "queue",
87573
+ ...session ? [
87574
+ "steer"
87575
+ ] : []
87576
+ ].includes(whenBusy)) throw new RangeError("--when-busy must be reject, queue, or persistent steer");
87577
+ if (whenBusy === "steer" && (typeof expectedTurnId !== "string" || !ID_PATTERN.test(expectedTurnId))) throw new RangeError("steer requires expectedTurnId");
87578
+ if (typeof threadId !== "string" || !ID_PATTERN.test(threadId)) throw new RangeError("Invalid threadId");
87579
+ if (typeof text !== "string" || !text.trim() || Buffer.byteLength(text) > WS_MAX_MESSAGE_BYTES) throw new RangeError("Message must contain text within 4 MiB");
87580
+ if (!envelope || typeof envelope.messageId !== "string" || !ID_PATTERN.test(envelope.messageId)) throw new RangeError("Invalid envelope messageId");
87581
+ const validated = buildEnvelope({
87582
+ correlationId: envelope.correlationId,
87583
+ replyTo: envelope.replyTo,
87584
+ hop: envelope.hop,
87585
+ env
87586
+ });
87587
+ envelope = {
87588
+ ...validated,
87589
+ messageId: envelope.messageId,
87590
+ header: Boolean(envelope.header)
87591
+ };
85729
87592
  assertThreadAllowed(threadId, env);
85730
87593
  if (whenBusy === "queue") requireExperimental(env, "--when-busy queue");
87594
+ if (signal !== undefined && !(signal instanceof AbortSignal)) throw new TypeError("signal must be an AbortSignal");
87595
+ const assertNotCancelled = ()=>{
87596
+ if (signal?.aborted) throw new CodexSendError("Codex submission cancelled before delivery", {
87597
+ delivery: "rejected",
87598
+ reason: "cancelled",
87599
+ threadId,
87600
+ turnId: whenBusy === "steer" ? expectedTurnId : undefined,
87601
+ ...envelope
87602
+ });
87603
+ };
87604
+ assertNotCancelled();
85731
87605
  const body = withEnvelopeHeader(text, envelope, env);
85732
- const { client } = await openSession(env, {
85733
- experimental: whenBusy === "queue"
87606
+ const { client } = session ?? await openSession(env, {
87607
+ experimental: whenBusy === "queue",
87608
+ signal
85734
87609
  });
85735
87610
  try {
85736
87611
  let resumed;
@@ -85740,17 +87615,33 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85740
87615
  excludeTurns: true
85741
87616
  });
85742
87617
  } catch (err) {
87618
+ assertNotCancelled();
85743
87619
  if (err instanceof CodexSendError) throw err;
85744
87620
  throw new CodexSendError(explainSendError(err, threadId).message, {
85745
87621
  delivery: err instanceof CodexRpcError ? "rejected" : err && err.delivery || "unknown",
85746
87622
  reason: err instanceof CodexRpcError ? /no rollout found|thread not found/i.test(String(err.rpc && err.rpc.message)) ? "unknown-thread" : /active writer/i.test(String(err.rpc && err.rpc.message)) ? "external-owner" : "rejected" : "transport",
85747
87623
  threadId,
85748
- envelope
87624
+ ...envelope
85749
87625
  });
85750
87626
  }
87627
+ // A shared session stays connected when this conversation is cancelled.
87628
+ // Recheck after the last awaited preflight, before any submission request.
87629
+ assertNotCancelled();
85751
87630
  if (!isObject(resumed) || !isObject(resumed.thread) || typeof resumed.thread.id !== "string") {
85752
87631
  throw new CodexProtocolError("thread/resume", "missing `thread.id`");
85753
87632
  }
87633
+ if (resumed.thread.id !== threadId) throw new CodexSendError("thread/resume returned a different thread ID", {
87634
+ delivery: "rejected",
87635
+ reason: "bad-response",
87636
+ threadId,
87637
+ ...envelope
87638
+ });
87639
+ if (expectedCwd !== undefined && (0,node_fs__rspack_import_1.realpathSync)(resumed.cwd ?? resumed.thread.cwd) !== (0,node_fs__rspack_import_1.realpathSync)(expectedCwd)) throw new CodexSendError("Codex thread cwd does not match expectedCwd", {
87640
+ delivery: "rejected",
87641
+ reason: "cwd-mismatch",
87642
+ threadId,
87643
+ ...envelope
87644
+ });
85754
87645
  const state = threadState(resumed, threadId);
85755
87646
  const receiptBase = {
85756
87647
  threadId: resumed.thread.id,
@@ -85772,9 +87663,41 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85772
87663
  delivery: "rejected",
85773
87664
  reason: "busy",
85774
87665
  threadId,
85775
- envelope
87666
+ ...envelope
85776
87667
  });
85777
87668
  }
87669
+ if (whenBusy === "steer") {
87670
+ let steered;
87671
+ try {
87672
+ steered = await client.request("turn/steer", {
87673
+ threadId,
87674
+ expectedTurnId,
87675
+ clientUserMessageId: envelope.messageId,
87676
+ input: [
87677
+ {
87678
+ type: "text",
87679
+ text: body
87680
+ }
87681
+ ]
87682
+ });
87683
+ } catch (err) {
87684
+ throw unsupportedOrRpc(err, "turn/steer", threadId, envelope, expectedTurnId);
87685
+ }
87686
+ if (typeof steered?.turnId !== "string" || steered.turnId !== expectedTurnId) {
87687
+ throw new CodexSendError("Malformed turn/steer acknowledgment", {
87688
+ delivery: "unknown",
87689
+ reason: "bad-response",
87690
+ threadId,
87691
+ turnId: expectedTurnId,
87692
+ ...envelope
87693
+ });
87694
+ }
87695
+ return {
87696
+ delivery: "accepted",
87697
+ ...receiptBase,
87698
+ turnId: steered.turnId
87699
+ };
87700
+ }
85778
87701
  if (state.busy) {
85779
87702
  let queued;
85780
87703
  try {
@@ -85797,7 +87720,7 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85797
87720
  delivery: "unknown",
85798
87721
  reason: "bad-response",
85799
87722
  threadId,
85800
- envelope
87723
+ ...envelope
85801
87724
  });
85802
87725
  }
85803
87726
  return {
@@ -85818,9 +87741,11 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85818
87741
  // that arrives before the acknowledgment supplies our turn id wait in
85819
87742
  // client.deferred and are adopted only on a match. Requests missing
85820
87743
  // thread or turn IDs remain unanswered because ownership is unknown.
85821
- client.expectedThreadId = threadId;
85822
- client.expectedTurnId = null;
85823
- client.answerServerRequests = true;
87744
+ if (!session) {
87745
+ client.expectedThreadId = threadId;
87746
+ client.expectedTurnId = null;
87747
+ client.answerServerRequests = true;
87748
+ }
85824
87749
  let turn;
85825
87750
  try {
85826
87751
  turn = await client.request("turn/start", {
@@ -85843,7 +87768,7 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85843
87768
  delivery,
85844
87769
  reason: delivery === "rejected" ? "rejected" : "transport",
85845
87770
  threadId,
85846
- envelope
87771
+ ...envelope
85847
87772
  });
85848
87773
  }
85849
87774
  const turnId = turn && turn.turn && typeof turn.turn.id === "string" && turn.turn.id ? turn.turn.id : null;
@@ -85852,10 +87777,10 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85852
87777
  delivery: "unknown",
85853
87778
  reason: "bad-response",
85854
87779
  threadId,
85855
- envelope
87780
+ ...envelope
85856
87781
  });
85857
87782
  }
85858
- client._adoptTurn(turnId);
87783
+ if (!session) client._adoptTurn(turnId);
85859
87784
  const freshRefused = client.refused.slice(seenRefused).filter((r)=>{
85860
87785
  if (!r.answered) return false;
85861
87786
  const params = r.params && typeof r.params === "object" && !Array.isArray(r.params) ? r.params : null;
@@ -85874,7 +87799,7 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85874
87799
  threadId,
85875
87800
  turnId,
85876
87801
  refused: freshRefused.map((r)=>r.method),
85877
- envelope
87802
+ ...envelope
85878
87803
  });
85879
87804
  }
85880
87805
  return {
@@ -85884,18 +87809,22 @@ async function sendToCodexThreadInner(threadId, text, { env, envelope, whenBusy
85884
87809
  turnStatus: turn.turn.status
85885
87810
  };
85886
87811
  } finally{
85887
- client.close();
87812
+ if (!session) client.close();
85888
87813
  }
85889
87814
  }
85890
87815
 
85891
87816
  __webpack_require__.d(__webpack_exports__, {
87817
+ $3: () => (assertThreadAllowed),
85892
87818
  Bt: () => (listCodexQueue),
85893
87819
  MU: () => (codexStatus),
85894
87820
  Mr: () => (withEnvelopeHeader),
85895
87821
  X$: () => (listCodexThreads),
85896
87822
  ZS: () => (sendToCodexThread),
87823
+ e0: () => (experimentalEnabled),
87824
+ eC: () => (openCodexSession),
85897
87825
  nq: () => (buildEnvelope),
85898
- pF: () => (singleLine)
87826
+ pF: () => (singleLine),
87827
+ ql: () => (codexSocketPath)
85899
87828
  });
85900
87829
 
85901
87830
 
@@ -85960,8 +87889,6 @@ __webpack_require__.d(__webpack_exports__, {
85960
87889
  }
85961
87890
  /**
85962
87891
  * Flatten a thrown error into the #46 send/failure document (plus exitCode).
85963
- * Preserves the legacy failure-document fields, then adds exitCode for the
85964
- * generated CLI's `exitCode: 'result'` policy.
85965
87892
  *
85966
87893
  * @param {unknown} error
85967
87894
  * @param {{ isUsage?: (err: unknown) => boolean }} [opts]
@@ -85988,12 +87915,6 @@ __webpack_require__.d(__webpack_exports__, {
85988
87915
  if (error[key] !== undefined) out[key] = error[key];
85989
87916
  }
85990
87917
  if (out.reason === undefined && isUsage(error)) out.reason = "usage";
85991
- const envelope = /** @type {{ messageId?: string, correlationId?: string, hop?: number }} */ error.envelope;
85992
- if (envelope && typeof envelope === "object") {
85993
- if (envelope.messageId !== undefined) out.messageId = envelope.messageId;
85994
- if (envelope.correlationId !== undefined) out.correlationId = envelope.correlationId;
85995
- if (envelope.hop !== undefined) out.hop = envelope.hop;
85996
- }
85997
87918
  }
85998
87919
  if (out.delivery === undefined) out.delivery = "rejected";
85999
87920
  return /** @type {CodexSendOutcome & { error: string, exitCode: 1 }} */ {
@@ -86010,14 +87931,6 @@ __webpack_require__.d(__webpack_exports__, {
86010
87931
  ...receipt
86011
87932
  };
86012
87933
  if (base.delivery === undefined) base.delivery = "accepted";
86013
- // Flatten envelope onto the document when present (matches fail() + json print).
86014
- const envelope = base.envelope;
86015
- if (envelope && typeof envelope === "object") {
86016
- const e = /** @type {Record<string, unknown>} */ envelope;
86017
- if (base.messageId === undefined && e.messageId !== undefined) base.messageId = e.messageId;
86018
- if (base.correlationId === undefined && e.correlationId !== undefined) base.correlationId = e.correlationId;
86019
- if (base.hop === undefined && e.hop !== undefined) base.hop = e.hop;
86020
- }
86021
87934
  const exitCode = sendExitCode(/** @type {{ delivery: CodexDelivery, reason?: string, error?: string }} */ base);
86022
87935
  if (exitCode === 1 && base.error === undefined && base.reason === "approval-refused") {
86023
87936
  base.error = typeof base.message === "string" ? base.message : "Codex refused one or more approvals.";
@@ -86035,6 +87948,452 @@ __webpack_require__.d(__webpack_exports__, {
86035
87948
  });
86036
87949
 
86037
87950
 
87951
+ },
87952
+ "./src/core/codex/conversation.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
87953
+ /* import */ var _contract_js__rspack_import_0 = __webpack_require__("./src/core/codex/contract.js");
87954
+ /* import */ var node_fs__rspack_import_1 = __webpack_require__("node:fs");
87955
+ /* import */ var _codex_bridge_js__rspack_import_2 = __webpack_require__("./src/core/codex-bridge.js");
87956
+
87957
+
87958
+
87959
+ const ID = /^[A-Za-z0-9_.:-]{1,128}$/;
87960
+ const BUDGET = 4 * 1024 * 1024;
87961
+ function conversationId(value, name = 'threadId') {
87962
+ if (typeof value !== 'string' || !ID.test(value)) throw new RangeError(`${name} must be 1-128 identifier characters`);
87963
+ return value;
87964
+ }
87965
+ function boundedInteger(value, max, name) {
87966
+ if (!Number.isInteger(value) || value < 1 || value > max) throw new RangeError(`${name} must be an integer 1-${max}`);
87967
+ return value;
87968
+ }
87969
+ const terminal = (status)=>[
87970
+ 'completed',
87971
+ 'failed',
87972
+ 'interrupted'
87973
+ ].includes(status);
87974
+ const namedTurn = (p)=>p?.turnId ?? p?.turn_id ?? p?.turn?.id;
87975
+ /** Bounded traversal; a coverage failure throws and must never be interpreted as not found. */ async function visitCodexHistory(session, threadId, method, params, visit, { signal, stopped = ()=>false } = {}) {
87976
+ if (![
87977
+ 'thread/turns/list',
87978
+ 'thread/items/list'
87979
+ ].includes(method)) throw new RangeError('Unsupported history method');
87980
+ conversationId(threadId);
87981
+ const client = session.client;
87982
+ let cursor;
87983
+ const seen = new Set();
87984
+ for(let page = 0; page < 20; page++){
87985
+ if (stopped() || signal?.aborted) throw new Error('History coverage incomplete: observation cancelled');
87986
+ const result = await client.request(method, {
87987
+ ...params,
87988
+ threadId,
87989
+ limit: 100,
87990
+ ...cursor ? {
87991
+ cursor
87992
+ } : {}
87993
+ });
87994
+ if (stopped() || signal?.aborted) throw new Error('History coverage incomplete: observation cancelled');
87995
+ if (!Array.isArray(result?.data) || result.data.length > 100 || result.nextCursor != null && (typeof result.nextCursor !== 'string' || !result.nextCursor || result.nextCursor.length > 4096)) throw new Error(`Invalid ${method} page`);
87996
+ if (visit(result.data)) return {
87997
+ complete: false,
87998
+ reason: 'matched',
87999
+ pages: page + 1
88000
+ };
88001
+ if (result.nextCursor == null) return {
88002
+ complete: true,
88003
+ reason: 'exhausted',
88004
+ pages: page + 1
88005
+ };
88006
+ if (seen.has(result.nextCursor)) throw new Error('History coverage incomplete: repeated pagination cursor');
88007
+ seen.add(result.nextCursor);
88008
+ cursor = result.nextCursor;
88009
+ }
88010
+ throw new Error('History coverage incomplete: 20 page limit');
88011
+ }
88012
+ /** A bounded observer. Cancellation ends observation, never the daemon's turn. */ async function openCodexConversation(threadId, options = {}) {
88013
+ conversationId(threadId);
88014
+ const { env = process.env, expectedCwd, signal, onEvent } = options;
88015
+ (0,_codex_bridge_js__rspack_import_2/* .assertThreadAllowed */.$3)(threadId, env);
88016
+ if (signal !== undefined && !(signal instanceof AbortSignal)) throw new TypeError('signal must be an AbortSignal');
88017
+ if (onEvent !== undefined && typeof onEvent !== 'function') throw new TypeError('onEvent must be a function');
88018
+ if (signal?.aborted) throw new Error('Observation cancelled');
88019
+ const expected = expectedCwd === undefined ? undefined : (0,node_fs__rspack_import_1.realpathSync)(expectedCwd);
88020
+ const session = options.session ?? await (0,_codex_bridge_js__rspack_import_2/* .openCodexSession */.eC)(env, {
88021
+ signal,
88022
+ experimental: (0,_codex_bridge_js__rspack_import_2/* .experimentalEnabled */.e0)(env)
88023
+ });
88024
+ const { client } = session;
88025
+ const events = [];
88026
+ const acceptedTurns = new Set();
88027
+ const wake = new Set();
88028
+ let bytes = 0, overflow = false, disconnected = client.closed, closed = false;
88029
+ const record = (event)=>{
88030
+ const size = Buffer.byteLength(JSON.stringify(event));
88031
+ if (size > BUDGET) {
88032
+ overflow = true;
88033
+ } else {
88034
+ while(events.length >= 500 || bytes + size > BUDGET){
88035
+ bytes -= events.shift().bytes;
88036
+ overflow = true;
88037
+ }
88038
+ events.push({
88039
+ event,
88040
+ bytes: size
88041
+ });
88042
+ bytes += size;
88043
+ }
88044
+ for (const listener of [
88045
+ ...wake
88046
+ ])listener();
88047
+ return onEvent?.(event);
88048
+ };
88049
+ const observe = (kind)=>(message)=>{
88050
+ const p = message.params;
88051
+ if ((p?.threadId ?? p?.thread_id) !== threadId) return;
88052
+ return record({
88053
+ kind,
88054
+ ...message
88055
+ });
88056
+ };
88057
+ const unsubs = [
88058
+ client.onNotification(observe('notification')),
88059
+ client.onServerRequest(observe('interaction')),
88060
+ client.onClose((error)=>{
88061
+ disconnected = true;
88062
+ return record({
88063
+ kind: 'disconnect',
88064
+ error: error?.message
88065
+ });
88066
+ })
88067
+ ];
88068
+ const close = async ()=>{
88069
+ if (closed) return;
88070
+ closed = true;
88071
+ for (const unsubscribe of unsubs)unsubscribe();
88072
+ for (const listener of wake)listener();
88073
+ if (!options.session) client.close();
88074
+ };
88075
+ let resumed;
88076
+ try {
88077
+ resumed = await client.request('thread/resume', {
88078
+ threadId,
88079
+ excludeTurns: true
88080
+ });
88081
+ if (resumed?.thread?.id !== threadId) throw new Error('thread/resume returned a different thread ID');
88082
+ const cwd = resumed.cwd ?? resumed.thread.cwd;
88083
+ if (expected !== undefined && (typeof cwd !== 'string' || (0,node_fs__rspack_import_1.realpathSync)(cwd) !== expected)) throw new Error('Codex thread cwd does not match expectedCwd');
88084
+ } catch (error) {
88085
+ await close();
88086
+ throw error;
88087
+ }
88088
+ /** @param {{turnId: string, messageId?: string, afterMessageId?: string|string[], timeoutMs?: number, signal?: AbortSignal, maxOutputBytes?: number}} options */ async function wait({ turnId, messageId, afterMessageId, timeoutMs = 120000, signal: waitSignal, maxOutputBytes = 1048576 }) {
88089
+ conversationId(turnId, 'turnId');
88090
+ if (messageId !== undefined) conversationId(messageId, 'messageId');
88091
+ const anchors = afterMessageId === undefined ? [] : Array.isArray(afterMessageId) ? afterMessageId : [
88092
+ afterMessageId
88093
+ ];
88094
+ if (afterMessageId !== undefined) boundedInteger(anchors.length, 200, 'afterMessageId count');
88095
+ for (const anchor of anchors)conversationId(anchor, 'afterMessageId');
88096
+ boundedInteger(timeoutMs, 600000, 'timeoutMs');
88097
+ boundedInteger(maxOutputBytes, BUDGET, 'maxOutputBytes');
88098
+ if (waitSignal !== undefined && !(waitSignal instanceof AbortSignal)) throw new TypeError('signal must be an AbortSignal');
88099
+ let done = false, status = acceptedTurns.has(turnId) ? 'inProgress' : undefined, error, historyError, itemBytes = 0, truncated = overflow;
88100
+ const items = new Map();
88101
+ const add = (item)=>{
88102
+ if (!item || typeof item.id !== 'string' || typeof item.type !== 'string') throw new Error('Invalid history item');
88103
+ if (item.type !== 'agentMessage' || typeof item.text !== 'string' || item.phase !== 'final_answer' && item.phase != null) return;
88104
+ const normalized = {
88105
+ id: item.id,
88106
+ type: item.type,
88107
+ phase: item.phase ?? null,
88108
+ text: item.text
88109
+ };
88110
+ const size = Buffer.byteLength(JSON.stringify(normalized));
88111
+ const prior = items.get(item.id);
88112
+ if (itemBytes - (prior?.bytes ?? 0) + size > BUDGET || !prior && items.size >= 2000) {
88113
+ truncated = true;
88114
+ return;
88115
+ }
88116
+ itemBytes += size - (prior?.bytes ?? 0);
88117
+ items.set(item.id, {
88118
+ item: normalized,
88119
+ bytes: size
88120
+ });
88121
+ };
88122
+ const scan = ()=>{
88123
+ const interactions = new Map();
88124
+ for (const { event } of events){
88125
+ const p = event.params;
88126
+ if (event.method === 'serverRequest/resolved') {
88127
+ interactions.delete(p.requestId);
88128
+ continue;
88129
+ }
88130
+ if (namedTurn(p) !== turnId) continue;
88131
+ if (event.kind === 'interaction') interactions.set(event.id, event);
88132
+ if (event.method === 'turn/started' && !terminal(status)) status = p.turn?.status;
88133
+ if (event.method === 'item/completed' && afterMessageId === undefined) add(p.item);
88134
+ if (event.method === 'turn/completed') {
88135
+ status = p.turn?.status;
88136
+ error = p.turn?.error;
88137
+ if (afterMessageId === undefined) for (const item of p.turn?.items ?? [])add(item);
88138
+ }
88139
+ }
88140
+ return [
88141
+ ...interactions.values()
88142
+ ];
88143
+ };
88144
+ const result = (state, detail)=>{
88145
+ const interactions = scan();
88146
+ const candidates = [
88147
+ ...items.values()
88148
+ ].map((x)=>x.item);
88149
+ const finals = candidates.filter((i)=>i.phase === 'final_answer');
88150
+ // Old app-servers omit phase; use their completed agent items only at terminal status.
88151
+ const selected = finals.length ? finals : terminal(state) ? candidates : [];
88152
+ const reply = {
88153
+ text: '',
88154
+ items: [],
88155
+ truncated: truncated || overflow
88156
+ };
88157
+ for (const item of selected){
88158
+ const text = reply.text ? `${reply.text}\n${item.text}` : item.text;
88159
+ if (Buffer.byteLength(JSON.stringify({
88160
+ text,
88161
+ items: [
88162
+ ...reply.items,
88163
+ item
88164
+ ]
88165
+ })) > maxOutputBytes) {
88166
+ reply.truncated = true;
88167
+ break;
88168
+ }
88169
+ reply.text = text;
88170
+ reply.items.push(item);
88171
+ }
88172
+ return {
88173
+ threadId,
88174
+ turnId,
88175
+ ...messageId === undefined ? {} : {
88176
+ messageId
88177
+ },
88178
+ execution: {
88179
+ state,
88180
+ ...detail ? {
88181
+ error: detail
88182
+ } : {}
88183
+ },
88184
+ reply,
88185
+ interactions
88186
+ };
88187
+ };
88188
+ let timer, notify;
88189
+ const abortSignals = [
88190
+ signal,
88191
+ waitSignal
88192
+ ].filter(Boolean);
88193
+ const stopped = new Promise((resolve)=>{
88194
+ notify = ()=>{
88195
+ if (abortSignals.some((s)=>s.aborted) || closed) resolve([
88196
+ 'unknown',
88197
+ 'Observation cancelled'
88198
+ ]);
88199
+ else if (disconnected) resolve([
88200
+ 'disconnected',
88201
+ 'Codex connection closed'
88202
+ ]);
88203
+ };
88204
+ timer = setTimeout(()=>resolve([
88205
+ 'timeout',
88206
+ 'Observation deadline reached'
88207
+ ]), timeoutMs);
88208
+ for (const s of abortSignals)s.addEventListener('abort', notify, {
88209
+ once: true
88210
+ });
88211
+ wake.add(notify);
88212
+ notify();
88213
+ });
88214
+ const collect = async ()=>{
88215
+ scan();
88216
+ try {
88217
+ let found = false, historyTerminal = false, anchorFound = afterMessageId === undefined;
88218
+ const missingAnchors = new Set(anchors);
88219
+ await visitCodexHistory(session, threadId, 'thread/turns/list', {}, (data)=>{
88220
+ for (const turn of data)if (!turn || typeof turn.id !== 'string' || typeof turn.status !== 'string') throw new Error('Invalid turn history');
88221
+ const turn = data.find((t)=>t.id === turnId);
88222
+ if (!turn) return false;
88223
+ found = true;
88224
+ historyTerminal = terminal(turn.status);
88225
+ if (!terminal(status)) {
88226
+ status = turn.status;
88227
+ error = turn.error;
88228
+ }
88229
+ return true;
88230
+ }, {
88231
+ stopped: ()=>done
88232
+ });
88233
+ // Notifications can establish completion while the history response is in flight.
88234
+ scan();
88235
+ if (!found && !status) return [
88236
+ 'unknown',
88237
+ 'History coverage incomplete: selected turn not found'
88238
+ ];
88239
+ await visitCodexHistory(session, threadId, 'thread/items/list', {
88240
+ turnId,
88241
+ sortDirection: 'asc'
88242
+ }, (data)=>{
88243
+ for (const row of data){
88244
+ if (!row || row.turnId !== turnId || !row.item) throw new Error('Invalid thread/items/list wrapper');
88245
+ if (row.item.type === 'userMessage' && anchors.includes(row.item.clientId)) {
88246
+ anchorFound = true;
88247
+ missingAnchors.delete(row.item.clientId);
88248
+ }
88249
+ if (anchorFound) add(row.item);
88250
+ }
88251
+ return false;
88252
+ }, {
88253
+ stopped: ()=>done
88254
+ });
88255
+ if (!anchorFound || missingAnchors.size) {
88256
+ items.clear();
88257
+ return [
88258
+ 'unknown',
88259
+ 'History coverage incomplete: reply anchor not found'
88260
+ ];
88261
+ }
88262
+ if (afterMessageId !== undefined && !historyTerminal) return scan().length ? [
88263
+ 'waiting-for-input'
88264
+ ] : [
88265
+ 'unknown',
88266
+ 'Anchored reply awaits terminal history'
88267
+ ];
88268
+ } catch (err) {
88269
+ historyError = err.message;
88270
+ truncated = true;
88271
+ }
88272
+ if (afterMessageId !== undefined && historyError) {
88273
+ items.clear();
88274
+ return [
88275
+ 'unknown',
88276
+ historyError
88277
+ ];
88278
+ }
88279
+ while(!done){
88280
+ const interactions = scan();
88281
+ if (terminal(status)) return [
88282
+ status,
88283
+ error ?? historyError
88284
+ ];
88285
+ if (historyError || overflow) return [
88286
+ 'unknown',
88287
+ historyError ?? 'Notification coverage overflow'
88288
+ ];
88289
+ if (interactions.length) return [
88290
+ 'waiting-for-input'
88291
+ ];
88292
+ await new Promise((resolve)=>{
88293
+ const listener = ()=>{
88294
+ wake.delete(listener);
88295
+ resolve();
88296
+ };
88297
+ wake.add(listener);
88298
+ });
88299
+ }
88300
+ return [
88301
+ 'unknown',
88302
+ 'Observation ended'
88303
+ ];
88304
+ };
88305
+ try {
88306
+ const [state, detail] = await Promise.race([
88307
+ stopped,
88308
+ collect()
88309
+ ]);
88310
+ return result(state, detail);
88311
+ } finally{
88312
+ done = true;
88313
+ clearTimeout(timer);
88314
+ wake.delete(notify);
88315
+ for (const s of abortSignals)s.removeEventListener('abort', notify);
88316
+ for (const listener of [
88317
+ ...wake
88318
+ ])listener();
88319
+ }
88320
+ }
88321
+ /** @param {{timeoutMs?: number, maxEvents?: number, signal?: AbortSignal}} [options] */ async function watch({ timeoutMs = 30000, maxEvents = 100, signal: watchSignal } = {}) {
88322
+ boundedInteger(timeoutMs, 600000, 'timeoutMs');
88323
+ boundedInteger(maxEvents, 500, 'maxEvents');
88324
+ if (watchSignal !== undefined && !(watchSignal instanceof AbortSignal)) throw new TypeError('signal must be an AbortSignal');
88325
+ const signals = [
88326
+ signal,
88327
+ watchSignal
88328
+ ].filter(Boolean);
88329
+ let timer, listener;
88330
+ const reason = await new Promise((resolve)=>{
88331
+ listener = ()=>{
88332
+ if (signals.some((s)=>s.aborted) || closed) resolve('cancelled');
88333
+ else if (disconnected) resolve('disconnected');
88334
+ else if (events.length >= maxEvents) resolve('event-limit');
88335
+ };
88336
+ timer = setTimeout(()=>resolve('timeout'), timeoutMs);
88337
+ wake.add(listener);
88338
+ for (const s of signals)s.addEventListener('abort', listener, {
88339
+ once: true
88340
+ });
88341
+ listener();
88342
+ });
88343
+ clearTimeout(timer);
88344
+ wake.delete(listener);
88345
+ for (const s of signals)s.removeEventListener('abort', listener);
88346
+ return {
88347
+ threadId,
88348
+ events: events.slice(0, maxEvents).map((x)=>x.event),
88349
+ reason,
88350
+ truncated: overflow || events.length > maxEvents
88351
+ };
88352
+ }
88353
+ return {
88354
+ threadId,
88355
+ cwd: resumed.cwd ?? resumed.thread.cwd,
88356
+ wait,
88357
+ watch,
88358
+ close,
88359
+ /** @param {string} text
88360
+ * @param {{envelope?: object, whenBusy?: string, expectedTurnId?: string, signal?: AbortSignal}} [options] */ async send (text, { envelope = (0,_codex_bridge_js__rspack_import_2/* .buildEnvelope */.nq)({
88361
+ env
88362
+ }), whenBusy = 'reject', expectedTurnId, signal: sendSignal } = {}) {
88363
+ if (closed) return (0,_contract_js__rspack_import_0/* .outcomeFromError */.DG)(Object.assign(new Error('Conversation closed'), {
88364
+ delivery: 'rejected',
88365
+ reason: 'closed',
88366
+ threadId,
88367
+ envelope
88368
+ }));
88369
+ if (sendSignal !== undefined && !(sendSignal instanceof AbortSignal)) throw new TypeError('signal must be an AbortSignal');
88370
+ const submissionSignal = signal && sendSignal ? AbortSignal.any([
88371
+ signal,
88372
+ sendSignal
88373
+ ]) : sendSignal ?? signal;
88374
+ const receipt = await (0,_codex_bridge_js__rspack_import_2/* .sendToCodexThread */.ZS)(threadId, text, {
88375
+ env,
88376
+ envelope,
88377
+ whenBusy,
88378
+ expectedTurnId,
88379
+ session,
88380
+ expectedCwd,
88381
+ signal: submissionSignal
88382
+ });
88383
+ if (receipt.delivery === 'accepted' && receipt.turnId) {
88384
+ acceptedTurns.add(receipt.turnId);
88385
+ if (acceptedTurns.size > 100) acceptedTurns.delete(acceptedTurns.values().next().value);
88386
+ }
88387
+ return receipt;
88388
+ }
88389
+ };
88390
+ }
88391
+
88392
+ __webpack_require__.d(__webpack_exports__, {
88393
+ j: () => (openCodexConversation)
88394
+ });
88395
+
88396
+
86038
88397
  },
86039
88398
  "./src/core/commands.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
86040
88399
  /* import */ var _store_js__rspack_import_0 = __webpack_require__("./src/core/store.js");
@@ -86702,7 +89061,7 @@ function formatTranscript(out, { full = false } = {}) {
86702
89061
  for (const e of entries){
86703
89062
  const role = e.role || e.kind || e.sender || e.type || "msg";
86704
89063
  const text = (0,_transcript_js__rspack_import_0/* .entryText */.u0)(e);
86705
- const id = e.id || e.messageId || "";
89064
+ const id = e.id || "";
86706
89065
  lines.push("[" + role + (id ? " " + id : "") + "] " + (full ? text : truncateCliText(text)));
86707
89066
  }
86708
89067
  return lines.join("\n");
@@ -86797,20 +89156,33 @@ class GatewayError extends Error {
86797
89156
  // ponytail: fixed 30 s deadline and buffered byte cap; upgrade path is per-method budgets plus streaming reads.
86798
89157
  const GATEWAY_TIMEOUT_MS = 30000;
86799
89158
  const GATEWAY_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
89159
+ function assertGatewayActive(signal) {
89160
+ if (signal?.aborted) {
89161
+ const error = new GatewayError("Gateway submission cancelled before transmission");
89162
+ error.delivery = "rejected";
89163
+ error.reason = "cancelled";
89164
+ throw error;
89165
+ }
89166
+ }
89167
+ function gatewayDeadline(signal) {
89168
+ const timeout = AbortSignal.timeout(GATEWAY_TIMEOUT_MS);
89169
+ return signal ? AbortSignal.any([
89170
+ signal,
89171
+ timeout
89172
+ ]) : timeout;
89173
+ }
86800
89174
  function backendBase() {
86801
- return (process.env.SAND_BACKEND_URL || process.env.CURSOR_API_BASE_URL || "https://api2.cursor.sh").replace(/\/$/, "");
89175
+ return (process.env.CURSOR_API_BASE_URL || "https://api2.cursor.sh").replace(/\/$/, "");
86802
89176
  }
86803
89177
  function accessTokenFromEnv() {
86804
- return (process.env.CURSOR_ACCESS_TOKEN || process.env.GROK_BOT_ACCESS_TOKEN || process.env.SAND_ACCESS_TOKEN || "").trim();
89178
+ return (process.env.CURSOR_ACCESS_TOKEN || "").trim();
86805
89179
  }
86806
89180
  function gatewayTokenFromEnv() {
86807
- return (process.env.GROK_BOT_GATEWAY_TOKEN || process.env.SAND_HOST_GATEWAY_TOKEN || process.env.SAND_GATEWAY_TOKEN || "").trim();
89181
+ return (process.env.GROK_BOT_GATEWAY_TOKEN || "").trim();
86808
89182
  }
86809
89183
  function gatewayOverride() {
86810
89184
  const token = gatewayTokenFromEnv();
86811
- const explicitUrl = (process.env.GROK_BOT_GATEWAY_URL || process.env.SAND_HOST_GATEWAY_URL || "").trim();
86812
- const localUrl = token ? "http://127.0.0.1:" + (process.env.SAND_HOST_PORT || "1340") : "";
86813
- const url = explicitUrl || localUrl;
89185
+ const url = (process.env.GROK_BOT_GATEWAY_URL || "").trim();
86814
89186
  if (url && token) {
86815
89187
  return {
86816
89188
  gatewayUrl: (0,_url_policy_js__rspack_import_3/* .assertAllowedCredentialUrl */.Re)(url.replace(/\/$/, ""), {
@@ -86887,18 +89259,26 @@ function pick(obj, ...keys) {
86887
89259
  }
86888
89260
  return undefined;
86889
89261
  }
86890
- async function ensureSandbox(accessToken) {
89262
+ async function ensureSandbox(accessToken, { signal } = {}) {
89263
+ assertGatewayActive(signal);
86891
89264
  const url = (0,_url_policy_js__rspack_import_3/* .assertAllowedCredentialUrl */.Re)(backendBase(), {
86892
89265
  kind: "backend"
86893
89266
  }) + "/aiserver.v1.GrokBotService/EnsureSandBox";
86894
- const res = await fetch(url, {
86895
- method: "POST",
86896
- redirect: "error",
86897
- signal: AbortSignal.timeout(GATEWAY_TIMEOUT_MS),
86898
- headers: (0,_headers_js__rspack_import_4/* .ensureSandboxHeaders */._6)(accessToken),
86899
- body: "{}"
86900
- });
86901
- const body = await readJson(res);
89267
+ let res, body;
89268
+ try {
89269
+ res = await fetch(url, {
89270
+ method: "POST",
89271
+ redirect: "error",
89272
+ signal: gatewayDeadline(signal),
89273
+ headers: (0,_headers_js__rspack_import_4/* .ensureSandboxHeaders */._6)(accessToken),
89274
+ body: "{}"
89275
+ });
89276
+ body = await readJson(res);
89277
+ } catch (error) {
89278
+ assertGatewayActive(signal);
89279
+ throw error;
89280
+ }
89281
+ assertGatewayActive(signal);
86902
89282
  if (!res.ok) {
86903
89283
  const detail = body.message || body.error || body.raw || res.statusText;
86904
89284
  throw new GatewayError("EnsureSandBox failed: " + res.status + " " + (0,_url_policy_js__rspack_import_3/* .redactSecrets */.fp)(detail), {
@@ -86919,7 +89299,8 @@ async function ensureSandbox(accessToken) {
86919
89299
  gatewayHeaders: (0,_headers_js__rspack_import_4/* .mergeGatewayHeaders */.bQ)((0,_headers_js__rspack_import_4/* .headersFromEnsureSandbox */.Ew)(body), (0,_headers_js__rspack_import_4/* .headersFromEnv */.gx)())
86920
89300
  };
86921
89301
  }
86922
- async function connectGateway() {
89302
+ async function connectGateway({ signal } = {}) {
89303
+ assertGatewayActive(signal);
86923
89304
  const override = gatewayOverride();
86924
89305
  if (override) return override;
86925
89306
  const fromApp = sessionFromApp();
@@ -86928,21 +89309,36 @@ async function connectGateway() {
86928
89309
  if (!token) {
86929
89310
  throw new GatewayError("Set CURSOR_ACCESS_TOKEN, or GROK_BOT_GATEWAY_URL + GROK_BOT_GATEWAY_TOKEN. Do not use a Cursor dashboard API key.");
86930
89311
  }
86931
- return ensureSandbox(token);
89312
+ return ensureSandbox(token, {
89313
+ signal
89314
+ });
86932
89315
  }
86933
- async function gatewayCall(session, method, body = {}) {
89316
+ async function gatewayCall(session, method, body = {}, { signal } = {}) {
89317
+ assertGatewayActive(signal);
86934
89318
  const base = (0,_url_policy_js__rspack_import_3/* .assertAllowedCredentialUrl */.Re)(session.gatewayUrl, {
86935
89319
  kind: "gateway"
86936
89320
  });
86937
89321
  const url = base + "/api/" + method;
86938
- const res = await fetch(url, {
89322
+ // Cancellation can abort read/auth preflights. Once a prompt request starts,
89323
+ // observe its actual receipt (or timeout) instead of losing certainty on stop.
89324
+ const prompt = method === "sendPrompt";
89325
+ const options = {
86939
89326
  method: "POST",
86940
89327
  redirect: "error",
86941
- signal: AbortSignal.timeout(GATEWAY_TIMEOUT_MS),
89328
+ signal: gatewayDeadline(prompt ? undefined : signal),
86942
89329
  headers: (0,_headers_js__rspack_import_4/* .requestHeaders */.A1)(session),
86943
89330
  body: JSON.stringify(body)
86944
- });
86945
- const data = await readJson(res);
89331
+ };
89332
+ assertGatewayActive(signal); // Final synchronous boundary before transmission.
89333
+ let res, data;
89334
+ try {
89335
+ res = await fetch(url, options);
89336
+ data = await readJson(res);
89337
+ } catch (error) {
89338
+ if (!prompt) assertGatewayActive(signal);
89339
+ throw error;
89340
+ }
89341
+ if (!prompt) assertGatewayActive(signal);
86946
89342
  if (!res.ok) {
86947
89343
  const detail = data.message || data.error || data.raw || res.statusText;
86948
89344
  throw new GatewayError(method + " failed: " + res.status + " " + (0,_url_policy_js__rspack_import_3/* .redactSecrets */.fp)(String(detail).slice(0, 300)), {
@@ -86994,8 +89390,10 @@ function unwrapList(data) {
86994
89390
  function unwrapOne(data) {
86995
89391
  return asRecord(data.agent || data);
86996
89392
  }
86997
- async function listAgents(session) {
86998
- const data = await gatewayCall(session, "listAgents", {});
89393
+ async function listAgents(session, { signal } = {}) {
89394
+ const data = await gatewayCall(session, "listAgents", {}, {
89395
+ signal
89396
+ });
86999
89397
  return unwrapList(data).map(asRecord).filter((r)=>r && r.id);
87000
89398
  }
87001
89399
  function resolveFromList(records, ref) {
@@ -87007,8 +89405,10 @@ function resolveFromList(records, ref) {
87007
89405
  if (matches.length === 0) throw new GatewayError("No bot or group named \"" + ref + "\"");
87008
89406
  throw new GatewayError("Ambiguous name \"" + ref + "\"");
87009
89407
  }
87010
- async function resolveRef(session, ref) {
87011
- return resolveFromList(await listAgents(session), ref);
89408
+ async function resolveRef(session, ref, { signal } = {}) {
89409
+ return resolveFromList(await listAgents(session, {
89410
+ signal
89411
+ }), ref);
87012
89412
  }
87013
89413
  async function createAgent(session, input) {
87014
89414
  const data = await gatewayCall(session, "createAgent", {
@@ -87131,7 +89531,10 @@ async function removeGroupMember(session, groupRef, memberRef) {
87131
89531
  return setGroupMembers(session, group.id, next);
87132
89532
  }
87133
89533
  async function sendPrompt(session, ref, prompt, extra = {}) {
87134
- const rec = await resolveRef(session, ref);
89534
+ assertGatewayActive(extra.signal);
89535
+ const rec = await resolveRef(session, ref, {
89536
+ signal: extra.signal
89537
+ });
87135
89538
  const body = {
87136
89539
  agentId: rec.id,
87137
89540
  prompt,
@@ -87140,7 +89543,9 @@ async function sendPrompt(session, ref, prompt, extra = {}) {
87140
89543
  if (extra.replyToId) body.replyToId = extra.replyToId;
87141
89544
  let data;
87142
89545
  try {
87143
- data = await gatewayCall(session, "sendPrompt", body);
89546
+ data = await gatewayCall(session, "sendPrompt", body, {
89547
+ signal: extra.signal
89548
+ });
87144
89549
  } catch (err) {
87145
89550
  // Delivery states: the server answered no (rejected) vs the request may have landed (unknown).
87146
89551
  // Never retry an unknown delivery blindly; read the thread first.
@@ -87314,8 +89719,8 @@ function saveHistory(out, { dir, disabled, event, prompt, rootId } = {}) {
87314
89719
  rootId
87315
89720
  } : {},
87316
89721
  role: String(entry.role || entry.kind || entry.sender || entry.type || "msg"),
87317
- ...entry.id || entry.messageId ? {
87318
- messageId: String(entry.id || entry.messageId)
89722
+ ...entry.id ? {
89723
+ messageId: String(entry.id)
87319
89724
  } : {},
87320
89725
  ...entry.timestamp || entry.createdAt ? {
87321
89726
  timestamp: String(entry.timestamp || entry.createdAt)
@@ -87392,6 +89797,269 @@ __webpack_require__.d(__webpack_exports__, {
87392
89797
  });
87393
89798
 
87394
89799
 
89800
+ },
89801
+ "./src/core/relay/control.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
89802
+ /* import */ var node_string_decoder__rspack_import_0 = __webpack_require__("node:string_decoder");
89803
+ /* import */ var node_net__rspack_import_1 = __webpack_require__("node:net");
89804
+ /* import */ var node_crypto__rspack_import_2 = __webpack_require__("node:crypto");
89805
+ /* import */ var _profile_js__rspack_import_3 = __webpack_require__("./src/core/relay/profile.js");
89806
+
89807
+
89808
+
89809
+
89810
+ const RELAY_PROTOCOL = 1;
89811
+ const CONTROL_BYTES = 1024 * 1024;
89812
+ const CONTROL_TIMEOUT = 45000;
89813
+ function relayRequest(options, method, input = {}, { timeoutMs = CONTROL_TIMEOUT, signal, requestId = (0,node_crypto__rspack_import_2.randomUUID)() } = {}) {
89814
+ const { socketPath, profile } = (0,_profile_js__rspack_import_3/* .relayLocation */.hQ)(options);
89815
+ return new Promise((resolve, reject)=>{
89816
+ const decoder = new node_string_decoder__rspack_import_0.StringDecoder("utf8");
89817
+ let buffer = "", bytes = 0, settled = false, connected = false;
89818
+ const socket = (0,node_net__rspack_import_1.connect)(socketPath);
89819
+ const finish = (error, value)=>{
89820
+ if (settled) return;
89821
+ settled = true;
89822
+ clearTimeout(timer);
89823
+ signal?.removeEventListener("abort", abort);
89824
+ socket.destroy();
89825
+ error ? reject(error) : resolve(value);
89826
+ };
89827
+ const uncertain = ()=>Object.assign(Error(`Relay control connection lost; do not resend with a new requestId (${requestId}). Check bridge status.`), {
89828
+ requestId
89829
+ });
89830
+ const abort = ()=>finish(uncertain());
89831
+ const timer = setTimeout(abort, timeoutMs);
89832
+ signal?.addEventListener("abort", abort, {
89833
+ once: true
89834
+ });
89835
+ if (signal?.aborted) return abort();
89836
+ socket.on("error", (error)=>finish(connected ? uncertain() : error));
89837
+ socket.on("close", ()=>finish(uncertain()));
89838
+ socket.on("connect", ()=>{
89839
+ connected = true;
89840
+ const line = JSON.stringify({
89841
+ version: RELAY_PROTOCOL,
89842
+ profile,
89843
+ requestId,
89844
+ method,
89845
+ input
89846
+ }) + "\n";
89847
+ if (Buffer.byteLength(line) > CONTROL_BYTES) return finish(Error("Relay control request exceeds budget"));
89848
+ socket.write(line);
89849
+ });
89850
+ socket.on("data", (chunk)=>{
89851
+ bytes += chunk.length;
89852
+ if (bytes > CONTROL_BYTES) return finish(Error("Relay control response exceeds budget"));
89853
+ buffer += decoder.write(chunk);
89854
+ const end = buffer.indexOf("\n");
89855
+ if (end < 0) return;
89856
+ try {
89857
+ const reply = JSON.parse(buffer.slice(0, end));
89858
+ if (reply.version !== RELAY_PROTOCOL || reply.requestId !== requestId) throw Error("Relay protocol identity mismatch");
89859
+ if (reply.error) throw Error(reply.error);
89860
+ if (reply.profile !== profile) throw Error("Relay profile mismatch");
89861
+ finish(null, reply.result);
89862
+ } catch (error) {
89863
+ finish(error);
89864
+ }
89865
+ });
89866
+ });
89867
+ }
89868
+
89869
+ __webpack_require__.d(__webpack_exports__, {
89870
+ lJ: () => (relayRequest)
89871
+ });
89872
+
89873
+
89874
+ },
89875
+ "./src/core/relay/managed.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
89876
+ /* import */ var node_child_process__rspack_import_0 = __webpack_require__("node:child_process");
89877
+ /* import */ var node_fs_promises__rspack_import_1 = __webpack_require__("node:fs/promises");
89878
+ /* import */ var node_path__rspack_import_2 = __webpack_require__("node:path");
89879
+ /* import */ var node_url__rspack_import_3 = __webpack_require__("node:url");
89880
+ /* import */ var node_crypto__rspack_import_4 = __webpack_require__("node:crypto");
89881
+ /* import */ var _profile_js__rspack_import_5 = __webpack_require__("./src/core/relay/profile.js");
89882
+ /* import */ var _control_js__rspack_import_6 = __webpack_require__("./src/core/relay/control.js");
89883
+
89884
+
89885
+
89886
+
89887
+
89888
+
89889
+
89890
+ /** @param {{pluginRoot?: string, moduleUrl?: string}} options */ async function resolveRelayWorker({ pluginRoot, moduleUrl = import.meta.url } = {}) {
89891
+ const roots = [];
89892
+ if (pluginRoot) roots.push(pluginRoot);
89893
+ let path = (0,node_path__rspack_import_2.dirname)((0,node_url__rspack_import_3.fileURLToPath)(moduleUrl));
89894
+ for(let i = 0; i < 5; i++){
89895
+ roots.push(path);
89896
+ path = (0,node_path__rspack_import_2.dirname)(path);
89897
+ }
89898
+ for (const candidate of new Set(roots)){
89899
+ let manifest;
89900
+ try {
89901
+ manifest = JSON.parse(await (0,node_fs_promises__rspack_import_1.readFile)((0,node_path__rspack_import_2.join)(candidate, "agent-bundle.manifest.json"), "utf8"));
89902
+ } catch (error) {
89903
+ if (error.code === "ENOENT") continue;
89904
+ throw error;
89905
+ }
89906
+ const relative = "scripts/gbot-relay.mjs";
89907
+ const file = manifest.files?.find((f)=>f.path === relative);
89908
+ if (manifest.application?.name !== "gbot" || !file || !manifest.executables?.scripts?.some((s)=>s.path === relative)) continue;
89909
+ const root = await (0,node_fs_promises__rspack_import_1.realpath)(candidate), worker = (0,node_path__rspack_import_2.join)(root, relative), stat = await (0,node_fs_promises__rspack_import_1.lstat)(worker);
89910
+ if (!stat.isFile() || stat.isSymbolicLink() || await (0,node_fs_promises__rspack_import_1.realpath)(worker) !== worker) throw Error("Relay worker must be a regular packaged script");
89911
+ if (stat.size !== file.bytes || (0,_profile_js__rspack_import_5/* .digest */.br)(await (0,node_fs_promises__rspack_import_1.readFile)(worker)) !== file.sha256) throw Error("Packaged relay worker checksum mismatch");
89912
+ return worker;
89913
+ }
89914
+ throw Error("Packaged relay worker not found; rebuild or reinstall the plugin");
89915
+ }
89916
+ const unavailable = (error)=>[
89917
+ "ENOENT",
89918
+ "ECONNREFUSED"
89919
+ ].includes(error.code);
89920
+ async function ensureRelayWorker(options = {}) {
89921
+ const location = (0,_profile_js__rspack_import_5/* .relayLocation */.hQ)(options);
89922
+ try {
89923
+ return await (0,_control_js__rspack_import_6/* .relayRequest */.lJ)(location, "hello", {}, {
89924
+ timeoutMs: 1500
89925
+ });
89926
+ } catch (error) {
89927
+ if (!unavailable(error)) throw error;
89928
+ }
89929
+ const workerPath = await resolveRelayWorker(options);
89930
+ const child = (0,node_child_process__rspack_import_0.spawn)(process.execPath, [
89931
+ workerPath
89932
+ ], {
89933
+ detached: true,
89934
+ stdio: "ignore",
89935
+ env: {
89936
+ ...location.env,
89937
+ GROK_BOT_RELAY_DIR: location.stateDir
89938
+ },
89939
+ cwd: (0,node_path__rspack_import_2.dirname)(workerPath)
89940
+ });
89941
+ let spawnError;
89942
+ child.on("error", (error)=>{
89943
+ spawnError = error;
89944
+ });
89945
+ child.unref();
89946
+ const end = Date.now() + 10000;
89947
+ while(Date.now() < end){
89948
+ if (spawnError) throw spawnError;
89949
+ if (options.signal?.aborted) throw Error("Relay startup cancelled before submission");
89950
+ try {
89951
+ return await (0,_control_js__rspack_import_6/* .relayRequest */.lJ)(location, "hello", {}, {
89952
+ timeoutMs: 1000,
89953
+ signal: options.signal
89954
+ });
89955
+ } catch (error) {
89956
+ if (!unavailable(error)) throw error;
89957
+ }
89958
+ await new Promise((resolve)=>setTimeout(resolve, 75));
89959
+ }
89960
+ throw Error("Relay worker startup failed or timed out; no untracked send was attempted. Inspect bridge status and the relay owner lock.");
89961
+ }
89962
+ async function managedOperation(method, input, options = {}) {
89963
+ const location = (0,_profile_js__rspack_import_5/* .relayLocation */.hQ)(options);
89964
+ const requestId = input.requestId ?? (0,node_crypto__rspack_import_4.randomUUID)();
89965
+ if (![
89966
+ "status",
89967
+ "stop",
89968
+ "respond"
89969
+ ].includes(method)) await ensureRelayWorker(options);
89970
+ try {
89971
+ return await (0,_control_js__rspack_import_6/* .relayRequest */.lJ)(location, method, input, {
89972
+ signal: options.signal,
89973
+ requestId
89974
+ });
89975
+ } catch (error) {
89976
+ if (method === "status" && unavailable(error)) return {
89977
+ worker: {
89978
+ state: "stopped",
89979
+ profile: location.profile,
89980
+ supervised: false
89981
+ },
89982
+ reason: "Worker is not running. Start a route or tracked send to resume saved routes."
89983
+ };
89984
+ // Never retry a disconnected mutation. Its durable request ID is the recovery handle.
89985
+ throw error;
89986
+ }
89987
+ }
89988
+
89989
+ __webpack_require__.d(__webpack_exports__, {
89990
+ Bb: () => (managedOperation),
89991
+ _v: () => (resolveRelayWorker)
89992
+ });
89993
+
89994
+
89995
+ },
89996
+ "./src/core/relay/profile.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
89997
+ /* import */ var node_crypto__rspack_import_0 = __webpack_require__("node:crypto");
89998
+ /* import */ var node_os__rspack_import_1 = __webpack_require__("node:os");
89999
+ /* import */ var node_path__rspack_import_2 = __webpack_require__("node:path");
90000
+ /* import */ var _codex_bridge_js__rspack_import_3 = __webpack_require__("./src/core/codex-bridge.js");
90001
+ /* import */ var _app_session_js__rspack_import_4 = __webpack_require__("./src/core/app-session.js");
90002
+
90003
+
90004
+
90005
+
90006
+
90007
+ const digest = (value)=>(0,node_crypto__rspack_import_0.createHash)("sha256").update(value).digest("hex");
90008
+ // Only explicit overrides are hashed. App-session token refresh retains its source identity.
90009
+ function relayProfile(env = process.env) {
90010
+ const keys = [
90011
+ "GROK_BOT_GATEWAY_URL",
90012
+ "SAND_HOST_GATEWAY_URL",
90013
+ "SAND_HOST_PORT",
90014
+ "GROK_BOT_GATEWAY_TOKEN",
90015
+ "SAND_HOST_GATEWAY_TOKEN",
90016
+ "SAND_GATEWAY_TOKEN",
90017
+ "CURSOR_ACCESS_TOKEN",
90018
+ "GROK_BOT_ACCESS_TOKEN",
90019
+ "SAND_ACCESS_TOKEN",
90020
+ "GROK_BOT_GATEWAY_HEADERS",
90021
+ "SAND_BACKEND_URL",
90022
+ "CURSOR_API_BASE_URL",
90023
+ "SAND_BOX_NAMESPACE",
90024
+ "SAND_CLIENT_VERSION",
90025
+ "GROK_BOT_CODEX_THREADS",
90026
+ "GROK_BOT_MAX_HOPS",
90027
+ "GROK_BOT_CODEX_EXPERIMENTAL",
90028
+ "GROK_BOT_ALLOW_LOCAL_GATEWAY",
90029
+ "GROK_BOT_ALLOW_ANY_GATEWAY",
90030
+ "GROK_BOT_TEST",
90031
+ "NODE_ENV"
90032
+ ];
90033
+ return digest(JSON.stringify([
90034
+ (0,node_path__rspack_import_2.resolve)((0,_codex_bridge_js__rspack_import_3/* .codexSocketPath */.ql)(env)),
90035
+ (0,_app_session_js__rspack_import_4/* .grokBotGatewayDescriptorPath */.dQ)((0,node_os__rspack_import_1.homedir)(), process.platform, env),
90036
+ ...keys.map((key)=>[
90037
+ key,
90038
+ env[key] ?? ""
90039
+ ])
90040
+ ]));
90041
+ }
90042
+ function relayLocation({ env = process.env, stateDir, profile = relayProfile(env) } = {}) {
90043
+ if (process.platform === "win32") throw Error("Codex relay requires Unix-domain sockets; Windows is unsupported.");
90044
+ const dir = (0,node_path__rspack_import_2.resolve)(stateDir ?? env.GROK_BOT_RELAY_DIR ?? (0,node_path__rspack_import_2.join)((0,node_os__rspack_import_1.homedir)(), ".grok-bot-cli", "relay", profile.slice(0, 24)));
90045
+ // macOS Unix sockets cannot use arbitrarily long installation/state paths.
90046
+ const socketDir = Buffer.byteLength((0,node_path__rspack_import_2.join)(dir, "control.sock")) < 100 ? dir : (0,node_path__rspack_import_2.join)("/tmp", `gbot-relay-${process.getuid()}`, digest(dir).slice(0, 24));
90047
+ return {
90048
+ stateDir: dir,
90049
+ profile,
90050
+ env,
90051
+ socketDir,
90052
+ socketPath: (0,node_path__rspack_import_2.join)(socketDir, "control.sock")
90053
+ };
90054
+ }
90055
+
90056
+ __webpack_require__.d(__webpack_exports__, {
90057
+ hQ: () => (relayLocation)
90058
+ }, {
90059
+ br: digest
90060
+ });
90061
+
90062
+
87395
90063
  },
87396
90064
  "./src/core/store.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
87397
90065
  /* import */ var node_crypto__rspack_import_0 = __webpack_require__("node:crypto");
@@ -87459,10 +90127,7 @@ function isUuid(value) {
87459
90127
  function defaultCandidateRoots() {
87460
90128
  const home = (0,node_os__rspack_import_2.homedir)();
87461
90129
  const env = [
87462
- process.env.GROK_BOT_AGENTS_DIR,
87463
- process.env.SAND_AGENTS_DIR,
87464
- process.env.SAND_DATA_ROOT && (0,node_path__rspack_import_3.join)(process.env.SAND_DATA_ROOT, "agents"),
87465
- process.env.SAND_DATA_ROOT && (0,node_path__rspack_import_3.join)(process.env.SAND_DATA_ROOT, "agent-data", "agents")
90130
+ process.env.GROK_BOT_AGENTS_DIR
87466
90131
  ].filter(Boolean);
87467
90132
  return [
87468
90133
  ...env,
@@ -87741,7 +90406,6 @@ __webpack_require__.d(__webpack_exports__, {
87741
90406
 
87742
90407
  },
87743
90408
  "./src/core/transcript.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
87744
- // Shared by `gbot thread` and the grok-bot plugin's gbot_thread tool.
87745
90409
  /** Coerce anything to a string without throwing (numbers, BigInt, unserializable objects). */ function toSafeText(value) {
87746
90410
  if (typeof value === "string") return value;
87747
90411
  if (value == null) return "";
@@ -87779,15 +90443,12 @@ function entryTextRaw(e) {
87779
90443
  return typeof e.preview === "string" ? e.preview : "";
87780
90444
  }
87781
90445
  function transcriptEntries(payload) {
87782
- if (Array.isArray(payload)) return payload;
87783
90446
  if (!payload || typeof payload !== "object") return [];
87784
- const entries = payload.entries || payload.messages || payload.items;
87785
- return Array.isArray(entries) ? entries : [];
90447
+ return Array.isArray(payload.entries) ? payload.entries : [];
87786
90448
  }
87787
90449
  function sourceEntryId(entry) {
87788
90450
  if (!entry || typeof entry !== "object") return "";
87789
- if (typeof entry.id === "string" && entry.id) return entry.id;
87790
- return typeof entry.messageId === "string" ? entry.messageId : "";
90451
+ return typeof entry.id === "string" ? entry.id : "";
87791
90452
  }
87792
90453
  function lastSourceId(entries, fallback = "") {
87793
90454
  for(let index = entries.length - 1; index >= 0; index -= 1){
@@ -87963,6 +90624,10 @@ __webpack_require__.d(__webpack_exports__, {
87963
90624
  });
87964
90625
 
87965
90626
 
90627
+ },
90628
+ "./package.json"(module) {
90629
+ module.exports = {"rE":"0.6.0"}
90630
+
87966
90631
  },
87967
90632
 
87968
90633
  });