discord-agent-bridge 0.1.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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -0
  3. package/dist/app.js +210 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/app.test.js +117 -0
  6. package/dist/app.test.js.map +1 -0
  7. package/dist/cli.js +63 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/cli.test.js +91 -0
  10. package/dist/cli.test.js.map +1 -0
  11. package/dist/core/auditLog.js +65 -0
  12. package/dist/core/auditLog.js.map +1 -0
  13. package/dist/core/auditLog.test.js +124 -0
  14. package/dist/core/auditLog.test.js.map +1 -0
  15. package/dist/core/auth.js +106 -0
  16. package/dist/core/auth.js.map +1 -0
  17. package/dist/core/auth.test.js +216 -0
  18. package/dist/core/auth.test.js.map +1 -0
  19. package/dist/core/channelRegistry.js +119 -0
  20. package/dist/core/channelRegistry.js.map +1 -0
  21. package/dist/core/channelRegistry.test.js +114 -0
  22. package/dist/core/channelRegistry.test.js.map +1 -0
  23. package/dist/core/commandPolicy.js +6 -0
  24. package/dist/core/commandPolicy.js.map +1 -0
  25. package/dist/core/commandRouter.js +9 -0
  26. package/dist/core/commandRouter.js.map +1 -0
  27. package/dist/core/config.js +141 -0
  28. package/dist/core/config.js.map +1 -0
  29. package/dist/core/config.test.js +149 -0
  30. package/dist/core/config.test.js.map +1 -0
  31. package/dist/core/configResolver.js +90 -0
  32. package/dist/core/configResolver.js.map +1 -0
  33. package/dist/core/configResolver.test.js +138 -0
  34. package/dist/core/configResolver.test.js.map +1 -0
  35. package/dist/core/configSchema.js +164 -0
  36. package/dist/core/configSchema.js.map +1 -0
  37. package/dist/core/contracts.js +5 -0
  38. package/dist/core/contracts.js.map +1 -0
  39. package/dist/core/eventBus.js +42 -0
  40. package/dist/core/eventBus.js.map +1 -0
  41. package/dist/core/eventBus.test.js +72 -0
  42. package/dist/core/eventBus.test.js.map +1 -0
  43. package/dist/core/hookBridge.js +11 -0
  44. package/dist/core/hookBridge.js.map +1 -0
  45. package/dist/core/logger.js +116 -0
  46. package/dist/core/logger.js.map +1 -0
  47. package/dist/core/logger.test.js +88 -0
  48. package/dist/core/logger.test.js.map +1 -0
  49. package/dist/core/modeRegistry.js +33 -0
  50. package/dist/core/modeRegistry.js.map +1 -0
  51. package/dist/core/permissionResolver.js +43 -0
  52. package/dist/core/permissionResolver.js.map +1 -0
  53. package/dist/core/permissionResolver.test.js +136 -0
  54. package/dist/core/permissionResolver.test.js.map +1 -0
  55. package/dist/core/providerCatalog.js +240 -0
  56. package/dist/core/providerCatalog.js.map +1 -0
  57. package/dist/core/providerCatalog.test.js +230 -0
  58. package/dist/core/providerCatalog.test.js.map +1 -0
  59. package/dist/core/sessionOrchestrator.js +463 -0
  60. package/dist/core/sessionOrchestrator.js.map +1 -0
  61. package/dist/core/sessionOrchestrator.test.js +344 -0
  62. package/dist/core/sessionOrchestrator.test.js.map +1 -0
  63. package/dist/core/state/schema.js +49 -0
  64. package/dist/core/state/schema.js.map +1 -0
  65. package/dist/core/state/store.js +86 -0
  66. package/dist/core/state/store.js.map +1 -0
  67. package/dist/core/state/store.test.js +99 -0
  68. package/dist/core/state/store.test.js.map +1 -0
  69. package/dist/core/usageService.js +310 -0
  70. package/dist/core/usageService.js.map +1 -0
  71. package/dist/core/usageService.test.js +234 -0
  72. package/dist/core/usageService.test.js.map +1 -0
  73. package/dist/discord/alwaysAllow.test.js +181 -0
  74. package/dist/discord/alwaysAllow.test.js.map +1 -0
  75. package/dist/discord/client.js +666 -0
  76. package/dist/discord/client.js.map +1 -0
  77. package/dist/discord/client.test.js +256 -0
  78. package/dist/discord/client.test.js.map +1 -0
  79. package/dist/discord/configPanel.js +270 -0
  80. package/dist/discord/configPanel.js.map +1 -0
  81. package/dist/discord/configPanel.test.js +332 -0
  82. package/dist/discord/configPanel.test.js.map +1 -0
  83. package/dist/discord/directoryBrowser.js +151 -0
  84. package/dist/discord/directoryBrowser.js.map +1 -0
  85. package/dist/discord/directoryBrowser.test.js +163 -0
  86. package/dist/discord/directoryBrowser.test.js.map +1 -0
  87. package/dist/discord/favorites.js +10 -0
  88. package/dist/discord/favorites.js.map +1 -0
  89. package/dist/discord/fileDownload.js +94 -0
  90. package/dist/discord/fileDownload.js.map +1 -0
  91. package/dist/discord/fileDownload.test.js +59 -0
  92. package/dist/discord/fileDownload.test.js.map +1 -0
  93. package/dist/discord/format.js +104 -0
  94. package/dist/discord/format.js.map +1 -0
  95. package/dist/discord/format.test.js +40 -0
  96. package/dist/discord/format.test.js.map +1 -0
  97. package/dist/discord/guildChannels.js +97 -0
  98. package/dist/discord/guildChannels.js.map +1 -0
  99. package/dist/discord/guildChannels.test.js +231 -0
  100. package/dist/discord/guildChannels.test.js.map +1 -0
  101. package/dist/discord/i18n.js +207 -0
  102. package/dist/discord/i18n.js.map +1 -0
  103. package/dist/discord/i18n.test.js +31 -0
  104. package/dist/discord/i18n.test.js.map +1 -0
  105. package/dist/discord/interactionRouter.js +954 -0
  106. package/dist/discord/interactionRouter.js.map +1 -0
  107. package/dist/discord/interactionRouter.test.js +1245 -0
  108. package/dist/discord/interactionRouter.test.js.map +1 -0
  109. package/dist/discord/messageRouter.js +221 -0
  110. package/dist/discord/messageRouter.js.map +1 -0
  111. package/dist/discord/messageRouter.test.js +360 -0
  112. package/dist/discord/messageRouter.test.js.map +1 -0
  113. package/dist/discord/ports.js +12 -0
  114. package/dist/discord/ports.js.map +1 -0
  115. package/dist/discord/renderers/defaultSet.test.js +97 -0
  116. package/dist/discord/renderers/defaultSet.test.js.map +1 -0
  117. package/dist/discord/renderers/diffView.js +73 -0
  118. package/dist/discord/renderers/diffView.js.map +1 -0
  119. package/dist/discord/renderers/diffView.test.js +54 -0
  120. package/dist/discord/renderers/diffView.test.js.map +1 -0
  121. package/dist/discord/renderers/index.js +143 -0
  122. package/dist/discord/renderers/index.js.map +1 -0
  123. package/dist/discord/renderers/index.test.js +124 -0
  124. package/dist/discord/renderers/index.test.js.map +1 -0
  125. package/dist/discord/renderers/mentionOnComplete.js +19 -0
  126. package/dist/discord/renderers/mentionOnComplete.js.map +1 -0
  127. package/dist/discord/renderers/mentionOnComplete.test.js +35 -0
  128. package/dist/discord/renderers/mentionOnComplete.test.js.map +1 -0
  129. package/dist/discord/renderers/permissionButtons.js +150 -0
  130. package/dist/discord/renderers/permissionButtons.js.map +1 -0
  131. package/dist/discord/renderers/permissionButtons.test.js +108 -0
  132. package/dist/discord/renderers/permissionButtons.test.js.map +1 -0
  133. package/dist/discord/renderers/resultLine.js +25 -0
  134. package/dist/discord/renderers/resultLine.js.map +1 -0
  135. package/dist/discord/renderers/statusEmbed.js +20 -0
  136. package/dist/discord/renderers/statusEmbed.js.map +1 -0
  137. package/dist/discord/renderers/statusEmbed.test.js +32 -0
  138. package/dist/discord/renderers/statusEmbed.test.js.map +1 -0
  139. package/dist/discord/renderers/streamEmbed.js +134 -0
  140. package/dist/discord/renderers/streamEmbed.js.map +1 -0
  141. package/dist/discord/renderers/streamEmbed.test.js +97 -0
  142. package/dist/discord/renderers/streamEmbed.test.js.map +1 -0
  143. package/dist/discord/renderers/toolThread.js +65 -0
  144. package/dist/discord/renderers/toolThread.js.map +1 -0
  145. package/dist/discord/renderers/toolThread.test.js +54 -0
  146. package/dist/discord/renderers/toolThread.test.js.map +1 -0
  147. package/dist/discord/renderers/transcriptFeed.js +33 -0
  148. package/dist/discord/renderers/transcriptFeed.js.map +1 -0
  149. package/dist/discord/renderers/usageEmbed.js +78 -0
  150. package/dist/discord/renderers/usageEmbed.js.map +1 -0
  151. package/dist/discord/renderers/usageEmbed.test.js +42 -0
  152. package/dist/discord/renderers/usageEmbed.test.js.map +1 -0
  153. package/dist/discord/wiring.js +214 -0
  154. package/dist/discord/wiring.js.map +1 -0
  155. package/dist/discord/wiring.test.js +252 -0
  156. package/dist/discord/wiring.test.js.map +1 -0
  157. package/dist/discord/wizard/channelWizard.js +305 -0
  158. package/dist/discord/wizard/channelWizard.js.map +1 -0
  159. package/dist/discord/wizard/channelWizard.test.js +298 -0
  160. package/dist/discord/wizard/channelWizard.test.js.map +1 -0
  161. package/dist/discord/wizard/resumeWizard.js +123 -0
  162. package/dist/discord/wizard/resumeWizard.js.map +1 -0
  163. package/dist/modes/claude/index.js +80 -0
  164. package/dist/modes/claude/index.js.map +1 -0
  165. package/dist/modes/claude/listResumable.test.js +72 -0
  166. package/dist/modes/claude/listResumable.test.js.map +1 -0
  167. package/dist/modes/claude/mcpFileTool.js +82 -0
  168. package/dist/modes/claude/mcpFileTool.js.map +1 -0
  169. package/dist/modes/claude/permissions.js +35 -0
  170. package/dist/modes/claude/permissions.js.map +1 -0
  171. package/dist/modes/claude/plugins.js +56 -0
  172. package/dist/modes/claude/plugins.js.map +1 -0
  173. package/dist/modes/claude/session.js +324 -0
  174. package/dist/modes/claude/session.js.map +1 -0
  175. package/dist/modes/claude/session.test.js +415 -0
  176. package/dist/modes/claude/session.test.js.map +1 -0
  177. package/dist/modes/codex/discovery.js +221 -0
  178. package/dist/modes/codex/discovery.js.map +1 -0
  179. package/dist/modes/codex/discovery.test.js +213 -0
  180. package/dist/modes/codex/discovery.test.js.map +1 -0
  181. package/dist/modes/codex/eventMapper.js +262 -0
  182. package/dist/modes/codex/eventMapper.js.map +1 -0
  183. package/dist/modes/codex/index.js +132 -0
  184. package/dist/modes/codex/index.js.map +1 -0
  185. package/dist/modes/codex/index.test.js +170 -0
  186. package/dist/modes/codex/index.test.js.map +1 -0
  187. package/dist/modes/codex/runner.js +207 -0
  188. package/dist/modes/codex/runner.js.map +1 -0
  189. package/dist/modes/codex/runner.test.js +587 -0
  190. package/dist/modes/codex/runner.test.js.map +1 -0
  191. package/dist/modes/codex/sqliteReader.js +171 -0
  192. package/dist/modes/codex/sqliteReader.js.map +1 -0
  193. package/dist/modes/codex/sqliteReader.test.js +137 -0
  194. package/dist/modes/codex/sqliteReader.test.js.map +1 -0
  195. package/dist/setup/wizard.js +115 -0
  196. package/dist/setup/wizard.js.map +1 -0
  197. package/dist/setup/wizard.test.js +216 -0
  198. package/dist/setup/wizard.test.js.map +1 -0
  199. package/dist/startBot.test.js +78 -0
  200. package/dist/startBot.test.js.map +1 -0
  201. package/package.json +58 -0
