codex-channel-bgos 0.2.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/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/adapter.d.ts +96 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +677 -0
- package/dist/adapter.js.map +1 -0
- package/dist/agent-hints.d.ts +20 -0
- package/dist/agent-hints.d.ts.map +1 -0
- package/dist/agent-hints.js +92 -0
- package/dist/agent-hints.js.map +1 -0
- package/dist/agent-identity.d.ts +36 -0
- package/dist/agent-identity.d.ts.map +1 -0
- package/dist/agent-identity.js +42 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/attachment-bridge.d.ts +64 -0
- package/dist/attachment-bridge.d.ts.map +1 -0
- package/dist/attachment-bridge.js +216 -0
- package/dist/attachment-bridge.js.map +1 -0
- package/dist/auth-mode.d.ts +34 -0
- package/dist/auth-mode.d.ts.map +1 -0
- package/dist/auth-mode.js +48 -0
- package/dist/auth-mode.js.map +1 -0
- package/dist/bgos-api.d.ts +191 -0
- package/dist/bgos-api.d.ts.map +1 -0
- package/dist/bgos-api.js +225 -0
- package/dist/bgos-api.js.map +1 -0
- package/dist/bgos-ws.d.ts +94 -0
- package/dist/bgos-ws.d.ts.map +1 -0
- package/dist/bgos-ws.js +310 -0
- package/dist/bgos-ws.js.map +1 -0
- package/dist/capabilities.d.ts +28 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +44 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/catalog-sync.d.ts +26 -0
- package/dist/catalog-sync.d.ts.map +1 -0
- package/dist/catalog-sync.js +24 -0
- package/dist/catalog-sync.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +152 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-host.d.ts +44 -0
- package/dist/codex-host.d.ts.map +1 -0
- package/dist/codex-host.js +142 -0
- package/dist/codex-host.js.map +1 -0
- package/dist/commands-sync.d.ts +24 -0
- package/dist/commands-sync.d.ts.map +1 -0
- package/dist/commands-sync.js +43 -0
- package/dist/commands-sync.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -0
- package/dist/default-commands.d.ts +27 -0
- package/dist/default-commands.d.ts.map +1 -0
- package/dist/default-commands.js +64 -0
- package/dist/default-commands.js.map +1 -0
- package/dist/event-mapper.d.ts +43 -0
- package/dist/event-mapper.d.ts.map +1 -0
- package/dist/event-mapper.js +127 -0
- package/dist/event-mapper.js.map +1 -0
- package/dist/heartbeat.d.ts +75 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +186 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/inbound-handler.d.ts +167 -0
- package/dist/inbound-handler.d.ts.map +1 -0
- package/dist/inbound-handler.js +282 -0
- package/dist/inbound-handler.js.map +1 -0
- package/dist/inbound-input.d.ts +17 -0
- package/dist/inbound-input.d.ts.map +1 -0
- package/dist/inbound-input.js +25 -0
- package/dist/inbound-input.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/install-service.d.ts +8 -0
- package/dist/install-service.d.ts.map +1 -0
- package/dist/install-service.js +66 -0
- package/dist/install-service.js.map +1 -0
- package/dist/last-id-store.d.ts +33 -0
- package/dist/last-id-store.d.ts.map +1 -0
- package/dist/last-id-store.js +101 -0
- package/dist/last-id-store.js.map +1 -0
- package/dist/load-config.d.ts +30 -0
- package/dist/load-config.d.ts.map +1 -0
- package/dist/load-config.js +86 -0
- package/dist/load-config.js.map +1 -0
- package/dist/media-classify.d.ts +37 -0
- package/dist/media-classify.d.ts.map +1 -0
- package/dist/media-classify.js +108 -0
- package/dist/media-classify.js.map +1 -0
- package/dist/media-guard.d.ts +13 -0
- package/dist/media-guard.d.ts.map +1 -0
- package/dist/media-guard.js +159 -0
- package/dist/media-guard.js.map +1 -0
- package/dist/outbound-retry.d.ts +24 -0
- package/dist/outbound-retry.d.ts.map +1 -0
- package/dist/outbound-retry.js +75 -0
- package/dist/outbound-retry.js.map +1 -0
- package/dist/outbound.d.ts +223 -0
- package/dist/outbound.d.ts.map +1 -0
- package/dist/outbound.js +366 -0
- package/dist/outbound.js.map +1 -0
- package/dist/outbox.d.ts +16 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +88 -0
- package/dist/outbox.js.map +1 -0
- package/dist/pair-cli.d.ts +44 -0
- package/dist/pair-cli.d.ts.map +1 -0
- package/dist/pair-cli.js +182 -0
- package/dist/pair-cli.js.map +1 -0
- package/dist/pending-unknown-store.d.ts +26 -0
- package/dist/pending-unknown-store.d.ts.map +1 -0
- package/dist/pending-unknown-store.js +135 -0
- package/dist/pending-unknown-store.js.map +1 -0
- package/dist/processed-ids.d.ts +36 -0
- package/dist/processed-ids.d.ts.map +1 -0
- package/dist/processed-ids.js +55 -0
- package/dist/processed-ids.js.map +1 -0
- package/dist/reply-markers.d.ts +42 -0
- package/dist/reply-markers.d.ts.map +1 -0
- package/dist/reply-markers.js +124 -0
- package/dist/reply-markers.js.map +1 -0
- package/dist/setup/supervisor.d.ts +16 -0
- package/dist/setup/supervisor.d.ts.map +1 -0
- package/dist/setup/supervisor.js +61 -0
- package/dist/setup/supervisor.js.map +1 -0
- package/dist/thread-map.d.ts +12 -0
- package/dist/thread-map.d.ts.map +1 -0
- package/dist/thread-map.js +72 -0
- package/dist/thread-map.js.map +1 -0
- package/dist/tool-progress.d.ts +103 -0
- package/dist/tool-progress.d.ts.map +1 -0
- package/dist/tool-progress.js +216 -0
- package/dist/tool-progress.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +28 -0
- package/dist/version.js.map +1 -0
- package/dist/voice-rpc.d.ts +37 -0
- package/dist/voice-rpc.d.ts.map +1 -0
- package/dist/voice-rpc.js +44 -0
- package/dist/voice-rpc.js.map +1 -0
- package/package.json +47 -0
package/dist/bgos-ws.js
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { io } from "socket.io-client";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
import { loadLastId, saveLastId } from "./last-id-store.js";
|
|
4
|
+
import { normalizeVoiceRpc } from "./voice-rpc.js";
|
|
5
|
+
import { PairingRevokedError, } from "./types.js";
|
|
6
|
+
/** Resolve the storm-guard limit. 0 disables. Default 25. */
|
|
7
|
+
function resolveStormLimit() {
|
|
8
|
+
const raw = process.env.CODEX_BGOS_BACKFILL_STORM_LIMIT;
|
|
9
|
+
if (raw === undefined || raw === "")
|
|
10
|
+
return 25;
|
|
11
|
+
const n = Number(raw);
|
|
12
|
+
if (!Number.isFinite(n) || n < 0)
|
|
13
|
+
return 25;
|
|
14
|
+
return Math.floor(n);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Socket.IO client against BGOS. Handshake passes pairingToken as a query
|
|
18
|
+
* param; backend validates via bcrypt and joins the client to
|
|
19
|
+
* pairing:<id> + every assistant:<id> the pairing owns.
|
|
20
|
+
*
|
|
21
|
+
* Cursor authority is the DISK cursor (bgos_last_id): triggerBackfill reads
|
|
22
|
+
* loadLastId() at call time and the live WS path advances no cursor of its
|
|
23
|
+
* own. Dedupe + saveLastId happen in the inbound handler after the route
|
|
24
|
+
* resolves. Reconnect is handled at the Manager level (socket.io.on) because
|
|
25
|
+
* the Socket does not emit a `reconnect` reserved event in socket.io-client v4.
|
|
26
|
+
*/
|
|
27
|
+
export class BgosWs {
|
|
28
|
+
cfg;
|
|
29
|
+
api;
|
|
30
|
+
emitter = new EventEmitter();
|
|
31
|
+
socket = null;
|
|
32
|
+
reconnectAttempts = 0;
|
|
33
|
+
manualClose = false;
|
|
34
|
+
wsConnectedSince = null;
|
|
35
|
+
backfillInFlight = null;
|
|
36
|
+
typingThrottle = new Map();
|
|
37
|
+
constructor(cfg, api) {
|
|
38
|
+
this.cfg = cfg;
|
|
39
|
+
this.api = api;
|
|
40
|
+
}
|
|
41
|
+
on(event, listener) {
|
|
42
|
+
this.emitter.on(event, listener);
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
off(event, listener) {
|
|
46
|
+
this.emitter.off(event, listener);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/** ISO timestamp of the current connection, or null when disconnected. */
|
|
50
|
+
get connectedSince() {
|
|
51
|
+
return this.wsConnectedSince;
|
|
52
|
+
}
|
|
53
|
+
/** Swap the pairing token (and optionally base URL) for re-pair recovery.
|
|
54
|
+
* Caller reconnects (disconnect + connect) to apply it. */
|
|
55
|
+
updateToken(token, baseUrl) {
|
|
56
|
+
this.cfg = {
|
|
57
|
+
...this.cfg,
|
|
58
|
+
pairingToken: token,
|
|
59
|
+
...(baseUrl ? { baseUrl } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async connect() {
|
|
63
|
+
this.manualClose = false;
|
|
64
|
+
const socket = io(this.cfg.baseUrl, {
|
|
65
|
+
path: "/socket.io",
|
|
66
|
+
query: { pairingToken: this.cfg.pairingToken },
|
|
67
|
+
transports: ["websocket"],
|
|
68
|
+
reconnection: true,
|
|
69
|
+
reconnectionDelay: this.cfg.reconnect.initialDelayMs,
|
|
70
|
+
reconnectionDelayMax: this.cfg.reconnect.maxDelayMs,
|
|
71
|
+
reconnectionAttempts: Infinity,
|
|
72
|
+
});
|
|
73
|
+
socket.on("connect", () => {
|
|
74
|
+
this.reconnectAttempts = 0;
|
|
75
|
+
this.wsConnectedSince = new Date().toISOString();
|
|
76
|
+
this.emitter.emit("connect");
|
|
77
|
+
});
|
|
78
|
+
socket.on("disconnect", () => {
|
|
79
|
+
this.wsConnectedSince = null;
|
|
80
|
+
this.emitter.emit("disconnect");
|
|
81
|
+
});
|
|
82
|
+
// Manager-level reconnect (the Socket does not emit `reconnect` in
|
|
83
|
+
// socket.io-client v4, the previous socket.on("reconnect") was dead
|
|
84
|
+
// code). The adapter refreshes identity + backfills on this.
|
|
85
|
+
socket.io.on("reconnect", () => {
|
|
86
|
+
this.emitter.emit("reconnect");
|
|
87
|
+
});
|
|
88
|
+
socket.on("inbound_message", (payload) => {
|
|
89
|
+
const msg = this.normalizeInbound(payload);
|
|
90
|
+
if (!msg)
|
|
91
|
+
return;
|
|
92
|
+
// No cursor advance here: the inbound handler dedupes + persists the
|
|
93
|
+
// disk cursor after the route resolves.
|
|
94
|
+
this.emitter.emit("inbound_message", msg);
|
|
95
|
+
});
|
|
96
|
+
socket.on("inbound_click", (payload) => {
|
|
97
|
+
const click = this.normalizeInboundClick(payload);
|
|
98
|
+
if (click)
|
|
99
|
+
this.emitter.emit("inbound_click", click);
|
|
100
|
+
});
|
|
101
|
+
socket.on("commands_updated", (p) => this.emitter.emit("commands_updated", p));
|
|
102
|
+
socket.on("pair_ready", (p) => this.emitter.emit("pair_ready", p));
|
|
103
|
+
socket.on("assistant_bound", (p) => this.emitter.emit("assistant_bound", p));
|
|
104
|
+
socket.on("assistant_unbound", (p) => this.emitter.emit("assistant_unbound", p));
|
|
105
|
+
socket.on("pairing_revoked", (p) => {
|
|
106
|
+
this.emitter.emit("pairing_revoked", p);
|
|
107
|
+
this.emitter.emit("error", new PairingRevokedError("Pairing revoked by backend"));
|
|
108
|
+
});
|
|
109
|
+
socket.on("callback_result", (p) => this.emitter.emit("callback_result", p));
|
|
110
|
+
// Native voice control plane (mint / consult / dispatch). Frames are
|
|
111
|
+
// normalized + op-whitelisted here (G2 lesson: a malformed frame is
|
|
112
|
+
// dropped safely, the backend's own timeout surfaces it, but every
|
|
113
|
+
// well-formed op MUST pass through to the handler, which answers
|
|
114
|
+
// unserved ops with a descriptive error rather than silence).
|
|
115
|
+
socket.on("voice_rpc", (p) => {
|
|
116
|
+
const frame = normalizeVoiceRpc(p);
|
|
117
|
+
if (frame)
|
|
118
|
+
this.emitter.emit("voice_rpc", frame);
|
|
119
|
+
});
|
|
120
|
+
socket.on("connect_error", (err) => {
|
|
121
|
+
this.reconnectAttempts++;
|
|
122
|
+
this.emitter.emit("error", err);
|
|
123
|
+
});
|
|
124
|
+
this.socket = socket;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Backfill missed messages from the DISK cursor. Single-flight: concurrent
|
|
128
|
+
* calls (poll tick racing a reconnect) coalesce onto the same promise.
|
|
129
|
+
*
|
|
130
|
+
* `opts.initial` marks the boot backfill: when the disk cursor is 0 and the
|
|
131
|
+
* pairing already has history, page through it WITHOUT dispatching and seed
|
|
132
|
+
* the cursor to the newest id (cold-start guard), so a fresh install does
|
|
133
|
+
* not replay the entire history as new messages.
|
|
134
|
+
*/
|
|
135
|
+
triggerBackfill(opts) {
|
|
136
|
+
if (this.backfillInFlight)
|
|
137
|
+
return this.backfillInFlight;
|
|
138
|
+
this.backfillInFlight = this.runBackfill(opts?.initial ?? false).finally(() => {
|
|
139
|
+
this.backfillInFlight = null;
|
|
140
|
+
});
|
|
141
|
+
return this.backfillInFlight;
|
|
142
|
+
}
|
|
143
|
+
async runBackfill(initial) {
|
|
144
|
+
try {
|
|
145
|
+
const since = loadLastId();
|
|
146
|
+
if (initial && since === 0) {
|
|
147
|
+
await this.coldStartSeed();
|
|
148
|
+
this.emitter.emit("backfill_ok");
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const { messages } = await this.api.inboundSince(since);
|
|
152
|
+
const normalized = [];
|
|
153
|
+
for (const raw of messages) {
|
|
154
|
+
const m = this.normalizeInbound(raw);
|
|
155
|
+
if (m)
|
|
156
|
+
normalized.push(m);
|
|
157
|
+
}
|
|
158
|
+
const stormLimit = resolveStormLimit();
|
|
159
|
+
if (stormLimit > 0 && normalized.length > stormLimit) {
|
|
160
|
+
// Storm guard: fast-forward the cursor, skip dispatch, surface it.
|
|
161
|
+
let maxId = since;
|
|
162
|
+
for (const m of normalized)
|
|
163
|
+
if (m.messageId > maxId)
|
|
164
|
+
maxId = m.messageId;
|
|
165
|
+
saveLastId(maxId);
|
|
166
|
+
this.emitter.emit("backfill_storm", normalized.length);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
for (const m of normalized) {
|
|
170
|
+
// The inbound handler dedupes (processed-ids) + persists the cursor.
|
|
171
|
+
this.emitter.emit("inbound_message", m);
|
|
172
|
+
}
|
|
173
|
+
this.emitter.emit("backfill_ok");
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
177
|
+
this.emitter.emit("backfill_error", e);
|
|
178
|
+
this.emitter.emit("error", e);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Cold-start seed: page the entire history WITHOUT dispatching, advancing
|
|
183
|
+
* the disk cursor to the newest id. Bounded iterations to guarantee
|
|
184
|
+
* termination even if the backend paginates oddly.
|
|
185
|
+
*/
|
|
186
|
+
async coldStartSeed() {
|
|
187
|
+
let cursor = 0;
|
|
188
|
+
for (let i = 0; i < 100; i++) {
|
|
189
|
+
const { messages } = await this.api.inboundSince(cursor);
|
|
190
|
+
let maxId = cursor;
|
|
191
|
+
let count = 0;
|
|
192
|
+
for (const raw of messages) {
|
|
193
|
+
const m = this.normalizeInbound(raw);
|
|
194
|
+
if (!m)
|
|
195
|
+
continue;
|
|
196
|
+
count++;
|
|
197
|
+
if (m.messageId > maxId)
|
|
198
|
+
maxId = m.messageId;
|
|
199
|
+
}
|
|
200
|
+
if (count === 0 || maxId <= cursor)
|
|
201
|
+
break;
|
|
202
|
+
saveLastId(maxId);
|
|
203
|
+
cursor = maxId;
|
|
204
|
+
// Small terminal page: almost certainly the end of history.
|
|
205
|
+
if (count < 2)
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Emit a client-side `typing` WS event (contract C4). Best-effort +
|
|
211
|
+
* throttled to 1 per 3s per chat. Safe on old backends: an unknown WS
|
|
212
|
+
* event is ignored server-side.
|
|
213
|
+
*/
|
|
214
|
+
emitTyping(params) {
|
|
215
|
+
try {
|
|
216
|
+
const now = Date.now();
|
|
217
|
+
const last = this.typingThrottle.get(params.chatId) ?? 0;
|
|
218
|
+
if (now - last < 3000)
|
|
219
|
+
return;
|
|
220
|
+
this.typingThrottle.set(params.chatId, now);
|
|
221
|
+
this.socket?.emit("typing", {
|
|
222
|
+
chatId: params.chatId,
|
|
223
|
+
assistantId: params.assistantId,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
/* best-effort, never break a reply path over a typing indicator */
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
disconnect() {
|
|
231
|
+
this.manualClose = true;
|
|
232
|
+
this.socket?.disconnect();
|
|
233
|
+
this.socket = null;
|
|
234
|
+
this.wsConnectedSince = null;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Translate the wire-level payload (snake_case) into our camelCase type.
|
|
238
|
+
* Backend already emits camelCase via the helper service, but defensively
|
|
239
|
+
* handle both so we don't drop messages if someone changes the emitter.
|
|
240
|
+
*/
|
|
241
|
+
normalizeInbound(raw) {
|
|
242
|
+
if (!raw || typeof raw !== "object")
|
|
243
|
+
return null;
|
|
244
|
+
const r = raw;
|
|
245
|
+
const toInt = (v) => {
|
|
246
|
+
if (typeof v === "number")
|
|
247
|
+
return v;
|
|
248
|
+
if (typeof v === "string" && /^\d+$/.test(v))
|
|
249
|
+
return Number(v);
|
|
250
|
+
return 0;
|
|
251
|
+
};
|
|
252
|
+
const assistantId = toInt(r.assistantId ?? r.assistant_id);
|
|
253
|
+
const chatId = toInt(r.chatId ?? r.chat_id);
|
|
254
|
+
const messageId = toInt(r.messageId ?? r.message_id);
|
|
255
|
+
if (!assistantId || !chatId || !messageId)
|
|
256
|
+
return null;
|
|
257
|
+
// a2a side-thread markers, present only on peer-agent inbounds (the
|
|
258
|
+
// backend stamps them on the WS event). `toInt` yields 0 when absent;
|
|
259
|
+
// collapse that to undefined so ordinary user messages stay clean.
|
|
260
|
+
const peerConversationId = toInt(r.peerConversationId ?? r.peer_conversation_id) || undefined;
|
|
261
|
+
const turnStateRaw = r.turnState ?? r.turn_state;
|
|
262
|
+
return {
|
|
263
|
+
assistantId,
|
|
264
|
+
chatId,
|
|
265
|
+
messageId,
|
|
266
|
+
userId: String(r.userId ?? r.user_id ?? ""),
|
|
267
|
+
text: String(r.text ?? ""),
|
|
268
|
+
files: Array.isArray(r.files) ? r.files : [],
|
|
269
|
+
messageType: (r.messageType ?? r.message_type ?? "standard"),
|
|
270
|
+
commandName: (r.commandName ?? r.command_name ?? undefined),
|
|
271
|
+
commandArgs: (r.commandArgs ?? r.command_args ?? undefined),
|
|
272
|
+
...(peerConversationId !== undefined ? { peerConversationId } : {}),
|
|
273
|
+
...(typeof turnStateRaw === "string" && turnStateRaw
|
|
274
|
+
? { turnState: turnStateRaw }
|
|
275
|
+
: {}),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/** Normalize an inbound_click WS payload (camelCase or snake_case). */
|
|
279
|
+
normalizeInboundClick(raw) {
|
|
280
|
+
if (!raw || typeof raw !== "object")
|
|
281
|
+
return null;
|
|
282
|
+
const r = raw;
|
|
283
|
+
const toInt = (v) => {
|
|
284
|
+
if (typeof v === "number")
|
|
285
|
+
return v;
|
|
286
|
+
if (typeof v === "string" && /^\d+$/.test(v))
|
|
287
|
+
return Number(v);
|
|
288
|
+
return 0;
|
|
289
|
+
};
|
|
290
|
+
const assistantId = toInt(r.assistantId ?? r.assistant_id);
|
|
291
|
+
const chatId = toInt(r.chatId ?? r.chat_id);
|
|
292
|
+
const messageId = toInt(r.messageId ?? r.message_id);
|
|
293
|
+
const callbackData = r.callbackData ?? r.callback_data;
|
|
294
|
+
if (!assistantId || !chatId || typeof callbackData !== "string") {
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
assistantId,
|
|
299
|
+
chatId,
|
|
300
|
+
messageId,
|
|
301
|
+
userId: String(r.userId ?? r.user_id ?? ""),
|
|
302
|
+
optionId: toInt(r.optionId ?? r.option_id),
|
|
303
|
+
callbackData,
|
|
304
|
+
...(typeof (r.buttonText ?? r.button_text) === "string"
|
|
305
|
+
? { buttonText: String(r.buttonText ?? r.button_text) }
|
|
306
|
+
: {}),
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=bgos-ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bgos-ws.js","sourceRoot":"","sources":["../src/bgos-ws.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** The bundled, offline fallback shipped with the daemon. */
|
|
2
|
+
export declare const BUNDLED_CAPABILITIES = "# BGOS Channel, Agent Capabilities\n\nYou are reachable from the BGOS chat app. Your text reply is delivered to the\nuser as a chat message. A few markers let you use richer BGOS features. Put each\nmarker on its own line. The daemon strips markers from the visible text.\n\n## Markdown\nSupported: **bold**, *italic*, `inline code`, fenced code blocks, [links](url),\n# / ## / ### headings, ordered and unordered lists, > blockquotes.\nNOT supported: tables (they do not lay out on mobile), inline images via\n (use MEDIA: instead), strikethrough. Do not escape punctuation; this\nis not Telegram MarkdownV2.\n\n## Sending files, images, videos (you to user)\nPut `MEDIA:/absolute/path/to/file` on its own line. The daemon infers the type\nfrom the extension and uploads it (inline under 500 KB, presigned S3 otherwise).\nCaps: image 10 MB, video 100 MB, audio 25 MB, document 25 MB. Multiple MEDIA:\nlines send multiple files in one bubble. Surrounding sentences remain visible.\n\n## Inline option buttons (non-blocking)\nOffer up to 6 tappable choices. The user can still type instead.\n[[BGOS_BUTTONS]]\nYes, ship it | ship\nHold off | hold\n[[/BGOS_BUTTONS]]\nEach line is `Label | value`. The value comes back to you as the user's next\nmessage when they tap. Any text before the block is the question.\n\n## ask_user_input (blocking questions)\nAsk 1 to 4 questions the user must answer before continuing.\n[[BGOS_ASK]]\nQ: Which environment?\nStaging | staging\nProduction | prod\nQ: Proceed now?\nnoskip\nYes | yes\n[[/BGOS_ASK]]\nOptions are `Label | value`. Add `noskip` to require an answer, `nofreetext`\nto disallow a typed answer. Each answer arrives as your next message.\n\n## Status line\nShow a short working status with `STATUS: <text>` on its own line (for example\n`STATUS: running tests`). An empty `STATUS:` clears it.\n\n## Tool activity (automatic)\nYour shell commands, file edits, MCP tool calls, and web searches are shown to\nthe user as a live tool-progress card automatically. You do not need to report\nthem.\n\n## Files the user sends you\nImages are attached to your input directly. Other files are downloaded and their\nabsolute path is given to you inline as `[File attached: /path (mime)]`; read\nthem from disk as needed.\n\n## Slash commands\n`/new` starts a fresh conversation (your thread is reset). `/retry` re-runs the\nuser's last message. `/status` shows daemon health. These are handled by the\ndaemon; you will not see them.\n\n## Not supported here\nNo group chats, threads, or message editing. Dangerous-command approval prompts\nare not surfaced to BGOS in this version; run within your sandbox.\n";
|
|
3
|
+
/** Shape of GET /integrations/capabilities?channel=codex. */
|
|
4
|
+
export interface ServedCapabilities {
|
|
5
|
+
channel: string;
|
|
6
|
+
version: string;
|
|
7
|
+
text: string;
|
|
8
|
+
core: string;
|
|
9
|
+
channelSyntax: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Whether a payload looks like a real BGOS capability canon. The served text
|
|
13
|
+
* opens with "# BGOS Channel Agent Capabilities" and the bundled copy with
|
|
14
|
+
* "# BGOS Channel, Agent Capabilities"; both carry the two dash-free markers, so
|
|
15
|
+
* matching on both rejects an empty or garbage body while accepting either form.
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasCanonMarkers(text: string | null | undefined): boolean;
|
|
18
|
+
export interface PickedCapabilities {
|
|
19
|
+
text: string;
|
|
20
|
+
source: "backend" | "bundled";
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Choose the agent-hints text to inject: the served canon when it is present and
|
|
24
|
+
* well-formed, else the bundled fallback. Pure and total (never throws), so the
|
|
25
|
+
* connect path can call it on any input, including a failed fetch (pass null).
|
|
26
|
+
*/
|
|
27
|
+
export declare function pickCapabilitiesText(fetched: ServedCapabilities | null | undefined, bundled?: string): PickedCapabilities;
|
|
28
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAiBA,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB,ymFAAmB,CAAC;AAErD,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGxE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,GAAE,MAA6B,GACrC,kBAAkB,CAUpB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability bootstrap (fetch-on-connect).
|
|
3
|
+
*
|
|
4
|
+
* The BGOS backend owns the machine-readable capability canon and serves it per
|
|
5
|
+
* channel at `GET /api/v1/integrations/capabilities?channel=codex`. The daemon
|
|
6
|
+
* fetches it once at connect and writes the returned `text` to the Codex agent's
|
|
7
|
+
* AGENTS.md (see CodexHost.applyAgentHints), so a connected agent always sees the
|
|
8
|
+
* current canon without a daemon release. When the endpoint is unreachable (old
|
|
9
|
+
* backend, network, revoked token, malformed body) the daemon keeps the frozen
|
|
10
|
+
* `BGOS_AGENT_HINTS` copy it shipped with. A fetch failure NEVER hard-fails the
|
|
11
|
+
* daemon.
|
|
12
|
+
*
|
|
13
|
+
* This module holds only PURE helpers (no I/O), so the validate-and-choose logic
|
|
14
|
+
* is unit-tested; the fetch + AGENTS.md write live in bgos-api.ts / codex-host.ts.
|
|
15
|
+
*/
|
|
16
|
+
import { BGOS_AGENT_HINTS } from "./agent-hints.js";
|
|
17
|
+
/** The bundled, offline fallback shipped with the daemon. */
|
|
18
|
+
export const BUNDLED_CAPABILITIES = BGOS_AGENT_HINTS;
|
|
19
|
+
/**
|
|
20
|
+
* Whether a payload looks like a real BGOS capability canon. The served text
|
|
21
|
+
* opens with "# BGOS Channel Agent Capabilities" and the bundled copy with
|
|
22
|
+
* "# BGOS Channel, Agent Capabilities"; both carry the two dash-free markers, so
|
|
23
|
+
* matching on both rejects an empty or garbage body while accepting either form.
|
|
24
|
+
*/
|
|
25
|
+
export function hasCanonMarkers(text) {
|
|
26
|
+
if (typeof text !== "string")
|
|
27
|
+
return false;
|
|
28
|
+
return text.includes("BGOS Channel") && text.includes("Agent Capabilities");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Choose the agent-hints text to inject: the served canon when it is present and
|
|
32
|
+
* well-formed, else the bundled fallback. Pure and total (never throws), so the
|
|
33
|
+
* connect path can call it on any input, including a failed fetch (pass null).
|
|
34
|
+
*/
|
|
35
|
+
export function pickCapabilitiesText(fetched, bundled = BUNDLED_CAPABILITIES) {
|
|
36
|
+
const served = fetched?.text;
|
|
37
|
+
if (typeof served === "string" &&
|
|
38
|
+
served.trim().length > 0 &&
|
|
39
|
+
hasCanonMarkers(served)) {
|
|
40
|
+
return { text: served, source: "backend" };
|
|
41
|
+
}
|
|
42
|
+
return { text: bundled, source: "bundled" };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAWrD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAA+B;IAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC9E,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA8C,EAC9C,UAAkB,oBAAoB;IAEtC,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC;IAC7B,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACxB,eAAe,CAAC,MAAM,CAAC,EACvB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { BgosApi } from "./bgos-api.js";
|
|
2
|
+
/**
|
|
3
|
+
* Push the agent catalog to BGOS so the Integrations card's checklist
|
|
4
|
+
* populates with the available-to-bind agents.
|
|
5
|
+
*
|
|
6
|
+
* Fail-open: catalog push is non-fatal. If it errors we log + return so
|
|
7
|
+
* the daemon stays connected. The user can either retry by reloading the
|
|
8
|
+
* Integrations card (which calls `/integrations/me`) or restart the
|
|
9
|
+
* daemon.
|
|
10
|
+
*
|
|
11
|
+
* Caller is responsible for resolving `pairing_id` (typically by
|
|
12
|
+
* `BgosApi.whoami()` on connect) and providing the agent list.
|
|
13
|
+
*/
|
|
14
|
+
export interface CatalogAgent {
|
|
15
|
+
/** Stable identifier the host uses to dispatch (e.g. `"general"`,
|
|
16
|
+
* `"critic"`, etc.). Becomes the assistant's `agent_route` in BGOS. */
|
|
17
|
+
route: string;
|
|
18
|
+
/** Display name shown on the Integrations checklist. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Optional one-line description for the checklist row. */
|
|
21
|
+
description?: string;
|
|
22
|
+
/** Optional avatar URL for the checklist row. */
|
|
23
|
+
avatarUrl?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function syncCatalog(api: BgosApi, pairingId: number, agents: CatalogAgent[]): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=catalog-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-sync.d.ts","sourceRoot":"","sources":["../src/catalog-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,YAAY;IAC3B;4EACwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export async function syncCatalog(api, pairingId, agents) {
|
|
2
|
+
if (!agents.length) {
|
|
3
|
+
// eslint-disable-next-line no-console
|
|
4
|
+
console.warn("[codex-channel-bgos] syncCatalog called with empty agent list - skipping");
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
const entries = agents.map((a) => ({
|
|
8
|
+
agent_route: a.route,
|
|
9
|
+
name: a.name,
|
|
10
|
+
description: a.description,
|
|
11
|
+
avatar_url: a.avatarUrl,
|
|
12
|
+
}));
|
|
13
|
+
try {
|
|
14
|
+
await api.pushAgentCatalog(pairingId, entries);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
// Fail-open. Surface the message so logs are useful but never
|
|
18
|
+
// throw - `BGOSAdapter.start()` calls this path and a 5xx in
|
|
19
|
+
// catalog push must NOT take down the adapter.
|
|
20
|
+
// eslint-disable-next-line no-console
|
|
21
|
+
console.warn("[codex-channel-bgos] agent catalog push failed (non-fatal):", err instanceof Error ? err.message : String(err));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=catalog-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-sync.js","sourceRoot":"","sources":["../src/catalog-sync.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAY,EACZ,SAAiB,EACjB,MAAsB;IAEtB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACV,0EAA0E,CAC3E,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAwB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,WAAW,EAAE,CAAC,CAAC,KAAK;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,UAAU,EAAE,CAAC,CAAC,SAAS;KACxB,CAAC,CAAC,CAAC;IACJ,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8DAA8D;QAC9D,6DAA6D;QAC7D,+CAA+C;QAC/C,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACV,6DAA6D,EAC7D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* codex-channel-bgos daemon CLI.
|
|
4
|
+
*
|
|
5
|
+
* codex-channel-bgos connect <CODE> pair with a BGOS code, then start
|
|
6
|
+
* codex-channel-bgos start start from the stored pairing token
|
|
7
|
+
* codex-channel-bgos install-service install launchd/systemd persistence
|
|
8
|
+
* codex-channel-bgos --help
|
|
9
|
+
*
|
|
10
|
+
* `connect` is pair-then-start in one process (the OpenClaw one-paste shape):
|
|
11
|
+
* pairing writes ~/.codex-bgos/secrets/bgos.json, then control falls through to
|
|
12
|
+
* start, which reads that same file.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync } from "node:fs";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { pairBgos } from "./pair-cli.js";
|
|
18
|
+
import { loadConfig } from "./load-config.js";
|
|
19
|
+
import { resolveAuthMode } from "./auth-mode.js";
|
|
20
|
+
import { CodexAdapter } from "./adapter.js";
|
|
21
|
+
import { getPackageVersion } from "./version.js";
|
|
22
|
+
import { installService } from "./install-service.js";
|
|
23
|
+
const DEFAULT_BASE_URL = "https://api.brandgrowthos.ai";
|
|
24
|
+
const LOG = "[codex-channel-bgos]";
|
|
25
|
+
/** Path to OpenAI Codex's own auth.json (a prior `codex login`). */
|
|
26
|
+
function codexAuthJsonPath() {
|
|
27
|
+
const home = process.env.CODEX_HOME?.trim();
|
|
28
|
+
const root = home && home.length > 0 ? home : join(homedir(), ".codex");
|
|
29
|
+
return join(root, "auth.json");
|
|
30
|
+
}
|
|
31
|
+
function resolveAuth() {
|
|
32
|
+
const raw = (process.env.CODEX_BGOS_AUTH_MODE ?? "auto").trim().toLowerCase();
|
|
33
|
+
const forced = raw === "chatgpt" || raw === "apikey" ? raw : "auto";
|
|
34
|
+
return resolveAuthMode({
|
|
35
|
+
authJsonExists: existsSync(codexAuthJsonPath()),
|
|
36
|
+
openaiKey: process.env.OPENAI_API_KEY,
|
|
37
|
+
forced,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function printPreflight() {
|
|
41
|
+
// The codex binary ships with @openai/codex-sdk (a dependency), so "installed"
|
|
42
|
+
// is always true for a working install; report auth as the meaningful gate.
|
|
43
|
+
process.stdout.write(`${LOG} preflight: codex runtime bundled (ok)\n`);
|
|
44
|
+
}
|
|
45
|
+
function usage() {
|
|
46
|
+
process.stdout.write(`codex-channel-bgos v${getPackageVersion()}\n\n` +
|
|
47
|
+
`Usage:\n` +
|
|
48
|
+
` codex-channel-bgos connect <CODE> Pair with a BGOS code, then start the daemon\n` +
|
|
49
|
+
` codex-channel-bgos start Start from the stored pairing token\n` +
|
|
50
|
+
` codex-channel-bgos install-service Install launchd/systemd persistence\n` +
|
|
51
|
+
` codex-channel-bgos --help\n\n` +
|
|
52
|
+
`Auth (D7): prefers an existing 'codex login', else OPENAI_API_KEY.\n` +
|
|
53
|
+
`Override with CODEX_BGOS_AUTH_MODE=auto|chatgpt|apikey.\n`);
|
|
54
|
+
}
|
|
55
|
+
async function runStart() {
|
|
56
|
+
const auth = resolveAuth();
|
|
57
|
+
if (!auth.ok) {
|
|
58
|
+
process.stderr.write(`${LOG} cannot start: ${auth.error}\n`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
let cfg;
|
|
62
|
+
try {
|
|
63
|
+
cfg = loadConfig();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
process.stderr.write(`${LOG} not paired yet. Get a code from the BGOS app, then run:\n` +
|
|
67
|
+
` npx codex-channel-bgos connect BGOS-XXXX-XX\n`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
process.stdout.write(`${LOG} starting v${getPackageVersion()}\n`);
|
|
72
|
+
process.stdout.write(`${LOG} auth: ${auth.label} (${auth.mode})\n`);
|
|
73
|
+
const adapter = new CodexAdapter(cfg, auth, {
|
|
74
|
+
model: process.env.CODEX_BGOS_MODEL,
|
|
75
|
+
});
|
|
76
|
+
let stopping = false;
|
|
77
|
+
const shutdown = () => {
|
|
78
|
+
if (stopping)
|
|
79
|
+
return;
|
|
80
|
+
stopping = true;
|
|
81
|
+
process.stdout.write(`\n${LOG} shutting down...\n`);
|
|
82
|
+
void adapter.stop().finally(() => process.exit(0));
|
|
83
|
+
};
|
|
84
|
+
process.on("SIGINT", shutdown);
|
|
85
|
+
process.on("SIGTERM", shutdown);
|
|
86
|
+
await adapter.start();
|
|
87
|
+
process.stdout.write(`${LOG} ready, waiting for BGOS messages\n`);
|
|
88
|
+
}
|
|
89
|
+
async function runConnect(code) {
|
|
90
|
+
const auth = resolveAuth();
|
|
91
|
+
if (!auth.ok) {
|
|
92
|
+
process.stderr.write(`${LOG} ${auth.error}\n`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
printPreflight();
|
|
96
|
+
process.stdout.write(`${LOG} auth: ${auth.ok ? auth.label : "unresolved"} (${auth.ok ? auth.mode : "none"})\n`);
|
|
97
|
+
const baseUrl = process.env.BGOS_BASE_URL ?? DEFAULT_BASE_URL;
|
|
98
|
+
if (!code) {
|
|
99
|
+
process.stderr.write(`${LOG} no pair code given. Get one from the BGOS app (Add an agent -> Codex) and run:\n` +
|
|
100
|
+
` npx codex-channel-bgos connect BGOS-XXXX-XX\n`);
|
|
101
|
+
process.exit(2);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const { pairing, tokenFile } = await pairBgos({ baseUrl, code });
|
|
106
|
+
process.stdout.write(`${LOG} paired (pairing_id=${pairing.pairing_id}). Token stored at ${tokenFile}. Starting...\n`);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
const e = err;
|
|
110
|
+
const status = e?.response?.status;
|
|
111
|
+
if (status === 400 || status === 404 || status === 410) {
|
|
112
|
+
process.stderr.write(`${LOG} pair code rejected (${status}): expired or already used. Get a fresh code and try again.\n`);
|
|
113
|
+
process.exit(2);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
process.stderr.write(`${LOG} pairing failed: ${e?.message ?? String(err)}\n`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
await runStart();
|
|
121
|
+
}
|
|
122
|
+
async function main() {
|
|
123
|
+
const argv = process.argv.slice(2);
|
|
124
|
+
const verb = argv[0];
|
|
125
|
+
if (verb === "--help" || verb === "-h" || verb === "help") {
|
|
126
|
+
usage();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (verb === "install-service") {
|
|
130
|
+
const r = installService();
|
|
131
|
+
process.stdout.write(`${LOG} ${r.message}\n`);
|
|
132
|
+
process.exit(r.ok ? 0 : 1);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (verb === "connect") {
|
|
136
|
+
const code = argv.slice(1).find((a) => !a.startsWith("-"));
|
|
137
|
+
await runConnect(code);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (verb === "start" || verb === undefined) {
|
|
141
|
+
await runStart();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
process.stderr.write(`${LOG} unknown command: ${verb}\n`);
|
|
145
|
+
usage();
|
|
146
|
+
process.exit(2);
|
|
147
|
+
}
|
|
148
|
+
void main().catch((err) => {
|
|
149
|
+
process.stderr.write(`${LOG} fatal: ${err instanceof Error ? err.stack : String(err)}\n`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|