grok-bot-cli 0.6.0 → 0.8.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/CHANGELOG.md +19 -0
- package/dist/.claude-plugin/marketplace.json +1 -1
- package/dist/.claude-plugin/plugin.json +1 -1
- package/dist/.codex-plugin/plugin.json +1 -1
- package/dist/.cursor-plugin/plugin.json +1 -1
- package/dist/INSTALL.md +1 -1
- package/dist/agent-bundle.compile-evidence.json +1 -1
- package/dist/agent-bundle.manifest.json +1 -1
- package/dist/agent-bundle.package-compile-evidence.json +1 -1
- package/dist/bin/gbot-flight.mjs +380 -116
- package/dist/bin/gbot-install.js +9085 -9082
- package/dist/bin/gbot.mjs +476 -121
- package/dist/install.mjs +19 -9
- package/dist/mcp/mcp-grok-bot-b8c2461e-flight.mjs +425 -29
- package/dist/mcp/mcp-grok-bot-b8c2461e.mjs +435 -24
- package/dist/package.json +3 -3
- package/dist/plugin.json +1 -1
- package/dist/scripts/gbot-relay.mjs +138 -22
- package/dist/skills/talk-to-grok-bot/SKILL.md +18 -0
- package/package.json +3 -3
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grok-bot-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "CLI and Agent Bundle plugin for Grok Bot agents and groups: create, update, message, inspect threads, and automate cleanup",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -42,12 +42,12 @@
|
|
|
42
42
|
"agent-bundle"
|
|
43
43
|
],
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@agent-bundle/runtime": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/@agent-bundle/runtime@
|
|
45
|
+
"@agent-bundle/runtime": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/@agent-bundle/runtime@57a9196caf2590ece001799eaeed92613352bc21",
|
|
46
46
|
"@changesets/cli": "3.0.3",
|
|
47
47
|
"@rstest/core": "0.11.12",
|
|
48
48
|
"@types/node": "^24.0.0",
|
|
49
49
|
"@types/react": "^19.2.18",
|
|
50
|
-
"agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@
|
|
50
|
+
"agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@57a9196caf2590ece001799eaeed92613352bc21",
|
|
51
51
|
"react": "19.3.0",
|
|
52
52
|
"react-dom": "19.3.0",
|
|
53
53
|
"typescript": "7.0.2",
|
package/dist/plugin.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://agent-plugins.org/schemas/1.0.0/plugin.schema.json","author":{"name":"Zack Jackson","url":"https://github.com/ScriptedAlchemy"},"description":"Message Grok Bot from Codex, Claude Code, and Cursor, with managed automatic replies and explicit Codex conversation links.","homepage":"https://github.com/ScriptedAlchemy/grok-bot-cli#readme","keywords":["grok","grok-bot","grokbot","gbot","cursor","ai-agents","automation","terminal","cli","agent-bundle"],"license":"MIT","name":"gbot","repository":"https://github.com/ScriptedAlchemy/grok-bot-cli","version":"0.
|
|
1
|
+
{"$schema":"https://agent-plugins.org/schemas/1.0.0/plugin.schema.json","author":{"name":"Zack Jackson","url":"https://github.com/ScriptedAlchemy"},"description":"Message Grok Bot from Codex, Claude Code, and Cursor, with managed automatic replies and explicit Codex conversation links.","homepage":"https://github.com/ScriptedAlchemy/grok-bot-cli#readme","keywords":["grok","grok-bot","grokbot","gbot","cursor","ai-agents","automation","terminal","cli","agent-bundle"],"license":"MIT","name":"gbot","repository":"https://github.com/ScriptedAlchemy/grok-bot-cli","version":"0.8.0"}
|
|
@@ -56217,10 +56217,10 @@ function listDesktopProcesses(timeoutMs = DESKTOP_PROCESS_LIST_TIMEOUT_MS) {
|
|
|
56217
56217
|
const lines = Array.isArray(listProcesses) ? listProcesses : String(listProcesses ?? "").split(/\r?\n/);
|
|
56218
56218
|
for (const line of lines){
|
|
56219
56219
|
if (!/app-server/.test(line)) continue;
|
|
56220
|
-
// Desktop's bundled binary
|
|
56220
|
+
// Desktop's bundled binary only (Mac/Windows separators, optional .exe).
|
|
56221
|
+
// Do NOT match probe shells whose cmdline merely mentions ChatGPT.app +
|
|
56222
|
+
// app-server + codex-app-tools — that false-positives MATCH2 / Scout noise.
|
|
56221
56223
|
if (/ChatGPT\.app[\\/].*Resources[\\/]codex(\.exe)?(["'\s]|$)/.test(line)) return "private-stdio";
|
|
56222
|
-
// Same app-server line owned by ChatGPT.app carrying the app-tools override.
|
|
56223
|
-
if (/ChatGPT\.app/.test(line) && /(codex_app|mcp_servers\.codex_app|codex-app-tools)/.test(line)) return "private-stdio";
|
|
56224
56224
|
}
|
|
56225
56225
|
return "unknown";
|
|
56226
56226
|
}
|
|
@@ -57906,10 +57906,12 @@ function socketStateOf(path) {
|
|
|
57906
57906
|
},
|
|
57907
57907
|
"./src/core/gateway.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
57908
57908
|
/* import */ var node_crypto__rspack_import_0 = __webpack_require__("node:crypto");
|
|
57909
|
-
/* import */ var
|
|
57909
|
+
/* import */ var _headers_js__rspack_import_5 = __webpack_require__("./src/core/headers.js");
|
|
57910
57910
|
/* import */ var _app_session_js__rspack_import_1 = __webpack_require__("./src/core/app-session.js");
|
|
57911
57911
|
/* import */ var _store_js__rspack_import_2 = __webpack_require__("./src/core/store.js");
|
|
57912
57912
|
/* import */ var _url_policy_js__rspack_import_3 = __webpack_require__("./src/core/url-policy.js");
|
|
57913
|
+
/* import */ var _grok_approvals_js__rspack_import_4 = __webpack_require__("./src/core/grok-approvals.js");
|
|
57914
|
+
|
|
57913
57915
|
|
|
57914
57916
|
|
|
57915
57917
|
|
|
@@ -57959,7 +57961,7 @@ function gatewayOverride() {
|
|
|
57959
57961
|
kind: "gateway"
|
|
57960
57962
|
}),
|
|
57961
57963
|
gatewayToken: token,
|
|
57962
|
-
gatewayHeaders: (0,
|
|
57964
|
+
gatewayHeaders: (0,_headers_js__rspack_import_5/* .headersFromEnv */.gx)()
|
|
57963
57965
|
};
|
|
57964
57966
|
}
|
|
57965
57967
|
return null;
|
|
@@ -57980,7 +57982,7 @@ function sessionFromApp() {
|
|
|
57980
57982
|
kind: "gateway"
|
|
57981
57983
|
}),
|
|
57982
57984
|
gatewayToken: loaded.gatewayToken,
|
|
57983
|
-
gatewayHeaders: (0,
|
|
57985
|
+
gatewayHeaders: (0,_headers_js__rspack_import_5/* .mergeGatewayHeaders */.bQ)((0,_headers_js__rspack_import_5/* .normalizeHeaderMap */.dk)(loaded.headers), (0,_headers_js__rspack_import_5/* .headersFromEnv */.gx)())
|
|
57984
57986
|
};
|
|
57985
57987
|
}
|
|
57986
57988
|
function hasGatewayAuth() {
|
|
@@ -58040,7 +58042,7 @@ async function ensureSandbox(accessToken, { signal } = {}) {
|
|
|
58040
58042
|
method: "POST",
|
|
58041
58043
|
redirect: "error",
|
|
58042
58044
|
signal: gatewayDeadline(signal),
|
|
58043
|
-
headers: (0,
|
|
58045
|
+
headers: (0,_headers_js__rspack_import_5/* .ensureSandboxHeaders */._6)(accessToken),
|
|
58044
58046
|
body: "{}"
|
|
58045
58047
|
});
|
|
58046
58048
|
body = await readJson(res);
|
|
@@ -58066,7 +58068,7 @@ async function ensureSandbox(accessToken, { signal } = {}) {
|
|
|
58066
58068
|
kind: "gateway"
|
|
58067
58069
|
}),
|
|
58068
58070
|
gatewayToken: String(gatewayToken),
|
|
58069
|
-
gatewayHeaders: (0,
|
|
58071
|
+
gatewayHeaders: (0,_headers_js__rspack_import_5/* .mergeGatewayHeaders */.bQ)((0,_headers_js__rspack_import_5/* .headersFromEnsureSandbox */.Ew)(body), (0,_headers_js__rspack_import_5/* .headersFromEnv */.gx)())
|
|
58070
58072
|
};
|
|
58071
58073
|
}
|
|
58072
58074
|
async function connectGateway({ signal } = {}) {
|
|
@@ -58096,7 +58098,7 @@ async function gatewayCall(session, method, body = {}, { signal } = {}) {
|
|
|
58096
58098
|
method: "POST",
|
|
58097
58099
|
redirect: "error",
|
|
58098
58100
|
signal: gatewayDeadline(prompt ? undefined : signal),
|
|
58099
|
-
headers: (0,
|
|
58101
|
+
headers: (0,_headers_js__rspack_import_5/* .requestHeaders */.A1)(session),
|
|
58100
58102
|
body: JSON.stringify(body)
|
|
58101
58103
|
};
|
|
58102
58104
|
assertGatewayActive(signal); // Final synchronous boundary before transmission.
|
|
@@ -58363,6 +58365,43 @@ async function getThread(session, ref, rootId) {
|
|
|
58363
58365
|
thread: data
|
|
58364
58366
|
};
|
|
58365
58367
|
}
|
|
58368
|
+
async function listGrokApprovals(session, ref) {
|
|
58369
|
+
const { target, transcript } = await getTranscriptTail(session, ref, 200);
|
|
58370
|
+
if (!Array.isArray(transcript?.entries) || transcript.entries.length > 200) throw new GatewayError("Invalid approval transcript coverage");
|
|
58371
|
+
return {
|
|
58372
|
+
target: {
|
|
58373
|
+
id: target.id,
|
|
58374
|
+
name: target.name
|
|
58375
|
+
},
|
|
58376
|
+
approvals: transcript.entries.map(grokApproval).filter(Boolean),
|
|
58377
|
+
coverage: "Latest 200 transcript entries only; older requests require the owning Grok UI."
|
|
58378
|
+
};
|
|
58379
|
+
}
|
|
58380
|
+
async function respondGrokApproval(session, ref, input) {
|
|
58381
|
+
const { entryId, requestId, decision } = grokApprovalResponseSchema.parse({
|
|
58382
|
+
...input,
|
|
58383
|
+
target: ref
|
|
58384
|
+
});
|
|
58385
|
+
const { target, approvals } = await listGrokApprovals(session, ref);
|
|
58386
|
+
const matches = approvals.filter((card)=>card.entryId === entryId && card.requestId === requestId);
|
|
58387
|
+
if (matches.length !== 1) throw new GatewayError("Stale, foreign or unsupported Grok approval; refresh pending requests or use the owning Grok UI");
|
|
58388
|
+
const approval = matches[0];
|
|
58389
|
+
if (decision === "accept" && approval.truncated) throw new GatewayError("Approval details are truncated; acceptance requires the owning Grok UI");
|
|
58390
|
+
const local = approval.type === "local-tool-permission";
|
|
58391
|
+
await gatewayCall(session, local ? "resolveLocalToolPermission" : "resolveAutoReviewApproval", {
|
|
58392
|
+
agentId: target.id,
|
|
58393
|
+
entryId,
|
|
58394
|
+
requestId,
|
|
58395
|
+
resolution: local ? decision === "accept" ? "allow-once" : "deny" : decision === "accept" ? "approved" : "denied"
|
|
58396
|
+
});
|
|
58397
|
+
return {
|
|
58398
|
+
target,
|
|
58399
|
+
entryId,
|
|
58400
|
+
requestId,
|
|
58401
|
+
decision,
|
|
58402
|
+
delivery: "accepted"
|
|
58403
|
+
};
|
|
58404
|
+
}
|
|
58366
58405
|
|
|
58367
58406
|
__webpack_require__.d(__webpack_exports__, {
|
|
58368
58407
|
LV: () => (sendPrompt),
|
|
@@ -58372,6 +58411,66 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
58372
58411
|
});
|
|
58373
58412
|
|
|
58374
58413
|
|
|
58414
|
+
},
|
|
58415
|
+
"./src/core/grok-approvals.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
58416
|
+
/* import */ var zod__rspack_import_1 = __webpack_require__("./node_modules/zod/v4/classic/schemas.js");
|
|
58417
|
+
/* import */ var _url_policy_js__rspack_import_0 = __webpack_require__("./src/core/url-policy.js");
|
|
58418
|
+
|
|
58419
|
+
|
|
58420
|
+
const id = zod__rspack_import_1/* .string */.YjP().min(1).max(1024);
|
|
58421
|
+
const grokApprovalResponseSchema = zod__rspack_import_1/* .strictObject */.rej({
|
|
58422
|
+
target: id,
|
|
58423
|
+
entryId: id,
|
|
58424
|
+
requestId: id,
|
|
58425
|
+
decision: zod__rspack_import_1/* ["enum"] */.k5n([
|
|
58426
|
+
"accept",
|
|
58427
|
+
"decline"
|
|
58428
|
+
])
|
|
58429
|
+
});
|
|
58430
|
+
function grokApproval(entry) {
|
|
58431
|
+
if (entry?.kind !== "send-message") return null;
|
|
58432
|
+
const type = entry.message?.type;
|
|
58433
|
+
const card = type === "auto-review-approval" ? entry.message.approval : type === "local-tool-permission" ? entry.message.ask : null;
|
|
58434
|
+
if (card?.status !== "pending" || !id.safeParse(card.requestId).success || !id.safeParse(entry.id).success) return null;
|
|
58435
|
+
const details = {};
|
|
58436
|
+
let truncated = false;
|
|
58437
|
+
for (const key of [
|
|
58438
|
+
"reason",
|
|
58439
|
+
"command",
|
|
58440
|
+
"summary",
|
|
58441
|
+
"action",
|
|
58442
|
+
"description",
|
|
58443
|
+
"target",
|
|
58444
|
+
"machineId",
|
|
58445
|
+
"surface",
|
|
58446
|
+
"workingDirectory"
|
|
58447
|
+
]){
|
|
58448
|
+
if (typeof card[key] !== "string") continue;
|
|
58449
|
+
const text = (0,_url_policy_js__rspack_import_0/* .redactSecrets */.fp)(card[key]);
|
|
58450
|
+
truncated ||= text.length > 2048;
|
|
58451
|
+
details[key] = text.slice(0, 2048);
|
|
58452
|
+
}
|
|
58453
|
+
return {
|
|
58454
|
+
entryId: entry.id,
|
|
58455
|
+
requestId: card.requestId,
|
|
58456
|
+
type,
|
|
58457
|
+
...details,
|
|
58458
|
+
truncated
|
|
58459
|
+
};
|
|
58460
|
+
}
|
|
58461
|
+
function grokApprovalNotice(entry, target) {
|
|
58462
|
+
const approval = grokApproval(entry);
|
|
58463
|
+
return approval ? `Grok approval pending. Requires an explicit user decision; never approve automatically.\n${JSON.stringify({
|
|
58464
|
+
botTarget: target,
|
|
58465
|
+
...approval
|
|
58466
|
+
})}\nUse gbot_grok_respond with target=${JSON.stringify(target)}, entryId, requestId and decision accept (once) or decline.${approval.truncated ? " Details are truncated; acceptance requires the owning Grok UI." : ""} A chat reply is not authorization.` : null;
|
|
58467
|
+
}
|
|
58468
|
+
|
|
58469
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
58470
|
+
xE: () => (grokApprovalNotice)
|
|
58471
|
+
});
|
|
58472
|
+
|
|
58473
|
+
|
|
58375
58474
|
},
|
|
58376
58475
|
"./src/core/headers.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
58377
58476
|
function normalizeHeaderMap(obj) {
|
|
@@ -59172,8 +59271,10 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59172
59271
|
|
|
59173
59272
|
},
|
|
59174
59273
|
"./src/core/relay/intake.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
59175
|
-
/* import */ var
|
|
59274
|
+
/* import */ var _transcript_js__rspack_import_2 = __webpack_require__("./src/core/transcript.js");
|
|
59176
59275
|
/* import */ var _records_js__rspack_import_0 = __webpack_require__("./src/core/relay/records.js");
|
|
59276
|
+
/* import */ var _grok_approvals_js__rspack_import_1 = __webpack_require__("./src/core/grok-approvals.js");
|
|
59277
|
+
|
|
59177
59278
|
|
|
59178
59279
|
|
|
59179
59280
|
/** Correlate the whole page before atomically recording intake and advancing its checkpoint. */ function createIntake({ state, gateway, clock, newRecord, stoppedBindings }) {
|
|
@@ -59185,7 +59286,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59185
59286
|
const page = (0,_records_js__rspack_import_0/* .pageEntries */.ci)(await gateway.tail(targetId));
|
|
59186
59287
|
await change("targets", {
|
|
59187
59288
|
id: targetId,
|
|
59188
|
-
cursor: page.length ? (0,
|
|
59289
|
+
cursor: page.length ? (0,_transcript_js__rspack_import_2/* .sourceEntryId */.p2)(page.at(-1)) : null,
|
|
59189
59290
|
baseline: true,
|
|
59190
59291
|
state: "running",
|
|
59191
59292
|
reason: null,
|
|
@@ -59214,8 +59315,8 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59214
59315
|
});
|
|
59215
59316
|
return;
|
|
59216
59317
|
}
|
|
59217
|
-
const current = page.length ? (0,
|
|
59218
|
-
const index = target.cursor === null ? -1 : page.findIndex((e)=>(0,
|
|
59318
|
+
const current = page.length ? (0,_transcript_js__rspack_import_2/* .sourceEntryId */.p2)(page.at(-1)) : null;
|
|
59319
|
+
const index = target.cursor === null ? -1 : page.findIndex((e)=>(0,_transcript_js__rspack_import_2/* .sourceEntryId */.p2)(e) === target.cursor);
|
|
59219
59320
|
if (target.cursor !== null && index === -1 || target.cursor === null && page.length === 200) {
|
|
59220
59321
|
await change("targets", {
|
|
59221
59322
|
...target,
|
|
@@ -59225,6 +59326,15 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59225
59326
|
});
|
|
59226
59327
|
return;
|
|
59227
59328
|
}
|
|
59329
|
+
const incoming = page.slice(index + 1);
|
|
59330
|
+
if (incoming.some((entry)=>entry.kind === "send-message" && (typeof entry.requestId !== "string" || !entry.requestId))) {
|
|
59331
|
+
await change("targets", {
|
|
59332
|
+
...target,
|
|
59333
|
+
state: "paused",
|
|
59334
|
+
reason: "invalid-coverage"
|
|
59335
|
+
});
|
|
59336
|
+
return;
|
|
59337
|
+
}
|
|
59228
59338
|
const local = {
|
|
59229
59339
|
...state.read().records
|
|
59230
59340
|
}, changes = [];
|
|
@@ -59254,7 +59364,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59254
59364
|
...r,
|
|
59255
59365
|
submission: "accepted",
|
|
59256
59366
|
requestId: entry.requestId,
|
|
59257
|
-
messageId: (0,
|
|
59367
|
+
messageId: (0,_transcript_js__rspack_import_2/* .sourceEntryId */.p2)(entry),
|
|
59258
59368
|
reason: null
|
|
59259
59369
|
};
|
|
59260
59370
|
local[r.id] = next;
|
|
@@ -59272,9 +59382,13 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59272
59382
|
"unknown",
|
|
59273
59383
|
"accepted"
|
|
59274
59384
|
].includes(r.submission) && !r.requestId);
|
|
59275
|
-
const incoming = page.slice(index + 1);
|
|
59276
59385
|
for (const entry of incoming){
|
|
59277
59386
|
if (entry.kind !== "send-message" || own.has(entry.requestId)) continue;
|
|
59387
|
+
const approvalNotice = (0,_grok_approvals_js__rspack_import_1/* .grokApprovalNotice */.xE)(entry, targetId);
|
|
59388
|
+
if ([
|
|
59389
|
+
"auto-review-approval",
|
|
59390
|
+
"local-tool-permission"
|
|
59391
|
+
].includes(entry.message?.type) && !approvalNotice) continue;
|
|
59278
59392
|
const parent = requests.get(entry.requestId);
|
|
59279
59393
|
// Without nonce coverage, unsolicited classification could echo a return or misroute a reply.
|
|
59280
59394
|
if (!parent && unresolved) {
|
|
@@ -59302,14 +59416,14 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59302
59416
|
]);
|
|
59303
59417
|
return;
|
|
59304
59418
|
}
|
|
59305
|
-
const sourceId = (0,
|
|
59419
|
+
const sourceId = (0,_transcript_js__rspack_import_2/* .sourceEntryId */.p2)(entry), id = "inbound:" + (0,_records_js__rspack_import_0/* .hash */.tW)([
|
|
59306
59420
|
targetId,
|
|
59307
59421
|
sourceId
|
|
59308
59422
|
]);
|
|
59309
59423
|
if (local[id]) continue;
|
|
59310
59424
|
let body;
|
|
59311
59425
|
try {
|
|
59312
|
-
body = (0,_records_js__rspack_import_0/* .messageText */.Lo)((0,
|
|
59426
|
+
body = (0,_records_js__rspack_import_0/* .messageText */.Lo)(approvalNotice ?? (0,_transcript_js__rspack_import_2/* .entryText */.u0)(entry));
|
|
59313
59427
|
} catch {
|
|
59314
59428
|
await change("targets", {
|
|
59315
59429
|
...target,
|
|
@@ -59318,7 +59432,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59318
59432
|
});
|
|
59319
59433
|
return;
|
|
59320
59434
|
}
|
|
59321
|
-
const text = `[Grok sender ${targetId}; message ${sourceId}]\n${parent ? "Reply to a tracked request. Your next final answer is not returned automatically." : "Linked conversation. Your corresponding final answer returns automatically to Grok."}\n\n${body}`;
|
|
59435
|
+
const text = `[Grok sender ${targetId}; message ${sourceId}]\n${approvalNotice ? "Approval notice. Your next final answer is not returned automatically." : parent ? "Reply to a tracked request. Your next final answer is not returned automatically." : "Linked conversation. Your corresponding final answer returns automatically to Grok."}\n\n${body}`;
|
|
59322
59436
|
if (Buffer.byteLength(text) > (/* inlined export .MAX_TEXT */65536)) {
|
|
59323
59437
|
await change("targets", {
|
|
59324
59438
|
...target,
|
|
@@ -59332,7 +59446,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59332
59446
|
sourceId
|
|
59333
59447
|
],
|
|
59334
59448
|
parentId: parent?.id,
|
|
59335
|
-
returnToGrok: !parent,
|
|
59449
|
+
returnToGrok: !parent && !approvalNotice,
|
|
59336
59450
|
correlationId: parent?.correlationId,
|
|
59337
59451
|
hop: parent ? parent.hop + 1 : 0,
|
|
59338
59452
|
maxHops: parent?.maxHops
|
|
@@ -59649,7 +59763,10 @@ function relayProfile(env = process.env) {
|
|
|
59649
59763
|
"GROK_BOT_ALLOW_LOCAL_GATEWAY",
|
|
59650
59764
|
"GROK_BOT_ALLOW_ANY_GATEWAY",
|
|
59651
59765
|
"GROK_BOT_TEST",
|
|
59652
|
-
"NODE_ENV"
|
|
59766
|
+
"NODE_ENV",
|
|
59767
|
+
// Secret Service credentials depend on the caller's desktop session.
|
|
59768
|
+
"DBUS_SESSION_BUS_ADDRESS",
|
|
59769
|
+
"DISPLAY"
|
|
59653
59770
|
];
|
|
59654
59771
|
return digest(JSON.stringify([
|
|
59655
59772
|
(0,node_path__rspack_import_2.resolve)((0,_codex_bridge_js__rspack_import_3/* .codexSocketPath */.ql)(env)),
|
|
@@ -59719,7 +59836,6 @@ function pageEntries(payload) {
|
|
|
59719
59836
|
_state_js__rspack_import_2/* .relayId.parse */.pT.parse(id);
|
|
59720
59837
|
if (ids.has(id) || typeof e.kind !== "string" || !e.kind) throw new Error("Invalid transcript coverage");
|
|
59721
59838
|
ids.add(id);
|
|
59722
|
-
if (e.kind === "send-message" && (typeof e.requestId !== "string" || !e.requestId)) throw new Error("Message coverage lacks requestId");
|
|
59723
59839
|
}
|
|
59724
59840
|
return page;
|
|
59725
59841
|
}
|
|
@@ -60834,7 +60950,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
60834
60950
|
|
|
60835
60951
|
},
|
|
60836
60952
|
"./package.json"(module) {
|
|
60837
|
-
module.exports = {"rE":"0.
|
|
60953
|
+
module.exports = {"rE":"0.8.0"}
|
|
60838
60954
|
|
|
60839
60955
|
},
|
|
60840
60956
|
|
|
@@ -44,6 +44,16 @@ change session permissions, or respond to an unsupported interaction; use its ow
|
|
|
44
44
|
|
|
45
45
|
Bot replies are `send-message` entries; yours are `message` with `role: user`.
|
|
46
46
|
|
|
47
|
+
Grok-origin approvals are separate from Codex interactions. `gbot_grok_approvals`
|
|
48
|
+
(CLI: `gbot approvals list TARGET`) lists pending auto-review and local-tool cards in
|
|
49
|
+
the latest 200 entries. Linked/tracked routes forward new pending cards as notices;
|
|
50
|
+
their chat answers never authorize an action. After an explicit user decision, use
|
|
51
|
+
`gbot_grok_respond` (CLI: `gbot approvals respond --target TARGET --entry-id ID
|
|
52
|
+
--request-id ID --decision accept|decline`). Copy the exact IDs from the current
|
|
53
|
+
card. Accept grants once; persistent grants are unavailable. Responses recheck the
|
|
54
|
+
card before sending; delivery success does not prove execution. Older cards,
|
|
55
|
+
cookie/payment approvals and other unsupported requests require the owning Grok UI.
|
|
56
|
+
|
|
47
57
|
List targets with `gbot bots list` / `gbot groups list` when the name is ambiguous.
|
|
48
58
|
|
|
49
59
|
## CLI automation
|
|
@@ -99,3 +109,11 @@ Managed Codex return routes reject `expectedTurnId` and legacy `replyTo`/`envelo
|
|
|
99
109
|
options before submission; use plain `codex_send` for a caller-selected turn guard.
|
|
100
110
|
An explicit Grok target supplied with `bindingId` must resolve to the binding's
|
|
101
111
|
recipient. A mismatch fails instead of selecting one destination silently.
|
|
112
|
+
|
|
113
|
+
## Host tool inventory
|
|
114
|
+
|
|
115
|
+
Codex MCP clients receive Grok messaging and approval tools; truthfully identified
|
|
116
|
+
Grok Bot clients receive Codex messaging and approval tools. Bridge start/status/stop
|
|
117
|
+
remain shared. Cursor and unknown clients retain both sets. Filtering uses negotiated
|
|
118
|
+
client-name prefixes and does not provide authorization. A Grok runtime identifying
|
|
119
|
+
itself as Cursor needs its native MCP identity corrected before this filter applies.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grok-bot-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "CLI and Agent Bundle plugin for Grok Bot agents and groups: create, update, message, inspect threads, and automate cleanup",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -54,12 +54,12 @@
|
|
|
54
54
|
"LICENSE"
|
|
55
55
|
],
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@agent-bundle/runtime": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/@agent-bundle/runtime@
|
|
57
|
+
"@agent-bundle/runtime": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/@agent-bundle/runtime@57a9196caf2590ece001799eaeed92613352bc21",
|
|
58
58
|
"@changesets/cli": "3.0.3",
|
|
59
59
|
"@rstest/core": "0.11.12",
|
|
60
60
|
"@types/node": "^24.0.0",
|
|
61
61
|
"@types/react": "^19.2.18",
|
|
62
|
-
"agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@
|
|
62
|
+
"agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@57a9196caf2590ece001799eaeed92613352bc21",
|
|
63
63
|
"react": "19.3.0",
|
|
64
64
|
"react-dom": "19.3.0",
|
|
65
65
|
"typescript": "7.0.2",
|