@@ -0,0 +1,587 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { EventEmitter } from 'node:events';
3
+ import { spawnSync } from 'node:child_process';
4
+ import * as os from 'node:os';
5
+ import { mapCodexLine } from './eventMapper.js';
6
+ import { runCodexTurn, buildCodexArgs, permModeArgs, effortArgs } from './runner.js';
7
+ // Is a real `codex` binary on PATH? The parse smoke test is skipped when not, so
8
+ // CI without codex still passes. `codex --version` exits 0 only when the binary
9
+ // resolves; ENOENT (not on PATH) surfaces as probe.error.
10
+ function codexOnPath() {
11
+ const probe = spawnSync('codex', ['--version'], { stdio: 'ignore', timeout: 10_000 });
12
+ return probe.error === undefined && probe.status === 0;
13
+ }
14
+ // ---- Test doubles ------------------------------------------------------------
15
+ // A recording logger: captures debug() calls so tests can assert non-silent
16
+ // handling of unrecognized/deprecation lines.
17
+ function makeLogger() {
18
+ const debugCalls = [];
19
+ const logger = {
20
+ debug: (...meta) => debugCalls.push(meta),
21
+ info: () => { },
22
+ warn: () => { },
23
+ error: () => { },
24
+ };
25
+ return { logger, debugCalls };
26
+ }
27
+ // A fake ChildProcess: an EventEmitter with a stdout/stderr EventEmitter each.
28
+ // Tests push stdout lines then fire 'close'; `kill()` is recorded so a timeout
29
+ // test can assert the process was terminated.
30
+ class FakeChild extends EventEmitter {
31
+ stdout = new EventEmitter();
32
+ stderr = new EventEmitter();
33
+ killed;
34
+ kill(signal) {
35
+ this.killed = signal;
36
+ // A real SIGTERM ends the process; emulate the ensuing close.
37
+ setImmediate(() => this.emit('close', null, signal ?? 'SIGTERM'));
38
+ return true;
39
+ }
40
+ }
41
+ // Build an injectable spawn that: records the argv/options, returns a FakeChild,
42
+ // and (after a tick, so the caller has attached its listeners) streams the
43
+ // scripted stdout chunks and fires 'close' with `exitCode`. If `stall` is true
44
+ // it never closes on its own — only kill() ends it (for the timeout test).
45
+ function fakeSpawn(opts) {
46
+ const child = new FakeChild();
47
+ const captured = {};
48
+ const spawn = (command, args, options) => {
49
+ captured.command = command;
50
+ captured.args = args;
51
+ captured.env = options.env;
52
+ captured.stdio = options.stdio;
53
+ setImmediate(() => {
54
+ if (opts.spawnError) {
55
+ child.emit('error', opts.spawnError);
56
+ return;
57
+ }
58
+ for (const chunk of opts.stdoutChunks)
59
+ child.stdout.emit('data', Buffer.from(chunk, 'utf8'));
60
+ if (!opts.stall)
61
+ child.emit('close', opts.exitCode ?? 0, null);
62
+ });
63
+ return child;
64
+ };
65
+ return { spawn, captured, child };
66
+ }
67
+ // A scripted `codex exec --json` stdout stream exercising every mapped kind:
68
+ // the deprecation warning (non-JSON), thread.started, item.started progress,
69
+ // item.completed agent_message + command_execution (exit 0 and non-0) +
70
+ // file_change + mcp_tool_call, an unknown-type line, and turn.completed w/ usage.
71
+ function scriptedStdout() {
72
+ const lines = [
73
+ 'warning: `--full-auto` is deprecated; set approval and sandbox explicitly instead', // non-JSON deprecation
74
+ JSON.stringify({ type: 'thread.started', thread_id: 'thread-xyz' }),
75
+ JSON.stringify({ type: 'turn.started' }),
76
+ JSON.stringify({ type: 'item.started', item: { type: 'command_execution', command: 'ls -la' } }),
77
+ JSON.stringify({ type: 'item.completed', item: { type: 'agent_message', text: 'Here is the plan.' } }),
78
+ JSON.stringify({
79
+ type: 'item.completed',
80
+ item: { type: 'command_execution', id: 'cmd-1', command: 'ls', aggregated_output: 'a\nb', exit_code: 0 },
81
+ }),
82
+ JSON.stringify({
83
+ type: 'item.completed',
84
+ item: { type: 'command_execution', id: 'cmd-2', command: 'false', aggregated_output: 'boom', exit_code: 1 },
85
+ }),
86
+ JSON.stringify({
87
+ type: 'item.completed',
88
+ item: { type: 'file_change', id: 'fc-1', changes: [{ path: 'src/a.ts', kind: 'update' }] },
89
+ }),
90
+ JSON.stringify({
91
+ type: 'item.completed',
92
+ item: { type: 'mcp_tool_call', id: 'mcp-1', tool: 'search', arguments: { q: 'hi' }, result: 'found', status: 'completed' },
93
+ }),
94
+ JSON.stringify({ type: 'item.completed', item: { type: 'reasoning', text: 'internal thoughts' } }),
95
+ JSON.stringify({ type: 'some.future.event', item: { type: 'brand_new' } }), // unknown type
96
+ JSON.stringify({ type: 'turn.completed', usage: { input_tokens: 120, output_tokens: 34, total_tokens: 154 } }),
97
+ ];
98
+ // Codex prints one JSON object per line; join and add a trailing newline so
99
+ // the last real line is flushed before close.
100
+ return lines.join('\n') + '\n';
101
+ }
102
+ function collect() {
103
+ const events = [];
104
+ return { emit: (ev) => events.push(ev), events };
105
+ }
106
+ // ---- eventMapper (pure core) -------------------------------------------------
107
+ describe('mapCodexLine', () => {
108
+ const idFor = (item) => (typeof item.id === 'string' ? item.id : 'gen');
109
+ it('captures the sessionId from thread.started without emitting an event', () => {
110
+ const { logger } = makeLogger();
111
+ const r = mapCodexLine(JSON.stringify({ type: 'thread.started', thread_id: 't-1' }), logger, idFor);
112
+ expect(r.sessionId).toBe('t-1');
113
+ expect(r.events).toEqual([]);
114
+ });
115
+ it('maps agent_message to a non-delta text event', () => {
116
+ const { logger } = makeLogger();
117
+ const r = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'agent_message', text: 'hi' } }), logger, idFor);
118
+ expect(r.events).toEqual([{ kind: 'text', text: 'hi', delta: false }]);
119
+ });
120
+ it('drops reasoning items (thinking is unsupported)', () => {
121
+ const { logger } = makeLogger();
122
+ const r = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'reasoning', text: 'x' } }), logger, idFor);
123
+ expect(r.events).toEqual([]);
124
+ });
125
+ it('maps command_execution to a tool_use + tool_result pair sharing one id', () => {
126
+ const { logger } = makeLogger();
127
+ const ok = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'command_execution', id: 'c1', command: 'ls', aggregated_output: 'out', exit_code: 0 } }), logger, idFor);
128
+ expect(ok.events).toEqual([
129
+ { kind: 'tool_use', id: 'c1', name: 'shell', input: { command: 'ls' } },
130
+ { kind: 'tool_result', id: 'c1', ok: true, content: 'out' },
131
+ ]);
132
+ const fail = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'command_execution', id: 'c2', command: 'false', aggregated_output: 'err', exit_code: 1 } }), logger, idFor);
133
+ expect(fail.events).toContainEqual({ kind: 'tool_result', id: 'c2', ok: false, content: 'err' });
134
+ });
135
+ it('maps file_change to an apply_patch tool_use carrying the changes', () => {
136
+ const { logger } = makeLogger();
137
+ const r = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'file_change', id: 'f1', changes: [{ path: 'a.ts', kind: 'add' }] } }), logger, idFor);
138
+ expect(r.events).toEqual([{ kind: 'tool_use', id: 'f1', name: 'apply_patch', input: { changes: [{ path: 'a.ts', kind: 'add' }] } }]);
139
+ });
140
+ it('maps mcp_tool_call to a tool_use (+ tool_result when a result is present)', () => {
141
+ const { logger } = makeLogger();
142
+ const r = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'mcp_tool_call', id: 'm1', tool: 'search', arguments: { q: 'x' }, result: 'ok', status: 'completed' } }), logger, idFor);
143
+ expect(r.events).toEqual([
144
+ { kind: 'tool_use', id: 'm1', name: 'search', input: { q: 'x' } },
145
+ { kind: 'tool_result', id: 'm1', ok: true, content: 'ok' },
146
+ ]);
147
+ });
148
+ it('maps a web_search item to a web_search tool_use', () => {
149
+ const { logger } = makeLogger();
150
+ const r = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'web_search', id: 'w1', query: 'cats' } }), logger, idFor);
151
+ expect(r.events).toEqual([{ kind: 'tool_use', id: 'w1', name: 'web_search', input: { query: 'cats' } }]);
152
+ });
153
+ it('maps turn.completed usage to a result with token counts only (no usage panel)', () => {
154
+ const { logger } = makeLogger();
155
+ const r = mapCodexLine(JSON.stringify({ type: 'turn.completed', usage: { input_tokens: 10, output_tokens: 5, total_tokens: 15 } }), logger, idFor);
156
+ expect(r.events).toEqual([{ kind: 'result', tokensIn: 10, tokensOut: 5 }]);
157
+ // Never a context_usage event for Codex.
158
+ expect(r.events.some((e) => e.kind === 'context_usage')).toBe(false);
159
+ });
160
+ it('maps turn.failed / thread.failed to a non-retryable error', () => {
161
+ const { logger } = makeLogger();
162
+ const turn = mapCodexLine(JSON.stringify({ type: 'turn.failed', error: { message: 'nope' } }), logger, idFor);
163
+ expect(turn.events).toEqual([{ kind: 'error', message: 'nope', retryable: false }]);
164
+ const thread = mapCodexLine(JSON.stringify({ type: 'thread.failed', error: { message: 'boom' } }), logger, idFor);
165
+ expect(thread.events).toEqual([{ kind: 'error', message: 'boom', retryable: false }]);
166
+ });
167
+ it('maps an error item to a non-retryable error event', () => {
168
+ const { logger } = makeLogger();
169
+ const r = mapCodexLine(JSON.stringify({ type: 'item.completed', item: { type: 'error', message: 'kaput' } }), logger, idFor);
170
+ expect(r.events).toEqual([{ kind: 'error', message: 'kaput', retryable: false }]);
171
+ });
172
+ it('classifies item.started as a progress event', () => {
173
+ const { logger } = makeLogger();
174
+ const r = mapCodexLine(JSON.stringify({ type: 'item.started', item: { type: 'command_execution', command: 'ls' } }), logger, idFor);
175
+ expect(r.events).toEqual([{ kind: 'progress', label: '명령 실행 중', detail: 'ls' }]);
176
+ });
177
+ it('logs a non-JSON line at debug and emits nothing (never throws)', () => {
178
+ const { logger, debugCalls } = makeLogger();
179
+ const r = mapCodexLine('warning: `--full-auto` is deprecated', logger, idFor);
180
+ expect(r.events).toEqual([]);
181
+ expect(debugCalls.length).toBe(1);
182
+ expect(debugCalls[0]?.[0]).toBe('unrecognized codex event');
183
+ });
184
+ it('logs an unknown JSON type at debug and emits nothing', () => {
185
+ const { logger, debugCalls } = makeLogger();
186
+ const r = mapCodexLine(JSON.stringify({ type: 'brand.new.thing' }), logger, idFor);
187
+ expect(r.events).toEqual([]);
188
+ expect(debugCalls.length).toBe(1);
189
+ });
190
+ it('understands the alternate event_msg agent-message shape (stream drift)', () => {
191
+ const { logger } = makeLogger();
192
+ const r = mapCodexLine(JSON.stringify({ type: 'event_msg', payload: { type: 'agent_message', message: 'drifted' } }), logger, idFor);
193
+ expect(r.events).toEqual([{ kind: 'text', text: 'drifted', delta: false }]);
194
+ });
195
+ });
196
+ // ---- permModeArgs / buildCodexArgs ------------------------------------------
197
+ describe('permModeArgs (PermMode → codex flags, fresh turn)', () => {
198
+ // The approval policy is set via `-c approval_policy="…"` — `-a` is NOT a valid
199
+ // `codex exec` flag. `-s`/--sandbox IS valid on exec.
200
+ it('maps default to on-request approval + workspace-write sandbox', () => {
201
+ expect(permModeArgs('default')).toEqual(['-c', 'approval_policy="on-request"', '-s', 'workspace-write']);
202
+ });
203
+ it('maps acceptEdits to never approval + workspace-write sandbox', () => {
204
+ expect(permModeArgs('acceptEdits')).toEqual(['-c', 'approval_policy="never"', '-s', 'workspace-write']);
205
+ });
206
+ it('maps bypassPermissions to the single bypass flag (no -a/-s/-c)', () => {
207
+ expect(permModeArgs('bypassPermissions')).toEqual(['--dangerously-bypass-approvals-and-sandbox']);
208
+ });
209
+ it('maps plan to on-request approval + read-only sandbox', () => {
210
+ expect(permModeArgs('plan')).toEqual(['-c', 'approval_policy="on-request"', '-s', 'read-only']);
211
+ });
212
+ it('never emits the invalid `-a`/--ask-for-approval flag for any mode', () => {
213
+ for (const mode of ['default', 'acceptEdits', 'plan', 'bypassPermissions']) {
214
+ expect(permModeArgs(mode)).not.toContain('-a');
215
+ expect(permModeArgs(mode)).not.toContain('--ask-for-approval');
216
+ }
217
+ });
218
+ // Codex-native sandbox modes (the wizard's Codex permission step) map to `-s <mode>`
219
+ // + a sensible approval policy; danger-full-access → the single bypass flag.
220
+ it('maps the Codex-native sandbox modes to the right -s / approval flags', () => {
221
+ expect(permModeArgs('read-only')).toEqual(['-c', 'approval_policy="on-request"', '-s', 'read-only']);
222
+ expect(permModeArgs('workspace-write')).toEqual(['-c', 'approval_policy="on-request"', '-s', 'workspace-write']);
223
+ expect(permModeArgs('danger-full-access')).toEqual(['--dangerously-bypass-approvals-and-sandbox']);
224
+ for (const m of ['read-only', 'workspace-write', 'danger-full-access']) {
225
+ expect(permModeArgs(m)).not.toContain('-a');
226
+ }
227
+ });
228
+ });
229
+ describe('effortArgs (reasoning effort → -c model_reasoning_effort)', () => {
230
+ it('emits `-c model_reasoning_effort="<level>"` for a non-empty level', () => {
231
+ expect(effortArgs('high')).toEqual(['-c', 'model_reasoning_effort="high"']);
232
+ expect(effortArgs('minimal')).toEqual(['-c', 'model_reasoning_effort="minimal"']);
233
+ });
234
+ it('emits nothing for empty/undefined (codex uses its own config default)', () => {
235
+ expect(effortArgs('')).toEqual([]);
236
+ expect(effortArgs(undefined)).toEqual([]);
237
+ expect(effortArgs(' ')).toEqual([]);
238
+ });
239
+ });
240
+ describe('buildCodexArgs', () => {
241
+ it('builds a fresh-turn argv with approval-via-c, sandbox, model, --cd, and a -- before the prompt', () => {
242
+ const args = buildCodexArgs({
243
+ prompt: 'do it',
244
+ cwd: '/tmp/ws',
245
+ permMode: 'default',
246
+ model: 'gpt-5-codex',
247
+ outputPath: '/tmp/out.txt',
248
+ });
249
+ expect(args).toEqual([
250
+ 'exec',
251
+ '--json',
252
+ '-c',
253
+ 'approval_policy="on-request"',
254
+ '-s',
255
+ 'workspace-write',
256
+ '-m',
257
+ 'gpt-5-codex',
258
+ '--skip-git-repo-check',
259
+ '--cd',
260
+ '/tmp/ws',
261
+ '-o',
262
+ '/tmp/out.txt',
263
+ '--',
264
+ 'do it',
265
+ ]);
266
+ // The prompt sits immediately after the `--` separator.
267
+ expect(args[args.length - 2]).toBe('--');
268
+ expect(args[args.length - 1]).toBe('do it');
269
+ // `-a`/--ask-for-approval must never appear (invalid on exec).
270
+ expect(args).not.toContain('-a');
271
+ expect(args).not.toContain('--ask-for-approval');
272
+ });
273
+ it('includes `-c model_reasoning_effort="…"` after the permission flags when effort is set', () => {
274
+ const args = buildCodexArgs({
275
+ prompt: 'do it',
276
+ cwd: '/tmp/ws',
277
+ permMode: 'workspace-write', // a Codex-native sandbox value
278
+ effort: 'high',
279
+ model: 'gpt-5.5',
280
+ outputPath: '/tmp/out.txt',
281
+ });
282
+ // Sandbox flags then the reasoning-effort flag, both before the model + prompt.
283
+ expect(args).toEqual(expect.arrayContaining(['-s', 'workspace-write', '-c', 'model_reasoning_effort="high"', '-m', 'gpt-5.5']));
284
+ const sandboxIdx = args.indexOf('workspace-write');
285
+ const effortIdx = args.indexOf('model_reasoning_effort="high"');
286
+ expect(sandboxIdx).toBeGreaterThan(-1);
287
+ expect(effortIdx).toBeGreaterThan(sandboxIdx);
288
+ });
289
+ it('omits the effort flag entirely when no effort is given (codex config default wins)', () => {
290
+ const args = buildCodexArgs({ prompt: 'p', cwd: '/ws', permMode: 'default', outputPath: '/o.txt' });
291
+ expect(args.some((a) => a.startsWith('model_reasoning_effort='))).toBe(false);
292
+ });
293
+ it('each fresh PermMode produces the correct approval/sandbox (or bypass) argv', () => {
294
+ const base = { prompt: 'p', cwd: '/ws', outputPath: '/o.txt' };
295
+ expect(buildCodexArgs({ ...base, permMode: 'default' })).toEqual(expect.arrayContaining(['-c', 'approval_policy="on-request"', '-s', 'workspace-write']));
296
+ expect(buildCodexArgs({ ...base, permMode: 'acceptEdits' })).toEqual(expect.arrayContaining(['-c', 'approval_policy="never"', '-s', 'workspace-write']));
297
+ expect(buildCodexArgs({ ...base, permMode: 'plan' })).toEqual(expect.arrayContaining(['-c', 'approval_policy="on-request"', '-s', 'read-only']));
298
+ const bypass = buildCodexArgs({ ...base, permMode: 'bypassPermissions' });
299
+ expect(bypass).toContain('--dangerously-bypass-approvals-and-sandbox');
300
+ expect(bypass).not.toContain('-a');
301
+ expect(bypass).not.toContain('-s');
302
+ expect(bypass).not.toContain('-c');
303
+ });
304
+ it('places a prompt beginning with `-` after the `--` separator, not as a flag (fresh)', () => {
305
+ const args = buildCodexArgs({ prompt: '--help', cwd: '/ws', permMode: 'default', outputPath: '/o.txt' });
306
+ const sep = args.indexOf('--');
307
+ expect(sep).toBeGreaterThan(-1);
308
+ expect(args.slice(sep + 1)).toEqual(['--help']);
309
+ // The dangerous-looking prompt is strictly the last positional.
310
+ expect(args[args.length - 1]).toBe('--help');
311
+ });
312
+ it('places a prompt beginning with `-` after the `--` separator, not as a flag (resume)', () => {
313
+ const args = buildCodexArgs({ prompt: '--help', cwd: '/ws', permMode: 'default', resumeId: 't1', outputPath: '/o.txt' });
314
+ const sep = args.indexOf('--');
315
+ expect(sep).toBeGreaterThan(-1);
316
+ expect(args.slice(sep + 1)).toEqual(['--help']);
317
+ expect(args[args.length - 1]).toBe('--help');
318
+ });
319
+ it('builds a resume argv that omits -a/-s/--cd, keeps --skip-git-repo-check, and passes the session id positionally', () => {
320
+ const args = buildCodexArgs({
321
+ prompt: 'continue',
322
+ cwd: '/tmp/ws',
323
+ permMode: 'bypassPermissions', // must be ignored on resume
324
+ model: 'gpt-5-codex',
325
+ resumeId: 'thread-xyz',
326
+ outputPath: '/tmp/out.txt',
327
+ });
328
+ expect(args).toEqual([
329
+ 'exec',
330
+ 'resume',
331
+ '--json',
332
+ '--skip-git-repo-check',
333
+ 'thread-xyz',
334
+ '-m',
335
+ 'gpt-5-codex',
336
+ '-o',
337
+ '/tmp/out.txt',
338
+ '--',
339
+ 'continue',
340
+ ]);
341
+ expect(args).toContain('--skip-git-repo-check');
342
+ expect(args).not.toContain('-a');
343
+ expect(args).not.toContain('-s');
344
+ expect(args).not.toContain('--cd');
345
+ expect(args).not.toContain('--dangerously-bypass-approvals-and-sandbox');
346
+ });
347
+ });
348
+ // ---- runCodexTurn (end-to-end with a mocked child process) -------------------
349
+ describe('runCodexTurn', () => {
350
+ const tmpDir = os.tmpdir();
351
+ it('streams the scripted stdout into ordered AgentEvents and reads the -o final message', async () => {
352
+ const { logger, debugCalls } = makeLogger();
353
+ const { emit, events } = collect();
354
+ const { spawn } = fakeSpawn({ stdoutChunks: [scriptedStdout()], exitCode: 0 });
355
+ const readFile = vi.fn().mockResolvedValue('FINAL MESSAGE FROM FILE\n');
356
+ const result = await runCodexTurn({
357
+ prompt: 'hello',
358
+ cwd: '/tmp/ws',
359
+ permMode: 'default',
360
+ timeoutMs: 5_000,
361
+ emit,
362
+ logger,
363
+ spawn,
364
+ readFile,
365
+ tmpDir,
366
+ });
367
+ // sessionId captured from thread.started.
368
+ expect(result.sessionId).toBe('thread-xyz');
369
+ // status completed on exit 0.
370
+ expect(result.status).toBe('completed');
371
+ expect(result.exitCode).toBe(0);
372
+ // final message comes from the -o file, NOT reconstructed from the stream.
373
+ expect(result.finalMessage).toBe('FINAL MESSAGE FROM FILE');
374
+ expect(readFile).toHaveBeenCalledTimes(1);
375
+ // Ordered AgentEvents: progress → text → shell(ok) → shell(fail) → apply_patch
376
+ // → mcp tool_use+result → result(tokens). reasoning + unknown are absent.
377
+ expect(events).toEqual([
378
+ { kind: 'progress', label: '명령 실행 중', detail: 'ls -la' },
379
+ { kind: 'text', text: 'Here is the plan.', delta: false },
380
+ { kind: 'tool_use', id: 'cmd-1', name: 'shell', input: { command: 'ls' } },
381
+ { kind: 'tool_result', id: 'cmd-1', ok: true, content: 'a\nb' },
382
+ { kind: 'tool_use', id: 'cmd-2', name: 'shell', input: { command: 'false' } },
383
+ { kind: 'tool_result', id: 'cmd-2', ok: false, content: 'boom' },
384
+ { kind: 'tool_use', id: 'fc-1', name: 'apply_patch', input: { changes: [{ path: 'src/a.ts', kind: 'update' }] } },
385
+ { kind: 'tool_use', id: 'mcp-1', name: 'search', input: { q: 'hi' } },
386
+ { kind: 'tool_result', id: 'mcp-1', ok: true, content: 'found' },
387
+ { kind: 'result', tokensIn: 120, tokensOut: 34 },
388
+ ]);
389
+ // No usage/context_usage event ever emitted for Codex.
390
+ expect(events.some((e) => e.kind === 'context_usage')).toBe(false);
391
+ // Both the deprecation warning and the unknown-type line were logged (not
392
+ // crashed, not silently dropped). Filter to the mapper's debug calls.
393
+ const unrecognized = debugCalls.filter((c) => c[0] === 'unrecognized codex event');
394
+ expect(unrecognized.length).toBe(2);
395
+ });
396
+ it('passes CODEX_HOME through to the child env and the model into argv', async () => {
397
+ const { logger } = makeLogger();
398
+ const { emit } = collect();
399
+ const { spawn, captured } = fakeSpawn({ stdoutChunks: [scriptedStdout()], exitCode: 0 });
400
+ await runCodexTurn({
401
+ prompt: 'hi',
402
+ cwd: '/tmp/ws',
403
+ permMode: 'plan',
404
+ model: 'gpt-5-codex',
405
+ codexHome: '/custom/.codex',
406
+ timeoutMs: 5_000,
407
+ emit,
408
+ logger,
409
+ spawn,
410
+ readFile: async () => 'ok',
411
+ tmpDir,
412
+ });
413
+ expect(captured.env?.CODEX_HOME).toBe('/custom/.codex');
414
+ expect(captured.args).toEqual(expect.arrayContaining(['-m', 'gpt-5-codex', '-c', 'approval_policy="on-request"', '-s', 'read-only']));
415
+ expect(captured.args).not.toContain('-a');
416
+ // Child stdin is ignored so `codex exec` doesn't hang waiting on stdin EOF.
417
+ expect(captured.stdio).toEqual(['ignore', 'pipe', 'pipe']);
418
+ });
419
+ it('threads a chosen reasoning effort into the spawned argv', async () => {
420
+ const { logger } = makeLogger();
421
+ const { emit } = collect();
422
+ const { spawn, captured } = fakeSpawn({ stdoutChunks: [scriptedStdout()], exitCode: 0 });
423
+ await runCodexTurn({
424
+ prompt: 'hi',
425
+ cwd: '/tmp/ws',
426
+ permMode: 'workspace-write',
427
+ effort: 'xhigh',
428
+ timeoutMs: 5_000,
429
+ emit,
430
+ logger,
431
+ spawn,
432
+ readFile: async () => 'ok',
433
+ tmpDir,
434
+ });
435
+ expect(captured.args).toEqual(expect.arrayContaining(['-c', 'model_reasoning_effort="xhigh"', '-s', 'workspace-write']));
436
+ });
437
+ it('reports status:error and emits an error event on a non-zero exit', async () => {
438
+ const { logger } = makeLogger();
439
+ const { emit, events } = collect();
440
+ const { spawn } = fakeSpawn({
441
+ stdoutChunks: [JSON.stringify({ type: 'thread.started', thread_id: 't' }) + '\n'],
442
+ exitCode: 2,
443
+ });
444
+ const result = await runCodexTurn({
445
+ prompt: 'hi',
446
+ cwd: '/tmp/ws',
447
+ permMode: 'default',
448
+ timeoutMs: 5_000,
449
+ emit,
450
+ logger,
451
+ spawn,
452
+ readFile: async () => '',
453
+ tmpDir,
454
+ });
455
+ expect(result.status).toBe('error');
456
+ expect(result.exitCode).toBe(2);
457
+ expect(events.some((e) => e.kind === 'error' && !e.retryable)).toBe(true);
458
+ });
459
+ it('kills the process and emits an error on timeout', async () => {
460
+ const { logger } = makeLogger();
461
+ const { emit, events } = collect();
462
+ const { spawn, child } = fakeSpawn({ stdoutChunks: [], stall: true });
463
+ const result = await runCodexTurn({
464
+ prompt: 'hi',
465
+ cwd: '/tmp/ws',
466
+ permMode: 'default',
467
+ timeoutMs: 20, // short: the stalled child never closes on its own
468
+ emit,
469
+ logger,
470
+ spawn,
471
+ readFile: async () => 'should-not-be-used',
472
+ tmpDir,
473
+ });
474
+ expect(result.status).toBe('timeout');
475
+ expect(child.killed).toBe('SIGTERM');
476
+ const errs = events.filter((e) => e.kind === 'error');
477
+ expect(errs.length).toBe(1);
478
+ expect(errs[0]).toMatchObject({ kind: 'error', retryable: true });
479
+ expect(errs[0].message).toMatch(/timed out/);
480
+ });
481
+ it('reports status:error when the child fails to spawn', async () => {
482
+ const { logger } = makeLogger();
483
+ const { emit, events } = collect();
484
+ const { spawn } = fakeSpawn({ stdoutChunks: [], spawnError: new Error('ENOENT: codex not found') });
485
+ const result = await runCodexTurn({
486
+ prompt: 'hi',
487
+ cwd: '/tmp/ws',
488
+ permMode: 'default',
489
+ timeoutMs: 5_000,
490
+ emit,
491
+ logger,
492
+ spawn,
493
+ readFile: async () => '',
494
+ tmpDir,
495
+ });
496
+ expect(result.status).toBe('error');
497
+ expect(result.exitCode).toBe(null);
498
+ expect(events).toContainEqual({ kind: 'error', message: 'ENOENT: codex not found', retryable: false });
499
+ });
500
+ it('aborts an in-flight turn: kills the child and resolves as status:aborted', async () => {
501
+ const { logger } = makeLogger();
502
+ const { emit, events } = collect();
503
+ const { spawn, child } = fakeSpawn({ stdoutChunks: [], stall: true });
504
+ const controller = new AbortController();
505
+ // Abort shortly after the run starts (the stalled child never closes on its own).
506
+ setTimeout(() => controller.abort(), 10);
507
+ const result = await runCodexTurn({
508
+ prompt: 'hi',
509
+ cwd: '/tmp/ws',
510
+ permMode: 'default',
511
+ timeoutMs: 5_000, // long: the abort, not the timeout, must end it
512
+ emit,
513
+ logger,
514
+ spawn,
515
+ readFile: async () => 'should-not-be-used',
516
+ tmpDir,
517
+ signal: controller.signal,
518
+ });
519
+ expect(result.status).toBe('aborted');
520
+ expect(child.killed).toBe('SIGTERM');
521
+ const errs = events.filter((e) => e.kind === 'error');
522
+ expect(errs.length).toBe(1);
523
+ expect(errs[0]).toMatchObject({ kind: 'error', retryable: false });
524
+ expect(errs[0].message).toMatch(/stopped/);
525
+ });
526
+ it('an already-aborted signal kills the child before it can complete', async () => {
527
+ const { logger } = makeLogger();
528
+ const { emit } = collect();
529
+ const { spawn, child } = fakeSpawn({ stdoutChunks: [], stall: true });
530
+ const controller = new AbortController();
531
+ controller.abort(); // pre-aborted
532
+ const result = await runCodexTurn({
533
+ prompt: 'hi',
534
+ cwd: '/tmp/ws',
535
+ permMode: 'default',
536
+ timeoutMs: 5_000,
537
+ emit,
538
+ logger,
539
+ spawn,
540
+ readFile: async () => '',
541
+ tmpDir,
542
+ signal: controller.signal,
543
+ });
544
+ expect(result.status).toBe('aborted');
545
+ expect(child.killed).toBe('SIGTERM');
546
+ });
547
+ it('resumes with the session id and omits -a/-s/--cd in the spawned argv', async () => {
548
+ const { logger } = makeLogger();
549
+ const { emit } = collect();
550
+ const { spawn, captured } = fakeSpawn({ stdoutChunks: [scriptedStdout()], exitCode: 0 });
551
+ const result = await runCodexTurn({
552
+ prompt: 'more',
553
+ cwd: '/tmp/ws',
554
+ permMode: 'bypassPermissions', // ignored on resume
555
+ resumeId: 'thread-xyz',
556
+ timeoutMs: 5_000,
557
+ emit,
558
+ logger,
559
+ spawn,
560
+ readFile: async () => 'resumed final',
561
+ tmpDir,
562
+ });
563
+ expect(result.finalMessage).toBe('resumed final');
564
+ expect(captured.args?.slice(0, 5)).toEqual(['exec', 'resume', '--json', '--skip-git-repo-check', 'thread-xyz']);
565
+ expect(captured.args).toContain('--skip-git-repo-check');
566
+ expect(captured.args).not.toContain('-a');
567
+ expect(captured.args).not.toContain('--cd');
568
+ // The prompt is guarded behind a `--` separator here too.
569
+ expect(captured.args?.[captured.args.length - 2]).toBe('--');
570
+ expect(captured.args?.[captured.args.length - 1]).toBe('more');
571
+ expect(captured.stdio).toEqual(['ignore', 'pipe', 'pipe']);
572
+ });
573
+ });
574
+ // ---- Real-CLI parse smoke (skipped when `codex` is not on PATH) ---------------
575
+ // Catches an invalid `codex exec` flag (a C1-class regression) with no network or
576
+ // API cost: appending `--help` makes the CLI print usage and exit 0 WITHOUT
577
+ // making an API turn. If codex ever rejects our flags again (e.g. re-adding the
578
+ // invalid `-a`), the parse fails before `--help` is honored and this goes red.
579
+ describe.runIf(codexOnPath())('codex exec argv parses against the real CLI', () => {
580
+ it('accepts the fresh-turn permission/skip/json flags (exit 0 via --help, no API turn)', () => {
581
+ const args = ['exec', ...permModeArgs('default'), '--skip-git-repo-check', '--json', '--help'];
582
+ const res = spawnSync('codex', args, { stdio: 'ignore', timeout: 30_000 });
583
+ expect(res.error).toBeUndefined();
584
+ expect(res.status).toBe(0);
585
+ });
586
+ });
587
+ //# sourceMappingURL=runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../../src/modes/codex/runner.test.ts"],"names":[],"mappings":"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"}