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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/dist/adapter.d.ts +96 -0
  4. package/dist/adapter.d.ts.map +1 -0
  5. package/dist/adapter.js +677 -0
  6. package/dist/adapter.js.map +1 -0
  7. package/dist/agent-hints.d.ts +20 -0
  8. package/dist/agent-hints.d.ts.map +1 -0
  9. package/dist/agent-hints.js +92 -0
  10. package/dist/agent-hints.js.map +1 -0
  11. package/dist/agent-identity.d.ts +36 -0
  12. package/dist/agent-identity.d.ts.map +1 -0
  13. package/dist/agent-identity.js +42 -0
  14. package/dist/agent-identity.js.map +1 -0
  15. package/dist/attachment-bridge.d.ts +64 -0
  16. package/dist/attachment-bridge.d.ts.map +1 -0
  17. package/dist/attachment-bridge.js +216 -0
  18. package/dist/attachment-bridge.js.map +1 -0
  19. package/dist/auth-mode.d.ts +34 -0
  20. package/dist/auth-mode.d.ts.map +1 -0
  21. package/dist/auth-mode.js +48 -0
  22. package/dist/auth-mode.js.map +1 -0
  23. package/dist/bgos-api.d.ts +191 -0
  24. package/dist/bgos-api.d.ts.map +1 -0
  25. package/dist/bgos-api.js +225 -0
  26. package/dist/bgos-api.js.map +1 -0
  27. package/dist/bgos-ws.d.ts +94 -0
  28. package/dist/bgos-ws.d.ts.map +1 -0
  29. package/dist/bgos-ws.js +310 -0
  30. package/dist/bgos-ws.js.map +1 -0
  31. package/dist/capabilities.d.ts +28 -0
  32. package/dist/capabilities.d.ts.map +1 -0
  33. package/dist/capabilities.js +44 -0
  34. package/dist/capabilities.js.map +1 -0
  35. package/dist/catalog-sync.d.ts +26 -0
  36. package/dist/catalog-sync.d.ts.map +1 -0
  37. package/dist/catalog-sync.js +24 -0
  38. package/dist/catalog-sync.js.map +1 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +152 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/codex-host.d.ts +44 -0
  44. package/dist/codex-host.d.ts.map +1 -0
  45. package/dist/codex-host.js +142 -0
  46. package/dist/codex-host.js.map +1 -0
  47. package/dist/commands-sync.d.ts +24 -0
  48. package/dist/commands-sync.d.ts.map +1 -0
  49. package/dist/commands-sync.js +43 -0
  50. package/dist/commands-sync.js.map +1 -0
  51. package/dist/config.d.ts +4 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +36 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/default-commands.d.ts +27 -0
  56. package/dist/default-commands.d.ts.map +1 -0
  57. package/dist/default-commands.js +64 -0
  58. package/dist/default-commands.js.map +1 -0
  59. package/dist/event-mapper.d.ts +43 -0
  60. package/dist/event-mapper.d.ts.map +1 -0
  61. package/dist/event-mapper.js +127 -0
  62. package/dist/event-mapper.js.map +1 -0
  63. package/dist/heartbeat.d.ts +75 -0
  64. package/dist/heartbeat.d.ts.map +1 -0
  65. package/dist/heartbeat.js +186 -0
  66. package/dist/heartbeat.js.map +1 -0
  67. package/dist/inbound-handler.d.ts +167 -0
  68. package/dist/inbound-handler.d.ts.map +1 -0
  69. package/dist/inbound-handler.js +282 -0
  70. package/dist/inbound-handler.js.map +1 -0
  71. package/dist/inbound-input.d.ts +17 -0
  72. package/dist/inbound-input.d.ts.map +1 -0
  73. package/dist/inbound-input.js +25 -0
  74. package/dist/inbound-input.js.map +1 -0
  75. package/dist/index.d.ts +25 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +18 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/install-service.d.ts +8 -0
  80. package/dist/install-service.d.ts.map +1 -0
  81. package/dist/install-service.js +66 -0
  82. package/dist/install-service.js.map +1 -0
  83. package/dist/last-id-store.d.ts +33 -0
  84. package/dist/last-id-store.d.ts.map +1 -0
  85. package/dist/last-id-store.js +101 -0
  86. package/dist/last-id-store.js.map +1 -0
  87. package/dist/load-config.d.ts +30 -0
  88. package/dist/load-config.d.ts.map +1 -0
  89. package/dist/load-config.js +86 -0
  90. package/dist/load-config.js.map +1 -0
  91. package/dist/media-classify.d.ts +37 -0
  92. package/dist/media-classify.d.ts.map +1 -0
  93. package/dist/media-classify.js +108 -0
  94. package/dist/media-classify.js.map +1 -0
  95. package/dist/media-guard.d.ts +13 -0
  96. package/dist/media-guard.d.ts.map +1 -0
  97. package/dist/media-guard.js +159 -0
  98. package/dist/media-guard.js.map +1 -0
  99. package/dist/outbound-retry.d.ts +24 -0
  100. package/dist/outbound-retry.d.ts.map +1 -0
  101. package/dist/outbound-retry.js +75 -0
  102. package/dist/outbound-retry.js.map +1 -0
  103. package/dist/outbound.d.ts +223 -0
  104. package/dist/outbound.d.ts.map +1 -0
  105. package/dist/outbound.js +366 -0
  106. package/dist/outbound.js.map +1 -0
  107. package/dist/outbox.d.ts +16 -0
  108. package/dist/outbox.d.ts.map +1 -0
  109. package/dist/outbox.js +88 -0
  110. package/dist/outbox.js.map +1 -0
  111. package/dist/pair-cli.d.ts +44 -0
  112. package/dist/pair-cli.d.ts.map +1 -0
  113. package/dist/pair-cli.js +182 -0
  114. package/dist/pair-cli.js.map +1 -0
  115. package/dist/pending-unknown-store.d.ts +26 -0
  116. package/dist/pending-unknown-store.d.ts.map +1 -0
  117. package/dist/pending-unknown-store.js +135 -0
  118. package/dist/pending-unknown-store.js.map +1 -0
  119. package/dist/processed-ids.d.ts +36 -0
  120. package/dist/processed-ids.d.ts.map +1 -0
  121. package/dist/processed-ids.js +55 -0
  122. package/dist/processed-ids.js.map +1 -0
  123. package/dist/reply-markers.d.ts +42 -0
  124. package/dist/reply-markers.d.ts.map +1 -0
  125. package/dist/reply-markers.js +124 -0
  126. package/dist/reply-markers.js.map +1 -0
  127. package/dist/setup/supervisor.d.ts +16 -0
  128. package/dist/setup/supervisor.d.ts.map +1 -0
  129. package/dist/setup/supervisor.js +61 -0
  130. package/dist/setup/supervisor.js.map +1 -0
  131. package/dist/thread-map.d.ts +12 -0
  132. package/dist/thread-map.d.ts.map +1 -0
  133. package/dist/thread-map.js +72 -0
  134. package/dist/thread-map.js.map +1 -0
  135. package/dist/tool-progress.d.ts +103 -0
  136. package/dist/tool-progress.d.ts.map +1 -0
  137. package/dist/tool-progress.js +216 -0
  138. package/dist/tool-progress.js.map +1 -0
  139. package/dist/types.d.ts +244 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +16 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/version.d.ts +2 -0
  144. package/dist/version.d.ts.map +1 -0
  145. package/dist/version.js +28 -0
  146. package/dist/version.js.map +1 -0
  147. package/dist/voice-rpc.d.ts +37 -0
  148. package/dist/voice-rpc.d.ts.map +1 -0
  149. package/dist/voice-rpc.js +44 -0
  150. package/dist/voice-rpc.js.map +1 -0
  151. package/package.json +47 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 BrandGrowthOS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,114 @@
