@evalops/maestro 0.10.30 → 0.10.32

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 (80) hide show
  1. package/dist/agent/compaction/cut-points.d.ts +157 -0
  2. package/dist/agent/compaction/cut-points.d.ts.map +1 -0
  3. package/dist/agent/compaction/cut-points.js +341 -0
  4. package/dist/agent/compaction/cut-points.js.map +1 -0
  5. package/dist/agent/compaction.d.ts +4 -144
  6. package/dist/agent/compaction.d.ts.map +1 -1
  7. package/dist/agent/compaction.js +5 -340
  8. package/dist/agent/compaction.js.map +1 -1
  9. package/dist/agent/transport/tool-execution.d.ts +1 -0
  10. package/dist/agent/transport/tool-execution.d.ts.map +1 -1
  11. package/dist/agent/transport/tool-execution.js +23 -3
  12. package/dist/agent/transport/tool-execution.js.map +1 -1
  13. package/dist/agent/transport/tool-phase-summary.d.ts +6 -0
  14. package/dist/agent/transport/tool-phase-summary.d.ts.map +1 -0
  15. package/dist/agent/transport/tool-phase-summary.js +99 -0
  16. package/dist/agent/transport/tool-phase-summary.js.map +1 -0
  17. package/dist/agent/transport/tool-safety-pipeline.d.ts +1 -0
  18. package/dist/agent/transport/tool-safety-pipeline.d.ts.map +1 -1
  19. package/dist/agent/transport/tool-safety-pipeline.js +9 -4
  20. package/dist/agent/transport/tool-safety-pipeline.js.map +1 -1
  21. package/dist/agent/transport.d.ts.map +1 -1
  22. package/dist/agent/transport.js +4 -99
  23. package/dist/agent/transport.js.map +1 -1
  24. package/dist/cli/commands/a2a/args.d.ts +13 -0
  25. package/dist/cli/commands/a2a/args.d.ts.map +1 -0
  26. package/dist/cli/commands/a2a/args.js +327 -0
  27. package/dist/cli/commands/a2a/args.js.map +1 -0
  28. package/dist/cli/commands/a2a/discovery.d.ts +40 -0
  29. package/dist/cli/commands/a2a/discovery.d.ts.map +1 -0
  30. package/dist/cli/commands/a2a/discovery.js +150 -0
  31. package/dist/cli/commands/a2a/discovery.js.map +1 -0
  32. package/dist/cli/commands/a2a.d.ts +2 -5
  33. package/dist/cli/commands/a2a.d.ts.map +1 -1
  34. package/dist/cli/commands/a2a.js +4 -474
  35. package/dist/cli/commands/a2a.js.map +1 -1
  36. package/dist/cli.js +1868 -1591
  37. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  38. package/dist/node_modules/@evalops/tui/package.json +1 -1
  39. package/dist/server/app-context.d.ts +7 -0
  40. package/dist/server/app-context.d.ts.map +1 -1
  41. package/dist/server/app-context.js.map +1 -1
  42. package/dist/server/handlers/chat-ws.d.ts.map +1 -1
  43. package/dist/server/handlers/chat-ws.js +42 -24
  44. package/dist/server/handlers/chat-ws.js.map +1 -1
  45. package/dist/server/handlers/chat.d.ts.map +1 -1
  46. package/dist/server/handlers/chat.js +54 -35
  47. package/dist/server/handlers/chat.js.map +1 -1
  48. package/dist/server/handlers/hosted-runner-identity.d.ts +17 -0
  49. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
  50. package/dist/server/handlers/hosted-runner-identity.js +7 -0
  51. package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
  52. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
  53. package/dist/server/handlers/platform-a2a-push.js +134 -15
  54. package/dist/server/handlers/platform-a2a-push.js.map +1 -1
  55. package/dist/server/server-utils.d.ts.map +1 -1
  56. package/dist/server/server-utils.js +12 -0
  57. package/dist/server/server-utils.js.map +1 -1
  58. package/dist/server/session-timeline.d.ts.map +1 -1
  59. package/dist/server/session-timeline.js +13 -0
  60. package/dist/server/session-timeline.js.map +1 -1
  61. package/dist/telemetry/maestro-event-catalog.d.ts +30 -0
  62. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  63. package/dist/telemetry/maestro-event-catalog.js +96 -5
  64. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  65. package/dist/tools/find.d.ts +2 -0
  66. package/dist/tools/find.d.ts.map +1 -1
  67. package/dist/tools/find.js +25 -12
  68. package/dist/tools/find.js.map +1 -1
  69. package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
  70. package/dist/tools/parallel-ripgrep.js +1 -10
  71. package/dist/tools/parallel-ripgrep.js.map +1 -1
  72. package/dist/tools/ripgrep-utils.d.ts +1 -0
  73. package/dist/tools/ripgrep-utils.d.ts.map +1 -1
  74. package/dist/tools/ripgrep-utils.js +9 -0
  75. package/dist/tools/ripgrep-utils.js.map +1 -1
  76. package/dist/tools/search.d.ts.map +1 -1
  77. package/dist/tools/search.js +4 -4
  78. package/dist/tools/search.js.map +1 -1
  79. package/dist/version.json +2 -2
  80. package/package.json +6 -2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evalops/contracts",
3
- "version": "0.10.30",
3
+ "version": "0.10.32",
4
4
  "description": "Shared Maestro contracts for frontend/backend integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evalops/tui",
3
- "version": "0.10.30",
3
+ "version": "0.10.32",
4
4
  "description": "Terminal UI library with differential rendering for Maestro",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -35,11 +35,18 @@ export interface HostedRunnerContext {
35
35
  kind: "statusUpdate" | "artifactUpdate" | "task" | "message";
36
36
  taskId?: string;
37
37
  contextId?: string;
38
+ workspaceId?: string;
39
+ organizationId?: string;
40
+ tenantId?: string;
38
41
  state?: string;
39
42
  final?: boolean;
40
43
  receivedAt: string;
41
44
  runtimeEventId?: string;
42
45
  runtimeEventType?: string;
46
+ traceparent?: string;
47
+ tracestate?: string;
48
+ agentId?: string;
49
+ actorId?: string;
43
50
  };
44
51
  agentRuntimeWorkerQueue?: string;
45
52
  agentRuntimeCorrelationPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"app-context.d.ts","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-context.d.ts","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"../agent/action-approval.js\";\nimport type { Agent } from \"../agent/index.js\";\nimport type { ToolRetryService } from \"../agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { PlatformToolExecutionBridge } from \"../agent/transport/tool-execution-bridge.js\";\nimport type { ThinkingLevel } from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport type { AuthCredential } from \"../providers/auth.js\";\nimport type { HeadlessRuntimeService } from \"./headless-runtime-service.js\";\nimport type { HostedRunnerLeaseSnapshot } from \"./hosted-runner-lease.js\";\n\nexport interface WebServerConfig {\n\tcorsHeaders: Record<string, string>;\n\tstaticMaxAge: number;\n\tdefaultApprovalMode: ApprovalMode;\n\tdefaultProvider: string;\n\tdefaultModelId: string;\n\thostedRunner?: HostedRunnerContext;\n}\n\nexport interface HostedRunnerContext {\n\tenabled: true;\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot?: string;\n\trestoreManifestPath?: string;\n\tlistenHost?: string;\n\tlistenPort?: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tagentRuntimeLeaseToken?: string;\n\ta2aMessageId?: string;\n\ta2aTaskId?: string;\n\tlastPlatformA2APush?: {\n\t\tkind: \"statusUpdate\" | \"artifactUpdate\" | \"task\" | \"message\";\n\t\ttaskId?: string;\n\t\tcontextId?: string;\n\t\tstate?: string;\n\t\tfinal?: boolean;\n\t\treceivedAt: string;\n\t\truntimeEventId?: string;\n\t\truntimeEventType?: string;\n\t};\n\tagentRuntimeWorkerQueue?: string;\n\tagentRuntimeCorrelationPath?: string;\n\tattachAudience?: string;\n\tconfiguredMaestroSessionId?: string;\n\tactiveMaestroSessionId?: string;\n\truntimeLease?: HostedRunnerLeaseSnapshot;\n\tdraining?: boolean;\n\tlastDrain?: {\n\t\tstatus: string;\n\t\tmanifestPath: string;\n\t\tdrainedAt: string;\n\t\treason?: string;\n\t\trequestedBy?: string;\n\t};\n}\n\nexport interface WebServerServices {\n\tcreateAgent: (\n\t\tmodel: RegisteredModel,\n\t\tthinking: ThinkingLevel,\n\t\tapproval: ApprovalMode,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tenableClientTools?: boolean;\n\t\t\tuseClientAskUser?: boolean;\n\t\t\tincludeVscodeTools?: boolean;\n\t\t\tincludeJetBrainsTools?: boolean;\n\t\t\tincludeConductorTools?: boolean;\n\t\t\tapprovalService?: ActionApprovalService;\n\t\t\tclientToolService?: ClientToolExecutionService;\n\t\t\ttoolRetryService?: ToolRetryService;\n\t\t\tplatformToolExecutionBridge?: PlatformToolExecutionBridge | false;\n\t\t},\n\t) => Promise<Agent>;\n\tcreateBackgroundAgent: (\n\t\tmodel: RegisteredModel,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tsystemPrompt?: string;\n\t\t},\n\t) => Promise<Agent>;\n\tgetRegisteredModel: (\n\t\tinput: string | null | undefined,\n\t) => Promise<RegisteredModel>;\n\tgetCurrentSelection: () => { provider: string; modelId: string };\n\tensureCredential: (provider: string) => Promise<AuthCredential>;\n\tsetModelSelection: (model: RegisteredModel) => void;\n\tacquireSse: () => symbol | null;\n\treleaseSse: (token: symbol | null) => void;\n\theadlessRuntimeService: HeadlessRuntimeService;\n}\n\nexport type WebServerContext = WebServerConfig & WebServerServices;\n"]}
