@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
@@ -3,6 +3,38 @@ export type OutputMode = "interactive" | "json";
3
3
  export interface WingmanConfig {
4
4
  logLevel?: LogLevel;
5
5
  defaultAgent?: string;
6
+ summarization?: {
7
+ enabled?: boolean;
8
+ maxTokensBeforeSummary?: number;
9
+ messagesToKeep?: number;
10
+ };
11
+ modelRetry?: {
12
+ enabled?: boolean;
13
+ maxRetries?: number;
14
+ backoffFactor?: number;
15
+ initialDelayMs?: number;
16
+ maxDelayMs?: number;
17
+ jitter?: boolean;
18
+ onFailure?: "continue" | "error";
19
+ };
20
+ toolRetry?: {
21
+ enabled?: boolean;
22
+ maxRetries?: number;
23
+ backoffFactor?: number;
24
+ initialDelayMs?: number;
25
+ maxDelayMs?: number;
26
+ jitter?: boolean;
27
+ onFailure?: "continue" | "error";
28
+ tools?: string[];
29
+ };
30
+ humanInTheLoop?: {
31
+ enabled?: boolean;
32
+ interruptOn?: Record<string, boolean | {
33
+ allowedDecisions: Array<"approve" | "edit" | "reject">;
34
+ description?: string;
35
+ argsSchema?: Record<string, any>;
36
+ }>;
37
+ };
6
38
  gateway?: {
7
39
  host?: string;
8
40
  port?: number;
@@ -35,6 +35,8 @@ function isTaskTool(name) {
35
35
  function extractSubagentName(args) {
36
36
  if (!args || "object" != typeof args) return null;
37
37
  const directKeys = [
38
+ "subagent_type",
39
+ "subagentType",
38
40
  "subagent",
39
41
  "subAgent",
40
42
  "agent",
@@ -5,6 +5,8 @@ function isTaskTool(name) {
5
5
  function extractSubagentName(args) {
6
6
  if (!args || "object" != typeof args) return null;
7
7
  const directKeys = [
8
+ "subagent_type",
9
+ "subagentType",
8
10
  "subagent",
9
11
  "subAgent",
10
12
  "agent",
@@ -26,9 +26,9 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  InternalHookRegistry: ()=>InternalHookRegistry
28
28
  });
29
- const external_loader_cjs_namespaceObject = require("./loader.cjs");
30
29
  const agentInvoker_cjs_namespaceObject = require("../../cli/core/agentInvoker.cjs");
31
30
  const outputManager_cjs_namespaceObject = require("../../cli/core/outputManager.cjs");
31
+ const external_loader_cjs_namespaceObject = require("./loader.cjs");
32
32
  function _define_property(obj, key, value) {
33
33
  if (key in obj) Object.defineProperty(obj, key, {
34
34
  value: value,
@@ -100,6 +100,7 @@ class InternalHookRegistry {
100
100
  outputManager,
101
101
  logger: this.ctx.logger,
102
102
  sessionManager: manager,
103
+ terminalSessionManager: this.ctx.getTerminalSessionManager(),
103
104
  workdir,
104
105
  defaultOutputDir
105
106
  });
@@ -1,5 +1,5 @@
1
- import type { HookEvent, InternalHooksConfig } from "./types.js";
2
1
  import type { GatewayHttpContext } from "../http/types.js";
2
+ import type { HookEvent, InternalHooksConfig } from "./types.js";
3
3
  export declare class InternalHookRegistry {
4
4
  private ctx;
5
5
  private config;
@@ -1,6 +1,6 @@
1
- import { InternalHookLoader } from "./loader.js";
2
1
  import { AgentInvoker } from "../../cli/core/agentInvoker.js";
3
2
  import { OutputManager } from "../../cli/core/outputManager.js";
3
+ import { InternalHookLoader } from "./loader.js";
4
4
  function _define_property(obj, key, value) {
5
5
  if (key in obj) Object.defineProperty(obj, key, {
6
6
  value: value,
@@ -72,6 +72,7 @@ class InternalHookRegistry {
72
72
  outputManager,
73
73
  logger: this.ctx.logger,
74
74
  sessionManager: manager,
75
+ terminalSessionManager: this.ctx.getTerminalSessionManager(),
75
76
  workdir,
76
77
  defaultOutputDir
77
78
  });
@@ -29,20 +29,20 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  InternalHooksConfigSchema: ()=>InternalHooksConfigSchema
30
30
  });
31
31
  const external_zod_namespaceObject = require("zod");
32
- const HookDeliverSchema = external_zod_namespaceObject.z.object({
33
- agentId: external_zod_namespaceObject.z.string().min(1),
34
- sessionKey: external_zod_namespaceObject.z.string().optional(),
35
- message: external_zod_namespaceObject.z.string().optional()
32
+ const HookDeliverSchema = external_zod_namespaceObject.object({
33
+ agentId: external_zod_namespaceObject.string().min(1),
34
+ sessionKey: external_zod_namespaceObject.string().optional(),
35
+ message: external_zod_namespaceObject.string().optional()
36
36
  });
37
- const HookEntrySchema = external_zod_namespaceObject.z.object({
38
- enabled: external_zod_namespaceObject.z.boolean().default(true),
37
+ const HookEntrySchema = external_zod_namespaceObject.object({
38
+ enabled: external_zod_namespaceObject.boolean().default(true),
39
39
  deliver: HookDeliverSchema.optional()
40
40
  });
41
- const InternalHooksConfigSchema = external_zod_namespaceObject.z.object({
42
- enabled: external_zod_namespaceObject.z.boolean().default(false),
43
- entries: external_zod_namespaceObject.z.record(external_zod_namespaceObject.z.string(), HookEntrySchema).optional(),
44
- load: external_zod_namespaceObject.z.object({
45
- extraDirs: external_zod_namespaceObject.z.array(external_zod_namespaceObject.z.string()).optional()
41
+ const InternalHooksConfigSchema = external_zod_namespaceObject.object({
42
+ enabled: external_zod_namespaceObject.boolean().default(false),
43
+ entries: external_zod_namespaceObject.record(external_zod_namespaceObject.string(), HookEntrySchema).optional(),
44
+ load: external_zod_namespaceObject.object({
45
+ extraDirs: external_zod_namespaceObject.array(external_zod_namespaceObject.string()).optional()
46
46
  }).optional()
47
47
  });
48
48
  exports.HookDeliverSchema = __webpack_exports__.HookDeliverSchema;
@@ -1,4 +1,4 @@
1
- import { z } from "zod";
1
+ import * as z from "zod";
2
2
  import type { RoutingInfo } from "../types.js";
3
3
  export declare const HookDeliverSchema: z.ZodObject<{
4
4
  agentId: z.ZodString;
@@ -1,18 +1,18 @@
1
- import { z } from "zod";
2
- const HookDeliverSchema = z.object({
3
- agentId: z.string().min(1),
4
- sessionKey: z.string().optional(),
5
- message: z.string().optional()
1
+ import { array, boolean as external_zod_boolean, object, record, string } from "zod";
2
+ const HookDeliverSchema = object({
3
+ agentId: string().min(1),
4
+ sessionKey: string().optional(),
5
+ message: string().optional()
6
6
  });
7
- const HookEntrySchema = z.object({
8
- enabled: z.boolean().default(true),
7
+ const HookEntrySchema = object({
8
+ enabled: external_zod_boolean().default(true),
9
9
  deliver: HookDeliverSchema.optional()
10
10
  });
11
- const InternalHooksConfigSchema = z.object({
12
- enabled: z.boolean().default(false),
13
- entries: z.record(z.string(), HookEntrySchema).optional(),
14
- load: z.object({
15
- extraDirs: z.array(z.string()).optional()
11
+ const InternalHooksConfigSchema = object({
12
+ enabled: external_zod_boolean().default(false),
13
+ entries: record(string(), HookEntrySchema).optional(),
14
+ load: object({
15
+ extraDirs: array(string()).optional()
16
16
  }).optional()
17
17
  });
18
18
  export { HookDeliverSchema, HookEntrySchema, InternalHooksConfigSchema };
@@ -26,18 +26,34 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  handleAgentsApi: ()=>handleAgentsApi
28
28
  });
29
- const agentLoader_cjs_namespaceObject = require("../../agent/config/agentLoader.cjs");
30
- const toolRegistry_cjs_namespaceObject = require("../../agent/config/toolRegistry.cjs");
31
- const external_router_cjs_namespaceObject = require("../router.cjs");
32
29
  const external_node_fs_namespaceObject = require("node:fs");
33
30
  const external_node_path_namespaceObject = require("node:path");
34
31
  const external_js_yaml_namespaceObject = require("js-yaml");
32
+ const agentConfig_cjs_namespaceObject = require("../../agent/config/agentConfig.cjs");
33
+ const agentLoader_cjs_namespaceObject = require("../../agent/config/agentLoader.cjs");
34
+ const toolRegistry_cjs_namespaceObject = require("../../agent/config/toolRegistry.cjs");
35
35
  const voice_cjs_namespaceObject = require("../../types/voice.cjs");
36
+ const external_router_cjs_namespaceObject = require("../router.cjs");
36
37
  const hasOwn = (value, key)=>Boolean(value && Object.prototype.hasOwnProperty.call(value, key));
37
38
  const getPromptTrainingFromPayload = (payload)=>{
38
39
  if (hasOwn(payload, "promptTraining")) return payload.promptTraining;
39
40
  if (hasOwn(payload, "promptRefinement")) return payload.promptRefinement;
40
41
  };
42
+ const getReasoningEffortFromPayload = (payload)=>{
43
+ if (hasOwn(payload, "reasoningEffort")) return payload.reasoningEffort;
44
+ if (hasOwn(payload, "thinkingEffort")) return payload.thinkingEffort;
45
+ };
46
+ const parseReasoningEffort = (value, fieldPath)=>{
47
+ const parsed = agentConfig_cjs_namespaceObject.ReasoningEffortSchema.safeParse(value);
48
+ if (!parsed.success) return {
49
+ ok: false,
50
+ error: `Invalid ${fieldPath}: expected one of minimal|low|medium|high`
51
+ };
52
+ return {
53
+ ok: true,
54
+ value: parsed.data
55
+ };
56
+ };
41
57
  const mapPromptTrainingFields = (value)=>({
42
58
  promptTraining: value,
43
59
  promptRefinement: value
@@ -48,6 +64,7 @@ const mapSubAgentForResponse = (sub)=>({
48
64
  description: sub.description,
49
65
  tools: sub.tools || [],
50
66
  model: sub.model,
67
+ reasoningEffort: sub.reasoningEffort,
51
68
  prompt: sub.systemPrompt,
52
69
  ...mapPromptTrainingFields(sub.promptRefinement)
53
70
  });
@@ -88,12 +105,23 @@ const normalizeSubAgents = (rawSubAgents)=>{
88
105
  ok: false,
89
106
  error: `Invalid subAgents[${index}].promptTraining`
90
107
  };
108
+ const rawReasoningEffort = getReasoningEffortFromPayload(item);
109
+ let reasoningEffort;
110
+ if (null != rawReasoningEffort) {
111
+ const parsedEffort = parseReasoningEffort(rawReasoningEffort, `subAgents[${index}].reasoningEffort`);
112
+ if (!parsedEffort.ok) return {
113
+ ok: false,
114
+ error: parsedEffort.error
115
+ };
116
+ reasoningEffort = parsedEffort.value;
117
+ }
91
118
  const tools = Array.isArray(item.tools) ? item.tools.filter((tool)=>availableTools.includes(tool)) : [];
92
119
  const sub = {
93
120
  name,
94
121
  description,
95
122
  tools,
96
123
  model: item.model?.trim() || void 0,
124
+ reasoningEffort,
97
125
  systemPrompt: prompt
98
126
  };
99
127
  if (null != promptTraining) sub.promptRefinement = promptTraining;
@@ -105,13 +133,14 @@ const normalizeSubAgents = (rawSubAgents)=>{
105
133
  };
106
134
  };
107
135
  const buildAgentMarkdown = (params)=>{
108
- const { id, description, tools, model, prompt, voice, promptRefinement, subAgents } = params;
136
+ const { id, description, tools, model, reasoningEffort, prompt, voice, promptRefinement, subAgents } = params;
109
137
  const metadata = {
110
138
  name: id,
111
139
  description: description || "New Wingman agent",
112
140
  tools: tools || []
113
141
  };
114
142
  if (model) metadata.model = model;
143
+ if (reasoningEffort) metadata.reasoningEffort = reasoningEffort;
115
144
  if (voice) metadata.voice = voice;
116
145
  if (void 0 !== promptRefinement) metadata.promptRefinement = promptRefinement;
117
146
  if (subAgents && subAgents.length > 0) metadata.subAgents = subAgents;
@@ -151,6 +180,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
151
180
  description: agent.description,
152
181
  tools: agent.tools || [],
153
182
  model: agent.model,
183
+ reasoningEffort: agent.reasoningEffort,
154
184
  voice: agent.voice,
155
185
  ...mapPromptTrainingFields(agent.promptRefinement),
156
186
  subAgents: agent.subAgents?.map((sub)=>mapSubAgentForResponse(sub)) || []
@@ -184,6 +214,15 @@ const handleAgentsApi = async (ctx, req, url)=>{
184
214
  if (null != promptTraining && "boolean" != typeof promptTraining && ("object" != typeof promptTraining || Array.isArray(promptTraining))) return new Response("Invalid promptTraining configuration", {
185
215
  status: 400
186
216
  });
217
+ const rawReasoningEffort = getReasoningEffortFromPayload(body);
218
+ let reasoningEffort;
219
+ if (null != rawReasoningEffort) {
220
+ const parsedEffort = parseReasoningEffort(rawReasoningEffort, "reasoningEffort");
221
+ if (!parsedEffort.ok) return new Response(parsedEffort.error, {
222
+ status: 400
223
+ });
224
+ reasoningEffort = parsedEffort.value;
225
+ }
187
226
  const rawSubAgents = hasOwn(body, "subAgents") ? body.subAgents : body.subagents;
188
227
  const subAgentsResult = normalizeSubAgents(rawSubAgents);
189
228
  if (!subAgentsResult.ok) return new Response(subAgentsResult.error, {
@@ -201,6 +240,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
201
240
  description: body.description,
202
241
  tools,
203
242
  model: body.model,
243
+ reasoningEffort,
204
244
  prompt: body.prompt,
205
245
  voice: parsedVoice,
206
246
  promptRefinement: null === promptTraining ? void 0 : promptTraining,
@@ -228,6 +268,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
228
268
  description: body.description,
229
269
  tools,
230
270
  model: body.model,
271
+ reasoningEffort,
231
272
  voice: parsedVoice,
232
273
  ...mapPromptTrainingFields(null === promptTraining ? void 0 : promptTraining),
233
274
  subAgents: subAgentsResult.value.map((sub)=>mapSubAgentForResponse(sub))
@@ -258,6 +299,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
258
299
  description: agentConfig.description,
259
300
  tools: agentConfig.tools || [],
260
301
  model: agentConfig.model,
302
+ reasoningEffort: agentConfig.reasoningEffort,
261
303
  voice: agentConfig.voice,
262
304
  ...mapPromptTrainingFields(agentConfig.promptRefinement),
263
305
  subAgents: agentConfig.subAgents?.map((sub)=>mapSubAgentForResponse(sub)) || [],
@@ -285,6 +327,16 @@ const handleAgentsApi = async (ctx, req, url)=>{
285
327
  const tools = Array.isArray(body.tools) ? body.tools.filter((tool)=>(0, toolRegistry_cjs_namespaceObject.getAvailableTools)().includes(tool)) : agentConfig.tools || [];
286
328
  const nextDescription = body.description ?? agentConfig.description;
287
329
  const nextModel = body.model ?? agentConfig.model;
330
+ const bodyReasoningEffort = getReasoningEffortFromPayload(body);
331
+ let nextReasoningEffort = agentConfig.reasoningEffort;
332
+ if (null === bodyReasoningEffort) nextReasoningEffort = void 0;
333
+ else if (void 0 !== bodyReasoningEffort) {
334
+ const parsedEffort = parseReasoningEffort(bodyReasoningEffort, "reasoningEffort");
335
+ if (!parsedEffort.ok) return new Response(parsedEffort.error, {
336
+ status: 400
337
+ });
338
+ nextReasoningEffort = parsedEffort.value;
339
+ }
288
340
  const nextPrompt = body.prompt ?? agentConfig.systemPrompt;
289
341
  const nextVoice = void 0 === parsedVoice ? agentConfig.voice : parsedVoice;
290
342
  const bodyPromptTraining = getPromptTrainingFromPayload(body);
@@ -315,6 +367,11 @@ const handleAgentsApi = async (ctx, req, url)=>{
315
367
  parsed.tools = tools;
316
368
  if (nextModel) parsed.model = nextModel;
317
369
  else delete parsed.model;
370
+ if (nextReasoningEffort) parsed.reasoningEffort = nextReasoningEffort;
371
+ else {
372
+ delete parsed.reasoningEffort;
373
+ delete parsed.thinkingEffort;
374
+ }
318
375
  parsed.systemPrompt = nextPrompt;
319
376
  if (nextVoice) parsed.voice = nextVoice;
320
377
  else delete parsed.voice;
@@ -334,6 +391,11 @@ const handleAgentsApi = async (ctx, req, url)=>{
334
391
  metadata.tools = tools;
335
392
  if (nextModel) metadata.model = nextModel;
336
393
  else delete metadata.model;
394
+ if (nextReasoningEffort) metadata.reasoningEffort = nextReasoningEffort;
395
+ else {
396
+ delete metadata.reasoningEffort;
397
+ delete metadata.thinkingEffort;
398
+ }
337
399
  if (nextVoice) metadata.voice = nextVoice;
338
400
  else delete metadata.voice;
339
401
  if (void 0 !== nextPromptRefinement) metadata.promptRefinement = nextPromptRefinement;
@@ -368,6 +430,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
368
430
  description: nextDescription,
369
431
  tools,
370
432
  model: nextModel,
433
+ reasoningEffort: nextReasoningEffort,
371
434
  voice: nextVoice,
372
435
  ...mapPromptTrainingFields(nextPromptRefinement),
373
436
  subAgents: nextSubAgents.map((sub)=>mapSubAgentForResponse(sub)),
@@ -1,15 +1,31 @@
1
- import { AgentLoader } from "../../agent/config/agentLoader.js";
2
- import { getAvailableTools } from "../../agent/config/toolRegistry.js";
3
- import { GatewayRouter } from "../router.js";
4
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
2
  import { join } from "node:path";
6
3
  import { dump, load } from "js-yaml";
4
+ import { ReasoningEffortSchema } from "../../agent/config/agentConfig.js";
5
+ import { AgentLoader } from "../../agent/config/agentLoader.js";
6
+ import { getAvailableTools } from "../../agent/config/toolRegistry.js";
7
7
  import { AgentVoiceConfigSchema } from "../../types/voice.js";
8
+ import { GatewayRouter } from "../router.js";
8
9
  const hasOwn = (value, key)=>Boolean(value && Object.prototype.hasOwnProperty.call(value, key));
9
10
  const getPromptTrainingFromPayload = (payload)=>{
10
11
  if (hasOwn(payload, "promptTraining")) return payload.promptTraining;
11
12
  if (hasOwn(payload, "promptRefinement")) return payload.promptRefinement;
12
13
  };
14
+ const getReasoningEffortFromPayload = (payload)=>{
15
+ if (hasOwn(payload, "reasoningEffort")) return payload.reasoningEffort;
16
+ if (hasOwn(payload, "thinkingEffort")) return payload.thinkingEffort;
17
+ };
18
+ const parseReasoningEffort = (value, fieldPath)=>{
19
+ const parsed = ReasoningEffortSchema.safeParse(value);
20
+ if (!parsed.success) return {
21
+ ok: false,
22
+ error: `Invalid ${fieldPath}: expected one of minimal|low|medium|high`
23
+ };
24
+ return {
25
+ ok: true,
26
+ value: parsed.data
27
+ };
28
+ };
13
29
  const mapPromptTrainingFields = (value)=>({
14
30
  promptTraining: value,
15
31
  promptRefinement: value
@@ -20,6 +36,7 @@ const mapSubAgentForResponse = (sub)=>({
20
36
  description: sub.description,
21
37
  tools: sub.tools || [],
22
38
  model: sub.model,
39
+ reasoningEffort: sub.reasoningEffort,
23
40
  prompt: sub.systemPrompt,
24
41
  ...mapPromptTrainingFields(sub.promptRefinement)
25
42
  });
@@ -60,12 +77,23 @@ const normalizeSubAgents = (rawSubAgents)=>{
60
77
  ok: false,
61
78
  error: `Invalid subAgents[${index}].promptTraining`
62
79
  };
80
+ const rawReasoningEffort = getReasoningEffortFromPayload(item);
81
+ let reasoningEffort;
82
+ if (null != rawReasoningEffort) {
83
+ const parsedEffort = parseReasoningEffort(rawReasoningEffort, `subAgents[${index}].reasoningEffort`);
84
+ if (!parsedEffort.ok) return {
85
+ ok: false,
86
+ error: parsedEffort.error
87
+ };
88
+ reasoningEffort = parsedEffort.value;
89
+ }
63
90
  const tools = Array.isArray(item.tools) ? item.tools.filter((tool)=>availableTools.includes(tool)) : [];
64
91
  const sub = {
65
92
  name,
66
93
  description,
67
94
  tools,
68
95
  model: item.model?.trim() || void 0,
96
+ reasoningEffort,
69
97
  systemPrompt: prompt
70
98
  };
71
99
  if (null != promptTraining) sub.promptRefinement = promptTraining;
@@ -77,13 +105,14 @@ const normalizeSubAgents = (rawSubAgents)=>{
77
105
  };
78
106
  };
79
107
  const buildAgentMarkdown = (params)=>{
80
- const { id, description, tools, model, prompt, voice, promptRefinement, subAgents } = params;
108
+ const { id, description, tools, model, reasoningEffort, prompt, voice, promptRefinement, subAgents } = params;
81
109
  const metadata = {
82
110
  name: id,
83
111
  description: description || "New Wingman agent",
84
112
  tools: tools || []
85
113
  };
86
114
  if (model) metadata.model = model;
115
+ if (reasoningEffort) metadata.reasoningEffort = reasoningEffort;
87
116
  if (voice) metadata.voice = voice;
88
117
  if (void 0 !== promptRefinement) metadata.promptRefinement = promptRefinement;
89
118
  if (subAgents && subAgents.length > 0) metadata.subAgents = subAgents;
@@ -123,6 +152,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
123
152
  description: agent.description,
124
153
  tools: agent.tools || [],
125
154
  model: agent.model,
155
+ reasoningEffort: agent.reasoningEffort,
126
156
  voice: agent.voice,
127
157
  ...mapPromptTrainingFields(agent.promptRefinement),
128
158
  subAgents: agent.subAgents?.map((sub)=>mapSubAgentForResponse(sub)) || []
@@ -156,6 +186,15 @@ const handleAgentsApi = async (ctx, req, url)=>{
156
186
  if (null != promptTraining && "boolean" != typeof promptTraining && ("object" != typeof promptTraining || Array.isArray(promptTraining))) return new Response("Invalid promptTraining configuration", {
157
187
  status: 400
158
188
  });
189
+ const rawReasoningEffort = getReasoningEffortFromPayload(body);
190
+ let reasoningEffort;
191
+ if (null != rawReasoningEffort) {
192
+ const parsedEffort = parseReasoningEffort(rawReasoningEffort, "reasoningEffort");
193
+ if (!parsedEffort.ok) return new Response(parsedEffort.error, {
194
+ status: 400
195
+ });
196
+ reasoningEffort = parsedEffort.value;
197
+ }
159
198
  const rawSubAgents = hasOwn(body, "subAgents") ? body.subAgents : body.subagents;
160
199
  const subAgentsResult = normalizeSubAgents(rawSubAgents);
161
200
  if (!subAgentsResult.ok) return new Response(subAgentsResult.error, {
@@ -173,6 +212,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
173
212
  description: body.description,
174
213
  tools,
175
214
  model: body.model,
215
+ reasoningEffort,
176
216
  prompt: body.prompt,
177
217
  voice: parsedVoice,
178
218
  promptRefinement: null === promptTraining ? void 0 : promptTraining,
@@ -200,6 +240,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
200
240
  description: body.description,
201
241
  tools,
202
242
  model: body.model,
243
+ reasoningEffort,
203
244
  voice: parsedVoice,
204
245
  ...mapPromptTrainingFields(null === promptTraining ? void 0 : promptTraining),
205
246
  subAgents: subAgentsResult.value.map((sub)=>mapSubAgentForResponse(sub))
@@ -230,6 +271,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
230
271
  description: agentConfig.description,
231
272
  tools: agentConfig.tools || [],
232
273
  model: agentConfig.model,
274
+ reasoningEffort: agentConfig.reasoningEffort,
233
275
  voice: agentConfig.voice,
234
276
  ...mapPromptTrainingFields(agentConfig.promptRefinement),
235
277
  subAgents: agentConfig.subAgents?.map((sub)=>mapSubAgentForResponse(sub)) || [],
@@ -257,6 +299,16 @@ const handleAgentsApi = async (ctx, req, url)=>{
257
299
  const tools = Array.isArray(body.tools) ? body.tools.filter((tool)=>getAvailableTools().includes(tool)) : agentConfig.tools || [];
258
300
  const nextDescription = body.description ?? agentConfig.description;
259
301
  const nextModel = body.model ?? agentConfig.model;
302
+ const bodyReasoningEffort = getReasoningEffortFromPayload(body);
303
+ let nextReasoningEffort = agentConfig.reasoningEffort;
304
+ if (null === bodyReasoningEffort) nextReasoningEffort = void 0;
305
+ else if (void 0 !== bodyReasoningEffort) {
306
+ const parsedEffort = parseReasoningEffort(bodyReasoningEffort, "reasoningEffort");
307
+ if (!parsedEffort.ok) return new Response(parsedEffort.error, {
308
+ status: 400
309
+ });
310
+ nextReasoningEffort = parsedEffort.value;
311
+ }
260
312
  const nextPrompt = body.prompt ?? agentConfig.systemPrompt;
261
313
  const nextVoice = void 0 === parsedVoice ? agentConfig.voice : parsedVoice;
262
314
  const bodyPromptTraining = getPromptTrainingFromPayload(body);
@@ -287,6 +339,11 @@ const handleAgentsApi = async (ctx, req, url)=>{
287
339
  parsed.tools = tools;
288
340
  if (nextModel) parsed.model = nextModel;
289
341
  else delete parsed.model;
342
+ if (nextReasoningEffort) parsed.reasoningEffort = nextReasoningEffort;
343
+ else {
344
+ delete parsed.reasoningEffort;
345
+ delete parsed.thinkingEffort;
346
+ }
290
347
  parsed.systemPrompt = nextPrompt;
291
348
  if (nextVoice) parsed.voice = nextVoice;
292
349
  else delete parsed.voice;
@@ -306,6 +363,11 @@ const handleAgentsApi = async (ctx, req, url)=>{
306
363
  metadata.tools = tools;
307
364
  if (nextModel) metadata.model = nextModel;
308
365
  else delete metadata.model;
366
+ if (nextReasoningEffort) metadata.reasoningEffort = nextReasoningEffort;
367
+ else {
368
+ delete metadata.reasoningEffort;
369
+ delete metadata.thinkingEffort;
370
+ }
309
371
  if (nextVoice) metadata.voice = nextVoice;
310
372
  else delete metadata.voice;
311
373
  if (void 0 !== nextPromptRefinement) metadata.promptRefinement = nextPromptRefinement;
@@ -340,6 +402,7 @@ const handleAgentsApi = async (ctx, req, url)=>{
340
402
  description: nextDescription,
341
403
  tools,
342
404
  model: nextModel,
405
+ reasoningEffort: nextReasoningEffort,
343
406
  voice: nextVoice,
344
407
  ...mapPromptTrainingFields(nextPromptRefinement),
345
408
  subAgents: nextSubAgents.map((sub)=>mapSubAgentForResponse(sub)),
@@ -63,7 +63,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
63
63
  const bUpdated = "number" == typeof b.updatedAt ? b.updatedAt : 0;
64
64
  return bUpdated - aUpdated;
65
65
  });
66
- return new Response(JSON.stringify(sorted.slice(0, limit), null, 2), {
66
+ return new Response(JSON.stringify(sorted.slice(0, limit)), {
67
67
  headers: {
68
68
  "Content-Type": "application/json"
69
69
  }
@@ -87,7 +87,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
87
87
  messageCount: session.messageCount,
88
88
  lastMessagePreview: session.lastMessagePreview,
89
89
  workdir: session.metadata?.workdir ?? null
90
- }, null, 2), {
90
+ }), {
91
91
  headers: {
92
92
  "Content-Type": "application/json"
93
93
  }
@@ -107,7 +107,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
107
107
  const manager = await ctx.getSessionManager(agentId);
108
108
  if ("GET" === req.method) {
109
109
  const messages = await manager.listMessages(sessionId);
110
- return new Response(JSON.stringify(messages, null, 2), {
110
+ return new Response(JSON.stringify(messages), {
111
111
  headers: {
112
112
  "Content-Type": "application/json"
113
113
  }
@@ -124,7 +124,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
124
124
  id: sessionId,
125
125
  messageCount: updated?.messageCount ?? 0,
126
126
  lastMessagePreview: updated?.lastMessagePreview ?? null
127
- }, null, 2), {
127
+ }), {
128
128
  headers: {
129
129
  "Content-Type": "application/json"
130
130
  }
@@ -152,7 +152,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
152
152
  return new Response(JSON.stringify({
153
153
  id: session.id,
154
154
  workdir: null
155
- }, null, 2), {
155
+ }), {
156
156
  headers: {
157
157
  "Content-Type": "application/json"
158
158
  }
@@ -172,7 +172,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
172
172
  return new Response(JSON.stringify({
173
173
  id: session.id,
174
174
  workdir: resolved
175
- }, null, 2), {
175
+ }), {
176
176
  headers: {
177
177
  "Content-Type": "application/json"
178
178
  }
@@ -208,7 +208,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
208
208
  messageCount: updated?.messageCount ?? session.messageCount,
209
209
  lastMessagePreview: updated?.lastMessagePreview ?? session.lastMessagePreview,
210
210
  workdir: updated?.metadata?.workdir ?? session.metadata?.workdir ?? null
211
- }, null, 2), {
211
+ }), {
212
212
  headers: {
213
213
  "Content-Type": "application/json"
214
214
  }
@@ -35,7 +35,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
35
35
  const bUpdated = "number" == typeof b.updatedAt ? b.updatedAt : 0;
36
36
  return bUpdated - aUpdated;
37
37
  });
38
- return new Response(JSON.stringify(sorted.slice(0, limit), null, 2), {
38
+ return new Response(JSON.stringify(sorted.slice(0, limit)), {
39
39
  headers: {
40
40
  "Content-Type": "application/json"
41
41
  }
@@ -59,7 +59,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
59
59
  messageCount: session.messageCount,
60
60
  lastMessagePreview: session.lastMessagePreview,
61
61
  workdir: session.metadata?.workdir ?? null
62
- }, null, 2), {
62
+ }), {
63
63
  headers: {
64
64
  "Content-Type": "application/json"
65
65
  }
@@ -79,7 +79,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
79
79
  const manager = await ctx.getSessionManager(agentId);
80
80
  if ("GET" === req.method) {
81
81
  const messages = await manager.listMessages(sessionId);
82
- return new Response(JSON.stringify(messages, null, 2), {
82
+ return new Response(JSON.stringify(messages), {
83
83
  headers: {
84
84
  "Content-Type": "application/json"
85
85
  }
@@ -96,7 +96,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
96
96
  id: sessionId,
97
97
  messageCount: updated?.messageCount ?? 0,
98
98
  lastMessagePreview: updated?.lastMessagePreview ?? null
99
- }, null, 2), {
99
+ }), {
100
100
  headers: {
101
101
  "Content-Type": "application/json"
102
102
  }
@@ -124,7 +124,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
124
124
  return new Response(JSON.stringify({
125
125
  id: session.id,
126
126
  workdir: null
127
- }, null, 2), {
127
+ }), {
128
128
  headers: {
129
129
  "Content-Type": "application/json"
130
130
  }
@@ -144,7 +144,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
144
144
  return new Response(JSON.stringify({
145
145
  id: session.id,
146
146
  workdir: resolved
147
- }, null, 2), {
147
+ }), {
148
148
  headers: {
149
149
  "Content-Type": "application/json"
150
150
  }
@@ -180,7 +180,7 @@ const handleSessionsApi = async (ctx, req, url)=>{
180
180
  messageCount: updated?.messageCount ?? session.messageCount,
181
181
  lastMessagePreview: updated?.lastMessagePreview ?? session.lastMessagePreview,
182
182
  workdir: updated?.metadata?.workdir ?? session.metadata?.workdir ?? null
183
- }, null, 2), {
183
+ }), {
184
184
  headers: {
185
185
  "Content-Type": "application/json"
186
186
  }