1
+ # codex-channel-bgos
2
+
3
+ Chat with your OpenAI Codex agents inside BGOS (Home of Agents).
4
+
5
+ `codex-channel-bgos` is a small daemon that runs on your machine, pairs with your
6
+ BGOS account, and hosts OpenAI Codex through the official
7
+ [`@openai/codex-sdk`](https://www.npmjs.com/package/@openai/codex-sdk). Every BGOS
8
+ chat maps to one persistent Codex thread, so your agent keeps context; tool runs
9
+ show up live as a tool-progress card; and `/new` starts fresh.
10
+
11
+ It is a sibling of `gobot-channel-bgos`, `openclaw-channel-bgos`, and
12
+ `hermes-channel-bgos` and reuses their proven transport, dedupe, cursor, and
13
+ outbound machinery.
14
+
15
+ ## Quick start (one paste)
16
+
17
+ 1. In the BGOS app, tap **Add an agent** and pick **Codex**. Copy the pair code.
18
+ 2. On the computer where Codex runs, paste:
19
+
20
+ ```bash
21
+ npx codex-channel-bgos connect BGOS-XXXX-XX
22
+ ```
23
+
24
+ That pairs and starts the daemon in one step. Your Codex agent appears in BGOS,
25
+ ready to chat.
26
+
27
+ The `codex` runtime ships with the npm package, so you do not need a separate
28
+ install. You do need to be signed in (see Auth).
29
+
30
+ ## Auth
31
+
32
+ The daemon prefers an existing `codex login` (your ChatGPT plan, no extra cost),
33
+ and falls back to an OpenAI API key.
34
+
35
+ - If you have run `codex login`, it is used automatically.
36
+ - Otherwise set `OPENAI_API_KEY` (for example in `~/.env`).
37
+ - With neither, the daemon refuses to start and tells you how to fix it.
38
+
39
+ Override the choice with `CODEX_BGOS_AUTH_MODE`:
40
+
41
+ | Value | Behavior |
42
+ |---|---|
43
+ | `auto` (default) | Prefer the codex login, else `OPENAI_API_KEY` |
44
+ | `chatgpt` | Require the codex login |
45
+ | `apikey` | Require `OPENAI_API_KEY` (metered billing) |
46
+
47
+ The active mode is printed at startup and reported in the heartbeat.
48
+
49
+ ## Commands
50
+
51
+ ```bash
52
+ codex-channel-bgos connect <CODE> # pair with a BGOS code, then start
53
+ codex-channel-bgos start # start from the stored pairing token
54
+ codex-channel-bgos install-service # install launchd/systemd persistence
55
+ codex-channel-bgos --help
56
+ ```
57
+
58
+ ## Keep it running
59
+
60
+ ```bash
61
+ npm i -g codex-channel-bgos
62
+ codex-channel-bgos connect BGOS-XXXX-XX # once, to pair
63
+ codex-channel-bgos install-service # launchd (macOS) or systemd user unit (Linux)
64
+ ```
65
+
66
+ On Linux, to keep the service alive after logout: `loginctl enable-linger "$USER"`.
67
+
68
+ ## What your Codex agent can do
69
+
70
+ The agent talks back with plain text plus a few markers (documented for the agent
71
+ in `AGENTS.md`, which the daemon writes into the workspace):
72
+
73
+ - Files and media: put `MEDIA:/absolute/path` on its own line.
74
+ - Inline buttons (up to 6): a `[[BGOS_BUTTONS]] ... [[/BGOS_BUTTONS]]` block.
75
+ - Blocking questions (1 to 4): a `[[BGOS_ASK]] ... [[/BGOS_ASK]]` block.
76
+ - Status line: `STATUS: <text>`.
77
+ - Tool progress: automatic. Codex's shell, file, MCP, and web-search activity is
78
+ streamed to a live card; the agent does not self-report.
79
+ - Inbound images are passed to Codex natively; other files are downloaded and
80
+ their path is given to the agent.
81
+
82
+ Slash commands `/new` (reset the thread), `/retry`, and `/status` are handled by
83
+ the daemon. Dangerous-command approval cards are not surfaced in this version (the
84
+ SDK exposes only a fixed approval policy; the daemon runs in a workspace-write
85
+ sandbox). See the capability canon in `hermes-channel-bgos/docs/bgos-agent-capabilities.md`.
86
+
87
+ ## Environment variables
88
+
89
+ | Variable | Default | Purpose |
90
+ |---|---|---|
91
+ | `OPENAI_API_KEY` | (none) | API-key auth (fallback to codex login) |
92
+ | `CODEX_BGOS_AUTH_MODE` | `auto` | `auto` / `chatgpt` / `apikey` |
93
+ | `CODEX_BGOS_HOME` | `~/.codex-bgos` | Data dir (secrets, threads, workspace, logs) |
94
+ | `CODEX_BGOS_MODEL` | (SDK default) | Codex model override |
95
+ | `CODEX_BGOS_POLL_INTERVAL` | `5` | Inbound poll seconds (0 disables) |
96
+ | `CODEX_BGOS_HEARTBEAT_INTERVAL` | `60` | Heartbeat seconds (0 disables network) |
97
+ | `BGOS_BASE_URL` | `https://api.brandgrowthos.ai` | Backend base URL |
98
+
99
+ Data lives under `~/.codex-bgos/` (kept separate from OpenAI Codex's own
100
+ `~/.codex/`): `secrets/bgos.json` (0600), `threads.json` (chat to thread map),
101
+ `workspace/` (Codex working dir + AGENTS.md), plus cursor/outbox/heartbeat files.
102
+
103
+ ## Develop
104
+
105
+ ```bash
106
+ npm install
107
+ npm test # vitest
108
+ npm run build # tsc + shebang finalize
109
+ npm run lint # tsc --noEmit
110
+ ```
111
+
112
+ ## License
113
+
114
+ MIT
@@ -0,0 +1,96 @@
1
+ import { BgosApi } from "./bgos-api.js";
2
+ import { BgosOutbound } from "./outbound.js";
3
+ import { CommandsSync } from "./commands-sync.js";
4
+ import { ToolProgressOrchestrator } from "./tool-progress.js";
5
+ import { type CatalogAgent } from "./catalog-sync.js";
6
+ import { type CommandSeedMode } from "./default-commands.js";
7
+ import type { AuthResolutionOk } from "./auth-mode.js";
8
+ import { type PluginConfig } from "./types.js";
9
+ export interface FatalInfo {
10
+ code: string;
11
+ message: string;
12
+ reason: string;
13
+ }
14
+ export interface CodexAdapterOptions {
15
+ /** Agent catalog to push on connect (defaults to a single "codex" agent). */
16
+ agents?: CatalogAgent[];
17
+ /** Model override (CODEX_BGOS_MODEL). */
18
+ model?: string;
19
+ commandSeedMode?: CommandSeedMode;
20
+ onFatal?: (info: FatalInfo) => void;
21
+ }
22
+ export declare class CodexAdapter {
23
+ readonly api: BgosApi;
24
+ readonly outbound: BgosOutbound;
25
+ readonly commandsSync: CommandsSync;
26
+ readonly toolProgress: ToolProgressOrchestrator;
27
+ private readonly cfg;
28
+ private readonly ws;
29
+ private readonly heartbeat;
30
+ private readonly host;
31
+ private readonly assistantToRoute;
32
+ private readonly lastInput;
33
+ private readonly dispatch;
34
+ private catalog;
35
+ private commandSeedModeOverride;
36
+ private pairingId;
37
+ private pollTimer;
38
+ private spoolTimer;
39
+ private started;
40
+ private readonly onFatal?;
41
+ private identityReady;
42
+ private capabilitiesLoaded;
43
+ private identityRetryTimer;
44
+ private pollStarted;
45
+ private lastScopeRefreshAt;
46
+ private scopeRefreshInFlight;
47
+ private currentToken;
48
+ private fatalLatched;
49
+ private fatalNotified;
50
+ private last401LogAt;
51
+ private secretsWatcher;
52
+ private secretsStatTimer;
53
+ private secretsDebounce;
54
+ constructor(cfg: PluginConfig, auth: AuthResolutionOk, opts?: CodexAdapterOptions);
55
+ get authMode(): "chatgpt" | "apikey";
56
+ private getCommandSeedMode;
57
+ private getRouteForAssistant;
58
+ start(): Promise<void>;
59
+ stop(): Promise<void>;
60
+ /**
61
+ * Fetch the served capability canon once and inject it into the Codex agent's
62
+ * AGENTS.md, replacing the bundled fallback the host wrote at construction.
63
+ * Never throws: any failure (network, 401, 404 on an old backend, malformed
64
+ * body) leaves the bundled copy in place so the daemon is never blocked on
65
+ * this. Runs once per process (start() is guarded), i.e. once at connect.
66
+ */
67
+ private loadServedCapabilities;
68
+ private statusLine;
69
+ private codexDispatch;
70
+ private runAndReply;
71
+ /**
72
+ * A user tapped an inline button or answered an ask question. Feed the choice
73
+ * back to Codex as the next turn (the thread keeps context), so the agent
74
+ * continues naturally. Correlate by (assistantId, chatId).
75
+ */
76
+ private handleInboundClick;
77
+ private refreshIdentity;
78
+ private scheduleIdentityRetry;
79
+ private refreshScopeRateLimited;
80
+ private reconcilePendingUnknownError;
81
+ private startPollLoop;
82
+ private stopPollLoop;
83
+ private onReconnect;
84
+ private handleWsError;
85
+ private enterFatalLatch;
86
+ private resolveSecretsDir;
87
+ private readSecretsFile;
88
+ private armSecretsWatch;
89
+ private startSecretsWatch;
90
+ private rearmSecretsWatch;
91
+ private stopSecretsWatch;
92
+ private checkSecretsForChange;
93
+ private recover;
94
+ private seedDefaultCommands;
95
+ }
96
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}