@wingman-ai/gateway 0.2.2 → 0.2.4

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 (160) hide show
  1. package/.wingman/agents/README.md +7 -1
  2. package/.wingman/agents/coding/agent.md +299 -201
  3. package/.wingman/agents/coding-v2/agent.md +127 -0
  4. package/.wingman/agents/coding-v2/implementor.md +89 -0
  5. package/.wingman/agents/main/agent.md +4 -0
  6. package/README.md +1 -0
  7. package/dist/agent/config/agentConfig.cjs +31 -17
  8. package/dist/agent/config/agentConfig.d.ts +23 -1
  9. package/dist/agent/config/agentConfig.js +30 -19
  10. package/dist/agent/config/agentLoader.cjs +26 -8
  11. package/dist/agent/config/agentLoader.d.ts +4 -2
  12. package/dist/agent/config/agentLoader.js +26 -8
  13. package/dist/agent/config/modelFactory.cjs +95 -25
  14. package/dist/agent/config/modelFactory.d.ts +13 -1
  15. package/dist/agent/config/modelFactory.js +95 -25
  16. package/dist/agent/config/toolRegistry.cjs +19 -6
  17. package/dist/agent/config/toolRegistry.d.ts +5 -2
  18. package/dist/agent/config/toolRegistry.js +19 -6
  19. package/dist/agent/middleware/hooks/types.cjs +13 -13
  20. package/dist/agent/middleware/hooks/types.d.ts +1 -1
  21. package/dist/agent/middleware/hooks/types.js +14 -14
  22. package/dist/agent/tests/agentConfig.test.cjs +22 -2
  23. package/dist/agent/tests/agentConfig.test.js +22 -2
  24. package/dist/agent/tests/agentLoader.test.cjs +38 -1
  25. package/dist/agent/tests/agentLoader.test.js +38 -1
  26. package/dist/agent/tests/backgroundTerminal.test.cjs +70 -0
  27. package/dist/agent/tests/backgroundTerminal.test.d.ts +1 -0
  28. package/dist/agent/tests/backgroundTerminal.test.js +64 -0
  29. package/dist/agent/tests/commandExecuteTool.test.cjs +29 -0
  30. package/dist/agent/tests/commandExecuteTool.test.d.ts +1 -0
  31. package/dist/agent/tests/commandExecuteTool.test.js +23 -0
  32. package/dist/agent/tests/modelFactory.test.cjs +47 -5
  33. package/dist/agent/tests/modelFactory.test.js +47 -5
  34. package/dist/agent/tests/terminalSessionManager.test.cjs +121 -0
  35. package/dist/agent/tests/terminalSessionManager.test.d.ts +1 -0
  36. package/dist/agent/tests/terminalSessionManager.test.js +115 -0
  37. package/dist/agent/tests/toolRegistry.test.cjs +14 -2
  38. package/dist/agent/tests/toolRegistry.test.js +14 -2
  39. package/dist/agent/tools/background_terminal.cjs +128 -0
  40. package/dist/agent/tools/background_terminal.d.ts +41 -0
  41. package/dist/agent/tools/background_terminal.js +94 -0
  42. package/dist/agent/tools/code_search.cjs +6 -6
  43. package/dist/agent/tools/code_search.d.ts +1 -1
  44. package/dist/agent/tools/code_search.js +7 -7
  45. package/dist/agent/tools/command_execute.cjs +22 -7
  46. package/dist/agent/tools/command_execute.d.ts +3 -2
  47. package/dist/agent/tools/command_execute.js +23 -8
  48. package/dist/agent/tools/git_status.cjs +3 -3
  49. package/dist/agent/tools/git_status.d.ts +1 -1
  50. package/dist/agent/tools/git_status.js +4 -4
  51. package/dist/agent/tools/internet_search.cjs +6 -6
  52. package/dist/agent/tools/internet_search.d.ts +1 -1
  53. package/dist/agent/tools/internet_search.js +7 -7
  54. package/dist/agent/tools/terminal_session_manager.cjs +321 -0
  55. package/dist/agent/tools/terminal_session_manager.d.ts +77 -0
  56. package/dist/agent/tools/terminal_session_manager.js +284 -0
  57. package/dist/agent/tools/think.cjs +4 -4
  58. package/dist/agent/tools/think.d.ts +1 -1
  59. package/dist/agent/tools/think.js +5 -5
  60. package/dist/agent/tools/ui_registry.cjs +13 -13
  61. package/dist/agent/tools/ui_registry.d.ts +4 -4
  62. package/dist/agent/tools/ui_registry.js +14 -14
  63. package/dist/agent/tools/web_crawler.cjs +4 -4
  64. package/dist/agent/tools/web_crawler.d.ts +1 -1
  65. package/dist/agent/tools/web_crawler.js +5 -5
  66. package/dist/agent/utils.cjs +2 -1
  67. package/dist/agent/utils.js +2 -1
  68. package/dist/cli/commands/init.cjs +7 -6
  69. package/dist/cli/commands/init.js +7 -6
  70. package/dist/cli/commands/provider.cjs +17 -3
  71. package/dist/cli/commands/provider.js +17 -3
  72. package/dist/cli/config/loader.cjs +27 -0
  73. package/dist/cli/config/loader.js +27 -0
  74. package/dist/cli/config/schema.cjs +146 -68
  75. package/dist/cli/config/schema.d.ts +89 -1
  76. package/dist/cli/config/schema.js +134 -68
  77. package/dist/cli/core/agentInvoker.cjs +344 -17
  78. package/dist/cli/core/agentInvoker.d.ts +63 -3
  79. package/dist/cli/core/agentInvoker.js +303 -12
  80. package/dist/cli/core/sessionManager.cjs +32 -5
  81. package/dist/cli/core/sessionManager.js +32 -5
  82. package/dist/cli/core/streamParser.cjs +15 -0
  83. package/dist/cli/core/streamParser.js +15 -0
  84. package/dist/cli/index.cjs +6 -5
  85. package/dist/cli/index.js +6 -5
  86. package/dist/cli/types.d.ts +32 -0
  87. package/dist/cli/ui/toolDisplayHelpers.cjs +2 -0
  88. package/dist/cli/ui/toolDisplayHelpers.js +2 -0
  89. package/dist/gateway/hooks/registry.cjs +2 -1
  90. package/dist/gateway/hooks/registry.d.ts +1 -1
  91. package/dist/gateway/hooks/registry.js +2 -1
  92. package/dist/gateway/hooks/types.cjs +11 -11
  93. package/dist/gateway/hooks/types.d.ts +1 -1
  94. package/dist/gateway/hooks/types.js +12 -12
  95. package/dist/gateway/http/agents.cjs +67 -4
  96. package/dist/gateway/http/agents.js +67 -4
  97. package/dist/gateway/http/sessions.cjs +7 -7
  98. package/dist/gateway/http/sessions.js +7 -7
  99. package/dist/gateway/http/types.d.ts +5 -3
  100. package/dist/gateway/http/webhooks.cjs +6 -5
  101. package/dist/gateway/http/webhooks.js +6 -5
  102. package/dist/gateway/server.cjs +198 -41
  103. package/dist/gateway/server.d.ts +9 -1
  104. package/dist/gateway/server.js +198 -41
  105. package/dist/gateway/types.d.ts +1 -0
  106. package/dist/gateway/validation.cjs +39 -39
  107. package/dist/gateway/validation.d.ts +1 -1
  108. package/dist/gateway/validation.js +40 -40
  109. package/dist/providers/codex.cjs +167 -0
  110. package/dist/providers/codex.d.ts +15 -0
  111. package/dist/providers/codex.js +127 -0
  112. package/dist/providers/credentials.cjs +8 -0
  113. package/dist/providers/credentials.js +8 -0
  114. package/dist/providers/registry.cjs +11 -0
  115. package/dist/providers/registry.d.ts +1 -1
  116. package/dist/providers/registry.js +11 -0
  117. package/dist/tests/additionalMessageMiddleware.test.cjs +3 -0
  118. package/dist/tests/additionalMessageMiddleware.test.js +3 -0
  119. package/dist/tests/agentInvokerSummarization.test.cjs +455 -0
  120. package/dist/tests/agentInvokerSummarization.test.d.ts +1 -0
  121. package/dist/tests/agentInvokerSummarization.test.js +449 -0
  122. package/dist/tests/agents-api.test.cjs +45 -5
  123. package/dist/tests/agents-api.test.js +45 -5
  124. package/dist/tests/cli-config-loader.test.cjs +88 -0
  125. package/dist/tests/cli-config-loader.test.js +88 -0
  126. package/dist/tests/cli-init.test.cjs +27 -3
  127. package/dist/tests/cli-init.test.js +27 -3
  128. package/dist/tests/codex-credentials-precedence.test.cjs +94 -0
  129. package/dist/tests/codex-credentials-precedence.test.d.ts +1 -0
  130. package/dist/tests/codex-credentials-precedence.test.js +88 -0
  131. package/dist/tests/codex-provider.test.cjs +210 -0
  132. package/dist/tests/codex-provider.test.d.ts +1 -0
  133. package/dist/tests/codex-provider.test.js +204 -0
  134. package/dist/tests/gateway.test.cjs +115 -8
  135. package/dist/tests/gateway.test.js +115 -8
  136. package/dist/tests/provider-command-codex.test.cjs +57 -0
  137. package/dist/tests/provider-command-codex.test.d.ts +1 -0
  138. package/dist/tests/provider-command-codex.test.js +51 -0
  139. package/dist/tests/sessionStateMessages.test.cjs +38 -0
  140. package/dist/tests/sessionStateMessages.test.js +38 -0
  141. package/dist/tests/toolDisplayHelpers.test.cjs +3 -0
  142. package/dist/tests/toolDisplayHelpers.test.js +3 -0
  143. package/dist/tools/mcp-finance.cjs +48 -48
  144. package/dist/tools/mcp-finance.js +48 -48
  145. package/dist/types/mcp.cjs +15 -15
  146. package/dist/types/mcp.d.ts +1 -1
  147. package/dist/types/mcp.js +16 -16
  148. package/dist/types/voice.cjs +21 -21
  149. package/dist/types/voice.d.ts +1 -1
  150. package/dist/types/voice.js +22 -22
  151. package/dist/webui/assets/index-DVWQluit.css +11 -0
  152. package/dist/webui/assets/index-Dlyzwalc.js +270 -0
  153. package/dist/webui/favicon-32x32.png +0 -0
  154. package/dist/webui/favicon-64x64.png +0 -0
  155. package/dist/webui/favicon.webp +0 -0
  156. package/dist/webui/index.html +4 -2
  157. package/package.json +13 -12
  158. package/.wingman/agents/coding/implementor.md +0 -79
  159. package/dist/webui/assets/index-CPhfGPHc.js +0 -182
  160. package/dist/webui/assets/index-DDsMIOTX.css +0 -11
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ createCodexFetch: ()=>createCodexFetch,
28
+ getCodexAuthPath: ()=>getCodexAuthPath,
29
+ resolveCodexAuthFromFile: ()=>resolveCodexAuthFromFile
30
+ });
31
+ const external_node_fs_namespaceObject = require("node:fs");
32
+ const external_node_os_namespaceObject = require("node:os");
33
+ const external_node_path_namespaceObject = require("node:path");
34
+ const external_logger_cjs_namespaceObject = require("../logger.cjs");
35
+ const CODEX_HOME_ENV = "CODEX_HOME";
36
+ const CODEX_AUTH_FILE = "auth.json";
37
+ const DEFAULT_CODEX_INSTRUCTIONS = "You are Wingman, a coding assistant. Follow the user's request exactly and keep tool usage focused.";
38
+ const logger = (0, external_logger_cjs_namespaceObject.createLogger)();
39
+ function getCodexAuthPath() {
40
+ const codexHome = process.env[CODEX_HOME_ENV]?.trim();
41
+ if (codexHome) return (0, external_node_path_namespaceObject.join)(codexHome, CODEX_AUTH_FILE);
42
+ return (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.homedir)(), ".codex", CODEX_AUTH_FILE);
43
+ }
44
+ function resolveCodexAuthFromFile() {
45
+ const authPath = getCodexAuthPath();
46
+ if (!(0, external_node_fs_namespaceObject.existsSync)(authPath)) return {
47
+ authPath
48
+ };
49
+ try {
50
+ const parsed = JSON.parse((0, external_node_fs_namespaceObject.readFileSync)(authPath, "utf-8"));
51
+ if (!parsed || "object" != typeof parsed) return {
52
+ authPath
53
+ };
54
+ const root = parsed;
55
+ const tokens = root.tokens && "object" == typeof root.tokens ? root.tokens : void 0;
56
+ const accessToken = firstNonEmptyString([
57
+ tokens?.access_token,
58
+ root.access_token
59
+ ]);
60
+ const accountId = firstNonEmptyString([
61
+ tokens?.account_id,
62
+ root.account_id
63
+ ]);
64
+ return {
65
+ accessToken,
66
+ accountId,
67
+ authPath
68
+ };
69
+ } catch {
70
+ return {
71
+ authPath
72
+ };
73
+ }
74
+ }
75
+ function createCodexFetch(options = {}) {
76
+ const baseFetch = options.baseFetch || globalThis.fetch.bind(globalThis);
77
+ return async (input, init)=>{
78
+ const codexAuth = resolveCodexAuthFromFile();
79
+ const accessToken = codexAuth.accessToken || options.fallbackToken;
80
+ const accountId = codexAuth.accountId || options.fallbackAccountId;
81
+ if (!accessToken) throw new Error("Codex credentials missing. Run `codex login` or set CODEX_ACCESS_TOKEN.");
82
+ const headers = new Headers(init?.headers || {});
83
+ headers.delete("authorization");
84
+ headers.delete("x-api-key");
85
+ headers.set("Authorization", `Bearer ${accessToken}`);
86
+ if (accountId) headers.set("ChatGPT-Account-ID", accountId);
87
+ const body = withCodexRequestDefaults(init?.body);
88
+ const response = await baseFetch(input, {
89
+ ...init,
90
+ headers,
91
+ body
92
+ });
93
+ if (!response.ok) {
94
+ let responseBody = "";
95
+ try {
96
+ responseBody = await response.clone().text();
97
+ } catch {}
98
+ const preview = responseBody.trim().slice(0, 1200);
99
+ logger.warn(`Codex request failed (${response.status} ${response.statusText || ""})`, {
100
+ url: "string" == typeof input ? input : input instanceof URL ? input.toString() : input.url,
101
+ bodyPresent: preview.length > 0,
102
+ bodyPreview: preview || null
103
+ });
104
+ }
105
+ return response;
106
+ };
107
+ }
108
+ function withCodexRequestDefaults(body) {
109
+ if ("string" != typeof body || !body.trim()) return body;
110
+ try {
111
+ const parsed = JSON.parse(body);
112
+ if (!parsed || "object" != typeof parsed || Array.isArray(parsed)) return body;
113
+ const root = stripUnsupportedCodexParams(parsed);
114
+ const instructions = "string" == typeof root.instructions && root.instructions.trim() ? root.instructions.trim() : extractInstructionsFromInput(root.input) || DEFAULT_CODEX_INSTRUCTIONS;
115
+ return JSON.stringify({
116
+ ...root,
117
+ store: false,
118
+ instructions
119
+ });
120
+ } catch {
121
+ return body;
122
+ }
123
+ }
124
+ function stripUnsupportedCodexParams(payload) {
125
+ const next = {
126
+ ...payload
127
+ };
128
+ delete next.temperature;
129
+ return next;
130
+ }
131
+ function extractInstructionsFromInput(input) {
132
+ if (!Array.isArray(input)) return;
133
+ for (const item of input){
134
+ if (!item || "object" != typeof item || Array.isArray(item)) continue;
135
+ const message = item;
136
+ const role = "string" == typeof message.role ? message.role : "";
137
+ if ("system" !== role && "developer" !== role) continue;
138
+ const text = extractTextContent(message.content);
139
+ if (text) return text;
140
+ }
141
+ }
142
+ function extractTextContent(content) {
143
+ if ("string" == typeof content && content.trim()) return content.trim();
144
+ if (!Array.isArray(content)) return;
145
+ for (const part of content){
146
+ if (!part || "object" != typeof part || Array.isArray(part)) continue;
147
+ const block = part;
148
+ const text = "string" == typeof block.text ? block.text : "string" == typeof block.content ? block.content : void 0;
149
+ if (!text || !text.trim()) continue;
150
+ const type = "string" == typeof block.type ? block.type : "";
151
+ if (!type || type.includes("text")) return text.trim();
152
+ }
153
+ }
154
+ function firstNonEmptyString(values) {
155
+ for (const value of values)if ("string" == typeof value && value.trim()) return value.trim();
156
+ }
157
+ exports.createCodexFetch = __webpack_exports__.createCodexFetch;
158
+ exports.getCodexAuthPath = __webpack_exports__.getCodexAuthPath;
159
+ exports.resolveCodexAuthFromFile = __webpack_exports__.resolveCodexAuthFromFile;
160
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
161
+ "createCodexFetch",
162
+ "getCodexAuthPath",
163
+ "resolveCodexAuthFromFile"
164
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
165
+ Object.defineProperty(exports, '__esModule', {
166
+ value: true
167
+ });
@@ -0,0 +1,15 @@
1
+ type FetchLike = (input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => ReturnType<typeof fetch>;
2
+ export interface CodexAuthState {
3
+ accessToken?: string;
4
+ accountId?: string;
5
+ authPath: string;
6
+ }
7
+ export interface CodexFetchOptions {
8
+ baseFetch?: FetchLike;
9
+ fallbackToken?: string;
10
+ fallbackAccountId?: string;
11
+ }
12
+ export declare function getCodexAuthPath(): string;
13
+ export declare function resolveCodexAuthFromFile(): CodexAuthState;
14
+ export declare function createCodexFetch(options?: CodexFetchOptions): FetchLike;
15
+ export {};
@@ -0,0 +1,127 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { createLogger } from "../logger.js";
5
+ const CODEX_HOME_ENV = "CODEX_HOME";
6
+ const CODEX_AUTH_FILE = "auth.json";
7
+ const DEFAULT_CODEX_INSTRUCTIONS = "You are Wingman, a coding assistant. Follow the user's request exactly and keep tool usage focused.";
8
+ const logger = createLogger();
9
+ function getCodexAuthPath() {
10
+ const codexHome = process.env[CODEX_HOME_ENV]?.trim();
11
+ if (codexHome) return join(codexHome, CODEX_AUTH_FILE);
12
+ return join(homedir(), ".codex", CODEX_AUTH_FILE);
13
+ }
14
+ function resolveCodexAuthFromFile() {
15
+ const authPath = getCodexAuthPath();
16
+ if (!existsSync(authPath)) return {
17
+ authPath
18
+ };
19
+ try {
20
+ const parsed = JSON.parse(readFileSync(authPath, "utf-8"));
21
+ if (!parsed || "object" != typeof parsed) return {
22
+ authPath
23
+ };
24
+ const root = parsed;
25
+ const tokens = root.tokens && "object" == typeof root.tokens ? root.tokens : void 0;
26
+ const accessToken = firstNonEmptyString([
27
+ tokens?.access_token,
28
+ root.access_token
29
+ ]);
30
+ const accountId = firstNonEmptyString([
31
+ tokens?.account_id,
32
+ root.account_id
33
+ ]);
34
+ return {
35
+ accessToken,
36
+ accountId,
37
+ authPath
38
+ };
39
+ } catch {
40
+ return {
41
+ authPath
42
+ };
43
+ }
44
+ }
45
+ function createCodexFetch(options = {}) {
46
+ const baseFetch = options.baseFetch || globalThis.fetch.bind(globalThis);
47
+ return async (input, init)=>{
48
+ const codexAuth = resolveCodexAuthFromFile();
49
+ const accessToken = codexAuth.accessToken || options.fallbackToken;
50
+ const accountId = codexAuth.accountId || options.fallbackAccountId;
51
+ if (!accessToken) throw new Error("Codex credentials missing. Run `codex login` or set CODEX_ACCESS_TOKEN.");
52
+ const headers = new Headers(init?.headers || {});
53
+ headers.delete("authorization");
54
+ headers.delete("x-api-key");
55
+ headers.set("Authorization", `Bearer ${accessToken}`);
56
+ if (accountId) headers.set("ChatGPT-Account-ID", accountId);
57
+ const body = withCodexRequestDefaults(init?.body);
58
+ const response = await baseFetch(input, {
59
+ ...init,
60
+ headers,
61
+ body
62
+ });
63
+ if (!response.ok) {
64
+ let responseBody = "";
65
+ try {
66
+ responseBody = await response.clone().text();
67
+ } catch {}
68
+ const preview = responseBody.trim().slice(0, 1200);
69
+ logger.warn(`Codex request failed (${response.status} ${response.statusText || ""})`, {
70
+ url: "string" == typeof input ? input : input instanceof URL ? input.toString() : input.url,
71
+ bodyPresent: preview.length > 0,
72
+ bodyPreview: preview || null
73
+ });
74
+ }
75
+ return response;
76
+ };
77
+ }
78
+ function withCodexRequestDefaults(body) {
79
+ if ("string" != typeof body || !body.trim()) return body;
80
+ try {
81
+ const parsed = JSON.parse(body);
82
+ if (!parsed || "object" != typeof parsed || Array.isArray(parsed)) return body;
83
+ const root = stripUnsupportedCodexParams(parsed);
84
+ const instructions = "string" == typeof root.instructions && root.instructions.trim() ? root.instructions.trim() : extractInstructionsFromInput(root.input) || DEFAULT_CODEX_INSTRUCTIONS;
85
+ return JSON.stringify({
86
+ ...root,
87
+ store: false,
88
+ instructions
89
+ });
90
+ } catch {
91
+ return body;
92
+ }
93
+ }
94
+ function stripUnsupportedCodexParams(payload) {
95
+ const next = {
96
+ ...payload
97
+ };
98
+ delete next.temperature;
99
+ return next;
100
+ }
101
+ function extractInstructionsFromInput(input) {
102
+ if (!Array.isArray(input)) return;
103
+ for (const item of input){
104
+ if (!item || "object" != typeof item || Array.isArray(item)) continue;
105
+ const message = item;
106
+ const role = "string" == typeof message.role ? message.role : "";
107
+ if ("system" !== role && "developer" !== role) continue;
108
+ const text = extractTextContent(message.content);
109
+ if (text) return text;
110
+ }
111
+ }
112
+ function extractTextContent(content) {
113
+ if ("string" == typeof content && content.trim()) return content.trim();
114
+ if (!Array.isArray(content)) return;
115
+ for (const part of content){
116
+ if (!part || "object" != typeof part || Array.isArray(part)) continue;
117
+ const block = part;
118
+ const text = "string" == typeof block.text ? block.text : "string" == typeof block.content ? block.content : void 0;
119
+ if (!text || !text.trim()) continue;
120
+ const type = "string" == typeof block.type ? block.type : "";
121
+ if (!type || type.includes("text")) return text.trim();
122
+ }
123
+ }
124
+ function firstNonEmptyString(values) {
125
+ for (const value of values)if ("string" == typeof value && value.trim()) return value.trim();
126
+ }
127
+ export { createCodexFetch, getCodexAuthPath, resolveCodexAuthFromFile };
@@ -36,6 +36,7 @@ __webpack_require__.d(__webpack_exports__, {
36
36
  const external_node_fs_namespaceObject = require("node:fs");
37
37
  const external_node_os_namespaceObject = require("node:os");
38
38
  const external_node_path_namespaceObject = require("node:path");
39
+ const external_codex_cjs_namespaceObject = require("./codex.cjs");
39
40
  const external_registry_cjs_namespaceObject = require("./registry.cjs");
40
41
  const CREDENTIALS_VERSION = 1;
41
42
  const CREDENTIALS_DIR = (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.homedir)(), ".wingman");
@@ -121,6 +122,13 @@ function resolveProviderToken(providerName) {
121
122
  envVar
122
123
  };
123
124
  }
125
+ if ("codex" === provider.name) {
126
+ const codexAuth = (0, external_codex_cjs_namespaceObject.resolveCodexAuthFromFile)();
127
+ if (codexAuth.accessToken) return {
128
+ token: codexAuth.accessToken,
129
+ source: "credentials"
130
+ };
131
+ }
124
132
  const credentials = getProviderCredentials(provider.name);
125
133
  const token = credentials?.accessToken ?? credentials?.apiKey ?? credentials?.refreshToken;
126
134
  if (token && token.trim()) return {
@@ -1,6 +1,7 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
+ import { resolveCodexAuthFromFile } from "./codex.js";
4
5
  import { getProviderSpec } from "./registry.js";
5
6
  const CREDENTIALS_VERSION = 1;
6
7
  const CREDENTIALS_DIR = join(homedir(), ".wingman");
@@ -86,6 +87,13 @@ function resolveProviderToken(providerName) {
86
87
  envVar
87
88
  };
88
89
  }
90
+ if ("codex" === provider.name) {
91
+ const codexAuth = resolveCodexAuthFromFile();
92
+ if (codexAuth.accessToken) return {
93
+ token: codexAuth.accessToken,
94
+ source: "credentials"
95
+ };
96
+ }
89
97
  const credentials = getProviderCredentials(provider.name);
90
98
  const token = credentials?.accessToken ?? credentials?.apiKey ?? credentials?.refreshToken;
91
99
  if (token && token.trim()) return {
@@ -47,6 +47,17 @@ const PROVIDERS = {
47
47
  ],
48
48
  category: "model"
49
49
  },
50
+ codex: {
51
+ name: "codex",
52
+ label: "OpenAI Codex",
53
+ type: "api-key",
54
+ envVars: [
55
+ "CODEX_ACCESS_TOKEN",
56
+ "CHATGPT_ACCESS_TOKEN"
57
+ ],
58
+ baseURL: "https://chatgpt.com/backend-api/codex",
59
+ category: "model"
60
+ },
50
61
  openrouter: {
51
62
  name: "openrouter",
52
63
  label: "OpenRouter",
@@ -1,6 +1,6 @@
1
1
  export type ProviderAuthType = "api-key" | "oauth";
2
2
  export type ProviderCategory = "model" | "voice";
3
- export type ProviderName = "anthropic" | "openai" | "openrouter" | "copilot" | "xai" | "lmstudio" | "ollama" | "elevenlabs";
3
+ export type ProviderName = "anthropic" | "openai" | "codex" | "openrouter" | "copilot" | "xai" | "lmstudio" | "ollama" | "elevenlabs";
4
4
  export interface ProviderOAuthConfig {
5
5
  authorizationUrl: string;
6
6
  tokenUrl: string;
@@ -17,6 +17,17 @@ const PROVIDERS = {
17
17
  ],
18
18
  category: "model"
19
19
  },
20
+ codex: {
21
+ name: "codex",
22
+ label: "OpenAI Codex",
23
+ type: "api-key",
24
+ envVars: [
25
+ "CODEX_ACCESS_TOKEN",
26
+ "CHATGPT_ACCESS_TOKEN"
27
+ ],
28
+ baseURL: "https://chatgpt.com/backend-api/codex",
29
+ category: "model"
30
+ },
20
31
  openrouter: {
21
32
  name: "openrouter",
22
33
  label: "OpenRouter",
@@ -40,6 +40,7 @@ const additional_messages_cjs_namespaceObject = require("../agent/middleware/add
40
40
  (0, external_vitest_namespaceObject.expect)(result.messages).toHaveLength(2);
41
41
  const injected = result.messages[0];
42
42
  (0, external_vitest_namespaceObject.expect)(injected.additional_kwargs?.source).toBe("additional-message-middleware");
43
+ (0, external_vitest_namespaceObject.expect)(injected).toBeInstanceOf(external_langchain_namespaceObject.HumanMessage);
43
44
  });
44
45
  (0, external_vitest_namespaceObject.it)("adds confidentiality guidance without exposing machine details", async ()=>{
45
46
  const workspaceRoot = external_node_path_default().resolve("repo");
@@ -59,7 +60,9 @@ const additional_messages_cjs_namespaceObject = require("../agent/middleware/add
59
60
  const injected = result.messages[0];
60
61
  const content = injected.content ?? "";
61
62
  (0, external_vitest_namespaceObject.expect)(content).toContain("Confidentiality");
63
+ (0, external_vitest_namespaceObject.expect)(content).toContain("inspect system/tool output internally");
62
64
  (0, external_vitest_namespaceObject.expect)(content).toContain("Do not disclose");
65
+ (0, external_vitest_namespaceObject.expect)(content).toContain("Do not quote internal tool call IDs");
63
66
  (0, external_vitest_namespaceObject.expect)(content).toContain("Working Directory");
64
67
  (0, external_vitest_namespaceObject.expect)(content).toContain("current working directory");
65
68
  (0, external_vitest_namespaceObject.expect)(content).toContain("Use relative paths");
@@ -16,6 +16,7 @@ describe("additionalMessageMiddleware", ()=>{
16
16
  expect(result.messages).toHaveLength(2);
17
17
  const injected = result.messages[0];
18
18
  expect(injected.additional_kwargs?.source).toBe("additional-message-middleware");
19
+ expect(injected).toBeInstanceOf(HumanMessage);
19
20
  });
20
21
  it("adds confidentiality guidance without exposing machine details", async ()=>{
21
22
  const workspaceRoot = node_path.resolve("repo");
@@ -35,7 +36,9 @@ describe("additionalMessageMiddleware", ()=>{
35
36
  const injected = result.messages[0];
36
37
  const content = injected.content ?? "";
37
38
  expect(content).toContain("Confidentiality");
39
+ expect(content).toContain("inspect system/tool output internally");
38
40
  expect(content).toContain("Do not disclose");
41
+ expect(content).toContain("Do not quote internal tool call IDs");
39
42
  expect(content).toContain("Working Directory");
40
43
  expect(content).toContain("current working directory");
41
44
  expect(content).toContain("Use relative paths");