@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.
- package/.wingman/agents/README.md +7 -1
- package/.wingman/agents/coding/agent.md +299 -201
- package/.wingman/agents/coding-v2/agent.md +127 -0
- package/.wingman/agents/coding-v2/implementor.md +89 -0
- package/.wingman/agents/main/agent.md +4 -0
- package/README.md +1 -0
- package/dist/agent/config/agentConfig.cjs +31 -17
- package/dist/agent/config/agentConfig.d.ts +23 -1
- package/dist/agent/config/agentConfig.js +30 -19
- package/dist/agent/config/agentLoader.cjs +26 -8
- package/dist/agent/config/agentLoader.d.ts +4 -2
- package/dist/agent/config/agentLoader.js +26 -8
- package/dist/agent/config/modelFactory.cjs +95 -25
- package/dist/agent/config/modelFactory.d.ts +13 -1
- package/dist/agent/config/modelFactory.js +95 -25
- package/dist/agent/config/toolRegistry.cjs +19 -6
- package/dist/agent/config/toolRegistry.d.ts +5 -2
- package/dist/agent/config/toolRegistry.js +19 -6
- package/dist/agent/middleware/hooks/types.cjs +13 -13
- package/dist/agent/middleware/hooks/types.d.ts +1 -1
- package/dist/agent/middleware/hooks/types.js +14 -14
- package/dist/agent/tests/agentConfig.test.cjs +22 -2
- package/dist/agent/tests/agentConfig.test.js +22 -2
- package/dist/agent/tests/agentLoader.test.cjs +38 -1
- package/dist/agent/tests/agentLoader.test.js +38 -1
- package/dist/agent/tests/backgroundTerminal.test.cjs +70 -0
- package/dist/agent/tests/backgroundTerminal.test.d.ts +1 -0
- package/dist/agent/tests/backgroundTerminal.test.js +64 -0
- package/dist/agent/tests/commandExecuteTool.test.cjs +29 -0
- package/dist/agent/tests/commandExecuteTool.test.d.ts +1 -0
- package/dist/agent/tests/commandExecuteTool.test.js +23 -0
- package/dist/agent/tests/modelFactory.test.cjs +47 -5
- package/dist/agent/tests/modelFactory.test.js +47 -5
- package/dist/agent/tests/terminalSessionManager.test.cjs +121 -0
- package/dist/agent/tests/terminalSessionManager.test.d.ts +1 -0
- package/dist/agent/tests/terminalSessionManager.test.js +115 -0
- package/dist/agent/tests/toolRegistry.test.cjs +14 -2
- package/dist/agent/tests/toolRegistry.test.js +14 -2
- package/dist/agent/tools/background_terminal.cjs +128 -0
- package/dist/agent/tools/background_terminal.d.ts +41 -0
- package/dist/agent/tools/background_terminal.js +94 -0
- package/dist/agent/tools/code_search.cjs +6 -6
- package/dist/agent/tools/code_search.d.ts +1 -1
- package/dist/agent/tools/code_search.js +7 -7
- package/dist/agent/tools/command_execute.cjs +22 -7
- package/dist/agent/tools/command_execute.d.ts +3 -2
- package/dist/agent/tools/command_execute.js +23 -8
- package/dist/agent/tools/git_status.cjs +3 -3
- package/dist/agent/tools/git_status.d.ts +1 -1
- package/dist/agent/tools/git_status.js +4 -4
- package/dist/agent/tools/internet_search.cjs +6 -6
- package/dist/agent/tools/internet_search.d.ts +1 -1
- package/dist/agent/tools/internet_search.js +7 -7
- package/dist/agent/tools/terminal_session_manager.cjs +321 -0
- package/dist/agent/tools/terminal_session_manager.d.ts +77 -0
- package/dist/agent/tools/terminal_session_manager.js +284 -0
- package/dist/agent/tools/think.cjs +4 -4
- package/dist/agent/tools/think.d.ts +1 -1
- package/dist/agent/tools/think.js +5 -5
- package/dist/agent/tools/ui_registry.cjs +13 -13
- package/dist/agent/tools/ui_registry.d.ts +4 -4
- package/dist/agent/tools/ui_registry.js +14 -14
- package/dist/agent/tools/web_crawler.cjs +4 -4
- package/dist/agent/tools/web_crawler.d.ts +1 -1
- package/dist/agent/tools/web_crawler.js +5 -5
- package/dist/agent/utils.cjs +2 -1
- package/dist/agent/utils.js +2 -1
- package/dist/cli/commands/init.cjs +7 -6
- package/dist/cli/commands/init.js +7 -6
- package/dist/cli/commands/provider.cjs +17 -3
- package/dist/cli/commands/provider.js +17 -3
- package/dist/cli/config/loader.cjs +27 -0
- package/dist/cli/config/loader.js +27 -0
- package/dist/cli/config/schema.cjs +146 -68
- package/dist/cli/config/schema.d.ts +89 -1
- package/dist/cli/config/schema.js +134 -68
- package/dist/cli/core/agentInvoker.cjs +344 -17
- package/dist/cli/core/agentInvoker.d.ts +63 -3
- package/dist/cli/core/agentInvoker.js +303 -12
- package/dist/cli/core/sessionManager.cjs +32 -5
- package/dist/cli/core/sessionManager.js +32 -5
- package/dist/cli/core/streamParser.cjs +15 -0
- package/dist/cli/core/streamParser.js +15 -0
- package/dist/cli/index.cjs +6 -5
- package/dist/cli/index.js +6 -5
- package/dist/cli/types.d.ts +32 -0
- package/dist/cli/ui/toolDisplayHelpers.cjs +2 -0
- package/dist/cli/ui/toolDisplayHelpers.js +2 -0
- package/dist/gateway/hooks/registry.cjs +2 -1
- package/dist/gateway/hooks/registry.d.ts +1 -1
- package/dist/gateway/hooks/registry.js +2 -1
- package/dist/gateway/hooks/types.cjs +11 -11
- package/dist/gateway/hooks/types.d.ts +1 -1
- package/dist/gateway/hooks/types.js +12 -12
- package/dist/gateway/http/agents.cjs +67 -4
- package/dist/gateway/http/agents.js +67 -4
- package/dist/gateway/http/sessions.cjs +7 -7
- package/dist/gateway/http/sessions.js +7 -7
- package/dist/gateway/http/types.d.ts +5 -3
- package/dist/gateway/http/webhooks.cjs +6 -5
- package/dist/gateway/http/webhooks.js +6 -5
- package/dist/gateway/server.cjs +198 -41
- package/dist/gateway/server.d.ts +9 -1
- package/dist/gateway/server.js +198 -41
- package/dist/gateway/types.d.ts +1 -0
- package/dist/gateway/validation.cjs +39 -39
- package/dist/gateway/validation.d.ts +1 -1
- package/dist/gateway/validation.js +40 -40
- package/dist/providers/codex.cjs +167 -0
- package/dist/providers/codex.d.ts +15 -0
- package/dist/providers/codex.js +127 -0
- package/dist/providers/credentials.cjs +8 -0
- package/dist/providers/credentials.js +8 -0
- package/dist/providers/registry.cjs +11 -0
- package/dist/providers/registry.d.ts +1 -1
- package/dist/providers/registry.js +11 -0
- package/dist/tests/additionalMessageMiddleware.test.cjs +3 -0
- package/dist/tests/additionalMessageMiddleware.test.js +3 -0
- package/dist/tests/agentInvokerSummarization.test.cjs +455 -0
- package/dist/tests/agentInvokerSummarization.test.d.ts +1 -0
- package/dist/tests/agentInvokerSummarization.test.js +449 -0
- package/dist/tests/agents-api.test.cjs +45 -5
- package/dist/tests/agents-api.test.js +45 -5
- package/dist/tests/cli-config-loader.test.cjs +88 -0
- package/dist/tests/cli-config-loader.test.js +88 -0
- package/dist/tests/cli-init.test.cjs +27 -3
- package/dist/tests/cli-init.test.js +27 -3
- package/dist/tests/codex-credentials-precedence.test.cjs +94 -0
- package/dist/tests/codex-credentials-precedence.test.d.ts +1 -0
- package/dist/tests/codex-credentials-precedence.test.js +88 -0
- package/dist/tests/codex-provider.test.cjs +210 -0
- package/dist/tests/codex-provider.test.d.ts +1 -0
- package/dist/tests/codex-provider.test.js +204 -0
- package/dist/tests/gateway.test.cjs +115 -8
- package/dist/tests/gateway.test.js +115 -8
- package/dist/tests/provider-command-codex.test.cjs +57 -0
- package/dist/tests/provider-command-codex.test.d.ts +1 -0
- package/dist/tests/provider-command-codex.test.js +51 -0
- package/dist/tests/sessionStateMessages.test.cjs +38 -0
- package/dist/tests/sessionStateMessages.test.js +38 -0
- package/dist/tests/toolDisplayHelpers.test.cjs +3 -0
- package/dist/tests/toolDisplayHelpers.test.js +3 -0
- package/dist/tools/mcp-finance.cjs +48 -48
- package/dist/tools/mcp-finance.js +48 -48
- package/dist/types/mcp.cjs +15 -15
- package/dist/types/mcp.d.ts +1 -1
- package/dist/types/mcp.js +16 -16
- package/dist/types/voice.cjs +21 -21
- package/dist/types/voice.d.ts +1 -1
- package/dist/types/voice.js +22 -22
- package/dist/webui/assets/index-DVWQluit.css +11 -0
- package/dist/webui/assets/index-Dlyzwalc.js +270 -0
- package/dist/webui/favicon-32x32.png +0 -0
- package/dist/webui/favicon-64x64.png +0 -0
- package/dist/webui/favicon.webp +0 -0
- package/dist/webui/index.html +4 -2
- package/package.json +13 -12
- package/.wingman/agents/coding/implementor.md +0 -79
- package/dist/webui/assets/index-CPhfGPHc.js +0 -182
- package/dist/webui/assets/index-DDsMIOTX.css +0 -11
package/dist/cli/types.d.ts
CHANGED
|
@@ -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;
|
|
@@ -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.
|
|
33
|
-
agentId: external_zod_namespaceObject.
|
|
34
|
-
sessionKey: external_zod_namespaceObject.
|
|
35
|
-
message: external_zod_namespaceObject.
|
|
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.
|
|
38
|
-
enabled: external_zod_namespaceObject.
|
|
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.
|
|
42
|
-
enabled: external_zod_namespaceObject.
|
|
43
|
-
entries: external_zod_namespaceObject.
|
|
44
|
-
load: external_zod_namespaceObject.
|
|
45
|
-
extraDirs: external_zod_namespaceObject.
|
|
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,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const HookDeliverSchema =
|
|
3
|
-
agentId:
|
|
4
|
-
sessionKey:
|
|
5
|
-
message:
|
|
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 =
|
|
8
|
-
enabled:
|
|
7
|
+
const HookEntrySchema = object({
|
|
8
|
+
enabled: external_zod_boolean().default(true),
|
|
9
9
|
deliver: HookDeliverSchema.optional()
|
|
10
10
|
});
|
|
11
|
-
const InternalHooksConfigSchema =
|
|
12
|
-
enabled:
|
|
13
|
-
entries:
|
|
14
|
-
load:
|
|
15
|
-
extraDirs:
|
|
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)
|
|
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
|
-
}
|
|
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
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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)
|
|
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
|
-
}
|
|
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
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
183
|
+
}), {
|
|
184
184
|
headers: {
|
|
185
185
|
"Content-Type": "application/json"
|
|
186
186
|
}
|