1
+ {"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"../agent/action-approval.js\";\nimport type { Agent } from \"../agent/index.js\";\nimport type { ToolRetryService } from \"../agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { PlatformToolExecutionBridge } from \"../agent/transport/tool-execution-bridge.js\";\nimport type { ThinkingLevel } from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport type { AuthCredential } from \"../providers/auth.js\";\nimport type { HeadlessRuntimeService } from \"./headless-runtime-service.js\";\nimport type { HostedRunnerLeaseSnapshot } from \"./hosted-runner-lease.js\";\n\nexport interface WebServerConfig {\n\tcorsHeaders: Record<string, string>;\n\tstaticMaxAge: number;\n\tdefaultApprovalMode: ApprovalMode;\n\tdefaultProvider: string;\n\tdefaultModelId: string;\n\thostedRunner?: HostedRunnerContext;\n}\n\nexport interface HostedRunnerContext {\n\tenabled: true;\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot?: string;\n\trestoreManifestPath?: string;\n\tlistenHost?: string;\n\tlistenPort?: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tagentRuntimeLeaseToken?: string;\n\ta2aMessageId?: string;\n\ta2aTaskId?: string;\n\tlastPlatformA2APush?: {\n\t\tkind: \"statusUpdate\" | \"artifactUpdate\" | \"task\" | \"message\";\n\t\ttaskId?: string;\n\t\tcontextId?: string;\n\t\tworkspaceId?: string;\n\t\torganizationId?: string;\n\t\ttenantId?: string;\n\t\tstate?: string;\n\t\tfinal?: boolean;\n\t\treceivedAt: string;\n\t\truntimeEventId?: string;\n\t\truntimeEventType?: string;\n\t\ttraceparent?: string;\n\t\ttracestate?: string;\n\t\tagentId?: string;\n\t\tactorId?: string;\n\t};\n\tagentRuntimeWorkerQueue?: string;\n\tagentRuntimeCorrelationPath?: string;\n\tattachAudience?: string;\n\tconfiguredMaestroSessionId?: string;\n\tactiveMaestroSessionId?: string;\n\truntimeLease?: HostedRunnerLeaseSnapshot;\n\tdraining?: boolean;\n\tlastDrain?: {\n\t\tstatus: string;\n\t\tmanifestPath: string;\n\t\tdrainedAt: string;\n\t\treason?: string;\n\t\trequestedBy?: string;\n\t};\n}\n\nexport interface WebServerServices {\n\tcreateAgent: (\n\t\tmodel: RegisteredModel,\n\t\tthinking: ThinkingLevel,\n\t\tapproval: ApprovalMode,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tenableClientTools?: boolean;\n\t\t\tuseClientAskUser?: boolean;\n\t\t\tincludeVscodeTools?: boolean;\n\t\t\tincludeJetBrainsTools?: boolean;\n\t\t\tincludeConductorTools?: boolean;\n\t\t\tapprovalService?: ActionApprovalService;\n\t\t\tclientToolService?: ClientToolExecutionService;\n\t\t\ttoolRetryService?: ToolRetryService;\n\t\t\tplatformToolExecutionBridge?: PlatformToolExecutionBridge | false;\n\t\t},\n\t) => Promise<Agent>;\n\tcreateBackgroundAgent: (\n\t\tmodel: RegisteredModel,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tsystemPrompt?: string;\n\t\t},\n\t) => Promise<Agent>;\n\tgetRegisteredModel: (\n\t\tinput: string | null | undefined,\n\t) => Promise<RegisteredModel>;\n\tgetCurrentSelection: () => { provider: string; modelId: string };\n\tensureCredential: (provider: string) => Promise<AuthCredential>;\n\tsetModelSelection: (model: RegisteredModel) => void;\n\tacquireSse: () => symbol | null;\n\treleaseSse: (token: symbol | null) => void;\n\theadlessRuntimeService: HeadlessRuntimeService;\n}\n\nexport type WebServerContext = WebServerConfig & WebServerServices;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-ws.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/chat-ws.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAW,SAAS,EAAE,MAAM,IAAI,CAAC;AAoB7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAgL1D,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,gBAAgB,QAkqBzB"}
1
+ {"version":3,"file":"chat-ws.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/chat-ws.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAW,SAAS,EAAE,MAAM,IAAI,CAAC;AAoB7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA0L1D,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,gBAAgB,QA2qBzB"}
@@ -29,6 +29,14 @@ import { convertComposerMessagesToApp } from "../session-serialization.js";
29
29
  import { ServerRequestToolRetryService } from "../tool-retry-service.js";
30
30
  import { ChatRequestSchema, validatePayload, } from "../validation.js";
31
31
  const logger = createLogger("web:chat-ws");
