@wingman-ai/gateway 0.5.3 → 0.6.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.
- package/dist/agent/backend/filtered-backend.cjs +130 -0
- package/dist/agent/backend/filtered-backend.d.ts +10 -0
- package/dist/agent/backend/filtered-backend.js +87 -0
- package/dist/agent/config/agentConfig.cjs +4 -0
- package/dist/agent/config/agentConfig.d.ts +12 -0
- package/dist/agent/config/agentConfig.js +4 -0
- package/dist/agent/config/toolRegistry.cjs +75 -1
- package/dist/agent/config/toolRegistry.d.ts +3 -0
- package/dist/agent/config/toolRegistry.js +75 -1
- package/dist/agent/middleware/additional-messages.cjs +4 -1
- package/dist/agent/middleware/additional-messages.js +4 -1
- package/dist/agent/middleware/large-tool-results.cjs +207 -0
- package/dist/agent/middleware/large-tool-results.d.ts +16 -0
- package/dist/agent/middleware/large-tool-results.js +173 -0
- package/dist/agent/tools/browser_control.cjs +9 -1231
- package/dist/agent/tools/browser_control.d.ts +126 -234
- package/dist/agent/tools/browser_control.js +7 -1226
- package/dist/agent/tools/browser_runtime.cjs +1358 -0
- package/dist/agent/tools/browser_runtime.d.ts +617 -0
- package/dist/agent/tools/browser_runtime.js +1288 -0
- package/dist/agent/tools/browser_session.cjs +189 -0
- package/dist/agent/tools/browser_session.d.ts +686 -0
- package/dist/agent/tools/browser_session.js +146 -0
- package/dist/agent/tools/browser_session_manager.cjs +213 -0
- package/dist/agent/tools/browser_session_manager.d.ts +70 -0
- package/dist/agent/tools/browser_session_manager.js +176 -0
- package/dist/cli/commands/init.cjs +80 -98
- package/dist/cli/commands/init.js +80 -98
- package/dist/cli/config/loader.cjs +0 -5
- package/dist/cli/config/loader.js +0 -5
- package/dist/cli/config/schema.cjs +3 -7
- package/dist/cli/config/schema.d.ts +6 -6
- package/dist/cli/config/schema.js +3 -7
- package/dist/cli/core/agentInvoker.cjs +88 -22
- package/dist/cli/core/agentInvoker.d.ts +10 -3
- package/dist/cli/core/agentInvoker.js +88 -25
- package/dist/cli/core/outputManager.cjs +7 -2
- package/dist/cli/core/outputManager.d.ts +2 -2
- package/dist/cli/core/outputManager.js +7 -2
- package/dist/cli/core/sessionManager.cjs +208 -41
- package/dist/cli/core/sessionManager.d.ts +20 -0
- package/dist/cli/core/sessionManager.js +208 -41
- package/dist/cli/index.cjs +16 -1
- package/dist/cli/index.js +16 -1
- package/dist/cli/services/updateCheck.cjs +212 -0
- package/dist/cli/services/updateCheck.d.ts +26 -0
- package/dist/cli/services/updateCheck.js +166 -0
- package/dist/cli/types.d.ts +2 -1
- package/dist/gateway/server.cjs +7 -0
- package/dist/gateway/server.js +7 -0
- package/dist/webui/assets/index-D3x3G75t.css +11 -0
- package/dist/webui/assets/index-UpMmcU1f.js +215 -0
- package/dist/webui/index.html +2 -2
- package/package.json +12 -12
- package/templates/agents/README.md +3 -1
- package/templates/agents/coding/agent.md +6 -13
- package/templates/agents/coding-v2/agent.md +6 -1
- package/templates/agents/game-dev/agent.md +9 -2
- package/templates/agents/game-dev/game-designer.md +4 -0
- package/templates/agents/game-dev/scene-engineer.md +4 -0
- package/templates/agents/main/agent.md +7 -2
- package/templates/agents/researcher/agent.md +14 -3
- package/templates/agents/stock-trader/agent.md +4 -0
- package/dist/agent/tests/agentConfig.test.cjs +0 -224
- package/dist/agent/tests/agentConfig.test.d.ts +0 -1
- package/dist/agent/tests/agentConfig.test.js +0 -218
- package/dist/agent/tests/agentLoader.test.cjs +0 -335
- package/dist/agent/tests/agentLoader.test.d.ts +0 -1
- package/dist/agent/tests/agentLoader.test.js +0 -329
- package/dist/agent/tests/backgroundTerminal.test.cjs +0 -70
- package/dist/agent/tests/backgroundTerminal.test.d.ts +0 -1
- package/dist/agent/tests/backgroundTerminal.test.js +0 -64
- package/dist/agent/tests/browserControlHelpers.test.cjs +0 -35
- package/dist/agent/tests/browserControlHelpers.test.d.ts +0 -1
- package/dist/agent/tests/browserControlHelpers.test.js +0 -29
- package/dist/agent/tests/browserControlTool.test.cjs +0 -2117
- package/dist/agent/tests/browserControlTool.test.d.ts +0 -1
- package/dist/agent/tests/browserControlTool.test.js +0 -2111
- package/dist/agent/tests/commandExecuteTool.test.cjs +0 -29
- package/dist/agent/tests/commandExecuteTool.test.d.ts +0 -1
- package/dist/agent/tests/commandExecuteTool.test.js +0 -23
- package/dist/agent/tests/internet_search.test.cjs +0 -107
- package/dist/agent/tests/internet_search.test.d.ts +0 -1
- package/dist/agent/tests/internet_search.test.js +0 -101
- package/dist/agent/tests/mcpClientManager.test.cjs +0 -290
- package/dist/agent/tests/mcpClientManager.test.d.ts +0 -1
- package/dist/agent/tests/mcpClientManager.test.js +0 -284
- package/dist/agent/tests/mcpResourceTools.test.cjs +0 -101
- package/dist/agent/tests/mcpResourceTools.test.d.ts +0 -1
- package/dist/agent/tests/mcpResourceTools.test.js +0 -95
- package/dist/agent/tests/modelFactory.test.cjs +0 -190
- package/dist/agent/tests/modelFactory.test.d.ts +0 -1
- package/dist/agent/tests/modelFactory.test.js +0 -184
- package/dist/agent/tests/terminalSessionManager.test.cjs +0 -121
- package/dist/agent/tests/terminalSessionManager.test.d.ts +0 -1
- package/dist/agent/tests/terminalSessionManager.test.js +0 -115
- package/dist/agent/tests/test-agent-loader.cjs +0 -33
- package/dist/agent/tests/test-agent-loader.d.ts +0 -1
- package/dist/agent/tests/test-agent-loader.js +0 -27
- package/dist/agent/tests/test-subagent-loading.cjs +0 -99
- package/dist/agent/tests/test-subagent-loading.d.ts +0 -1
- package/dist/agent/tests/test-subagent-loading.js +0 -93
- package/dist/agent/tests/toolRegistry.test.cjs +0 -147
- package/dist/agent/tests/toolRegistry.test.d.ts +0 -1
- package/dist/agent/tests/toolRegistry.test.js +0 -141
- package/dist/agent/tests/uiRegistryTools.test.cjs +0 -114
- package/dist/agent/tests/uiRegistryTools.test.d.ts +0 -1
- package/dist/agent/tests/uiRegistryTools.test.js +0 -105
- package/dist/agent/tests/xaiImageModel.test.cjs +0 -194
- package/dist/agent/tests/xaiImageModel.test.d.ts +0 -1
- package/dist/agent/tests/xaiImageModel.test.js +0 -188
- package/dist/tests/additionalMessageMiddleware.test.cjs +0 -216
- package/dist/tests/additionalMessageMiddleware.test.d.ts +0 -1
- package/dist/tests/additionalMessageMiddleware.test.js +0 -188
- package/dist/tests/agent-config-voice.test.cjs +0 -25
- package/dist/tests/agent-config-voice.test.d.ts +0 -1
- package/dist/tests/agent-config-voice.test.js +0 -19
- package/dist/tests/agentInvokerAttachments.test.cjs +0 -190
- package/dist/tests/agentInvokerAttachments.test.d.ts +0 -1
- package/dist/tests/agentInvokerAttachments.test.js +0 -184
- package/dist/tests/agentInvokerSummarization.test.cjs +0 -613
- package/dist/tests/agentInvokerSummarization.test.d.ts +0 -1
- package/dist/tests/agentInvokerSummarization.test.js +0 -607
- package/dist/tests/agentInvokerTokenUsage.test.cjs +0 -124
- package/dist/tests/agentInvokerTokenUsage.test.d.ts +0 -1
- package/dist/tests/agentInvokerTokenUsage.test.js +0 -118
- package/dist/tests/agentInvokerWorkdir.test.cjs +0 -150
- package/dist/tests/agentInvokerWorkdir.test.d.ts +0 -1
- package/dist/tests/agentInvokerWorkdir.test.js +0 -122
- package/dist/tests/agents-api.test.cjs +0 -324
- package/dist/tests/agents-api.test.d.ts +0 -1
- package/dist/tests/agents-api.test.js +0 -318
- package/dist/tests/attachments-utils.test.cjs +0 -46
- package/dist/tests/attachments-utils.test.d.ts +0 -1
- package/dist/tests/attachments-utils.test.js +0 -40
- package/dist/tests/browser-command.test.cjs +0 -264
- package/dist/tests/browser-command.test.d.ts +0 -1
- package/dist/tests/browser-command.test.js +0 -258
- package/dist/tests/browser-relay-server.test.cjs +0 -20
- package/dist/tests/browser-relay-server.test.d.ts +0 -1
- package/dist/tests/browser-relay-server.test.js +0 -14
- package/dist/tests/bunSqliteAdapter.test.cjs +0 -265
- package/dist/tests/bunSqliteAdapter.test.d.ts +0 -1
- package/dist/tests/bunSqliteAdapter.test.js +0 -259
- package/dist/tests/candleRange.test.cjs +0 -48
- package/dist/tests/candleRange.test.d.ts +0 -1
- package/dist/tests/candleRange.test.js +0 -42
- package/dist/tests/cli-config-loader.test.cjs +0 -532
- package/dist/tests/cli-config-loader.test.d.ts +0 -1
- package/dist/tests/cli-config-loader.test.js +0 -526
- package/dist/tests/cli-config-warnings.test.cjs +0 -94
- package/dist/tests/cli-config-warnings.test.d.ts +0 -1
- package/dist/tests/cli-config-warnings.test.js +0 -88
- package/dist/tests/cli-init.test.cjs +0 -225
- package/dist/tests/cli-init.test.d.ts +0 -1
- package/dist/tests/cli-init.test.js +0 -219
- package/dist/tests/cli-workspace-root.test.cjs +0 -114
- package/dist/tests/cli-workspace-root.test.d.ts +0 -1
- package/dist/tests/cli-workspace-root.test.js +0 -108
- package/dist/tests/codex-credentials-precedence.test.cjs +0 -94
- package/dist/tests/codex-credentials-precedence.test.d.ts +0 -1
- package/dist/tests/codex-credentials-precedence.test.js +0 -88
- package/dist/tests/codex-provider.test.cjs +0 -383
- package/dist/tests/codex-provider.test.d.ts +0 -1
- package/dist/tests/codex-provider.test.js +0 -377
- package/dist/tests/config-json-schema.test.cjs +0 -37
- package/dist/tests/config-json-schema.test.d.ts +0 -1
- package/dist/tests/config-json-schema.test.js +0 -31
- package/dist/tests/discord-adapter.test.cjs +0 -89
- package/dist/tests/discord-adapter.test.d.ts +0 -1
- package/dist/tests/discord-adapter.test.js +0 -83
- package/dist/tests/falRuntime.test.cjs +0 -78
- package/dist/tests/falRuntime.test.d.ts +0 -1
- package/dist/tests/falRuntime.test.js +0 -72
- package/dist/tests/falSummary.test.cjs +0 -51
- package/dist/tests/falSummary.test.d.ts +0 -1
- package/dist/tests/falSummary.test.js +0 -45
- package/dist/tests/fs-api.test.cjs +0 -138
- package/dist/tests/fs-api.test.d.ts +0 -1
- package/dist/tests/fs-api.test.js +0 -132
- package/dist/tests/gateway-command-workspace.test.cjs +0 -150
- package/dist/tests/gateway-command-workspace.test.d.ts +0 -1
- package/dist/tests/gateway-command-workspace.test.js +0 -144
- package/dist/tests/gateway-http-security.test.cjs +0 -318
- package/dist/tests/gateway-http-security.test.d.ts +0 -1
- package/dist/tests/gateway-http-security.test.js +0 -312
- package/dist/tests/gateway-node-mode.test.cjs +0 -174
- package/dist/tests/gateway-node-mode.test.d.ts +0 -1
- package/dist/tests/gateway-node-mode.test.js +0 -168
- package/dist/tests/gateway-origin-policy.test.cjs +0 -82
- package/dist/tests/gateway-origin-policy.test.d.ts +0 -1
- package/dist/tests/gateway-origin-policy.test.js +0 -76
- package/dist/tests/gateway-request-execution-overrides.test.cjs +0 -42
- package/dist/tests/gateway-request-execution-overrides.test.d.ts +0 -1
- package/dist/tests/gateway-request-execution-overrides.test.js +0 -36
- package/dist/tests/gateway.test.cjs +0 -700
- package/dist/tests/gateway.test.d.ts +0 -1
- package/dist/tests/gateway.test.js +0 -694
- package/dist/tests/hooks-matcher.test.cjs +0 -309
- package/dist/tests/hooks-matcher.test.d.ts +0 -1
- package/dist/tests/hooks-matcher.test.js +0 -303
- package/dist/tests/hooks-merger.test.cjs +0 -528
- package/dist/tests/hooks-merger.test.d.ts +0 -1
- package/dist/tests/hooks-merger.test.js +0 -522
- package/dist/tests/imagePersistence.test.cjs +0 -169
- package/dist/tests/imagePersistence.test.d.ts +0 -1
- package/dist/tests/imagePersistence.test.js +0 -163
- package/dist/tests/integration/agent-invocation.integration.test.cjs +0 -264
- package/dist/tests/integration/agent-invocation.integration.test.d.ts +0 -1
- package/dist/tests/integration/agent-invocation.integration.test.js +0 -258
- package/dist/tests/integration/finnhub-candles.integration.test.cjs +0 -98
- package/dist/tests/integration/finnhub-candles.integration.test.d.ts +0 -1
- package/dist/tests/integration/finnhub-candles.integration.test.js +0 -92
- package/dist/tests/integration/summarization-e2e.integration.test.cjs +0 -127
- package/dist/tests/integration/summarization-e2e.integration.test.d.ts +0 -1
- package/dist/tests/integration/summarization-e2e.integration.test.js +0 -121
- package/dist/tests/logger.test.cjs +0 -353
- package/dist/tests/logger.test.d.ts +0 -1
- package/dist/tests/logger.test.js +0 -347
- package/dist/tests/mediaCompatibilityMiddleware.test.cjs +0 -106
- package/dist/tests/mediaCompatibilityMiddleware.test.d.ts +0 -1
- package/dist/tests/mediaCompatibilityMiddleware.test.js +0 -100
- package/dist/tests/node-tools.test.cjs +0 -77
- package/dist/tests/node-tools.test.d.ts +0 -1
- package/dist/tests/node-tools.test.js +0 -71
- package/dist/tests/nodes-api.test.cjs +0 -86
- package/dist/tests/nodes-api.test.d.ts +0 -1
- package/dist/tests/nodes-api.test.js +0 -80
- package/dist/tests/outputManagerContextSummarized.test.cjs +0 -43
- package/dist/tests/outputManagerContextSummarized.test.d.ts +0 -1
- package/dist/tests/outputManagerContextSummarized.test.js +0 -37
- package/dist/tests/provider-command-codex.test.cjs +0 -57
- package/dist/tests/provider-command-codex.test.d.ts +0 -1
- package/dist/tests/provider-command-codex.test.js +0 -51
- package/dist/tests/routines-api.test.cjs +0 -107
- package/dist/tests/routines-api.test.d.ts +0 -1
- package/dist/tests/routines-api.test.js +0 -101
- package/dist/tests/run-terminal-bench-official-script.test.cjs +0 -61
- package/dist/tests/run-terminal-bench-official-script.test.d.ts +0 -1
- package/dist/tests/run-terminal-bench-official-script.test.js +0 -55
- package/dist/tests/sessionManager-uionly.test.cjs +0 -50
- package/dist/tests/sessionManager-uionly.test.d.ts +0 -1
- package/dist/tests/sessionManager-uionly.test.js +0 -44
- package/dist/tests/sessionMessageAttachments.test.cjs +0 -197
- package/dist/tests/sessionMessageAttachments.test.d.ts +0 -1
- package/dist/tests/sessionMessageAttachments.test.js +0 -191
- package/dist/tests/sessionMessageRole.test.cjs +0 -44
- package/dist/tests/sessionMessageRole.test.d.ts +0 -1
- package/dist/tests/sessionMessageRole.test.js +0 -38
- package/dist/tests/sessionStateMessages.test.cjs +0 -236
- package/dist/tests/sessionStateMessages.test.d.ts +0 -1
- package/dist/tests/sessionStateMessages.test.js +0 -230
- package/dist/tests/sessions-api.test.cjs +0 -250
- package/dist/tests/sessions-api.test.d.ts +0 -1
- package/dist/tests/sessions-api.test.js +0 -244
- package/dist/tests/skill-activation.test.cjs +0 -86
- package/dist/tests/skill-activation.test.d.ts +0 -1
- package/dist/tests/skill-activation.test.js +0 -80
- package/dist/tests/skill-metadata.test.cjs +0 -119
- package/dist/tests/skill-metadata.test.d.ts +0 -1
- package/dist/tests/skill-metadata.test.js +0 -113
- package/dist/tests/skill-repository.test.cjs +0 -469
- package/dist/tests/skill-repository.test.d.ts +0 -1
- package/dist/tests/skill-repository.test.js +0 -463
- package/dist/tests/skill-security-scanner.test.cjs +0 -126
- package/dist/tests/skill-security-scanner.test.d.ts +0 -1
- package/dist/tests/skill-security-scanner.test.js +0 -120
- package/dist/tests/sms-api.test.cjs +0 -183
- package/dist/tests/sms-api.test.d.ts +0 -1
- package/dist/tests/sms-api.test.js +0 -177
- package/dist/tests/sms-commands.test.cjs +0 -90
- package/dist/tests/sms-commands.test.d.ts +0 -1
- package/dist/tests/sms-commands.test.js +0 -84
- package/dist/tests/sms-policy-store.test.cjs +0 -69
- package/dist/tests/sms-policy-store.test.d.ts +0 -1
- package/dist/tests/sms-policy-store.test.js +0 -63
- package/dist/tests/teams-adapter.test.cjs +0 -58
- package/dist/tests/teams-adapter.test.d.ts +0 -1
- package/dist/tests/teams-adapter.test.js +0 -52
- package/dist/tests/technicalIndicators.test.cjs +0 -82
- package/dist/tests/technicalIndicators.test.d.ts +0 -1
- package/dist/tests/technicalIndicators.test.js +0 -76
- package/dist/tests/terminal-bench-adapters-helpers.test.cjs +0 -64
- package/dist/tests/terminal-bench-adapters-helpers.test.d.ts +0 -1
- package/dist/tests/terminal-bench-adapters-helpers.test.js +0 -58
- package/dist/tests/terminal-bench-cleanup.test.cjs +0 -93
- package/dist/tests/terminal-bench-cleanup.test.d.ts +0 -1
- package/dist/tests/terminal-bench-cleanup.test.js +0 -87
- package/dist/tests/terminal-bench-config.test.cjs +0 -62
- package/dist/tests/terminal-bench-config.test.d.ts +0 -1
- package/dist/tests/terminal-bench-config.test.js +0 -56
- package/dist/tests/terminal-bench-official.test.cjs +0 -194
- package/dist/tests/terminal-bench-official.test.d.ts +0 -1
- package/dist/tests/terminal-bench-official.test.js +0 -188
- package/dist/tests/terminal-bench-runner.test.cjs +0 -82
- package/dist/tests/terminal-bench-runner.test.d.ts +0 -1
- package/dist/tests/terminal-bench-runner.test.js +0 -76
- package/dist/tests/terminal-bench-scoring.test.cjs +0 -128
- package/dist/tests/terminal-bench-scoring.test.d.ts +0 -1
- package/dist/tests/terminal-bench-scoring.test.js +0 -122
- package/dist/tests/terminalProbe.test.cjs +0 -45
- package/dist/tests/terminalProbe.test.d.ts +0 -1
- package/dist/tests/terminalProbe.test.js +0 -39
- package/dist/tests/terminalProbeAuth.test.cjs +0 -85
- package/dist/tests/terminalProbeAuth.test.d.ts +0 -1
- package/dist/tests/terminalProbeAuth.test.js +0 -79
- package/dist/tests/toolDisplayHelpers.test.cjs +0 -46
- package/dist/tests/toolDisplayHelpers.test.d.ts +0 -1
- package/dist/tests/toolDisplayHelpers.test.js +0 -40
- package/dist/tests/uv.test.cjs +0 -47
- package/dist/tests/uv.test.d.ts +0 -1
- package/dist/tests/uv.test.js +0 -41
- package/dist/tests/voice-config.test.cjs +0 -35
- package/dist/tests/voice-config.test.d.ts +0 -1
- package/dist/tests/voice-config.test.js +0 -29
- package/dist/tests/websocket-transport.test.cjs +0 -31
- package/dist/tests/websocket-transport.test.d.ts +0 -1
- package/dist/tests/websocket-transport.test.js +0 -25
- package/dist/tests/yahooCandles.test.cjs +0 -111
- package/dist/tests/yahooCandles.test.d.ts +0 -1
- package/dist/tests/yahooCandles.test.js +0 -105
- package/dist/tools/finance/optionsAnalytics.test.cjs +0 -128
- package/dist/tools/finance/optionsAnalytics.test.d.ts +0 -1
- package/dist/tools/finance/optionsAnalytics.test.js +0 -122
- package/dist/webui/assets/index-BMf95nv5.js +0 -215
- package/dist/webui/assets/index-DhJQ8Mbn.css +0 -11
- package/dist/webui/assets/wingman_logo-Cogyt3qm.webp +0 -0
|
@@ -44,37 +44,19 @@ const external_node_url_namespaceObject = require("node:url");
|
|
|
44
44
|
const prompts_namespaceObject = require("@clack/prompts");
|
|
45
45
|
const external_chalk_namespaceObject = require("chalk");
|
|
46
46
|
var external_chalk_default = /*#__PURE__*/ __webpack_require__.n(external_chalk_namespaceObject);
|
|
47
|
+
const external_js_yaml_namespaceObject = require("js-yaml");
|
|
47
48
|
const modelFactory_cjs_namespaceObject = require("../../agent/config/modelFactory.cjs");
|
|
48
49
|
const external_logger_cjs_namespaceObject = require("../../logger.cjs");
|
|
49
50
|
const credentials_cjs_namespaceObject = require("../../providers/credentials.cjs");
|
|
50
51
|
const registry_cjs_namespaceObject = require("../../providers/registry.cjs");
|
|
51
52
|
const schema_cjs_namespaceObject = require("../config/schema.cjs");
|
|
52
53
|
const outputManager_cjs_namespaceObject = require("../core/outputManager.cjs");
|
|
53
|
-
const DEFAULT_AGENT_ID = "wingman";
|
|
54
|
-
const DEFAULT_AGENT_DESCRIPTION = "General-purpose coding assistant for this workspace.";
|
|
55
|
-
const DEFAULT_AGENT_PROMPT = "You are Wingman, a coding assistant for this repository.\nBe direct and concise. Ask clarifying questions when requirements are unclear.\nPrefer minimal diffs and safe changes. Avoid destructive actions unless asked.\nUse tools to inspect the codebase before editing.";
|
|
56
|
-
const DEFAULT_TOOLS = [
|
|
57
|
-
"code_search",
|
|
58
|
-
"git_status",
|
|
59
|
-
"command_execute",
|
|
60
|
-
"browser_control",
|
|
61
|
-
"internet_search",
|
|
62
|
-
"think"
|
|
63
|
-
];
|
|
64
54
|
const DEFAULT_FS_ROOT = ".";
|
|
65
55
|
const DEFAULT_BROWSER_PROFILE_ID = "default";
|
|
66
56
|
const DEFAULT_BROWSER_PROFILES_DIR = ".wingman/browser-profiles";
|
|
67
57
|
const DEFAULT_BROWSER_EXTENSIONS_DIR = ".wingman/browser-extensions";
|
|
68
58
|
const DEFAULT_BUNDLED_EXTENSION_ID = "wingman";
|
|
69
59
|
const DEFAULT_BROWSER_TRANSPORT = "auto";
|
|
70
|
-
const DEFAULT_MODELS = {
|
|
71
|
-
anthropic: "anthropic:claude-sonnet-4-5",
|
|
72
|
-
openai: "openai:gpt-4o",
|
|
73
|
-
codex: "codex:codex-mini-latest",
|
|
74
|
-
openrouter: "openrouter:openai/gpt-4o",
|
|
75
|
-
copilot: "copilot:gpt-4o",
|
|
76
|
-
xai: "xai:grok-beta"
|
|
77
|
-
};
|
|
78
60
|
const DEFAULT_INIT_MODE = "onboard";
|
|
79
61
|
const DEFAULT_ONBOARD_COMPONENTS = [
|
|
80
62
|
"config",
|
|
@@ -133,8 +115,20 @@ async function executeInitCommand(args, options = {}) {
|
|
|
133
115
|
renderInitBanner(outputManager, nonInteractive, mode, components);
|
|
134
116
|
const bundledAgentsPath = resolveBundledAgentsPath();
|
|
135
117
|
const bundledAgents = bundledAgentsPath ? listBundledAgents(bundledAgentsPath) : [];
|
|
136
|
-
const
|
|
137
|
-
const
|
|
118
|
+
const requestedAgentId = resolveRequestedAgentId(args);
|
|
119
|
+
const explicitAgent = Boolean(requestedAgentId);
|
|
120
|
+
const resolvedAgentId = resolveDefaultAgentId({
|
|
121
|
+
requestedAgentId,
|
|
122
|
+
bundledAgents,
|
|
123
|
+
configPath
|
|
124
|
+
});
|
|
125
|
+
if (!resolvedAgentId && (runConfig || runAgents)) throw new Error("No explicit agents are available. Add an agent under .wingman/agents or pass --agent with an existing bundled agent.");
|
|
126
|
+
const defaultAgentId = resolvedAgentId || "main";
|
|
127
|
+
if (runConfig || runAgents) assertAgentIsExplicit({
|
|
128
|
+
agentId: defaultAgentId,
|
|
129
|
+
bundledAgents,
|
|
130
|
+
configRoot
|
|
131
|
+
});
|
|
138
132
|
const agentPlan = runConfig || runAgents ? syncAgentsOnly ? resolveAgentSyncPlan({
|
|
139
133
|
defaultAgentId,
|
|
140
134
|
bundledAgents,
|
|
@@ -159,7 +153,6 @@ async function executeInitCommand(args, options = {}) {
|
|
|
159
153
|
const model = shouldResolveModel ? await resolveModelSelection({
|
|
160
154
|
nonInteractive,
|
|
161
155
|
optionMap,
|
|
162
|
-
providerName,
|
|
163
156
|
outputManager
|
|
164
157
|
}) : void 0;
|
|
165
158
|
if (runConfig) await runStep(useClack, "Writing workspace config", async ()=>handleConfigSetup({
|
|
@@ -178,7 +171,6 @@ async function executeInitCommand(args, options = {}) {
|
|
|
178
171
|
agentId: agentPlan.defaultAgentId,
|
|
179
172
|
model,
|
|
180
173
|
force,
|
|
181
|
-
nonInteractive,
|
|
182
174
|
outputManager,
|
|
183
175
|
bundledAgentsPath,
|
|
184
176
|
copyAgents: agentPlan.copyAgents,
|
|
@@ -245,10 +237,35 @@ function isHelpCommand(subcommand) {
|
|
|
245
237
|
"-h"
|
|
246
238
|
].includes(subcommand);
|
|
247
239
|
}
|
|
248
|
-
function
|
|
249
|
-
if (args.agent?.trim()) return args.agent.trim();
|
|
250
|
-
if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return args.subcommand.trim();
|
|
251
|
-
|
|
240
|
+
function resolveRequestedAgentId(args) {
|
|
241
|
+
if (args.agent?.trim()) return sanitizeAgentId(args.agent.trim());
|
|
242
|
+
if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return sanitizeAgentId(args.subcommand.trim());
|
|
243
|
+
}
|
|
244
|
+
function resolveDefaultAgentId(input) {
|
|
245
|
+
const { requestedAgentId, bundledAgents, configPath } = input;
|
|
246
|
+
if (requestedAgentId) return requestedAgentId;
|
|
247
|
+
const existingDefaultAgent = readConfiguredDefaultAgent(configPath);
|
|
248
|
+
if (existingDefaultAgent) return existingDefaultAgent;
|
|
249
|
+
const preferredBundledAgent = resolvePreferredBundledAgentId(bundledAgents);
|
|
250
|
+
if (preferredBundledAgent) return preferredBundledAgent;
|
|
251
|
+
}
|
|
252
|
+
function readConfiguredDefaultAgent(configPath) {
|
|
253
|
+
if (!(0, external_node_fs_namespaceObject.existsSync)(configPath)) return;
|
|
254
|
+
try {
|
|
255
|
+
const raw = (0, external_node_fs_namespaceObject.readFileSync)(configPath, "utf-8");
|
|
256
|
+
const parsed = JSON.parse(raw);
|
|
257
|
+
if ("string" == typeof parsed.defaultAgent && parsed.defaultAgent.trim()) return sanitizeAgentId(parsed.defaultAgent.trim());
|
|
258
|
+
} catch {}
|
|
259
|
+
}
|
|
260
|
+
function resolvePreferredBundledAgentId(bundledAgents) {
|
|
261
|
+
if (bundledAgents.includes("main")) return "main";
|
|
262
|
+
return bundledAgents[0];
|
|
263
|
+
}
|
|
264
|
+
function assertAgentIsExplicit(input) {
|
|
265
|
+
const { agentId, bundledAgents, configRoot } = input;
|
|
266
|
+
if (bundledAgents.includes(agentId)) return;
|
|
267
|
+
if (findAgentConfigPath(configRoot, agentId)) return;
|
|
268
|
+
throw new Error(`Agent "${agentId}" is not defined. Choose one of the bundled agents (${bundledAgents.join(", ")}) or create .wingman/agents/${agentId}/agent.md explicitly.`);
|
|
252
269
|
}
|
|
253
270
|
async function resolveAgentPlan(input) {
|
|
254
271
|
const { explicitAgent, defaultAgentId, bundledAgents, nonInteractive, optionMap, outputManager, ensureDefaultAgentInSelection } = input;
|
|
@@ -508,7 +525,7 @@ function bootstrapBrowserDefaults(configRoot, config) {
|
|
|
508
525
|
};
|
|
509
526
|
}
|
|
510
527
|
async function handleAgentSetup(input) {
|
|
511
|
-
const { configRoot, agentId, model, force,
|
|
528
|
+
const { configRoot, agentId, model, force, outputManager, bundledAgentsPath, copyAgents, ensureDefaultAgent = true } = input;
|
|
512
529
|
const copiedAgents = bundledAgentsPath ? copyBundledAgents({
|
|
513
530
|
bundledAgentsPath,
|
|
514
531
|
configRoot,
|
|
@@ -518,17 +535,8 @@ async function handleAgentSetup(input) {
|
|
|
518
535
|
}) : new Set();
|
|
519
536
|
if (copiedAgents.size > 0) writeLine(outputManager, `Copied ${copiedAgents.size} bundled agent(s) to ${(0, external_node_path_namespaceObject.join)(configRoot, "agents")}`);
|
|
520
537
|
if (!ensureDefaultAgent) return;
|
|
521
|
-
const
|
|
522
|
-
|
|
523
|
-
const expectedAgentExists = (0, external_node_fs_namespaceObject.existsSync)(expectedAgentPath);
|
|
524
|
-
if (!expectedAgentExists) return void await createFallbackAgent({
|
|
525
|
-
configRoot,
|
|
526
|
-
agentId,
|
|
527
|
-
model,
|
|
528
|
-
force,
|
|
529
|
-
nonInteractive,
|
|
530
|
-
outputManager
|
|
531
|
-
});
|
|
538
|
+
const expectedAgentPath = findAgentConfigPath(configRoot, agentId);
|
|
539
|
+
if (!expectedAgentPath) throw new Error(`Agent "${agentId}" was not found after init. Create .wingman/agents/${agentId}/agent.md explicitly or choose a bundled agent.`);
|
|
532
540
|
if (model) applyModelToAgent(expectedAgentPath, model, outputManager);
|
|
533
541
|
}
|
|
534
542
|
function resolveBundledAgentsPath() {
|
|
@@ -585,35 +593,34 @@ function copyDirectory(source, target) {
|
|
|
585
593
|
else (0, external_node_fs_namespaceObject.copyFileSync)(sourcePath, targetPath);
|
|
586
594
|
}
|
|
587
595
|
}
|
|
588
|
-
|
|
589
|
-
const { configRoot, agentId, model, force, nonInteractive, outputManager } = input;
|
|
596
|
+
function findAgentConfigPath(configRoot, agentId) {
|
|
590
597
|
const agentDir = (0, external_node_path_namespaceObject.join)(configRoot, "agents", agentId);
|
|
591
|
-
const
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
if (!shouldOverwrite) return void writeLine(outputManager, `Keeping existing agent "${agentId}".`);
|
|
597
|
-
}
|
|
598
|
-
(0, external_node_fs_namespaceObject.mkdirSync)(agentDir, {
|
|
599
|
-
recursive: true
|
|
600
|
-
});
|
|
601
|
-
const agentConfig = {
|
|
602
|
-
name: agentId,
|
|
603
|
-
description: DEFAULT_AGENT_DESCRIPTION,
|
|
604
|
-
systemPrompt: DEFAULT_AGENT_PROMPT,
|
|
605
|
-
tools: DEFAULT_TOOLS
|
|
606
|
-
};
|
|
607
|
-
if (model) agentConfig.model = model;
|
|
608
|
-
(0, external_node_fs_namespaceObject.writeFileSync)(agentPath, JSON.stringify(agentConfig, null, 2));
|
|
609
|
-
writeLine(outputManager, `Created starter agent at ${agentPath}`);
|
|
598
|
+
const jsonPath = (0, external_node_path_namespaceObject.join)(agentDir, "agent.json");
|
|
599
|
+
if ((0, external_node_fs_namespaceObject.existsSync)(jsonPath)) return jsonPath;
|
|
600
|
+
const markdownPath = (0, external_node_path_namespaceObject.join)(agentDir, "agent.md");
|
|
601
|
+
if ((0, external_node_fs_namespaceObject.existsSync)(markdownPath)) return markdownPath;
|
|
602
|
+
return null;
|
|
610
603
|
}
|
|
611
604
|
function applyModelToAgent(agentPath, model, outputManager) {
|
|
612
605
|
try {
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
606
|
+
if (agentPath.endsWith(".json")) {
|
|
607
|
+
const raw = (0, external_node_fs_namespaceObject.readFileSync)(agentPath, "utf-8");
|
|
608
|
+
const parsed = JSON.parse(raw);
|
|
609
|
+
parsed.model = model;
|
|
610
|
+
(0, external_node_fs_namespaceObject.writeFileSync)(agentPath, JSON.stringify(parsed, null, 2));
|
|
611
|
+
} else if (agentPath.endsWith(".md")) {
|
|
612
|
+
const raw = (0, external_node_fs_namespaceObject.readFileSync)(agentPath, "utf-8");
|
|
613
|
+
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/;
|
|
614
|
+
const match = raw.match(frontmatterRegex);
|
|
615
|
+
if (!match) throw new Error("Invalid agent.md format: missing frontmatter");
|
|
616
|
+
const [, rawFrontmatter, prompt] = match;
|
|
617
|
+
const metadata = external_js_yaml_namespaceObject.load(rawFrontmatter) || {};
|
|
618
|
+
metadata.model = model;
|
|
619
|
+
const serializedFrontmatter = external_js_yaml_namespaceObject.dump(metadata, {
|
|
620
|
+
lineWidth: 120
|
|
621
|
+
});
|
|
622
|
+
(0, external_node_fs_namespaceObject.writeFileSync)(agentPath, `---\n${serializedFrontmatter}---\n\n${prompt?.trim() || ""}\n`);
|
|
623
|
+
} else throw new Error("Unsupported agent config format");
|
|
617
624
|
writeLine(outputManager, `Updated ${agentPath} with model ${model}`);
|
|
618
625
|
} catch {
|
|
619
626
|
writeLine(outputManager, `Unable to update model for ${agentPath}. Update manually.`);
|
|
@@ -653,7 +660,7 @@ async function resolveProviderSelection(input) {
|
|
|
653
660
|
return normalized;
|
|
654
661
|
}
|
|
655
662
|
async function resolveModelSelection(input) {
|
|
656
|
-
const { nonInteractive, optionMap,
|
|
663
|
+
const { nonInteractive, optionMap, outputManager } = input;
|
|
657
664
|
const explicitModel = getStringOption(optionMap, [
|
|
658
665
|
"model"
|
|
659
666
|
]);
|
|
@@ -661,22 +668,13 @@ async function resolveModelSelection(input) {
|
|
|
661
668
|
validateModel(explicitModel);
|
|
662
669
|
return explicitModel;
|
|
663
670
|
}
|
|
664
|
-
|
|
665
|
-
const configuredProvider = providers.find((provider)=>"missing" !== (0, credentials_cjs_namespaceObject.resolveProviderToken)(provider.name).source);
|
|
666
|
-
const suggestedProvider = providerName || configuredProvider?.name;
|
|
667
|
-
const suggestedModel = suggestedProvider ? DEFAULT_MODELS[suggestedProvider] : void 0;
|
|
668
|
-
if (nonInteractive) {
|
|
669
|
-
if (suggestedModel) return suggestedModel;
|
|
670
|
-
return;
|
|
671
|
-
}
|
|
671
|
+
if (nonInteractive) return;
|
|
672
672
|
const inputValue = await (0, prompts_namespaceObject.text)({
|
|
673
673
|
message: "Model string (provider:model)",
|
|
674
|
-
placeholder:
|
|
675
|
-
defaultValue: suggestedModel
|
|
674
|
+
placeholder: "anthropic:claude-sonnet-4-5"
|
|
676
675
|
});
|
|
677
676
|
if ((0, prompts_namespaceObject.isCancel)(inputValue)) abortSetup();
|
|
678
677
|
const trimmed = String(inputValue ?? "").trim();
|
|
679
|
-
if (!trimmed && suggestedModel) return suggestedModel;
|
|
680
678
|
if (!trimmed) return void writeLine(outputManager, "Skipping model selection.");
|
|
681
679
|
validateModel(trimmed);
|
|
682
680
|
return trimmed;
|
|
@@ -779,29 +777,13 @@ async function promptForDefaultAgent(agents, currentDefault) {
|
|
|
779
777
|
const defaultValue = choices.includes(currentDefault) ? currentDefault : choices[0];
|
|
780
778
|
const selection = await (0, prompts_namespaceObject.select)({
|
|
781
779
|
message: "Pick a default agent",
|
|
782
|
-
options:
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
})),
|
|
787
|
-
{
|
|
788
|
-
value: "__custom__",
|
|
789
|
-
label: "Custom agent name"
|
|
790
|
-
}
|
|
791
|
-
],
|
|
780
|
+
options: choices.map((agent)=>({
|
|
781
|
+
value: agent,
|
|
782
|
+
label: agent
|
|
783
|
+
})),
|
|
792
784
|
initialValue: defaultValue
|
|
793
785
|
});
|
|
794
786
|
if ((0, prompts_namespaceObject.isCancel)(selection)) abortSetup();
|
|
795
|
-
if ("__custom__" === selection) {
|
|
796
|
-
const input = await (0, prompts_namespaceObject.text)({
|
|
797
|
-
message: "Default agent name",
|
|
798
|
-
placeholder: defaultValue
|
|
799
|
-
});
|
|
800
|
-
if ((0, prompts_namespaceObject.isCancel)(input)) abortSetup();
|
|
801
|
-
const trimmed = String(input ?? "").trim();
|
|
802
|
-
if (!trimmed) return defaultValue;
|
|
803
|
-
return sanitizeAgentId(trimmed);
|
|
804
|
-
}
|
|
805
787
|
return sanitizeAgentId(String(selection));
|
|
806
788
|
}
|
|
807
789
|
async function promptForAgentSelection(agents, defaultAgent) {
|
|
@@ -868,12 +850,12 @@ Usage:
|
|
|
868
850
|
wingman init <agent-name>
|
|
869
851
|
|
|
870
852
|
Options:
|
|
871
|
-
--agent <name>
|
|
853
|
+
--agent <name> Bundled or existing explicit agent name
|
|
872
854
|
--mode <name> Init mode (onboard|sync). Default: onboard
|
|
873
855
|
--only <targets> Run only selected setup targets (config,agents,provider)
|
|
874
856
|
--agents <list> Copy only these bundled agents (comma-separated)
|
|
875
857
|
--model <provider:model>
|
|
876
|
-
Set model for the
|
|
858
|
+
Set model for the selected explicit agent
|
|
877
859
|
--provider <name> Provider to configure (anthropic|openai|codex|openrouter|copilot|xai)
|
|
878
860
|
--token <token> Save provider token (non-interactive)
|
|
879
861
|
--api-key <key> Alias for --token
|
|
@@ -3,37 +3,19 @@ import { dirname, isAbsolute, join } from "node:path";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { cancel, confirm as prompts_confirm, intro, isCancel, multiselect, note, outro, select as prompts_select, spinner, text as prompts_text } from "@clack/prompts";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
+
import { dump, load } from "js-yaml";
|
|
6
7
|
import { ModelFactory } from "../../agent/config/modelFactory.js";
|
|
7
8
|
import { createLogger, getLogFilePath } from "../../logger.js";
|
|
8
9
|
import { getCredentialsPath, resolveProviderToken, saveProviderToken } from "../../providers/credentials.js";
|
|
9
10
|
import { listProviderSpecs, normalizeProviderName } from "../../providers/registry.js";
|
|
10
11
|
import { WingmanConfigSchema } from "../config/schema.js";
|
|
11
12
|
import { OutputManager } from "../core/outputManager.js";
|
|
12
|
-
const DEFAULT_AGENT_ID = "wingman";
|
|
13
|
-
const DEFAULT_AGENT_DESCRIPTION = "General-purpose coding assistant for this workspace.";
|
|
14
|
-
const DEFAULT_AGENT_PROMPT = "You are Wingman, a coding assistant for this repository.\nBe direct and concise. Ask clarifying questions when requirements are unclear.\nPrefer minimal diffs and safe changes. Avoid destructive actions unless asked.\nUse tools to inspect the codebase before editing.";
|
|
15
|
-
const DEFAULT_TOOLS = [
|
|
16
|
-
"code_search",
|
|
17
|
-
"git_status",
|
|
18
|
-
"command_execute",
|
|
19
|
-
"browser_control",
|
|
20
|
-
"internet_search",
|
|
21
|
-
"think"
|
|
22
|
-
];
|
|
23
13
|
const DEFAULT_FS_ROOT = ".";
|
|
24
14
|
const DEFAULT_BROWSER_PROFILE_ID = "default";
|
|
25
15
|
const DEFAULT_BROWSER_PROFILES_DIR = ".wingman/browser-profiles";
|
|
26
16
|
const DEFAULT_BROWSER_EXTENSIONS_DIR = ".wingman/browser-extensions";
|
|
27
17
|
const DEFAULT_BUNDLED_EXTENSION_ID = "wingman";
|
|
28
18
|
const DEFAULT_BROWSER_TRANSPORT = "auto";
|
|
29
|
-
const DEFAULT_MODELS = {
|
|
30
|
-
anthropic: "anthropic:claude-sonnet-4-5",
|
|
31
|
-
openai: "openai:gpt-4o",
|
|
32
|
-
codex: "codex:codex-mini-latest",
|
|
33
|
-
openrouter: "openrouter:openai/gpt-4o",
|
|
34
|
-
copilot: "copilot:gpt-4o",
|
|
35
|
-
xai: "xai:grok-beta"
|
|
36
|
-
};
|
|
37
19
|
const DEFAULT_INIT_MODE = "onboard";
|
|
38
20
|
const DEFAULT_ONBOARD_COMPONENTS = [
|
|
39
21
|
"config",
|
|
@@ -92,8 +74,20 @@ async function executeInitCommand(args, options = {}) {
|
|
|
92
74
|
renderInitBanner(outputManager, nonInteractive, mode, components);
|
|
93
75
|
const bundledAgentsPath = resolveBundledAgentsPath();
|
|
94
76
|
const bundledAgents = bundledAgentsPath ? listBundledAgents(bundledAgentsPath) : [];
|
|
95
|
-
const
|
|
96
|
-
const
|
|
77
|
+
const requestedAgentId = resolveRequestedAgentId(args);
|
|
78
|
+
const explicitAgent = Boolean(requestedAgentId);
|
|
79
|
+
const resolvedAgentId = resolveDefaultAgentId({
|
|
80
|
+
requestedAgentId,
|
|
81
|
+
bundledAgents,
|
|
82
|
+
configPath
|
|
83
|
+
});
|
|
84
|
+
if (!resolvedAgentId && (runConfig || runAgents)) throw new Error("No explicit agents are available. Add an agent under .wingman/agents or pass --agent with an existing bundled agent.");
|
|
85
|
+
const defaultAgentId = resolvedAgentId || "main";
|
|
86
|
+
if (runConfig || runAgents) assertAgentIsExplicit({
|
|
87
|
+
agentId: defaultAgentId,
|
|
88
|
+
bundledAgents,
|
|
89
|
+
configRoot
|
|
90
|
+
});
|
|
97
91
|
const agentPlan = runConfig || runAgents ? syncAgentsOnly ? resolveAgentSyncPlan({
|
|
98
92
|
defaultAgentId,
|
|
99
93
|
bundledAgents,
|
|
@@ -118,7 +112,6 @@ async function executeInitCommand(args, options = {}) {
|
|
|
118
112
|
const model = shouldResolveModel ? await resolveModelSelection({
|
|
119
113
|
nonInteractive,
|
|
120
114
|
optionMap,
|
|
121
|
-
providerName,
|
|
122
115
|
outputManager
|
|
123
116
|
}) : void 0;
|
|
124
117
|
if (runConfig) await runStep(useClack, "Writing workspace config", async ()=>handleConfigSetup({
|
|
@@ -137,7 +130,6 @@ async function executeInitCommand(args, options = {}) {
|
|
|
137
130
|
agentId: agentPlan.defaultAgentId,
|
|
138
131
|
model,
|
|
139
132
|
force,
|
|
140
|
-
nonInteractive,
|
|
141
133
|
outputManager,
|
|
142
134
|
bundledAgentsPath,
|
|
143
135
|
copyAgents: agentPlan.copyAgents,
|
|
@@ -204,10 +196,35 @@ function isHelpCommand(subcommand) {
|
|
|
204
196
|
"-h"
|
|
205
197
|
].includes(subcommand);
|
|
206
198
|
}
|
|
207
|
-
function
|
|
208
|
-
if (args.agent?.trim()) return args.agent.trim();
|
|
209
|
-
if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return args.subcommand.trim();
|
|
210
|
-
|
|
199
|
+
function resolveRequestedAgentId(args) {
|
|
200
|
+
if (args.agent?.trim()) return sanitizeAgentId(args.agent.trim());
|
|
201
|
+
if (args.subcommand && !isHelpCommand(args.subcommand) && !args.subcommand.startsWith("-")) return sanitizeAgentId(args.subcommand.trim());
|
|
202
|
+
}
|
|
203
|
+
function resolveDefaultAgentId(input) {
|
|
204
|
+
const { requestedAgentId, bundledAgents, configPath } = input;
|
|
205
|
+
if (requestedAgentId) return requestedAgentId;
|
|
206
|
+
const existingDefaultAgent = readConfiguredDefaultAgent(configPath);
|
|
207
|
+
if (existingDefaultAgent) return existingDefaultAgent;
|
|
208
|
+
const preferredBundledAgent = resolvePreferredBundledAgentId(bundledAgents);
|
|
209
|
+
if (preferredBundledAgent) return preferredBundledAgent;
|
|
210
|
+
}
|
|
211
|
+
function readConfiguredDefaultAgent(configPath) {
|
|
212
|
+
if (!existsSync(configPath)) return;
|
|
213
|
+
try {
|
|
214
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
215
|
+
const parsed = JSON.parse(raw);
|
|
216
|
+
if ("string" == typeof parsed.defaultAgent && parsed.defaultAgent.trim()) return sanitizeAgentId(parsed.defaultAgent.trim());
|
|
217
|
+
} catch {}
|
|
218
|
+
}
|
|
219
|
+
function resolvePreferredBundledAgentId(bundledAgents) {
|
|
220
|
+
if (bundledAgents.includes("main")) return "main";
|
|
221
|
+
return bundledAgents[0];
|
|
222
|
+
}
|
|
223
|
+
function assertAgentIsExplicit(input) {
|
|
224
|
+
const { agentId, bundledAgents, configRoot } = input;
|
|
225
|
+
if (bundledAgents.includes(agentId)) return;
|
|
226
|
+
if (findAgentConfigPath(configRoot, agentId)) return;
|
|
227
|
+
throw new Error(`Agent "${agentId}" is not defined. Choose one of the bundled agents (${bundledAgents.join(", ")}) or create .wingman/agents/${agentId}/agent.md explicitly.`);
|
|
211
228
|
}
|
|
212
229
|
async function resolveAgentPlan(input) {
|
|
213
230
|
const { explicitAgent, defaultAgentId, bundledAgents, nonInteractive, optionMap, outputManager, ensureDefaultAgentInSelection } = input;
|
|
@@ -467,7 +484,7 @@ function bootstrapBrowserDefaults(configRoot, config) {
|
|
|
467
484
|
};
|
|
468
485
|
}
|
|
469
486
|
async function handleAgentSetup(input) {
|
|
470
|
-
const { configRoot, agentId, model, force,
|
|
487
|
+
const { configRoot, agentId, model, force, outputManager, bundledAgentsPath, copyAgents, ensureDefaultAgent = true } = input;
|
|
471
488
|
const copiedAgents = bundledAgentsPath ? copyBundledAgents({
|
|
472
489
|
bundledAgentsPath,
|
|
473
490
|
configRoot,
|
|
@@ -477,17 +494,8 @@ async function handleAgentSetup(input) {
|
|
|
477
494
|
}) : new Set();
|
|
478
495
|
if (copiedAgents.size > 0) writeLine(outputManager, `Copied ${copiedAgents.size} bundled agent(s) to ${join(configRoot, "agents")}`);
|
|
479
496
|
if (!ensureDefaultAgent) return;
|
|
480
|
-
const
|
|
481
|
-
|
|
482
|
-
const expectedAgentExists = existsSync(expectedAgentPath);
|
|
483
|
-
if (!expectedAgentExists) return void await createFallbackAgent({
|
|
484
|
-
configRoot,
|
|
485
|
-
agentId,
|
|
486
|
-
model,
|
|
487
|
-
force,
|
|
488
|
-
nonInteractive,
|
|
489
|
-
outputManager
|
|
490
|
-
});
|
|
497
|
+
const expectedAgentPath = findAgentConfigPath(configRoot, agentId);
|
|
498
|
+
if (!expectedAgentPath) throw new Error(`Agent "${agentId}" was not found after init. Create .wingman/agents/${agentId}/agent.md explicitly or choose a bundled agent.`);
|
|
491
499
|
if (model) applyModelToAgent(expectedAgentPath, model, outputManager);
|
|
492
500
|
}
|
|
493
501
|
function resolveBundledAgentsPath() {
|
|
@@ -544,35 +552,34 @@ function copyDirectory(source, target) {
|
|
|
544
552
|
else copyFileSync(sourcePath, targetPath);
|
|
545
553
|
}
|
|
546
554
|
}
|
|
547
|
-
|
|
548
|
-
const { configRoot, agentId, model, force, nonInteractive, outputManager } = input;
|
|
555
|
+
function findAgentConfigPath(configRoot, agentId) {
|
|
549
556
|
const agentDir = join(configRoot, "agents", agentId);
|
|
550
|
-
const
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
if (!shouldOverwrite) return void writeLine(outputManager, `Keeping existing agent "${agentId}".`);
|
|
556
|
-
}
|
|
557
|
-
mkdirSync(agentDir, {
|
|
558
|
-
recursive: true
|
|
559
|
-
});
|
|
560
|
-
const agentConfig = {
|
|
561
|
-
name: agentId,
|
|
562
|
-
description: DEFAULT_AGENT_DESCRIPTION,
|
|
563
|
-
systemPrompt: DEFAULT_AGENT_PROMPT,
|
|
564
|
-
tools: DEFAULT_TOOLS
|
|
565
|
-
};
|
|
566
|
-
if (model) agentConfig.model = model;
|
|
567
|
-
writeFileSync(agentPath, JSON.stringify(agentConfig, null, 2));
|
|
568
|
-
writeLine(outputManager, `Created starter agent at ${agentPath}`);
|
|
557
|
+
const jsonPath = join(agentDir, "agent.json");
|
|
558
|
+
if (existsSync(jsonPath)) return jsonPath;
|
|
559
|
+
const markdownPath = join(agentDir, "agent.md");
|
|
560
|
+
if (existsSync(markdownPath)) return markdownPath;
|
|
561
|
+
return null;
|
|
569
562
|
}
|
|
570
563
|
function applyModelToAgent(agentPath, model, outputManager) {
|
|
571
564
|
try {
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
565
|
+
if (agentPath.endsWith(".json")) {
|
|
566
|
+
const raw = readFileSync(agentPath, "utf-8");
|
|
567
|
+
const parsed = JSON.parse(raw);
|
|
568
|
+
parsed.model = model;
|
|
569
|
+
writeFileSync(agentPath, JSON.stringify(parsed, null, 2));
|
|
570
|
+
} else if (agentPath.endsWith(".md")) {
|
|
571
|
+
const raw = readFileSync(agentPath, "utf-8");
|
|
572
|
+
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/;
|
|
573
|
+
const match = raw.match(frontmatterRegex);
|
|
574
|
+
if (!match) throw new Error("Invalid agent.md format: missing frontmatter");
|
|
575
|
+
const [, rawFrontmatter, prompt] = match;
|
|
576
|
+
const metadata = load(rawFrontmatter) || {};
|
|
577
|
+
metadata.model = model;
|
|
578
|
+
const serializedFrontmatter = dump(metadata, {
|
|
579
|
+
lineWidth: 120
|
|
580
|
+
});
|
|
581
|
+
writeFileSync(agentPath, `---\n${serializedFrontmatter}---\n\n${prompt?.trim() || ""}\n`);
|
|
582
|
+
} else throw new Error("Unsupported agent config format");
|
|
576
583
|
writeLine(outputManager, `Updated ${agentPath} with model ${model}`);
|
|
577
584
|
} catch {
|
|
578
585
|
writeLine(outputManager, `Unable to update model for ${agentPath}. Update manually.`);
|
|
@@ -612,7 +619,7 @@ async function resolveProviderSelection(input) {
|
|
|
612
619
|
return normalized;
|
|
613
620
|
}
|
|
614
621
|
async function resolveModelSelection(input) {
|
|
615
|
-
const { nonInteractive, optionMap,
|
|
622
|
+
const { nonInteractive, optionMap, outputManager } = input;
|
|
616
623
|
const explicitModel = getStringOption(optionMap, [
|
|
617
624
|
"model"
|
|
618
625
|
]);
|
|
@@ -620,22 +627,13 @@ async function resolveModelSelection(input) {
|
|
|
620
627
|
validateModel(explicitModel);
|
|
621
628
|
return explicitModel;
|
|
622
629
|
}
|
|
623
|
-
|
|
624
|
-
const configuredProvider = providers.find((provider)=>"missing" !== resolveProviderToken(provider.name).source);
|
|
625
|
-
const suggestedProvider = providerName || configuredProvider?.name;
|
|
626
|
-
const suggestedModel = suggestedProvider ? DEFAULT_MODELS[suggestedProvider] : void 0;
|
|
627
|
-
if (nonInteractive) {
|
|
628
|
-
if (suggestedModel) return suggestedModel;
|
|
629
|
-
return;
|
|
630
|
-
}
|
|
630
|
+
if (nonInteractive) return;
|
|
631
631
|
const inputValue = await prompts_text({
|
|
632
632
|
message: "Model string (provider:model)",
|
|
633
|
-
placeholder:
|
|
634
|
-
defaultValue: suggestedModel
|
|
633
|
+
placeholder: "anthropic:claude-sonnet-4-5"
|
|
635
634
|
});
|
|
636
635
|
if (isCancel(inputValue)) abortSetup();
|
|
637
636
|
const trimmed = String(inputValue ?? "").trim();
|
|
638
|
-
if (!trimmed && suggestedModel) return suggestedModel;
|
|
639
637
|
if (!trimmed) return void writeLine(outputManager, "Skipping model selection.");
|
|
640
638
|
validateModel(trimmed);
|
|
641
639
|
return trimmed;
|
|
@@ -738,29 +736,13 @@ async function promptForDefaultAgent(agents, currentDefault) {
|
|
|
738
736
|
const defaultValue = choices.includes(currentDefault) ? currentDefault : choices[0];
|
|
739
737
|
const selection = await prompts_select({
|
|
740
738
|
message: "Pick a default agent",
|
|
741
|
-
options:
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
})),
|
|
746
|
-
{
|
|
747
|
-
value: "__custom__",
|
|
748
|
-
label: "Custom agent name"
|
|
749
|
-
}
|
|
750
|
-
],
|
|
739
|
+
options: choices.map((agent)=>({
|
|
740
|
+
value: agent,
|
|
741
|
+
label: agent
|
|
742
|
+
})),
|
|
751
743
|
initialValue: defaultValue
|
|
752
744
|
});
|
|
753
745
|
if (isCancel(selection)) abortSetup();
|
|
754
|
-
if ("__custom__" === selection) {
|
|
755
|
-
const input = await prompts_text({
|
|
756
|
-
message: "Default agent name",
|
|
757
|
-
placeholder: defaultValue
|
|
758
|
-
});
|
|
759
|
-
if (isCancel(input)) abortSetup();
|
|
760
|
-
const trimmed = String(input ?? "").trim();
|
|
761
|
-
if (!trimmed) return defaultValue;
|
|
762
|
-
return sanitizeAgentId(trimmed);
|
|
763
|
-
}
|
|
764
746
|
return sanitizeAgentId(String(selection));
|
|
765
747
|
}
|
|
766
748
|
async function promptForAgentSelection(agents, defaultAgent) {
|
|
@@ -827,12 +809,12 @@ Usage:
|
|
|
827
809
|
wingman init <agent-name>
|
|
828
810
|
|
|
829
811
|
Options:
|
|
830
|
-
--agent <name>
|
|
812
|
+
--agent <name> Bundled or existing explicit agent name
|
|
831
813
|
--mode <name> Init mode (onboard|sync). Default: onboard
|
|
832
814
|
--only <targets> Run only selected setup targets (config,agents,provider)
|
|
833
815
|
--agents <list> Copy only these bundled agents (comma-separated)
|
|
834
816
|
--model <provider:model>
|
|
835
|
-
Set model for the
|
|
817
|
+
Set model for the selected explicit agent
|
|
836
818
|
--provider <name> Provider to configure (anthropic|openai|codex|openrouter|copilot|xai)
|
|
837
819
|
--token <token> Save provider token (non-interactive)
|
|
838
820
|
--api-key <key> Alias for --token
|
|
@@ -141,8 +141,8 @@ const BrowserConfigSchema = external_zod_namespaceObject.object({
|
|
|
141
141
|
});
|
|
142
142
|
const SummarizationConfigSchema = external_zod_namespaceObject.object({
|
|
143
143
|
enabled: external_zod_namespaceObject.boolean().optional().default(true).describe("Enable conversation history summarization"),
|
|
144
|
-
maxTokensBeforeSummary: external_zod_namespaceObject.number().min(1000).max(1000000).optional().
|
|
145
|
-
messagesToKeep: external_zod_namespaceObject.number().min(2).max(100).optional().
|
|
144
|
+
maxTokensBeforeSummary: external_zod_namespaceObject.number().min(1000).max(1000000).optional().describe("Token threshold before summarizing conversation history"),
|
|
145
|
+
messagesToKeep: external_zod_namespaceObject.number().min(2).max(100).optional().describe("How many most recent messages to keep after summarization")
|
|
146
146
|
});
|
|
147
147
|
const RetryOnFailureSchema = external_zod_namespaceObject["enum"]([
|
|
148
148
|
"continue",
|
|
@@ -382,11 +382,7 @@ const WingmanConfigSchema = external_zod_namespaceObject.object({
|
|
|
382
382
|
]).optional().default("info"),
|
|
383
383
|
defaultAgent: external_zod_namespaceObject.string().optional(),
|
|
384
384
|
recursionLimit: external_zod_namespaceObject.number().min(1).max(1000000).optional().default(5000),
|
|
385
|
-
summarization: SummarizationConfigSchema.optional()
|
|
386
|
-
enabled: true,
|
|
387
|
-
maxTokensBeforeSummary: 12000,
|
|
388
|
-
messagesToKeep: 8
|
|
389
|
-
}),
|
|
385
|
+
summarization: SummarizationConfigSchema.optional(),
|
|
390
386
|
modelRetry: ModelRetryConfigSchema.optional().default({
|
|
391
387
|
enabled: true,
|
|
392
388
|
maxRetries: 2,
|
|
@@ -64,8 +64,8 @@ export declare const BrowserConfigSchema: z.ZodObject<{
|
|
|
64
64
|
export type BrowserConfig = z.infer<typeof BrowserConfigSchema>;
|
|
65
65
|
export declare const SummarizationConfigSchema: z.ZodObject<{
|
|
66
66
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
67
|
-
maxTokensBeforeSummary: z.
|
|
68
|
-
messagesToKeep: z.
|
|
67
|
+
maxTokensBeforeSummary: z.ZodOptional<z.ZodNumber>;
|
|
68
|
+
messagesToKeep: z.ZodOptional<z.ZodNumber>;
|
|
69
69
|
}, z.core.$strip>;
|
|
70
70
|
export type SummarizationConfig = z.infer<typeof SummarizationConfigSchema>;
|
|
71
71
|
export declare const ModelRetryConfigSchema: z.ZodObject<{
|
|
@@ -218,11 +218,11 @@ export declare const WingmanConfigSchema: z.ZodObject<{
|
|
|
218
218
|
}>>>;
|
|
219
219
|
defaultAgent: z.ZodOptional<z.ZodString>;
|
|
220
220
|
recursionLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
221
|
-
summarization: z.
|
|
221
|
+
summarization: z.ZodOptional<z.ZodObject<{
|
|
222
222
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
223
|
-
maxTokensBeforeSummary: z.
|
|
224
|
-
messagesToKeep: z.
|
|
225
|
-
}, z.core.$strip
|
|
223
|
+
maxTokensBeforeSummary: z.ZodOptional<z.ZodNumber>;
|
|
224
|
+
messagesToKeep: z.ZodOptional<z.ZodNumber>;
|
|
225
|
+
}, z.core.$strip>>;
|
|
226
226
|
modelRetry: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
227
227
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
228
228
|
maxRetries: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|