@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
@@ -1,58 +1,97 @@
1
- import { z } from "zod";
1
+ import { ZodError, any, array, boolean as external_zod_boolean, enum as external_zod_enum, number, object, record, string, union } from "zod";
2
2
  import { HooksConfigSchema } from "../../agent/middleware/hooks/types.js";
3
3
  import { InternalHooksConfigSchema } from "../../gateway/hooks/types.js";
4
4
  import { MCPServersConfigSchema } from "../../types/mcp.js";
5
5
  import { VoiceConfigSchema } from "../../types/voice.js";
6
- const SearchConfigSchema = z.object({
7
- provider: z["enum"]([
6
+ const SearchConfigSchema = object({
7
+ provider: external_zod_enum([
8
8
  "duckduckgo",
9
9
  "perplexity"
10
10
  ]).default("duckduckgo").describe("Search provider to use"),
11
- maxResults: z.number().min(1).max(20).optional().default(5).describe("Maximum number of search results to return")
11
+ maxResults: number().min(1).max(20).optional().default(5).describe("Maximum number of search results to return")
12
12
  });
13
- const SkillsConfigSchema = z.object({
14
- repositoryOwner: z.string().default("anthropics").describe("GitHub repository owner for skills"),
15
- repositoryName: z.string().default("skills").describe("GitHub repository name for skills"),
16
- githubToken: z.string().optional().describe("GitHub personal access token for higher API rate limits"),
17
- skillsDirectory: z.string().default("skills").describe("Directory to install skills in")
13
+ const SkillsConfigSchema = object({
14
+ repositoryOwner: string().default("anthropics").describe("GitHub repository owner for skills"),
15
+ repositoryName: string().default("skills").describe("GitHub repository name for skills"),
16
+ githubToken: string().optional().describe("GitHub personal access token for higher API rate limits"),
17
+ skillsDirectory: string().default("skills").describe("Directory to install skills in")
18
18
  });
19
- const GatewayAuthSchema = z.object({
20
- mode: z["enum"]([
19
+ const SummarizationConfigSchema = object({
20
+ enabled: external_zod_boolean().optional().default(true).describe("Enable conversation history summarization"),
21
+ maxTokensBeforeSummary: number().min(1000).max(1000000).optional().default(12000).describe("Token threshold before summarizing conversation history"),
22
+ messagesToKeep: number().min(2).max(100).optional().default(8).describe("How many most recent messages to keep after summarization")
23
+ });
24
+ const RetryOnFailureSchema = external_zod_enum([
25
+ "continue",
26
+ "error"
27
+ ]);
28
+ const BaseRetryConfigSchema = object({
29
+ enabled: external_zod_boolean().optional().default(false).describe("Enable retry middleware"),
30
+ maxRetries: number().min(0).max(20).optional().default(2).describe("Maximum number of retry attempts"),
31
+ backoffFactor: number().min(0).max(10).optional().default(2).describe("Exponential backoff multiplier"),
32
+ initialDelayMs: number().min(0).max(120000).optional().default(1000).describe("Initial delay before first retry in milliseconds"),
33
+ maxDelayMs: number().min(0).max(300000).optional().default(60000).describe("Maximum backoff delay in milliseconds"),
34
+ jitter: external_zod_boolean().optional().default(true).describe("Add randomized jitter to retry delays"),
35
+ onFailure: RetryOnFailureSchema.optional().default("continue").describe("Behavior when retries are exhausted")
36
+ });
37
+ const ModelRetryConfigSchema = BaseRetryConfigSchema;
38
+ const ToolRetryConfigSchema = BaseRetryConfigSchema.extend({
39
+ tools: array(string().min(1)).optional().describe("Optional list of tool names to apply retry logic to")
40
+ });
41
+ const AllowedDecisionSchema = external_zod_enum([
42
+ "approve",
43
+ "edit",
44
+ "reject"
45
+ ]);
46
+ const InterruptOnToolConfigSchema = union([
47
+ external_zod_boolean(),
48
+ object({
49
+ allowedDecisions: array(AllowedDecisionSchema).min(1).describe("Allowed decisions for this tool"),
50
+ description: string().optional().describe("Optional custom review prompt for this tool"),
51
+ argsSchema: record(string(), any()).optional().describe("Optional argument schema for edit decisions")
52
+ })
53
+ ]);
54
+ const HumanInTheLoopConfigSchema = object({
55
+ enabled: external_zod_boolean().optional().default(false).describe("Enable human-in-the-loop tool approval"),
56
+ interruptOn: record(string(), InterruptOnToolConfigSchema).optional().default({}).describe("Per-tool approval policy mapping")
57
+ });
58
+ const GatewayAuthSchema = object({
59
+ mode: external_zod_enum([
21
60
  "token",
22
61
  "password",
23
62
  "none"
24
63
  ]).default("none"),
25
- token: z.string().optional(),
26
- password: z.string().optional(),
27
- allowTailscale: z.boolean().optional().default(false)
64
+ token: string().optional(),
65
+ password: string().optional(),
66
+ allowTailscale: external_zod_boolean().optional().default(false)
28
67
  }).default({
29
68
  mode: "none",
30
69
  allowTailscale: false
31
70
  });
32
- const GatewayControlUiSchema = z.object({
33
- enabled: z.boolean().default(true),
34
- port: z.number().min(1).max(65535).default(18790),
35
- pairingRequired: z.boolean().default(true),
36
- allowInsecureAuth: z.boolean().default(false)
71
+ const GatewayControlUiSchema = object({
72
+ enabled: external_zod_boolean().default(true),
73
+ port: number().min(1).max(65535).default(18790),
74
+ pairingRequired: external_zod_boolean().default(true),
75
+ allowInsecureAuth: external_zod_boolean().default(false)
37
76
  }).default({
38
77
  enabled: true,
39
78
  port: 18790,
40
79
  pairingRequired: true,
41
80
  allowInsecureAuth: false
42
81
  });
43
- const DiscordAdapterSchema = z.object({
44
- enabled: z.boolean().default(false),
45
- token: z.string().optional(),
46
- mentionOnly: z.boolean().default(true),
47
- allowBots: z.boolean().default(false),
48
- allowedGuilds: z.array(z.string()).default([]),
49
- allowedChannels: z.array(z.string()).default([]),
50
- channelSessions: z.record(z.string(), z.string()).default({}),
51
- sessionCommand: z.string().default("!session"),
52
- gatewayUrl: z.string().optional(),
53
- gatewayToken: z.string().optional(),
54
- gatewayPassword: z.string().optional(),
55
- responseChunkSize: z.number().min(500).max(2000).default(1900)
82
+ const DiscordAdapterSchema = object({
83
+ enabled: external_zod_boolean().default(false),
84
+ token: string().optional(),
85
+ mentionOnly: external_zod_boolean().default(true),
86
+ allowBots: external_zod_boolean().default(false),
87
+ allowedGuilds: array(string()).default([]),
88
+ allowedChannels: array(string()).default([]),
89
+ channelSessions: record(string(), string()).default({}),
90
+ sessionCommand: string().default("!session"),
91
+ gatewayUrl: string().optional(),
92
+ gatewayToken: string().optional(),
93
+ gatewayPassword: string().optional(),
94
+ responseChunkSize: number().min(500).max(2000).default(1900)
56
95
  }).default({
57
96
  enabled: false,
58
97
  mentionOnly: true,
@@ -63,14 +102,14 @@ const DiscordAdapterSchema = z.object({
63
102
  sessionCommand: "!session",
64
103
  responseChunkSize: 1900
65
104
  });
66
- const GatewayAdaptersSchema = z.object({
105
+ const GatewayAdaptersSchema = object({
67
106
  discord: DiscordAdapterSchema.optional()
68
107
  }).default({});
69
- const GatewayConfigSchema = z.object({
70
- host: z.string().default("127.0.0.1"),
71
- port: z.number().min(1).max(65535).default(18789),
72
- stateDir: z.string().optional(),
73
- fsRoots: z.array(z.string()).optional().default([]),
108
+ const GatewayConfigSchema = object({
109
+ host: string().default("127.0.0.1"),
110
+ port: number().min(1).max(65535).default(18789),
111
+ stateDir: string().optional(),
112
+ fsRoots: array(string()).optional().default([]),
74
113
  auth: GatewayAuthSchema.optional().default({
75
114
  mode: "none",
76
115
  allowTailscale: false
@@ -81,7 +120,7 @@ const GatewayConfigSchema = z.object({
81
120
  pairingRequired: true,
82
121
  allowInsecureAuth: false
83
122
  }),
84
- dynamicUiEnabled: z.boolean().optional().default(true),
123
+ dynamicUiEnabled: external_zod_boolean().optional().default(true),
85
124
  adapters: GatewayAdaptersSchema.optional().default({})
86
125
  }).default({
87
126
  host: "127.0.0.1",
@@ -100,50 +139,77 @@ const GatewayConfigSchema = z.object({
100
139
  dynamicUiEnabled: true,
101
140
  adapters: {}
102
141
  });
103
- const AgentListItemSchema = z.object({
104
- id: z.string().min(1),
105
- name: z.string().optional(),
106
- default: z.boolean().optional(),
107
- workspace: z.string().optional(),
108
- agentDir: z.string().optional(),
109
- model: z.string().optional()
142
+ const AgentListItemSchema = object({
143
+ id: string().min(1),
144
+ name: string().optional(),
145
+ default: external_zod_boolean().optional(),
146
+ workspace: string().optional(),
147
+ agentDir: string().optional(),
148
+ model: string().optional()
110
149
  });
111
- const BindingPeerSchema = z.object({
112
- kind: z["enum"]([
150
+ const BindingPeerSchema = object({
151
+ kind: external_zod_enum([
113
152
  "dm",
114
153
  "group",
115
154
  "channel"
116
155
  ]),
117
- id: z.string().min(1)
156
+ id: string().min(1)
118
157
  });
119
- const BindingMatchSchema = z.object({
120
- channel: z.string().min(1),
121
- accountId: z.string().optional(),
122
- guildId: z.string().optional(),
123
- teamId: z.string().optional(),
158
+ const BindingMatchSchema = object({
159
+ channel: string().min(1),
160
+ accountId: string().optional(),
161
+ guildId: string().optional(),
162
+ teamId: string().optional(),
124
163
  peer: BindingPeerSchema.optional()
125
164
  });
126
- const BindingSchema = z.object({
127
- agentId: z.string().min(1),
165
+ const BindingSchema = object({
166
+ agentId: string().min(1),
128
167
  match: BindingMatchSchema
129
168
  });
130
- const AgentsConfigSchema = z.object({
131
- list: z.array(AgentListItemSchema).default([]),
132
- bindings: z.array(BindingSchema).default([])
169
+ const AgentsConfigSchema = object({
170
+ list: array(AgentListItemSchema).default([]),
171
+ bindings: array(BindingSchema).default([])
133
172
  }).default({
134
173
  list: [],
135
174
  bindings: []
136
175
  });
137
- const WingmanConfigSchema = z.object({
138
- logLevel: z["enum"]([
176
+ const WingmanConfigSchema = object({
177
+ logLevel: external_zod_enum([
139
178
  "debug",
140
179
  "info",
141
180
  "warn",
142
181
  "error",
143
182
  "silent"
144
183
  ]).optional().default("info"),
145
- defaultAgent: z.string().optional(),
146
- recursionLimit: z.number().min(1).max(1000000).optional().default(5000),
184
+ defaultAgent: string().optional(),
185
+ recursionLimit: number().min(1).max(1000000).optional().default(5000),
186
+ summarization: SummarizationConfigSchema.optional().default({
187
+ enabled: true,
188
+ maxTokensBeforeSummary: 12000,
189
+ messagesToKeep: 8
190
+ }),
191
+ modelRetry: ModelRetryConfigSchema.optional().default({
192
+ enabled: true,
193
+ maxRetries: 2,
194
+ backoffFactor: 2,
195
+ initialDelayMs: 1000,
196
+ maxDelayMs: 60000,
197
+ jitter: true,
198
+ onFailure: "continue"
199
+ }),
200
+ toolRetry: ToolRetryConfigSchema.optional().default({
201
+ enabled: false,
202
+ maxRetries: 2,
203
+ backoffFactor: 2,
204
+ initialDelayMs: 1000,
205
+ maxDelayMs: 60000,
206
+ jitter: true,
207
+ onFailure: "continue"
208
+ }),
209
+ humanInTheLoop: HumanInTheLoopConfigSchema.optional().default({
210
+ enabled: false,
211
+ interruptOn: {}
212
+ }),
147
213
  toolHooks: HooksConfigSchema.optional().describe("Global tool hooks configuration"),
148
214
  hooks: InternalHooksConfigSchema.optional().describe("Internal hook configuration"),
149
215
  search: SearchConfigSchema.optional().default({
@@ -156,9 +222,9 @@ const WingmanConfigSchema = z.object({
156
222
  webSpeech: {},
157
223
  elevenlabs: {}
158
224
  }),
159
- cli: z.object({
160
- theme: z.string().default("default"),
161
- outputMode: z["enum"]([
225
+ cli: object({
226
+ theme: string().default("default"),
227
+ outputMode: external_zod_enum([
162
228
  "auto",
163
229
  "interactive",
164
230
  "json"
@@ -203,7 +269,7 @@ function validateConfig(data) {
203
269
  data: validated
204
270
  };
205
271
  } catch (error) {
206
- if (error instanceof z.ZodError) return {
272
+ if (error instanceof ZodError) return {
207
273
  success: false,
208
274
  error: error.issues.map((e)=>`${e.path.join(".")}: ${e.message}`).join(", ")
209
275
  };
@@ -213,4 +279,4 @@ function validateConfig(data) {
213
279
  };
214
280
  }
215
281
  }
216
- export { AgentsConfigSchema, GatewayConfigSchema, SearchConfigSchema, SkillsConfigSchema, WingmanConfigSchema, validateConfig };
282
+ export { AgentsConfigSchema, GatewayConfigSchema, HumanInTheLoopConfigSchema, ModelRetryConfigSchema, SearchConfigSchema, SkillsConfigSchema, SummarizationConfigSchema, ToolRetryConfigSchema, WingmanConfigSchema, validateConfig };