32
+ const noopAutomaticMemoryExtraction = {
33
+ schedule: (_sessionPath) => { },
34
+ flush: async () => { },
35
+ };
36
+ const noopAutomaticMemoryConsolidation = {
37
+ schedule: () => { },
38
+ flush: async () => { },
39
+ };
32
40
  function getComposerTextContent(content) {
33
41
  if (typeof content === "string")
34
42
  return content;
@@ -173,6 +181,7 @@ export function handleChatWebSocket(ws, req, context) {
173
181
  const { createAgent, createBackgroundAgent, getRegisteredModel, defaultApprovalMode, acquireSse, releaseSse, } = context;
174
182
  let sseLease = null;
175
183
  let cleanedUp = false;
184
+ let cleanupPromise = null;
176
185
  let requestHandled = false;
177
186
  const url = new URL(req.url || "/api/chat/ws", `http://${req.headers.host || "localhost"}`);
178
187
  const clientToolsFromQuery = parseBoolean(url.searchParams.get("clientTools"));
@@ -527,18 +536,22 @@ export function handleChatWebSocket(ws, req, context) {
527
536
  return slimEvent;
528
537
  };
529
538
  const updateSessionSummary = createRuntimeSessionSummaryUpdater(sessionManager);
530
- const automaticMemoryConsolidation = createAutomaticMemoryConsolidationCoordinator({
531
- createAgent: async () => createBackgroundAgent(agent.state.model, {
532
- systemPrompt: getMemoryConsolidationSystemPrompt(),
533
- }),
534
- getModel: () => agent.state.model,
535
- });
536
- const automaticMemoryExtraction = createAutomaticMemoryExtractionCoordinator({
537
- createAgent: async () => createBackgroundAgent(agent.state.model),
538
- getModel: () => agent.state.model,
539
- onProcessed: () => automaticMemoryConsolidation.schedule(),
540
- sessionManager,
541
- });
539
+ const automaticMemoryConsolidation = typeof createBackgroundAgent === "function"
540
+ ? createAutomaticMemoryConsolidationCoordinator({
541
+ createAgent: async () => createBackgroundAgent(agent.state.model, {
542
+ systemPrompt: getMemoryConsolidationSystemPrompt(),
543
+ }),
544
+ getModel: () => agent.state.model,
545
+ })
546
+ : noopAutomaticMemoryConsolidation;
547
+ const automaticMemoryExtraction = typeof createBackgroundAgent === "function"
548
+ ? createAutomaticMemoryExtractionCoordinator({
549
+ createAgent: async () => createBackgroundAgent(agent.state.model),
550
+ getModel: () => agent.state.model,
551
+ onProcessed: () => automaticMemoryConsolidation.schedule(),
552
+ sessionManager,
553
+ })
554
+ : noopAutomaticMemoryExtraction;
542
555
  const sessionHookService = createSessionHookService({
543
556
  cwd: process.cwd(),
544
557
  sessionId: sessionManager.getSessionId(),
@@ -622,18 +635,23 @@ export function handleChatWebSocket(ws, req, context) {
622
635
  });
623
636
  });
624
637
  const cleanup = async (aborted = false) => {
625
- if (cleanedUp)
626
- return;
627
- cleanedUp = true;
628
- unsubscribe();
629
- unsubscribeMcpElicitationBridge();
630
- await automaticMemoryExtraction.flush();
631
- await automaticMemoryConsolidation.flush();
632
- await sessionManager.flush();
633
- if (aborted) {
634
- wsSession.sendAborted();
635
- }
636
- wsSession.end();
638
+ if (cleanupPromise)
639
+ return cleanupPromise;
640
+ cleanupPromise = (async () => {
641
+ if (cleanedUp)
642
+ return;
643
+ cleanedUp = true;
644
+ unsubscribe();
645
+ unsubscribeMcpElicitationBridge();
646
+ await automaticMemoryExtraction.flush();
647
+ await automaticMemoryConsolidation.flush();
648
+ await sessionManager.flush();
649
+ if (aborted) {
650
+ wsSession.sendAborted();
651
+ }
652
+ wsSession.end();
653
+ })();
654
+ return cleanupPromise;
637
655
  };
638
656
  ws.on("close", () => {
639
657
  agent.abort();
@@ -1 +1 @@
1
- {"version":3,"file":"chat-ws.js","sourceRoot":"","sources":["../../../src/server/handlers/chat-ws.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WebSocket chat handler for agent conversations.\n *\n * Mirrors the SSE chat flow but streams AgentEvent payloads over WebSocket.\n */\n\nimport type { IncomingMessage } from \"node:http\";\nimport type { ComposerChatRequest, ComposerMessage } from \"@evalops/contracts\";\nimport type { RawData, WebSocket } from \"ws\";\nimport { isAssistantMessage } from \"../../agent/type-guards.js\";\nimport type {\n\tAttachment as AgentAttachment,\n\tAgentEvent,\n} from \"../../agent/types.js\";\nimport { runUserPromptWithRecovery } from \"../../agent/user-prompt-runtime.js\";\nimport { dispatchAgentNotification } from \"../../hooks/notification-hooks.js\";\nimport { createSessionHookService } from \"../../hooks/session-integration.js\";\nimport { withMcpPostKeepMessages } from \"../../mcp/prompt-recovery.js\";\nimport {\n\tcreateAutomaticMemoryConsolidationCoordinator,\n\tgetMemoryConsolidationSystemPrompt,\n} from \"../../memory/auto-consolidation.js\";\nimport { createAutomaticMemoryExtractionCoordinator } from \"../../memory/auto-extraction.js\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport { recordAssistantUsageMetric } from \"../../services/usage-analytics/recorder.js\";\nimport { toSessionModelMetadata } from \"../../session/manager.js\";\nimport { createRuntimeSessionSummaryUpdater } from \"../../session/runtime-summary-updater.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nimport type { WebServerContext } from \"../app-context.js\";\nimport {\n\tnormalizeApprovalMode,\n\tresolveApprovalModeForRequest,\n} from \"../approval-mode-store.js\";\nimport { WebActionApprovalService } from \"../approval-service.js\";\nimport { publishArtifactUpdate } from \"../artifacts-live-reload.js\";\nimport { getAuthSubject } from \"../authz.js\";\nimport { getAgentCircuitBreaker } from \"../circuit-breaker.js\";\nimport { clientToolService } from \"../client-tools-service.js\";\nimport { isHostedSessionManager } from \"../hosted-session-manager.js\";\nimport { serverRequestManager } from \"../server-request-manager.js\";\nimport { getRequestHeader } from \"../server-utils.js\";\nimport { startSessionWithPolicy } from \"../session-initialization.js\";\nimport { createWebSessionManagerForRequest } from \"../session-scope.js\";\nimport { convertComposerMessagesToApp } from \"../session-serialization.js\";\nimport type { SseContext, SseSkipListener } from \"../sse-session.js\";\nimport { ServerRequestToolRetryService } from \"../tool-retry-service.js\";\nimport {\n\ttype ChatRequestInput,\n\tChatRequestSchema,\n\tvalidatePayload,\n} from \"../validation.js\";\n\nconst logger = createLogger(\"web:chat-ws\");\n\nfunction getComposerTextContent(content: ComposerMessage[\"content\"]): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n}\n\nclass WsSession {\n\tprivate closed = false;\n\tprivate skippedWrites = 0;\n\tprivate sentWrites = 0;\n\tprivate lastError?: unknown;\n\tprivate context: SseContext = {};\n\n\tconstructor(\n\t\tprivate readonly ws: WebSocket,\n\t\tprivate readonly onSkip?: SseSkipListener,\n\t\tcontext?: SseContext,\n\t) {\n\t\tif (context) {\n\t\t\tthis.context = context;\n\t\t}\n\t}\n\n\tprivate canWrite(): boolean {\n\t\treturn this.ws.readyState === 1;\n\t}\n\n\tprivate write(payload: string): boolean {\n\t\tif (!this.canWrite()) {\n\t\t\tthis.skippedWrites++;\n\t\t\tthis.notifySkip();\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tthis.ws.send(payload);\n\t\t\tthis.sentWrites++;\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.skippedWrites++;\n\t\t\tthis.lastError = error;\n\t\t\tthis.notifySkip();\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tsendEvent(event: AgentEvent): void {\n\t\tthis.write(JSON.stringify(event));\n\t}\n\n\tsendSessionUpdate(sessionId: string): void {\n\t\tthis.write(JSON.stringify({ type: \"session_update\", sessionId }));\n\t}\n\n\tsendHeartbeat(): void {\n\t\tthis.write(JSON.stringify({ type: \"heartbeat\" }));\n\t}\n\n\tsendAborted(): void {\n\t\tthis.write(JSON.stringify({ type: \"aborted\" }));\n\t}\n\n\tsendDone(): void {\n\t\tthis.write(JSON.stringify({ type: \"done\" }));\n\t}\n\n\tend(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tif (!this.canWrite()) return;\n\t\ttry {\n\t\t\tthis.ws.close();\n\t\t} catch (error) {\n\t\t\tthis.skippedWrites++;\n\t\t\tthis.lastError = error;\n\t\t\tthis.notifySkip();\n\t\t}\n\t}\n\n\tgetMetrics(): { sent: number; skipped: number; lastError?: unknown } {\n\t\treturn {\n\t\t\tsent: this.sentWrites,\n\t\t\tskipped: this.skippedWrites,\n\t\t\tlastError: this.lastError,\n\t\t};\n\t}\n\n\tsetContext(context: SseContext): void {\n\t\tthis.context = { ...this.context, ...context };\n\t}\n\n\tprivate notifySkip(): void {\n\t\tif (this.skippedWrites <= 1) return;\n\t\tif (this.onSkip) {\n\t\t\tthis.onSkip({\n\t\t\t\tsent: this.sentWrites,\n\t\t\t\tskipped: this.skippedWrites,\n\t\t\t\tlastError: this.lastError,\n\t\t\t\tcontext: this.context,\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction parseBoolean(input?: string | null): boolean | undefined {\n\tif (!input) return undefined;\n\tconst normalized = input.toLowerCase().trim();\n\tif ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n\tif ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n\treturn undefined;\n}\n\nfunction getRawDataSize(data: RawData): number {\n\tif (typeof data === \"string\") {\n\t\treturn Buffer.byteLength(data, \"utf8\");\n\t}\n\tif (Buffer.isBuffer(data)) {\n\t\treturn data.length;\n\t}\n\tif (data instanceof ArrayBuffer) {\n\t\treturn data.byteLength;\n\t}\n\tif (Array.isArray(data)) {\n\t\treturn data.reduce((total, chunk) => total + chunk.length, 0);\n\t}\n\treturn 0;\n}\n\nfunction rawDataToString(data: RawData, maxPayload: number): string {\n\tconst size = getRawDataSize(data);\n\tif (size > maxPayload) {\n\t\tthrow new Error(\"Payload too large\");\n\t}\n\tif (typeof data === \"string\") {\n\t\treturn data;\n\t}\n\tif (Buffer.isBuffer(data)) {\n\t\treturn data.toString(\"utf8\");\n\t}\n\tif (Array.isArray(data)) {\n\t\treturn Buffer.concat(data).toString(\"utf8\");\n\t}\n\tif (data instanceof ArrayBuffer) {\n\t\treturn Buffer.from(data).toString(\"utf8\");\n\t}\n\treturn \"\";\n}\n\nexport function handleChatWebSocket(\n\tws: WebSocket,\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n) {\n\tconst {\n\t\tcreateAgent,\n\t\tcreateBackgroundAgent,\n\t\tgetRegisteredModel,\n\t\tdefaultApprovalMode,\n\t\tacquireSse,\n\t\treleaseSse,\n\t} = context;\n\n\tlet sseLease: symbol | null = null;\n\tlet cleanedUp = false;\n\tlet requestHandled = false;\n\n\tconst url = new URL(\n\t\treq.url || \"/api/chat/ws\",\n\t\t`http://${req.headers.host || \"localhost\"}`,\n\t);\n\n\tconst clientToolsFromQuery = parseBoolean(\n\t\turl.searchParams.get(\"clientTools\"),\n\t);\n\tconst slimFromQuery = parseBoolean(url.searchParams.get(\"slim\"));\n\tconst clientHeaderFromQuery = url.searchParams.get(\"client\")?.trim();\n\n\tconst sendErrorAndClose = (message: string) => {\n\t\ttry {\n\t\t\tconst session = new WsSession(ws);\n\t\t\tsession.sendEvent({ type: \"error\", message });\n\t\t\tsession.sendDone();\n\t\t\tsession.end();\n\t\t} catch {\n\t\t\tws.close();\n\t\t}\n\t};\n\n\tconst maxPayload =\n\t\tNumber.parseInt(process.env.MAESTRO_WS_MAX_PAYLOAD || \"1048576\", 10) ||\n\t\t1048576;\n\tconst parseRequest = (data: RawData): ComposerChatRequest => {\n\t\tconst raw = rawDataToString(data, maxPayload);\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(raw);\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid JSON payload\");\n\t\t}\n\t\treturn validatePayload<ChatRequestInput>(parsed, ChatRequestSchema);\n\t};\n\n\tws.on(\"message\", async (data) => {\n\t\tif (requestHandled) {\n\t\t\ttry {\n\t\t\t\tconst size = getRawDataSize(data);\n\t\t\t\tif (size > maxPayload) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst raw = rawDataToString(data, maxPayload);\n\t\t\t\tconst parsed = JSON.parse(raw);\n\t\t\t\tif (parsed && typeof parsed === \"object\" && parsed.type === \"abort\") {\n\t\t\t\t\tws.close();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\trequestHandled = true;\n\t\ttry {\n\t\t\tlet chatReq: ComposerChatRequest;\n\t\t\ttry {\n\t\t\t\tchatReq = parseRequest(data);\n\t\t\t} catch (error) {\n\t\t\t\tsendErrorAndClose(\n\t\t\t\t\terror instanceof Error ? error.message : \"Invalid chat request\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst incomingMessages = Array.isArray(chatReq.messages)\n\t\t\t\t? (chatReq.messages as ComposerMessage[])\n\t\t\t\t: [];\n\t\t\tif (incomingMessages.length === 0) {\n\t\t\t\tsendErrorAndClose(\"No messages supplied\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst latestMessage = incomingMessages[incomingMessages.length - 1];\n\t\t\tif (!latestMessage || latestMessage.role !== \"user\") {\n\t\t\t\tsendErrorAndClose(\"Last message must be a user message\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { attachmentsToSend, attachmentError } = (() => {\n\t\t\t\tconst MAX_ATTACHMENT_BYTES = 8 * 1024 * 1024;\n\t\t\t\tconst MAX_TOTAL_BYTES = 20 * 1024 * 1024;\n\n\t\t\t\tconst raw = latestMessage.attachments;\n\t\t\t\tif (!Array.isArray(raw) || raw.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tattachmentsToSend: undefined as AgentAttachment[] | undefined,\n\t\t\t\t\t\tattachmentError: null as string | null,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst attachments: AgentAttachment[] = [];\n\t\t\t\tlet totalBytes = 0;\n\n\t\t\t\tfor (const item of raw) {\n\t\t\t\t\tif (!item || typeof item !== \"object\") continue;\n\t\t\t\t\tconst id = typeof item.id === \"string\" ? item.id : \"\";\n\t\t\t\t\tconst type =\n\t\t\t\t\t\titem.type === \"image\" || item.type === \"document\"\n\t\t\t\t\t\t\t? item.type\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\tconst fileName =\n\t\t\t\t\t\ttypeof item.fileName === \"string\" ? item.fileName : \"attachment\";\n\t\t\t\t\tconst mimeType =\n\t\t\t\t\t\ttypeof item.mimeType === \"string\"\n\t\t\t\t\t\t\t? item.mimeType\n\t\t\t\t\t\t\t: \"application/octet-stream\";\n\t\t\t\t\tconst size =\n\t\t\t\t\t\ttypeof item.size === \"number\" && Number.isFinite(item.size)\n\t\t\t\t\t\t\t? item.size\n\t\t\t\t\t\t\t: 0;\n\t\t\t\t\tconst content = typeof item.content === \"string\" ? item.content : \"\";\n\t\t\t\t\tconst extractedText =\n\t\t\t\t\t\ttypeof item.extractedText === \"string\"\n\t\t\t\t\t\t\t? item.extractedText\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst preview =\n\t\t\t\t\t\ttypeof item.preview === \"string\" ? item.preview : undefined;\n\n\t\t\t\t\tif (!id || !type) continue;\n\t\t\t\t\tif (!content) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst approxBytes = Math.floor((content.length * 3) / 4);\n\t\t\t\t\tconst bytes = approxBytes > 0 ? approxBytes : size;\n\n\t\t\t\t\tif (bytes > MAX_ATTACHMENT_BYTES) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\t\tattachmentError: `Attachment too large: ${fileName} (${Math.ceil(bytes / 1024 / 1024)}MB). Max per file is ${Math.ceil(MAX_ATTACHMENT_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\ttotalBytes += bytes;\n\t\t\t\t\tif (totalBytes > MAX_TOTAL_BYTES) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\t\tattachmentError: `Attachments too large: total exceeds ${Math.ceil(MAX_TOTAL_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tattachments.push({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tfileName,\n\t\t\t\t\t\tmimeType,\n\t\t\t\t\t\tsize: size || bytes,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\textractedText,\n\t\t\t\t\t\tpreview,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tattachmentsToSend: attachments.length ? attachments : undefined,\n\t\t\t\t\tattachmentError: null,\n\t\t\t\t};\n\t\t\t})();\n\n\t\t\tif (attachmentError) {\n\t\t\t\tsendErrorAndClose(attachmentError);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst userInput = getComposerTextContent(latestMessage.content).trim();\n\t\t\tif (!userInput && !attachmentsToSend) {\n\t\t\t\tsendErrorAndClose(\"User message cannot be empty\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (acquireSse) {\n\t\t\t\tsseLease = acquireSse();\n\t\t\t\tif (!sseLease) {\n\t\t\t\t\tsendErrorAndClose(\"Too many active streaming connections\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst sessionManager = createWebSessionManagerForRequest(req, false);\n\t\t\tconst subject = getAuthSubject(req);\n\t\t\tlet existingSessionLoaded = false;\n\t\t\tif (chatReq.sessionId) {\n\t\t\t\tif (isHostedSessionManager(sessionManager)) {\n\t\t\t\t\texistingSessionLoaded = await sessionManager.resumeSession(\n\t\t\t\t\t\tchatReq.sessionId,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconst sessionFile = sessionManager.getSessionFileById(\n\t\t\t\t\t\tchatReq.sessionId,\n\t\t\t\t\t);\n\t\t\t\t\tif (sessionFile) {\n\t\t\t\t\t\tsessionManager.setSessionFile(sessionFile);\n\t\t\t\t\t\texistingSessionLoaded = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst registeredModel = await getRegisteredModel(chatReq.model);\n\n\t\t\tconst headerApproval = (() => {\n\t\t\t\tconst headerMode = normalizeApprovalMode(\n\t\t\t\t\tgetRequestHeader(\n\t\t\t\t\t\treq,\n\t\t\t\t\t\t\"x-composer-approval-mode\",\n\t\t\t\t\t\t\"x-maestro-approval-mode\",\n\t\t\t\t\t) ?? undefined,\n\t\t\t\t);\n\t\t\t\tif (headerMode) {\n\t\t\t\t\treturn headerMode;\n\t\t\t\t}\n\t\t\t\tconst approvalParam = url.searchParams.get(\"approval\");\n\t\t\t\treturn normalizeApprovalMode(approvalParam);\n\t\t\t})();\n\n\t\t\tconst effectiveApproval = resolveApprovalModeForRequest({\n\t\t\t\tsessionId: chatReq.sessionId,\n\t\t\t\tsubject,\n\t\t\t\theaderApprovalMode: headerApproval,\n\t\t\t\tdefaultApprovalMode,\n\t\t\t});\n\n\t\t\tconst clientToolsHeader = (() => {\n\t\t\t\tif (typeof clientToolsFromQuery === \"boolean\") {\n\t\t\t\t\treturn clientToolsFromQuery;\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\tgetRequestHeader(\n\t\t\t\t\t\treq,\n\t\t\t\t\t\t\"x-composer-client-tools\",\n\t\t\t\t\t\t\"x-maestro-client-tools\",\n\t\t\t\t\t) === \"1\"\n\t\t\t\t);\n\t\t\t})();\n\n\t\t\tconst clientHeader = (() => {\n\t\t\t\tif (clientHeaderFromQuery) return clientHeaderFromQuery.toLowerCase();\n\t\t\t\treturn getRequestHeader(\n\t\t\t\t\treq,\n\t\t\t\t\t\"x-composer-client\",\n\t\t\t\t\t\"x-maestro-client\",\n\t\t\t\t)?.toLowerCase();\n\t\t\t})();\n\t\t\tconst sessionIdProvider = () =>\n\t\t\t\tsessionManager.getSessionId() ?? undefined;\n\t\t\tconst requestApprovalService = new WebActionApprovalService(\n\t\t\t\teffectiveApproval,\n\t\t\t\tsessionIdProvider,\n\t\t\t);\n\t\t\tconst toolRetryService = new ServerRequestToolRetryService(\n\t\t\t\t\"prompt\",\n\t\t\t\tsessionIdProvider,\n\t\t\t);\n\n\t\t\tconst agent = await createAgent(\n\t\t\t\tregisteredModel,\n\t\t\t\tchatReq.thinkingLevel || \"off\",\n\t\t\t\teffectiveApproval,\n\t\t\t\t{\n\t\t\t\t\tapprovalService: requestApprovalService,\n\t\t\t\t\ttoolRetryService,\n\t\t\t\t\t...(clientToolsHeader\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tenableClientTools: true,\n\t\t\t\t\t\t\t\tclientToolService:\n\t\t\t\t\t\t\t\t\tclientToolService.forSession(sessionIdProvider),\n\t\t\t\t\t\t\t\tincludeVscodeTools: clientHeader === \"vscode\",\n\t\t\t\t\t\t\t\tincludeJetBrainsTools: clientHeader === \"jetbrains\",\n\t\t\t\t\t\t\t\tincludeConductorTools: clientHeader === \"conductor\",\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst historyMessages = incomingMessages.slice(0, -1);\n\t\t\tconst hydratedHistory = convertComposerMessagesToApp(\n\t\t\t\thistoryMessages,\n\t\t\t\tregisteredModel,\n\t\t\t);\n\t\t\tif (hydratedHistory.length > 0) {\n\t\t\t\tagent.replaceMessages(hydratedHistory);\n\t\t\t} else {\n\t\t\t\tagent.clearMessages();\n\t\t\t}\n\n\t\t\tconst requestId = Math.random().toString(36).slice(2);\n\t\t\tconst modelKey = `${registeredModel.provider}/${registeredModel.id}`;\n\t\t\tconst wsSession = new WsSession(ws, undefined, { requestId, modelKey });\n\t\t\tconst { enterpriseContext } = await import(\"../../enterprise/context.js\");\n\n\t\t\tconst initializeSessionIfNeeded = async (): Promise<string | null> => {\n\t\t\t\tif (existingSessionLoaded || sessionManager.isInitialized()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst initializationError = await startSessionWithPolicy({\n\t\t\t\t\tagent,\n\t\t\t\t\tenterpriseContext,\n\t\t\t\t\tlogger,\n\t\t\t\t\tmodelId: registeredModel.id,\n\t\t\t\t\tonSessionReady: (sessionId) => {\n\t\t\t\t\t\twsSession.sendSessionUpdate(sessionId);\n\t\t\t\t\t\twsSession.setContext({ sessionId });\n\t\t\t\t\t},\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsubject,\n\t\t\t\t});\n\t\t\t\tif (initializationError) {\n\t\t\t\t\treturn initializationError;\n\t\t\t\t}\n\t\t\t\texistingSessionLoaded = true;\n\t\t\t\treturn null;\n\t\t\t};\n\n\t\t\tconst initializationError = await initializeSessionIfNeeded();\n\t\t\tif (initializationError) {\n\t\t\t\twsSession.sendEvent({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `[Policy] ${initializationError}`,\n\t\t\t\t});\n\t\t\t\twsSession.sendDone();\n\t\t\t\twsSession.end();\n\t\t\t\tif (sseLease && releaseSse) {\n\t\t\t\t\treleaseSse(sseLease);\n\t\t\t\t\tsseLease = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst toolArgsByCallId = new Map<string, Record<string, unknown>>();\n\t\t\tconst storeToolArgs = (toolCallId: string, args: unknown) => {\n\t\t\t\ttoolArgsByCallId.set(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\t(args && typeof args === \"object\" && !Array.isArray(args)\n\t\t\t\t\t\t? (args as Record<string, unknown>)\n\t\t\t\t\t\t: {}) as Record<string, unknown>,\n\t\t\t\t);\n\t\t\t};\n\t\t\tconst slimValue = getRequestHeader(\n\t\t\t\treq,\n\t\t\t\t\"x-composer-slim-events\",\n\t\t\t\t\"x-maestro-slim-events\",\n\t\t\t);\n\t\t\tconst slimEvents =\n\t\t\t\ttypeof slimFromQuery === \"boolean\" ? slimFromQuery : slimValue === \"1\";\n\t\t\tconst slimToolCallArgsLimit = (() => {\n\t\t\t\tconst raw = process.env.MAESTRO_SLIM_TOOLCALL_ARGS_MAX_BYTES;\n\t\t\t\tif (!raw) return 4096;\n\t\t\t\tconst parsed = Number(raw);\n\t\t\t\tif (!Number.isFinite(parsed) || parsed <= 0) return 4096;\n\t\t\t\treturn Math.min(parsed, 1024 * 1024);\n\t\t\t})();\n\t\t\tconst extractToolCallInfo = (assistantEvent: {\n\t\t\t\tcontentIndex?: number;\n\t\t\t\tpartial?: { content?: unknown[] };\n\t\t\t}): {\n\t\t\t\ttoolCallId?: string;\n\t\t\t\ttoolCallName?: string;\n\t\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\t\ttoolCallArgsTruncated?: boolean;\n\t\t\t} => {\n\t\t\t\tconst assistantMessageEvent = assistantEvent.partial;\n\t\t\t\tconst contentIndex = assistantEvent.contentIndex;\n\t\t\t\tif (\n\t\t\t\t\t!assistantMessageEvent ||\n\t\t\t\t\ttypeof contentIndex !== \"number\" ||\n\t\t\t\t\t!Array.isArray(assistantMessageEvent.content)\n\t\t\t\t) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tconst block = assistantMessageEvent.content[contentIndex];\n\t\t\t\tif (!block || typeof block !== \"object\") {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tconst maybeToolCall = block as {\n\t\t\t\t\ttype?: string;\n\t\t\t\t\tid?: string;\n\t\t\t\t\tname?: string;\n\t\t\t\t\targuments?: Record<string, unknown>;\n\t\t\t\t};\n\t\t\t\tif (maybeToolCall.type !== \"toolCall\") {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tconst maybeArgs = maybeToolCall.arguments;\n\t\t\t\tconst toolCallArgs =\n\t\t\t\t\tmaybeArgs &&\n\t\t\t\t\ttypeof maybeArgs === \"object\" &&\n\t\t\t\t\t!Array.isArray(maybeArgs)\n\t\t\t\t\t\t? maybeArgs\n\t\t\t\t\t\t: undefined;\n\t\t\t\tif (toolCallArgs) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst size = Buffer.byteLength(\n\t\t\t\t\t\t\tJSON.stringify(toolCallArgs),\n\t\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (size > slimToolCallArgsLimit) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\ttoolCallArgs,\n\t\t\t\t};\n\t\t\t};\n\t\t\tconst maybeSlimEvent = (event: AgentEvent): AgentEvent => {\n\t\t\t\tif (!slimEvents || event.type !== \"message_update\") {\n\t\t\t\t\treturn event;\n\t\t\t\t}\n\n\t\t\t\tconst assistantEvent = event.assistantMessageEvent;\n\t\t\t\tconst slimEvent: Record<string, unknown> = { ...event };\n\t\t\t\tdelete slimEvent.message;\n\n\t\t\t\tif (!assistantEvent) {\n\t\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tassistantEvent.type === \"text_delta\" ||\n\t\t\t\t\tassistantEvent.type === \"thinking_delta\"\n\t\t\t\t) {\n\t\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t};\n\n\t\t\t\t\tslimEvent.assistantMessageEvent = assistantWithoutPartial;\n\t\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tassistantEvent.type === \"toolcall_start\" ||\n\t\t\t\t\tassistantEvent.type === \"toolcall_delta\" ||\n\t\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t\t) {\n\t\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t};\n\t\t\t\t\tconst toolCallInfo =\n\t\t\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: extractToolCallInfo(assistantEvent);\n\n\t\t\t\t\tslimEvent.assistantMessageEvent = {\n\t\t\t\t\t\t...assistantWithoutPartial,\n\t\t\t\t\t\t...toolCallInfo,\n\t\t\t\t\t};\n\t\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t\t}\n\n\t\t\t\tslimEvent.assistantMessageEvent = assistantEvent;\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t};\n\t\t\tconst updateSessionSummary =\n\t\t\t\tcreateRuntimeSessionSummaryUpdater(sessionManager);\n\t\t\tconst automaticMemoryConsolidation =\n\t\t\t\tcreateAutomaticMemoryConsolidationCoordinator({\n\t\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel, {\n\t\t\t\t\t\t\tsystemPrompt: getMemoryConsolidationSystemPrompt(),\n\t\t\t\t\t\t}),\n\t\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t\t});\n\t\t\tconst automaticMemoryExtraction =\n\t\t\t\tcreateAutomaticMemoryExtractionCoordinator({\n\t\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel),\n\t\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t\t\tonProcessed: () => automaticMemoryConsolidation.schedule(),\n\t\t\t\t\tsessionManager,\n\t\t\t\t});\n\t\t\tconst sessionHookService = createSessionHookService({\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t});\n\t\t\tconst unsubscribeMcpElicitationBridge = serverRequestManager.subscribe(\n\t\t\t\t(event) => {\n\t\t\t\t\tconst activeSessionId = sessionIdProvider();\n\t\t\t\t\tif (!activeSessionId || event.request.sessionId !== activeSessionId) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.request.kind !== \"mcp_elicitation\") {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.type === \"registered\") {\n\t\t\t\t\t\twsSession.sendEvent({\n\t\t\t\t\t\t\ttype: \"client_tool_request\",\n\t\t\t\t\t\t\ttoolCallId: event.request.callId,\n\t\t\t\t\t\t\ttoolName: event.request.toolName,\n\t\t\t\t\t\t\targs: event.request.args,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tstoreToolArgs(event.request.callId, event.request.args);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttoolArgsByCallId.delete(event.request.callId);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst unsubscribe = agent.subscribe((event: AgentEvent) => {\n\t\t\t\tupdateSessionSummary(event);\n\n\t\t\t\twsSession.sendEvent(maybeSlimEvent(event));\n\n\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"client_tool_request\") {\n\t\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\t\tif (event.toolName === \"artifacts\" && !event.isError) {\n\t\t\t\t\t\tconst sessionId = sessionManager.getSessionId();\n\t\t\t\t\t\tconst args = toolArgsByCallId.get(event.toolCallId) ?? {};\n\t\t\t\t\t\tconst filename =\n\t\t\t\t\t\t\ttypeof args.filename === \"string\" ? args.filename : null;\n\t\t\t\t\t\tconst command =\n\t\t\t\t\t\t\ttypeof args.command === \"string\" ? args.command : null;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsessionId &&\n\t\t\t\t\t\t\tfilename &&\n\t\t\t\t\t\t\t(command === \"create\" ||\n\t\t\t\t\t\t\t\tcommand === \"update\" ||\n\t\t\t\t\t\t\t\tcommand === \"rewrite\" ||\n\t\t\t\t\t\t\t\tcommand === \"delete\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tpublishArtifactUpdate(sessionId, filename);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttoolArgsByCallId.delete(event.toolCallId);\n\t\t\t\t}\n\n\t\t\t\tif (event.type === \"message_end\") {\n\t\t\t\t\tsessionManager.saveMessage(event.message);\n\t\t\t\t\tif (isAssistantMessage(event.message)) {\n\t\t\t\t\t\trecordAssistantUsageMetric({\n\t\t\t\t\t\t\treq,\n\t\t\t\t\t\t\tmessage: event.message,\n\t\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\t\tsubject,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tautomaticMemoryExtraction.schedule(sessionManager.getSessionFile());\n\t\t\t\t\t}\n\t\t\t\t\tsessionManager.updateSnapshot(\n\t\t\t\t\t\tagent.state,\n\t\t\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t\t\t);\n\t\t\t\t\tdispatchAgentNotification(\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsessionHookService,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsessionManager.updateSnapshot(\n\t\t\t\t\tagent.state,\n\t\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t\t);\n\t\t\t\tdispatchAgentNotification(\n\t\t\t\t\tevent,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionHookService,\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst cleanup = async (aborted = false) => {\n\t\t\t\tif (cleanedUp) return;\n\t\t\t\tcleanedUp = true;\n\t\t\t\tunsubscribe();\n\t\t\t\tunsubscribeMcpElicitationBridge();\n\t\t\t\tawait automaticMemoryExtraction.flush();\n\t\t\t\tawait automaticMemoryConsolidation.flush();\n\t\t\t\tawait sessionManager.flush();\n\t\t\t\tif (aborted) {\n\t\t\t\t\twsSession.sendAborted();\n\t\t\t\t}\n\t\t\t\twsSession.end();\n\t\t\t};\n\n\t\t\tws.on(\"close\", () => {\n\t\t\t\tagent.abort();\n\t\t\t\tvoid cleanup(true);\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst breaker = getAgentCircuitBreaker(registeredModel.provider);\n\t\t\t\tawait runUserPromptWithRecovery({\n\t\t\t\t\tagent,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\tprompt: userInput,\n\t\t\t\t\tattachmentCount: attachmentsToSend?.length ?? 0,\n\t\t\t\t\tattachmentNames: attachmentsToSend?.map(\n\t\t\t\t\t\t(attachment) => attachment.fileName,\n\t\t\t\t\t),\n\t\t\t\t\texecute: () =>\n\t\t\t\t\t\tbreaker.execute(() => agent.prompt(userInput, attachmentsToSend)),\n\t\t\t\t\tgetPostKeepMessages: withMcpPostKeepMessages(),\n\t\t\t\t});\n\t\t\t\twsSession.sendDone();\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"Agent prompt error\",\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t{ sessionId: sessionManager.getSessionId?.() },\n\t\t\t\t);\n\t\t\t\twsSession.sendEvent({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tawait cleanup(false);\n\t\t\t\tif (sseLease && releaseSse) {\n\t\t\t\t\treleaseSse(sseLease);\n\t\t\t\t\tsseLease = null;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Chat websocket error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t\tsendErrorAndClose(\n\t\t\t\terror instanceof Error ? error.message : \"Chat websocket error\",\n\t\t\t);\n\t\t\tif (sseLease && releaseSse) {\n\t\t\t\treleaseSse(sseLease);\n\t\t\t\tsseLease = null;\n\t\t\t}\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"chat-ws.js","sourceRoot":"","sources":["../../../src/server/handlers/chat-ws.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WebSocket chat handler for agent conversations.\n *\n * Mirrors the SSE chat flow but streams AgentEvent payloads over WebSocket.\n */\n\nimport type { IncomingMessage } from \"node:http\";\nimport type { ComposerChatRequest, ComposerMessage } from \"@evalops/contracts\";\nimport type { RawData, WebSocket } from \"ws\";\nimport { isAssistantMessage } from \"../../agent/type-guards.js\";\nimport type {\n\tAttachment as AgentAttachment,\n\tAgentEvent,\n} from \"../../agent/types.js\";\nimport { runUserPromptWithRecovery } from \"../../agent/user-prompt-runtime.js\";\nimport { dispatchAgentNotification } from \"../../hooks/notification-hooks.js\";\nimport { createSessionHookService } from \"../../hooks/session-integration.js\";\nimport { withMcpPostKeepMessages } from \"../../mcp/prompt-recovery.js\";\nimport {\n\tcreateAutomaticMemoryConsolidationCoordinator,\n\tgetMemoryConsolidationSystemPrompt,\n} from \"../../memory/auto-consolidation.js\";\nimport { createAutomaticMemoryExtractionCoordinator } from \"../../memory/auto-extraction.js\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport { recordAssistantUsageMetric } from \"../../services/usage-analytics/recorder.js\";\nimport { toSessionModelMetadata } from \"../../session/manager.js\";\nimport { createRuntimeSessionSummaryUpdater } from \"../../session/runtime-summary-updater.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nimport type { WebServerContext } from \"../app-context.js\";\nimport {\n\tnormalizeApprovalMode,\n\tresolveApprovalModeForRequest,\n} from \"../approval-mode-store.js\";\nimport { WebActionApprovalService } from \"../approval-service.js\";\nimport { publishArtifactUpdate } from \"../artifacts-live-reload.js\";\nimport { getAuthSubject } from \"../authz.js\";\nimport { getAgentCircuitBreaker } from \"../circuit-breaker.js\";\nimport { clientToolService } from \"../client-tools-service.js\";\nimport { isHostedSessionManager } from \"../hosted-session-manager.js\";\nimport { serverRequestManager } from \"../server-request-manager.js\";\nimport { getRequestHeader } from \"../server-utils.js\";\nimport { startSessionWithPolicy } from \"../session-initialization.js\";\nimport { createWebSessionManagerForRequest } from \"../session-scope.js\";\nimport { convertComposerMessagesToApp } from \"../session-serialization.js\";\nimport type { SseContext, SseSkipListener } from \"../sse-session.js\";\nimport { ServerRequestToolRetryService } from \"../tool-retry-service.js\";\nimport {\n\ttype ChatRequestInput,\n\tChatRequestSchema,\n\tvalidatePayload,\n} from \"../validation.js\";\n\nconst logger = createLogger(\"web:chat-ws\");\n\nconst noopAutomaticMemoryExtraction = {\n\tschedule: (_sessionPath?: string | null) => {},\n\tflush: async () => {},\n};\n\nconst noopAutomaticMemoryConsolidation = {\n\tschedule: () => {},\n\tflush: async () => {},\n};\n\nfunction getComposerTextContent(content: ComposerMessage[\"content\"]): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n}\n\nclass WsSession {\n\tprivate closed = false;\n\tprivate skippedWrites = 0;\n\tprivate sentWrites = 0;\n\tprivate lastError?: unknown;\n\tprivate context: SseContext = {};\n\n\tconstructor(\n\t\tprivate readonly ws: WebSocket,\n\t\tprivate readonly onSkip?: SseSkipListener,\n\t\tcontext?: SseContext,\n\t) {\n\t\tif (context) {\n\t\t\tthis.context = context;\n\t\t}\n\t}\n\n\tprivate canWrite(): boolean {\n\t\treturn this.ws.readyState === 1;\n\t}\n\n\tprivate write(payload: string): boolean {\n\t\tif (!this.canWrite()) {\n\t\t\tthis.skippedWrites++;\n\t\t\tthis.notifySkip();\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tthis.ws.send(payload);\n\t\t\tthis.sentWrites++;\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.skippedWrites++;\n\t\t\tthis.lastError = error;\n\t\t\tthis.notifySkip();\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tsendEvent(event: AgentEvent): void {\n\t\tthis.write(JSON.stringify(event));\n\t}\n\n\tsendSessionUpdate(sessionId: string): void {\n\t\tthis.write(JSON.stringify({ type: \"session_update\", sessionId }));\n\t}\n\n\tsendHeartbeat(): void {\n\t\tthis.write(JSON.stringify({ type: \"heartbeat\" }));\n\t}\n\n\tsendAborted(): void {\n\t\tthis.write(JSON.stringify({ type: \"aborted\" }));\n\t}\n\n\tsendDone(): void {\n\t\tthis.write(JSON.stringify({ type: \"done\" }));\n\t}\n\n\tend(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tif (!this.canWrite()) return;\n\t\ttry {\n\t\t\tthis.ws.close();\n\t\t} catch (error) {\n\t\t\tthis.skippedWrites++;\n\t\t\tthis.lastError = error;\n\t\t\tthis.notifySkip();\n\t\t}\n\t}\n\n\tgetMetrics(): { sent: number; skipped: number; lastError?: unknown } {\n\t\treturn {\n\t\t\tsent: this.sentWrites,\n\t\t\tskipped: this.skippedWrites,\n\t\t\tlastError: this.lastError,\n\t\t};\n\t}\n\n\tsetContext(context: SseContext): void {\n\t\tthis.context = { ...this.context, ...context };\n\t}\n\n\tprivate notifySkip(): void {\n\t\tif (this.skippedWrites <= 1) return;\n\t\tif (this.onSkip) {\n\t\t\tthis.onSkip({\n\t\t\t\tsent: this.sentWrites,\n\t\t\t\tskipped: this.skippedWrites,\n\t\t\t\tlastError: this.lastError,\n\t\t\t\tcontext: this.context,\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction parseBoolean(input?: string | null): boolean | undefined {\n\tif (!input) return undefined;\n\tconst normalized = input.toLowerCase().trim();\n\tif ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n\tif ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n\treturn undefined;\n}\n\nfunction getRawDataSize(data: RawData): number {\n\tif (typeof data === \"string\") {\n\t\treturn Buffer.byteLength(data, \"utf8\");\n\t}\n\tif (Buffer.isBuffer(data)) {\n\t\treturn data.length;\n\t}\n\tif (data instanceof ArrayBuffer) {\n\t\treturn data.byteLength;\n\t}\n\tif (Array.isArray(data)) {\n\t\treturn data.reduce((total, chunk) => total + chunk.length, 0);\n\t}\n\treturn 0;\n}\n\nfunction rawDataToString(data: RawData, maxPayload: number): string {\n\tconst size = getRawDataSize(data);\n\tif (size > maxPayload) {\n\t\tthrow new Error(\"Payload too large\");\n\t}\n\tif (typeof data === \"string\") {\n\t\treturn data;\n\t}\n\tif (Buffer.isBuffer(data)) {\n\t\treturn data.toString(\"utf8\");\n\t}\n\tif (Array.isArray(data)) {\n\t\treturn Buffer.concat(data).toString(\"utf8\");\n\t}\n\tif (data instanceof ArrayBuffer) {\n\t\treturn Buffer.from(data).toString(\"utf8\");\n\t}\n\treturn \"\";\n}\n\nexport function handleChatWebSocket(\n\tws: WebSocket,\n\treq: IncomingMessage,\n\tcontext: WebServerContext,\n) {\n\tconst {\n\t\tcreateAgent,\n\t\tcreateBackgroundAgent,\n\t\tgetRegisteredModel,\n\t\tdefaultApprovalMode,\n\t\tacquireSse,\n\t\treleaseSse,\n\t} = context;\n\n\tlet sseLease: symbol | null = null;\n\tlet cleanedUp = false;\n\tlet cleanupPromise: Promise<void> | null = null;\n\tlet requestHandled = false;\n\n\tconst url = new URL(\n\t\treq.url || \"/api/chat/ws\",\n\t\t`http://${req.headers.host || \"localhost\"}`,\n\t);\n\n\tconst clientToolsFromQuery = parseBoolean(\n\t\turl.searchParams.get(\"clientTools\"),\n\t);\n\tconst slimFromQuery = parseBoolean(url.searchParams.get(\"slim\"));\n\tconst clientHeaderFromQuery = url.searchParams.get(\"client\")?.trim();\n\n\tconst sendErrorAndClose = (message: string) => {\n\t\ttry {\n\t\t\tconst session = new WsSession(ws);\n\t\t\tsession.sendEvent({ type: \"error\", message });\n\t\t\tsession.sendDone();\n\t\t\tsession.end();\n\t\t} catch {\n\t\t\tws.close();\n\t\t}\n\t};\n\n\tconst maxPayload =\n\t\tNumber.parseInt(process.env.MAESTRO_WS_MAX_PAYLOAD || \"1048576\", 10) ||\n\t\t1048576;\n\tconst parseRequest = (data: RawData): ComposerChatRequest => {\n\t\tconst raw = rawDataToString(data, maxPayload);\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(raw);\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid JSON payload\");\n\t\t}\n\t\treturn validatePayload<ChatRequestInput>(parsed, ChatRequestSchema);\n\t};\n\n\tws.on(\"message\", async (data) => {\n\t\tif (requestHandled) {\n\t\t\ttry {\n\t\t\t\tconst size = getRawDataSize(data);\n\t\t\t\tif (size > maxPayload) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst raw = rawDataToString(data, maxPayload);\n\t\t\t\tconst parsed = JSON.parse(raw);\n\t\t\t\tif (parsed && typeof parsed === \"object\" && parsed.type === \"abort\") {\n\t\t\t\t\tws.close();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\trequestHandled = true;\n\t\ttry {\n\t\t\tlet chatReq: ComposerChatRequest;\n\t\t\ttry {\n\t\t\t\tchatReq = parseRequest(data);\n\t\t\t} catch (error) {\n\t\t\t\tsendErrorAndClose(\n\t\t\t\t\terror instanceof Error ? error.message : \"Invalid chat request\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst incomingMessages = Array.isArray(chatReq.messages)\n\t\t\t\t? (chatReq.messages as ComposerMessage[])\n\t\t\t\t: [];\n\t\t\tif (incomingMessages.length === 0) {\n\t\t\t\tsendErrorAndClose(\"No messages supplied\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst latestMessage = incomingMessages[incomingMessages.length - 1];\n\t\t\tif (!latestMessage || latestMessage.role !== \"user\") {\n\t\t\t\tsendErrorAndClose(\"Last message must be a user message\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { attachmentsToSend, attachmentError } = (() => {\n\t\t\t\tconst MAX_ATTACHMENT_BYTES = 8 * 1024 * 1024;\n\t\t\t\tconst MAX_TOTAL_BYTES = 20 * 1024 * 1024;\n\n\t\t\t\tconst raw = latestMessage.attachments;\n\t\t\t\tif (!Array.isArray(raw) || raw.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tattachmentsToSend: undefined as AgentAttachment[] | undefined,\n\t\t\t\t\t\tattachmentError: null as string | null,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst attachments: AgentAttachment[] = [];\n\t\t\t\tlet totalBytes = 0;\n\n\t\t\t\tfor (const item of raw) {\n\t\t\t\t\tif (!item || typeof item !== \"object\") continue;\n\t\t\t\t\tconst id = typeof item.id === \"string\" ? item.id : \"\";\n\t\t\t\t\tconst type =\n\t\t\t\t\t\titem.type === \"image\" || item.type === \"document\"\n\t\t\t\t\t\t\t? item.type\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\tconst fileName =\n\t\t\t\t\t\ttypeof item.fileName === \"string\" ? item.fileName : \"attachment\";\n\t\t\t\t\tconst mimeType =\n\t\t\t\t\t\ttypeof item.mimeType === \"string\"\n\t\t\t\t\t\t\t? item.mimeType\n\t\t\t\t\t\t\t: \"application/octet-stream\";\n\t\t\t\t\tconst size =\n\t\t\t\t\t\ttypeof item.size === \"number\" && Number.isFinite(item.size)\n\t\t\t\t\t\t\t? item.size\n\t\t\t\t\t\t\t: 0;\n\t\t\t\t\tconst content = typeof item.content === \"string\" ? item.content : \"\";\n\t\t\t\t\tconst extractedText =\n\t\t\t\t\t\ttypeof item.extractedText === \"string\"\n\t\t\t\t\t\t\t? item.extractedText\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst preview =\n\t\t\t\t\t\ttypeof item.preview === \"string\" ? item.preview : undefined;\n\n\t\t\t\t\tif (!id || !type) continue;\n\t\t\t\t\tif (!content) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst approxBytes = Math.floor((content.length * 3) / 4);\n\t\t\t\t\tconst bytes = approxBytes > 0 ? approxBytes : size;\n\n\t\t\t\t\tif (bytes > MAX_ATTACHMENT_BYTES) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\t\tattachmentError: `Attachment too large: ${fileName} (${Math.ceil(bytes / 1024 / 1024)}MB). Max per file is ${Math.ceil(MAX_ATTACHMENT_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\ttotalBytes += bytes;\n\t\t\t\t\tif (totalBytes > MAX_TOTAL_BYTES) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\t\tattachmentError: `Attachments too large: total exceeds ${Math.ceil(MAX_TOTAL_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tattachments.push({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tfileName,\n\t\t\t\t\t\tmimeType,\n\t\t\t\t\t\tsize: size || bytes,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\textractedText,\n\t\t\t\t\t\tpreview,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tattachmentsToSend: attachments.length ? attachments : undefined,\n\t\t\t\t\tattachmentError: null,\n\t\t\t\t};\n\t\t\t})();\n\n\t\t\tif (attachmentError) {\n\t\t\t\tsendErrorAndClose(attachmentError);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst userInput = getComposerTextContent(latestMessage.content).trim();\n\t\t\tif (!userInput && !attachmentsToSend) {\n\t\t\t\tsendErrorAndClose(\"User message cannot be empty\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (acquireSse) {\n\t\t\t\tsseLease = acquireSse();\n\t\t\t\tif (!sseLease) {\n\t\t\t\t\tsendErrorAndClose(\"Too many active streaming connections\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst sessionManager = createWebSessionManagerForRequest(req, false);\n\t\t\tconst subject = getAuthSubject(req);\n\t\t\tlet existingSessionLoaded = false;\n\t\t\tif (chatReq.sessionId) {\n\t\t\t\tif (isHostedSessionManager(sessionManager)) {\n\t\t\t\t\texistingSessionLoaded = await sessionManager.resumeSession(\n\t\t\t\t\t\tchatReq.sessionId,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconst sessionFile = sessionManager.getSessionFileById(\n\t\t\t\t\t\tchatReq.sessionId,\n\t\t\t\t\t);\n\t\t\t\t\tif (sessionFile) {\n\t\t\t\t\t\tsessionManager.setSessionFile(sessionFile);\n\t\t\t\t\t\texistingSessionLoaded = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst registeredModel = await getRegisteredModel(chatReq.model);\n\n\t\t\tconst headerApproval = (() => {\n\t\t\t\tconst headerMode = normalizeApprovalMode(\n\t\t\t\t\tgetRequestHeader(\n\t\t\t\t\t\treq,\n\t\t\t\t\t\t\"x-composer-approval-mode\",\n\t\t\t\t\t\t\"x-maestro-approval-mode\",\n\t\t\t\t\t) ?? undefined,\n\t\t\t\t);\n\t\t\t\tif (headerMode) {\n\t\t\t\t\treturn headerMode;\n\t\t\t\t}\n\t\t\t\tconst approvalParam = url.searchParams.get(\"approval\");\n\t\t\t\treturn normalizeApprovalMode(approvalParam);\n\t\t\t})();\n\n\t\t\tconst effectiveApproval = resolveApprovalModeForRequest({\n\t\t\t\tsessionId: chatReq.sessionId,\n\t\t\t\tsubject,\n\t\t\t\theaderApprovalMode: headerApproval,\n\t\t\t\tdefaultApprovalMode,\n\t\t\t});\n\n\t\t\tconst clientToolsHeader = (() => {\n\t\t\t\tif (typeof clientToolsFromQuery === \"boolean\") {\n\t\t\t\t\treturn clientToolsFromQuery;\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\tgetRequestHeader(\n\t\t\t\t\t\treq,\n\t\t\t\t\t\t\"x-composer-client-tools\",\n\t\t\t\t\t\t\"x-maestro-client-tools\",\n\t\t\t\t\t) === \"1\"\n\t\t\t\t);\n\t\t\t})();\n\n\t\t\tconst clientHeader = (() => {\n\t\t\t\tif (clientHeaderFromQuery) return clientHeaderFromQuery.toLowerCase();\n\t\t\t\treturn getRequestHeader(\n\t\t\t\t\treq,\n\t\t\t\t\t\"x-composer-client\",\n\t\t\t\t\t\"x-maestro-client\",\n\t\t\t\t)?.toLowerCase();\n\t\t\t})();\n\t\t\tconst sessionIdProvider = () =>\n\t\t\t\tsessionManager.getSessionId() ?? undefined;\n\t\t\tconst requestApprovalService = new WebActionApprovalService(\n\t\t\t\teffectiveApproval,\n\t\t\t\tsessionIdProvider,\n\t\t\t);\n\t\t\tconst toolRetryService = new ServerRequestToolRetryService(\n\t\t\t\t\"prompt\",\n\t\t\t\tsessionIdProvider,\n\t\t\t);\n\n\t\t\tconst agent = await createAgent(\n\t\t\t\tregisteredModel,\n\t\t\t\tchatReq.thinkingLevel || \"off\",\n\t\t\t\teffectiveApproval,\n\t\t\t\t{\n\t\t\t\t\tapprovalService: requestApprovalService,\n\t\t\t\t\ttoolRetryService,\n\t\t\t\t\t...(clientToolsHeader\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tenableClientTools: true,\n\t\t\t\t\t\t\t\tclientToolService:\n\t\t\t\t\t\t\t\t\tclientToolService.forSession(sessionIdProvider),\n\t\t\t\t\t\t\t\tincludeVscodeTools: clientHeader === \"vscode\",\n\t\t\t\t\t\t\t\tincludeJetBrainsTools: clientHeader === \"jetbrains\",\n\t\t\t\t\t\t\t\tincludeConductorTools: clientHeader === \"conductor\",\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst historyMessages = incomingMessages.slice(0, -1);\n\t\t\tconst hydratedHistory = convertComposerMessagesToApp(\n\t\t\t\thistoryMessages,\n\t\t\t\tregisteredModel,\n\t\t\t);\n\t\t\tif (hydratedHistory.length > 0) {\n\t\t\t\tagent.replaceMessages(hydratedHistory);\n\t\t\t} else {\n\t\t\t\tagent.clearMessages();\n\t\t\t}\n\n\t\t\tconst requestId = Math.random().toString(36).slice(2);\n\t\t\tconst modelKey = `${registeredModel.provider}/${registeredModel.id}`;\n\t\t\tconst wsSession = new WsSession(ws, undefined, { requestId, modelKey });\n\t\t\tconst { enterpriseContext } = await import(\"../../enterprise/context.js\");\n\n\t\t\tconst initializeSessionIfNeeded = async (): Promise<string | null> => {\n\t\t\t\tif (existingSessionLoaded || sessionManager.isInitialized()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst initializationError = await startSessionWithPolicy({\n\t\t\t\t\tagent,\n\t\t\t\t\tenterpriseContext,\n\t\t\t\t\tlogger,\n\t\t\t\t\tmodelId: registeredModel.id,\n\t\t\t\t\tonSessionReady: (sessionId) => {\n\t\t\t\t\t\twsSession.sendSessionUpdate(sessionId);\n\t\t\t\t\t\twsSession.setContext({ sessionId });\n\t\t\t\t\t},\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsubject,\n\t\t\t\t});\n\t\t\t\tif (initializationError) {\n\t\t\t\t\treturn initializationError;\n\t\t\t\t}\n\t\t\t\texistingSessionLoaded = true;\n\t\t\t\treturn null;\n\t\t\t};\n\n\t\t\tconst initializationError = await initializeSessionIfNeeded();\n\t\t\tif (initializationError) {\n\t\t\t\twsSession.sendEvent({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `[Policy] ${initializationError}`,\n\t\t\t\t});\n\t\t\t\twsSession.sendDone();\n\t\t\t\twsSession.end();\n\t\t\t\tif (sseLease && releaseSse) {\n\t\t\t\t\treleaseSse(sseLease);\n\t\t\t\t\tsseLease = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst toolArgsByCallId = new Map<string, Record<string, unknown>>();\n\t\t\tconst storeToolArgs = (toolCallId: string, args: unknown) => {\n\t\t\t\ttoolArgsByCallId.set(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\t(args && typeof args === \"object\" && !Array.isArray(args)\n\t\t\t\t\t\t? (args as Record<string, unknown>)\n\t\t\t\t\t\t: {}) as Record<string, unknown>,\n\t\t\t\t);\n\t\t\t};\n\t\t\tconst slimValue = getRequestHeader(\n\t\t\t\treq,\n\t\t\t\t\"x-composer-slim-events\",\n\t\t\t\t\"x-maestro-slim-events\",\n\t\t\t);\n\t\t\tconst slimEvents =\n\t\t\t\ttypeof slimFromQuery === \"boolean\" ? slimFromQuery : slimValue === \"1\";\n\t\t\tconst slimToolCallArgsLimit = (() => {\n\t\t\t\tconst raw = process.env.MAESTRO_SLIM_TOOLCALL_ARGS_MAX_BYTES;\n\t\t\t\tif (!raw) return 4096;\n\t\t\t\tconst parsed = Number(raw);\n\t\t\t\tif (!Number.isFinite(parsed) || parsed <= 0) return 4096;\n\t\t\t\treturn Math.min(parsed, 1024 * 1024);\n\t\t\t})();\n\t\t\tconst extractToolCallInfo = (assistantEvent: {\n\t\t\t\tcontentIndex?: number;\n\t\t\t\tpartial?: { content?: unknown[] };\n\t\t\t}): {\n\t\t\t\ttoolCallId?: string;\n\t\t\t\ttoolCallName?: string;\n\t\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\t\ttoolCallArgsTruncated?: boolean;\n\t\t\t} => {\n\t\t\t\tconst assistantMessageEvent = assistantEvent.partial;\n\t\t\t\tconst contentIndex = assistantEvent.contentIndex;\n\t\t\t\tif (\n\t\t\t\t\t!assistantMessageEvent ||\n\t\t\t\t\ttypeof contentIndex !== \"number\" ||\n\t\t\t\t\t!Array.isArray(assistantMessageEvent.content)\n\t\t\t\t) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tconst block = assistantMessageEvent.content[contentIndex];\n\t\t\t\tif (!block || typeof block !== \"object\") {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tconst maybeToolCall = block as {\n\t\t\t\t\ttype?: string;\n\t\t\t\t\tid?: string;\n\t\t\t\t\tname?: string;\n\t\t\t\t\targuments?: Record<string, unknown>;\n\t\t\t\t};\n\t\t\t\tif (maybeToolCall.type !== \"toolCall\") {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tconst maybeArgs = maybeToolCall.arguments;\n\t\t\t\tconst toolCallArgs =\n\t\t\t\t\tmaybeArgs &&\n\t\t\t\t\ttypeof maybeArgs === \"object\" &&\n\t\t\t\t\t!Array.isArray(maybeArgs)\n\t\t\t\t\t\t? maybeArgs\n\t\t\t\t\t\t: undefined;\n\t\t\t\tif (toolCallArgs) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst size = Buffer.byteLength(\n\t\t\t\t\t\t\tJSON.stringify(toolCallArgs),\n\t\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (size > slimToolCallArgsLimit) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\ttoolCallArgs,\n\t\t\t\t};\n\t\t\t};\n\t\t\tconst maybeSlimEvent = (event: AgentEvent): AgentEvent => {\n\t\t\t\tif (!slimEvents || event.type !== \"message_update\") {\n\t\t\t\t\treturn event;\n\t\t\t\t}\n\n\t\t\t\tconst assistantEvent = event.assistantMessageEvent;\n\t\t\t\tconst slimEvent: Record<string, unknown> = { ...event };\n\t\t\t\tdelete slimEvent.message;\n\n\t\t\t\tif (!assistantEvent) {\n\t\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tassistantEvent.type === \"text_delta\" ||\n\t\t\t\t\tassistantEvent.type === \"thinking_delta\"\n\t\t\t\t) {\n\t\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t};\n\n\t\t\t\t\tslimEvent.assistantMessageEvent = assistantWithoutPartial;\n\t\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tassistantEvent.type === \"toolcall_start\" ||\n\t\t\t\t\tassistantEvent.type === \"toolcall_delta\" ||\n\t\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t\t) {\n\t\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t};\n\t\t\t\t\tconst toolCallInfo =\n\t\t\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: extractToolCallInfo(assistantEvent);\n\n\t\t\t\t\tslimEvent.assistantMessageEvent = {\n\t\t\t\t\t\t...assistantWithoutPartial,\n\t\t\t\t\t\t...toolCallInfo,\n\t\t\t\t\t};\n\t\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t\t}\n\n\t\t\t\tslimEvent.assistantMessageEvent = assistantEvent;\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t};\n\t\t\tconst updateSessionSummary =\n\t\t\t\tcreateRuntimeSessionSummaryUpdater(sessionManager);\n\t\t\tconst automaticMemoryConsolidation =\n\t\t\t\ttypeof createBackgroundAgent === \"function\"\n\t\t\t\t\t? createAutomaticMemoryConsolidationCoordinator({\n\t\t\t\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel, {\n\t\t\t\t\t\t\t\t\tsystemPrompt: getMemoryConsolidationSystemPrompt(),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t\t\t\t})\n\t\t\t\t\t: noopAutomaticMemoryConsolidation;\n\t\t\tconst automaticMemoryExtraction =\n\t\t\t\ttypeof createBackgroundAgent === \"function\"\n\t\t\t\t\t? createAutomaticMemoryExtractionCoordinator({\n\t\t\t\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel),\n\t\t\t\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t\t\t\t\tonProcessed: () => automaticMemoryConsolidation.schedule(),\n\t\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\t})\n\t\t\t\t\t: noopAutomaticMemoryExtraction;\n\t\t\tconst sessionHookService = createSessionHookService({\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t});\n\t\t\tconst unsubscribeMcpElicitationBridge = serverRequestManager.subscribe(\n\t\t\t\t(event) => {\n\t\t\t\t\tconst activeSessionId = sessionIdProvider();\n\t\t\t\t\tif (!activeSessionId || event.request.sessionId !== activeSessionId) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.request.kind !== \"mcp_elicitation\") {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.type === \"registered\") {\n\t\t\t\t\t\twsSession.sendEvent({\n\t\t\t\t\t\t\ttype: \"client_tool_request\",\n\t\t\t\t\t\t\ttoolCallId: event.request.callId,\n\t\t\t\t\t\t\ttoolName: event.request.toolName,\n\t\t\t\t\t\t\targs: event.request.args,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tstoreToolArgs(event.request.callId, event.request.args);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttoolArgsByCallId.delete(event.request.callId);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst unsubscribe = agent.subscribe((event: AgentEvent) => {\n\t\t\t\tupdateSessionSummary(event);\n\n\t\t\t\twsSession.sendEvent(maybeSlimEvent(event));\n\n\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"client_tool_request\") {\n\t\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\t\tif (event.toolName === \"artifacts\" && !event.isError) {\n\t\t\t\t\t\tconst sessionId = sessionManager.getSessionId();\n\t\t\t\t\t\tconst args = toolArgsByCallId.get(event.toolCallId) ?? {};\n\t\t\t\t\t\tconst filename =\n\t\t\t\t\t\t\ttypeof args.filename === \"string\" ? args.filename : null;\n\t\t\t\t\t\tconst command =\n\t\t\t\t\t\t\ttypeof args.command === \"string\" ? args.command : null;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsessionId &&\n\t\t\t\t\t\t\tfilename &&\n\t\t\t\t\t\t\t(command === \"create\" ||\n\t\t\t\t\t\t\t\tcommand === \"update\" ||\n\t\t\t\t\t\t\t\tcommand === \"rewrite\" ||\n\t\t\t\t\t\t\t\tcommand === \"delete\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tpublishArtifactUpdate(sessionId, filename);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttoolArgsByCallId.delete(event.toolCallId);\n\t\t\t\t}\n\n\t\t\t\tif (event.type === \"message_end\") {\n\t\t\t\t\tsessionManager.saveMessage(event.message);\n\t\t\t\t\tif (isAssistantMessage(event.message)) {\n\t\t\t\t\t\trecordAssistantUsageMetric({\n\t\t\t\t\t\t\treq,\n\t\t\t\t\t\t\tmessage: event.message,\n\t\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\t\tsubject,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tautomaticMemoryExtraction.schedule(sessionManager.getSessionFile());\n\t\t\t\t\t}\n\t\t\t\t\tsessionManager.updateSnapshot(\n\t\t\t\t\t\tagent.state,\n\t\t\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t\t\t);\n\t\t\t\t\tdispatchAgentNotification(\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsessionHookService,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsessionManager.updateSnapshot(\n\t\t\t\t\tagent.state,\n\t\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t\t);\n\t\t\t\tdispatchAgentNotification(\n\t\t\t\t\tevent,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionHookService,\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tconst cleanup = async (aborted = false) => {\n\t\t\t\tif (cleanupPromise) return cleanupPromise;\n\t\t\t\tcleanupPromise = (async () => {\n\t\t\t\t\tif (cleanedUp) return;\n\t\t\t\t\tcleanedUp = true;\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tunsubscribeMcpElicitationBridge();\n\t\t\t\t\tawait automaticMemoryExtraction.flush();\n\t\t\t\t\tawait automaticMemoryConsolidation.flush();\n\t\t\t\t\tawait sessionManager.flush();\n\t\t\t\t\tif (aborted) {\n\t\t\t\t\t\twsSession.sendAborted();\n\t\t\t\t\t}\n\t\t\t\t\twsSession.end();\n\t\t\t\t})();\n\t\t\t\treturn cleanupPromise;\n\t\t\t};\n\n\t\t\tws.on(\"close\", () => {\n\t\t\t\tagent.abort();\n\t\t\t\tvoid cleanup(true);\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst breaker = getAgentCircuitBreaker(registeredModel.provider);\n\t\t\t\tawait runUserPromptWithRecovery({\n\t\t\t\t\tagent,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\tprompt: userInput,\n\t\t\t\t\tattachmentCount: attachmentsToSend?.length ?? 0,\n\t\t\t\t\tattachmentNames: attachmentsToSend?.map(\n\t\t\t\t\t\t(attachment) => attachment.fileName,\n\t\t\t\t\t),\n\t\t\t\t\texecute: () =>\n\t\t\t\t\t\tbreaker.execute(() => agent.prompt(userInput, attachmentsToSend)),\n\t\t\t\t\tgetPostKeepMessages: withMcpPostKeepMessages(),\n\t\t\t\t});\n\t\t\t\twsSession.sendDone();\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"Agent prompt error\",\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t{ sessionId: sessionManager.getSessionId?.() },\n\t\t\t\t);\n\t\t\t\twsSession.sendEvent({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tawait cleanup(false);\n\t\t\t\tif (sseLease && releaseSse) {\n\t\t\t\t\treleaseSse(sseLease);\n\t\t\t\t\tsseLease = null;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Chat websocket error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t\tsendErrorAndClose(\n\t\t\t\terror instanceof Error ? error.message : \"Chat websocket error\",\n\t\t\t);\n\t\t\tif (sseLease && releaseSse) {\n\t\t\t\treleaseSse(sseLease);\n\t\t\t\tsseLease = null;\n\t\t\t}\n\t\t}\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA+BjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAyC1D;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC/B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBA0vBzB"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA+BjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAmD1D;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC/B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAqwBzB"}
@@ -52,6 +52,14 @@ import { SseSession, sendSSE, sendSessionUpdate } from "../sse-session.js";
52
52
  import { ServerRequestToolRetryService } from "../tool-retry-service.js";
53
53
  import { ChatRequestSchema, parseAndValidateJson, } from "../validation.js";
54
54
  const logger = createLogger("web:chat");
55
+ const noopAutomaticMemoryExtraction = {
56
+ schedule: (_sessionPath) => { },
57
+ flush: async () => { },
58
+ };
59
+ const noopAutomaticMemoryConsolidation = {
60
+ schedule: () => { },
61
+ flush: async () => { },
62
+ };
55
63
  function getComposerTextContent(content) {
56
64
  if (typeof content === "string")
57
65
  return content;
@@ -309,6 +317,7 @@ export async function handleChat(req, res, context) {
309
317
  sseSession.startHeartbeat(); // Keep connection alive during idle periods
310
318
  // Track cleanup state to prevent double-cleanup
311
319
  let cleanedUp = false;
320
+ let cleanupPromise = null;
312
321
  // ===== Phase 5: Agent Event Subscription =====
313
322
  // Subscribe to agent events and forward them to the SSE stream
314
323
  // Pre-load enterprise context for session tracking
@@ -443,18 +452,22 @@ export async function handleChat(req, res, context) {
443
452
  return slimEvent;
444
453
  };
445
454
  const updateSessionSummary = createRuntimeSessionSummaryUpdater(sessionManager);
446
- const automaticMemoryConsolidation = createAutomaticMemoryConsolidationCoordinator({
447
- createAgent: async () => createBackgroundAgent(agent.state.model, {
448
- systemPrompt: getMemoryConsolidationSystemPrompt(),
449
- }),
450
- getModel: () => agent.state.model,
451
- });
452
- const automaticMemoryExtraction = createAutomaticMemoryExtractionCoordinator({
453
- createAgent: async () => createBackgroundAgent(agent.state.model),
454
- getModel: () => agent.state.model,
455
- onProcessed: () => automaticMemoryConsolidation.schedule(),
456
- sessionManager,
457
- });
455
+ const automaticMemoryConsolidation = typeof createBackgroundAgent === "function"
456
+ ? createAutomaticMemoryConsolidationCoordinator({
457
+ createAgent: async () => createBackgroundAgent(agent.state.model, {
458
+ systemPrompt: getMemoryConsolidationSystemPrompt(),
459
+ }),
460
+ getModel: () => agent.state.model,
461
+ })
462
+ : noopAutomaticMemoryConsolidation;
463
+ const automaticMemoryExtraction = typeof createBackgroundAgent === "function"
464
+ ? createAutomaticMemoryExtractionCoordinator({
465
+ createAgent: async () => createBackgroundAgent(agent.state.model),
466
+ getModel: () => agent.state.model,
467
+ onProcessed: () => automaticMemoryConsolidation.schedule(),
468
+ sessionManager,
469
+ })
470
+ : noopAutomaticMemoryExtraction;
458
471
  const sessionHookService = createSessionHookService({
459
472
  cwd: process.cwd(),
460
473
  sessionId: sessionManager.getSessionId(),
@@ -574,31 +587,37 @@ export async function handleChat(req, res, context) {
574
587
  * Idempotent - safe to call multiple times.
575
588
  */
576
589
  const cleanup = async (aborted = false) => {
577
- if (cleanedUp) {
578
- return;
590
+ if (cleanupPromise) {
591
+ return cleanupPromise;
579
592
  }
580
- cleanedUp = true;
581
- // Stop keepalive and remove event listeners
582
- sseSession.stopHeartbeat();
583
- req.off("close", handleConnectionClose);
584
- res.off("close", handleConnectionClose);
585
- unsubscribe();
586
- unsubscribeMcpElicitationBridge();
587
- await automaticMemoryExtraction.flush();
588
- await automaticMemoryConsolidation.flush();
589
- await sessionManager.flush();
590
- // Send final SSE events if connection is still open
591
- if (!res.writableEnded) {
592
- if (aborted) {
593
- sseSession.sendAborted();
593
+ cleanupPromise = (async () => {
594
+ if (cleanedUp) {
595
+ return;
594
596
  }
595
- sseSession.end();
596
- }
597
- // Log if we had to skip writes due to client disconnect
598
- const metrics = sseSession.getMetrics();
599
- if (metrics.skipped > 0) {
600
- console.debug("SSE writes skipped after disconnect", metrics);
601
- }
597
+ cleanedUp = true;
598
+ // Stop keepalive and remove event listeners
599
+ sseSession.stopHeartbeat();
600
+ req.off("close", handleConnectionClose);
601
+ res.off("close", handleConnectionClose);
602
+ unsubscribe();
603
+ unsubscribeMcpElicitationBridge();
604
+ await automaticMemoryExtraction.flush();
605
+ await automaticMemoryConsolidation.flush();
606
+ await sessionManager.flush();
607
+ // Send final SSE events if connection is still open
608
+ if (!res.writableEnded) {
609
+ if (aborted) {
610
+ sseSession.sendAborted();
611
+ }
612
+ sseSession.end();
613
+ }
614
+ // Log if we had to skip writes due to client disconnect
615
+ const metrics = sseSession.getMetrics();
616
+ if (metrics.skipped > 0) {
617
+ console.debug("SSE writes skipped after disconnect", metrics);
618
+ }
619
+ })();
620
+ return cleanupPromise;
602
621
  };
603
622
  // ===== Phase 7: Agent Execution =====
604
623
  try {