@stoneforge/smithy 1.0.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -18
- package/dist/cli/commands/agent.js +10 -10
- package/dist/cli/commands/agent.js.map +1 -1
- package/dist/cli/commands/pool.d.ts.map +1 -1
- package/dist/cli/commands/pool.js +33 -16
- package/dist/cli/commands/pool.js.map +1 -1
- package/dist/git/merge.js +1 -1
- package/dist/git/merge.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/prompts/director.md +2 -2
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +6 -3
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/persistent-worker.md +1 -1
- package/dist/prompts/steward-base.md +4 -4
- package/dist/prompts/steward-recovery.md +113 -0
- package/dist/prompts/worker.md +12 -1
- package/dist/runtime/spawner.d.ts.map +1 -1
- package/dist/runtime/spawner.js +10 -0
- package/dist/runtime/spawner.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +3 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/daemon-state.d.ts.map +1 -1
- package/dist/server/daemon-state.js +5 -3
- package/dist/server/daemon-state.js.map +1 -1
- package/dist/server/events-websocket.d.ts.map +1 -1
- package/dist/server/events-websocket.js +7 -5
- package/dist/server/events-websocket.js.map +1 -1
- package/dist/server/formatters.d.ts +16 -2
- package/dist/server/formatters.d.ts.map +1 -1
- package/dist/server/formatters.js +23 -2
- package/dist/server/formatters.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +14 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/lsp-websocket.d.ts.map +1 -1
- package/dist/server/lsp-websocket.js +10 -8
- package/dist/server/lsp-websocket.js.map +1 -1
- package/dist/server/routes/agents.d.ts.map +1 -1
- package/dist/server/routes/agents.js +69 -15
- package/dist/server/routes/agents.js.map +1 -1
- package/dist/server/routes/daemon.d.ts.map +1 -1
- package/dist/server/routes/daemon.js +6 -4
- package/dist/server/routes/daemon.js.map +1 -1
- package/dist/server/routes/events.d.ts.map +1 -1
- package/dist/server/routes/events.js +4 -2
- package/dist/server/routes/events.js.map +1 -1
- package/dist/server/routes/extensions.d.ts.map +1 -1
- package/dist/server/routes/extensions.js +9 -7
- package/dist/server/routes/extensions.js.map +1 -1
- package/dist/server/routes/plugins.d.ts.map +1 -1
- package/dist/server/routes/plugins.js +6 -4
- package/dist/server/routes/plugins.js.map +1 -1
- package/dist/server/routes/pools.d.ts.map +1 -1
- package/dist/server/routes/pools.js +26 -7
- package/dist/server/routes/pools.js.map +1 -1
- package/dist/server/routes/scheduler.d.ts.map +1 -1
- package/dist/server/routes/scheduler.js +9 -7
- package/dist/server/routes/scheduler.js.map +1 -1
- package/dist/server/routes/sessions.d.ts.map +1 -1
- package/dist/server/routes/sessions.js +17 -15
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/routes/tasks.d.ts.map +1 -1
- package/dist/server/routes/tasks.js +54 -31
- package/dist/server/routes/tasks.js.map +1 -1
- package/dist/server/routes/upload.d.ts.map +1 -1
- package/dist/server/routes/upload.js +3 -1
- package/dist/server/routes/upload.js.map +1 -1
- package/dist/server/routes/workflows.d.ts.map +1 -1
- package/dist/server/routes/workflows.js +17 -15
- package/dist/server/routes/workflows.js.map +1 -1
- package/dist/server/routes/workspace-files.d.ts.map +1 -1
- package/dist/server/routes/workspace-files.js +11 -9
- package/dist/server/routes/workspace-files.js.map +1 -1
- package/dist/server/routes/worktrees.d.ts.map +1 -1
- package/dist/server/routes/worktrees.js +6 -4
- package/dist/server/routes/worktrees.js.map +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +10 -8
- package/dist/server/server.js.map +1 -1
- package/dist/server/services/lsp-manager.d.ts.map +1 -1
- package/dist/server/services/lsp-manager.js +15 -13
- package/dist/server/services/lsp-manager.js.map +1 -1
- package/dist/server/services.d.ts +1 -2
- package/dist/server/services.d.ts.map +1 -1
- package/dist/server/services.js +37 -12
- package/dist/server/services.js.map +1 -1
- package/dist/server/static.d.ts.map +1 -1
- package/dist/server/static.js +3 -1
- package/dist/server/static.js.map +1 -1
- package/dist/server/websocket.d.ts.map +1 -1
- package/dist/server/websocket.js +6 -4
- package/dist/server/websocket.js.map +1 -1
- package/dist/services/agent-pool-service.d.ts.map +1 -1
- package/dist/services/agent-pool-service.js +7 -8
- package/dist/services/agent-pool-service.js.map +1 -1
- package/dist/services/agent-registry.d.ts +1 -1
- package/dist/services/agent-registry.d.ts.map +1 -1
- package/dist/services/agent-registry.js +2 -0
- package/dist/services/agent-registry.js.map +1 -1
- package/dist/services/dispatch-daemon.d.ts +64 -2
- package/dist/services/dispatch-daemon.d.ts.map +1 -1
- package/dist/services/dispatch-daemon.js +387 -59
- package/dist/services/dispatch-daemon.js.map +1 -1
- package/dist/services/index.d.ts +0 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +0 -11
- package/dist/services/index.js.map +1 -1
- package/dist/services/merge-steward-service.d.ts.map +1 -1
- package/dist/services/merge-steward-service.js +6 -4
- package/dist/services/merge-steward-service.js.map +1 -1
- package/dist/services/steward-scheduler.d.ts +37 -5
- package/dist/services/steward-scheduler.d.ts.map +1 -1
- package/dist/services/steward-scheduler.js +224 -41
- package/dist/services/steward-scheduler.js.map +1 -1
- package/dist/services/task-assignment-service.d.ts.map +1 -1
- package/dist/services/task-assignment-service.js +3 -0
- package/dist/services/task-assignment-service.js.map +1 -1
- package/dist/testing/test-context.d.ts +1 -1
- package/dist/testing/test-context.d.ts.map +1 -1
- package/dist/types/agent-pool.d.ts +4 -0
- package/dist/types/agent-pool.d.ts.map +1 -1
- package/dist/types/agent-pool.js +8 -1
- package/dist/types/agent-pool.js.map +1 -1
- package/dist/types/agent.d.ts +29 -7
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +2 -2
- package/dist/types/agent.js.map +1 -1
- package/dist/types/role-definition.d.ts +1 -1
- package/dist/types/role-definition.js +1 -1
- package/dist/types/role-definition.js.map +1 -1
- package/dist/types/task-meta.d.ts +6 -0
- package/dist/types/task-meta.d.ts.map +1 -1
- package/dist/types/task-meta.js.map +1 -1
- package/dist/utils/logger.d.ts +66 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +133 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +7 -7
- package/web/assets/index-CNcjZKzg.css +32 -0
- package/web/assets/{index-R1cylSgw.js → index-CtkfxijF.js} +679 -435
- package/web/assets/{utils-vendor-DaJ2Dubl.js → utils-vendor-B7jOGaxP.js} +1 -1
- package/web/index.html +3 -3
- package/dist/prompts/steward-health.md +0 -39
- package/dist/prompts/steward-ops.md +0 -28
- package/dist/prompts/steward-reminder.md +0 -26
- package/dist/services/health-steward-service.d.ts +0 -446
- package/dist/services/health-steward-service.d.ts.map +0 -1
- package/dist/services/health-steward-service.js +0 -866
- package/dist/services/health-steward-service.js.map +0 -1
- package/web/assets/index-DqP-_E4F.css +0 -32
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* real-time event updates from the EventBroadcaster.
|
|
7
7
|
*/
|
|
8
8
|
import { parseClientMessage, getBroadcaster, shouldReceiveEvent, } from '@stoneforge/shared-routes';
|
|
9
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
|
+
const logger = createLogger('orchestrator:events-ws');
|
|
9
11
|
/**
|
|
10
12
|
* Track active event-subscription WebSocket connections
|
|
11
13
|
*/
|
|
@@ -18,7 +20,7 @@ function sendToClient(ws, message) {
|
|
|
18
20
|
ws.send(JSON.stringify(message));
|
|
19
21
|
}
|
|
20
22
|
catch (err) {
|
|
21
|
-
|
|
23
|
+
logger.error('Error sending message to client:', err);
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
@@ -43,7 +45,7 @@ export function handleEventsWSOpen(ws) {
|
|
|
43
45
|
broadcaster.addListener(eventListener);
|
|
44
46
|
}
|
|
45
47
|
eventsClients.set(clientId, ws);
|
|
46
|
-
|
|
48
|
+
logger.debug(`Client connected: ${clientId}`);
|
|
47
49
|
}
|
|
48
50
|
/**
|
|
49
51
|
* Handle an event-subscription WebSocket message
|
|
@@ -68,7 +70,7 @@ export function handleEventsWSMessage(ws, message) {
|
|
|
68
70
|
ws.data.subscriptions.add(channel);
|
|
69
71
|
}
|
|
70
72
|
sendToClient(ws, { type: 'subscribed', channels: parsed.channels });
|
|
71
|
-
|
|
73
|
+
logger.debug(`Client ${ws.data.id} subscribed to: ${parsed.channels.join(', ')}`);
|
|
72
74
|
break;
|
|
73
75
|
}
|
|
74
76
|
case 'unsubscribe': {
|
|
@@ -76,7 +78,7 @@ export function handleEventsWSMessage(ws, message) {
|
|
|
76
78
|
ws.data.subscriptions.delete(channel);
|
|
77
79
|
}
|
|
78
80
|
sendToClient(ws, { type: 'unsubscribed', channels: parsed.channels });
|
|
79
|
-
|
|
81
|
+
logger.debug(`Client ${ws.data.id} unsubscribed from: ${parsed.channels.join(', ')}`);
|
|
80
82
|
break;
|
|
81
83
|
}
|
|
82
84
|
}
|
|
@@ -91,6 +93,6 @@ export function handleEventsWSClose(ws) {
|
|
|
91
93
|
broadcaster.removeListener(eventListener);
|
|
92
94
|
}
|
|
93
95
|
eventsClients.delete(id);
|
|
94
|
-
|
|
96
|
+
logger.debug(`Client disconnected: ${id}`);
|
|
95
97
|
}
|
|
96
98
|
//# sourceMappingURL=events-websocket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-websocket.js","sourceRoot":"","sources":["../../src/server/events-websocket.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"events-websocket.js","sourceRoot":"","sources":["../../src/server/events-websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,25 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { Task } from '@stoneforge/core';
|
|
7
7
|
import type { SessionRecord, WorktreeInfo, StewardExecutionEntry, PluginExecutionResult } from '../index.js';
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Compute the effective display status for a task.
|
|
10
|
+
*
|
|
11
|
+
* The `blocked` status is computed at display time, never stored directly.
|
|
12
|
+
* A task is considered blocked when it has unresolved blocking dependencies
|
|
13
|
+
* (i.e., it appears in the blocked_cache). Only tasks with an 'open' stored
|
|
14
|
+
* status are shown as 'blocked' — tasks already in_progress, closed, etc.
|
|
15
|
+
* retain their stored status.
|
|
16
|
+
*
|
|
17
|
+
* @param task - The task to compute the effective status for
|
|
18
|
+
* @param blockedIds - Set of element IDs that are currently blocked (from blocked_cache)
|
|
19
|
+
* @returns The effective display status
|
|
20
|
+
*/
|
|
21
|
+
export declare function getEffectiveTaskStatus(task: Task, blockedIds?: Set<string>): string;
|
|
22
|
+
export declare function formatTaskResponse(task: Task, hydratedDescription?: string | null, blockedIds?: Set<string>): {
|
|
9
23
|
id: import("@stoneforge/core").ElementId;
|
|
10
24
|
title: string;
|
|
11
25
|
description: string | undefined;
|
|
12
|
-
status:
|
|
26
|
+
status: string;
|
|
13
27
|
priority: import("@stoneforge/core").Priority;
|
|
14
28
|
complexity: import("@stoneforge/core").Complexity;
|
|
15
29
|
taskType: import("@stoneforge/core").TaskTypeValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/server/formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EAEtB,MAAM,aAAa,CAAC;AAErB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/server/formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EAEtB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAKnF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwC3G;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa;;;;;;;;;;;;;;;EAiBzD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY;;;;;;;;;;EAYxD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB;;;;;;;;;;EAYhE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,qBAAqB;;;;;;;;;;;;EAcxE;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1C,EACD,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAwCR"}
|
|
@@ -3,15 +3,36 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Functions to format domain objects for JSON API responses.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Compute the effective display status for a task.
|
|
8
|
+
*
|
|
9
|
+
* The `blocked` status is computed at display time, never stored directly.
|
|
10
|
+
* A task is considered blocked when it has unresolved blocking dependencies
|
|
11
|
+
* (i.e., it appears in the blocked_cache). Only tasks with an 'open' stored
|
|
12
|
+
* status are shown as 'blocked' — tasks already in_progress, closed, etc.
|
|
13
|
+
* retain their stored status.
|
|
14
|
+
*
|
|
15
|
+
* @param task - The task to compute the effective status for
|
|
16
|
+
* @param blockedIds - Set of element IDs that are currently blocked (from blocked_cache)
|
|
17
|
+
* @returns The effective display status
|
|
18
|
+
*/
|
|
19
|
+
export function getEffectiveTaskStatus(task, blockedIds) {
|
|
20
|
+
if (blockedIds && blockedIds.has(task.id) && task.status === 'open') {
|
|
21
|
+
return 'blocked';
|
|
22
|
+
}
|
|
23
|
+
return task.status;
|
|
24
|
+
}
|
|
25
|
+
export function formatTaskResponse(task, hydratedDescription, blockedIds) {
|
|
7
26
|
const meta = task.metadata?.orchestrator;
|
|
8
27
|
// Use hydrated description from descriptionRef, or fall back to metadata.description
|
|
9
28
|
const description = hydratedDescription ?? task.metadata?.description;
|
|
29
|
+
// Compute effective display status: show 'blocked' for open tasks with unresolved dependencies
|
|
30
|
+
const effectiveStatus = getEffectiveTaskStatus(task, blockedIds);
|
|
10
31
|
return {
|
|
11
32
|
id: task.id,
|
|
12
33
|
title: task.title,
|
|
13
34
|
description,
|
|
14
|
-
status:
|
|
35
|
+
status: effectiveStatus,
|
|
15
36
|
priority: task.priority,
|
|
16
37
|
complexity: task.complexity,
|
|
17
38
|
taskType: task.taskType,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/server/formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,UAAU,kBAAkB,CAAC,IAAU,EAAE,mBAAmC;
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/server/formatters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAyClE,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmJ5F"}
|
package/dist/server/index.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { Hono } from 'hono';
|
|
8
8
|
import { cors } from 'hono/cors';
|
|
9
9
|
import { getAgentMetadata } from '../index.js';
|
|
10
|
+
import { createLogger, getLogLevel } from '../utils/logger.js';
|
|
10
11
|
import { CORS_ORIGINS as DEFAULT_CORS_ORIGINS, PORT as DEFAULT_PORT, HOST as DEFAULT_HOST, PROJECT_ROOT as DEFAULT_PROJECT_ROOT, DB_PATH as DEFAULT_DB_PATH } from './config.js';
|
|
11
12
|
import { initializeServices } from './services.js';
|
|
12
13
|
import { createHealthRoutes, createTaskRoutes, createAgentRoutes, createSessionRoutes, createWorktreeRoutes, createSchedulerRoutes, createPluginRoutes, createEventRoutes, createUploadRoutes, createDaemonRoutes, createWorkflowRoutes, createPoolRoutes, createWorkspaceFilesRoutes, createExtensionsRoutes, markDaemonAsServerManaged, } from './routes/index.js';
|
|
@@ -21,7 +22,9 @@ import { createLspManager } from './services/lsp-manager.js';
|
|
|
21
22
|
import { createLspRoutes } from './routes/lsp.js';
|
|
22
23
|
import { initializeBroadcaster } from '@stoneforge/shared-routes';
|
|
23
24
|
import { registerStaticMiddleware } from './static.js';
|
|
25
|
+
const logger = createLogger('orchestrator');
|
|
24
26
|
export async function startSmithyServer(options = {}) {
|
|
27
|
+
logger.info('Log level: ' + getLogLevel());
|
|
25
28
|
const port = options.port ?? DEFAULT_PORT;
|
|
26
29
|
const host = options.host ?? DEFAULT_HOST;
|
|
27
30
|
const corsOrigins = options.corsOrigins ?? [
|
|
@@ -41,16 +44,16 @@ export async function startSmithyServer(options = {}) {
|
|
|
41
44
|
const meta = getAgentMetadata(director);
|
|
42
45
|
if (meta?.sessionStatus === 'running' && meta?.sessionId) {
|
|
43
46
|
directorSessionId = meta.sessionId;
|
|
44
|
-
|
|
47
|
+
logger.debug(`Director was running with session ${directorSessionId} before restart`);
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
50
|
// Reconcile stale sessions: reset agents marked 'running' to 'idle' if process is dead
|
|
48
51
|
const reconcileResult = await services.sessionManager.reconcileOnStartup();
|
|
49
52
|
if (reconcileResult.reconciled > 0) {
|
|
50
|
-
|
|
53
|
+
logger.info(`Reconciled ${reconcileResult.reconciled} stale agent session(s)`);
|
|
51
54
|
}
|
|
52
55
|
if (reconcileResult.errors.length > 0) {
|
|
53
|
-
|
|
56
|
+
logger.warn('Reconciliation errors:', reconcileResult.errors);
|
|
54
57
|
}
|
|
55
58
|
const app = new Hono();
|
|
56
59
|
app.use('*', cors({
|
|
@@ -103,7 +106,7 @@ export async function startSmithyServer(options = {}) {
|
|
|
103
106
|
// This must happen after startServer() so HTTP/WS infrastructure is ready for clients
|
|
104
107
|
if (directorSessionId && director) {
|
|
105
108
|
const directorId = director.id;
|
|
106
|
-
|
|
109
|
+
logger.debug(`Attempting to auto-resume director session ${directorSessionId}`);
|
|
107
110
|
try {
|
|
108
111
|
const { session, events } = await services.sessionManager.resumeSession(directorId, {
|
|
109
112
|
providerSessionId: directorSessionId,
|
|
@@ -120,12 +123,12 @@ export async function startSmithyServer(options = {}) {
|
|
|
120
123
|
agentRole: session.agentRole || 'director',
|
|
121
124
|
events,
|
|
122
125
|
});
|
|
123
|
-
|
|
126
|
+
logger.info(`Director session auto-resumed successfully (session: ${session.id})`);
|
|
124
127
|
}
|
|
125
128
|
catch (error) {
|
|
126
129
|
// Resume failed - director will stay idle and can be started manually via UI
|
|
127
|
-
|
|
128
|
-
|
|
130
|
+
logger.warn('Failed to auto-resume director session:', error instanceof Error ? error.message : String(error));
|
|
131
|
+
logger.info('Director will remain idle - can be started manually via UI');
|
|
129
132
|
}
|
|
130
133
|
}
|
|
131
134
|
// Auto-start dispatch daemon based on persisted state and environment variable
|
|
@@ -134,19 +137,19 @@ export async function startSmithyServer(options = {}) {
|
|
|
134
137
|
const envDisabled = process.env.DAEMON_AUTO_START === 'false';
|
|
135
138
|
const persistedShouldRun = shouldDaemonAutoStart();
|
|
136
139
|
if (!services.dispatchDaemon) {
|
|
137
|
-
|
|
140
|
+
logger.info('Dispatch daemon not available (no git repository)');
|
|
138
141
|
}
|
|
139
142
|
else if (envDisabled) {
|
|
140
|
-
|
|
143
|
+
logger.info('Dispatch daemon auto-start disabled (DAEMON_AUTO_START=false)');
|
|
141
144
|
}
|
|
142
145
|
else if (!persistedShouldRun) {
|
|
143
|
-
|
|
146
|
+
logger.info('Dispatch daemon not started (was stopped by user, state persisted)');
|
|
144
147
|
}
|
|
145
148
|
else {
|
|
146
149
|
services.dispatchDaemon.start();
|
|
147
150
|
saveDaemonState(true, 'server-startup');
|
|
148
151
|
markDaemonAsServerManaged();
|
|
149
|
-
|
|
152
|
+
logger.info('Dispatch daemon auto-started');
|
|
150
153
|
}
|
|
151
154
|
return services;
|
|
152
155
|
}
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,IAAI,IAAI,YAAY,EAAE,IAAI,IAAI,YAAY,EAAE,YAAY,IAAI,oBAAoB,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,aAAa,CAAC;AACjL,OAAO,EAAE,kBAAkB,EAAiB,MAAM,eAAe,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,4BAA4B;AAC5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lsp-websocket.d.ts","sourceRoot":"","sources":["../../src/server/lsp-websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"lsp-websocket.d.ts","sourceRoot":"","sources":["../../src/server/lsp-websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAyCD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,eAAe,CAAC,eAAe,CAAC,EACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,GACrB,IAAI,CA0FN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,eAAe,CAAC,eAAe,CAAC,EACpC,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,IAAI,CAsBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,eAAe,CAAC,eAAe,CAAC,GAAG,IAAI,CAU3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Bridges WebSocket connections to Language Server Protocol (LSP) processes.
|
|
5
5
|
* Handles message formatting and bidirectional communication.
|
|
6
6
|
*/
|
|
7
|
+
import { createLogger } from '../utils/logger.js';
|
|
8
|
+
const logger = createLogger('lsp-ws');
|
|
7
9
|
/**
|
|
8
10
|
* Parse the Content-Length header from LSP message buffer
|
|
9
11
|
*/
|
|
@@ -45,7 +47,7 @@ export function handleLspWSOpen(ws, language, lspManager) {
|
|
|
45
47
|
process: null,
|
|
46
48
|
buffer: Buffer.alloc(0),
|
|
47
49
|
});
|
|
48
|
-
|
|
50
|
+
logger.debug(`Client ${clientId} connected for language: ${language}`);
|
|
49
51
|
// Start the language server for this language
|
|
50
52
|
lspManager.startServer(language).then((process) => {
|
|
51
53
|
const client = lspClients.get(clientId);
|
|
@@ -54,7 +56,7 @@ export function handleLspWSOpen(ws, language, lspManager) {
|
|
|
54
56
|
return;
|
|
55
57
|
}
|
|
56
58
|
if (!process) {
|
|
57
|
-
|
|
59
|
+
logger.debug(`No server available for language: ${language}`);
|
|
58
60
|
ws.send(JSON.stringify({
|
|
59
61
|
jsonrpc: '2.0',
|
|
60
62
|
error: {
|
|
@@ -102,9 +104,9 @@ export function handleLspWSOpen(ws, language, lspManager) {
|
|
|
102
104
|
client.cleanup = () => {
|
|
103
105
|
process.stdout?.off('data', onData);
|
|
104
106
|
};
|
|
105
|
-
|
|
107
|
+
logger.debug(`Server connected for client ${clientId}`);
|
|
106
108
|
}).catch((error) => {
|
|
107
|
-
|
|
109
|
+
logger.error(`Error starting server for ${language}:`, error);
|
|
108
110
|
ws.send(JSON.stringify({
|
|
109
111
|
jsonrpc: '2.0',
|
|
110
112
|
error: {
|
|
@@ -120,12 +122,12 @@ export function handleLspWSOpen(ws, language, lspManager) {
|
|
|
120
122
|
export function handleLspWSMessage(ws, message) {
|
|
121
123
|
const client = lspClients.get(ws.data.id);
|
|
122
124
|
if (!client) {
|
|
123
|
-
|
|
125
|
+
logger.error(`Unknown client: ${ws.data.id}`);
|
|
124
126
|
return;
|
|
125
127
|
}
|
|
126
128
|
if (!client.process || !client.process.stdin) {
|
|
127
129
|
// Server not ready yet, queue the message or send error
|
|
128
|
-
|
|
130
|
+
logger.debug(`Server not ready for client ${ws.data.id}, message queued`);
|
|
129
131
|
return;
|
|
130
132
|
}
|
|
131
133
|
try {
|
|
@@ -135,7 +137,7 @@ export function handleLspWSMessage(ws, message) {
|
|
|
135
137
|
client.process.stdin.write(lspMessage);
|
|
136
138
|
}
|
|
137
139
|
catch (error) {
|
|
138
|
-
|
|
140
|
+
logger.error(`Error forwarding message:`, error);
|
|
139
141
|
}
|
|
140
142
|
}
|
|
141
143
|
/**
|
|
@@ -150,7 +152,7 @@ export function handleLspWSClose(ws) {
|
|
|
150
152
|
// Note: We don't kill the language server process here because it can serve multiple clients
|
|
151
153
|
lspClients.delete(ws.data.id);
|
|
152
154
|
}
|
|
153
|
-
|
|
155
|
+
logger.debug(`Client disconnected: ${ws.data.id}`);
|
|
154
156
|
}
|
|
155
157
|
/**
|
|
156
158
|
* Get the number of active LSP WebSocket connections
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lsp-websocket.js","sourceRoot":"","sources":["../../src/server/lsp-websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"lsp-websocket.js","sourceRoot":"","sources":["../../src/server/lsp-websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/server/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/server/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAM/C,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,8EAyfnD"}
|
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
import { Hono } from 'hono';
|
|
7
7
|
import { getProviderRegistry, ProviderError } from '@stoneforge/smithy/providers';
|
|
8
8
|
import { formatSessionRecord } from '../formatters.js';
|
|
9
|
+
import { createLogger } from '../../utils/logger.js';
|
|
10
|
+
const logger = createLogger('orchestrator');
|
|
9
11
|
export function createAgentRoutes(services) {
|
|
10
|
-
const { agentRegistry, sessionManager, taskAssignmentService } = services;
|
|
12
|
+
const { agentRegistry, sessionManager, taskAssignmentService, stewardScheduler } = services;
|
|
11
13
|
const app = new Hono();
|
|
12
14
|
// GET /api/agents
|
|
13
15
|
app.get('/api/agents', async (c) => {
|
|
@@ -18,7 +20,7 @@ export function createAgentRoutes(services) {
|
|
|
18
20
|
return c.json({ agents });
|
|
19
21
|
}
|
|
20
22
|
catch (error) {
|
|
21
|
-
|
|
23
|
+
logger.error('Failed to list agents:', error);
|
|
22
24
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
23
25
|
}
|
|
24
26
|
});
|
|
@@ -65,6 +67,8 @@ export function createAgentRoutes(services) {
|
|
|
65
67
|
name: body.name,
|
|
66
68
|
stewardFocus: body.stewardFocus,
|
|
67
69
|
triggers: body.triggers,
|
|
70
|
+
playbook: body.stewardFocus === 'custom' ? body.playbook : undefined,
|
|
71
|
+
playbookId: body.stewardFocus === 'custom' ? body.playbookId : undefined,
|
|
68
72
|
createdBy,
|
|
69
73
|
tags: body.tags,
|
|
70
74
|
maxConcurrentTasks: body.maxConcurrentTasks,
|
|
@@ -72,6 +76,14 @@ export function createAgentRoutes(services) {
|
|
|
72
76
|
provider: body.provider,
|
|
73
77
|
model: body.model,
|
|
74
78
|
});
|
|
79
|
+
if (stewardScheduler.isRunning()) {
|
|
80
|
+
try {
|
|
81
|
+
await stewardScheduler.registerSteward(agent.id);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
logger.warn('Failed to auto-register steward with scheduler:', err);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
75
87
|
break;
|
|
76
88
|
default:
|
|
77
89
|
return c.json({ error: { code: 'INVALID_INPUT', message: `Invalid role: ${body.role}` } }, 400);
|
|
@@ -83,7 +95,7 @@ export function createAgentRoutes(services) {
|
|
|
83
95
|
if (errorMessage.includes('already exists') || errorMessage.includes('duplicate')) {
|
|
84
96
|
return c.json({ error: { code: 'ALREADY_EXISTS', message: errorMessage } }, 409);
|
|
85
97
|
}
|
|
86
|
-
|
|
98
|
+
logger.error('Failed to register agent:', error);
|
|
87
99
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: errorMessage } }, 500);
|
|
88
100
|
}
|
|
89
101
|
});
|
|
@@ -107,7 +119,7 @@ export function createAgentRoutes(services) {
|
|
|
107
119
|
if (errorMessage.includes('already exists') || errorMessage.includes('duplicate')) {
|
|
108
120
|
return c.json({ error: { code: 'ALREADY_EXISTS', message: errorMessage } }, 409);
|
|
109
121
|
}
|
|
110
|
-
|
|
122
|
+
logger.error('Failed to register director:', error);
|
|
111
123
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: errorMessage } }, 500);
|
|
112
124
|
}
|
|
113
125
|
});
|
|
@@ -139,7 +151,7 @@ export function createAgentRoutes(services) {
|
|
|
139
151
|
if (errorMessage.includes('already exists') || errorMessage.includes('duplicate')) {
|
|
140
152
|
return c.json({ error: { code: 'ALREADY_EXISTS', message: errorMessage } }, 409);
|
|
141
153
|
}
|
|
142
|
-
|
|
154
|
+
logger.error('Failed to register worker:', error);
|
|
143
155
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: errorMessage } }, 500);
|
|
144
156
|
}
|
|
145
157
|
});
|
|
@@ -153,10 +165,13 @@ export function createAgentRoutes(services) {
|
|
|
153
165
|
if (!body.stewardFocus) {
|
|
154
166
|
return c.json({ error: { code: 'INVALID_INPUT', message: 'stewardFocus is required' } }, 400);
|
|
155
167
|
}
|
|
156
|
-
const validFocuses = ['merge', '
|
|
168
|
+
const validFocuses = ['merge', 'docs', 'recovery', 'custom'];
|
|
157
169
|
if (!validFocuses.includes(body.stewardFocus)) {
|
|
158
170
|
return c.json({ error: { code: 'INVALID_INPUT', message: `stewardFocus must be one of: ${validFocuses.join(', ')}` } }, 400);
|
|
159
171
|
}
|
|
172
|
+
if (body.stewardFocus === 'custom' && !body.playbook?.trim() && !body.playbookId?.trim()) {
|
|
173
|
+
return c.json({ error: { code: 'INVALID_INPUT', message: 'Either playbook or playbookId is required for custom stewards' } }, 400);
|
|
174
|
+
}
|
|
160
175
|
if (body.triggers) {
|
|
161
176
|
for (const trigger of body.triggers) {
|
|
162
177
|
if (trigger.type === 'cron' && !trigger.schedule) {
|
|
@@ -174,11 +189,21 @@ export function createAgentRoutes(services) {
|
|
|
174
189
|
name: body.name,
|
|
175
190
|
stewardFocus: body.stewardFocus,
|
|
176
191
|
triggers: body.triggers,
|
|
192
|
+
playbook: body.stewardFocus === 'custom' ? body.playbook : undefined,
|
|
193
|
+
playbookId: body.stewardFocus === 'custom' ? body.playbookId : undefined,
|
|
177
194
|
createdBy: (body.createdBy ?? 'el-0000'),
|
|
178
195
|
tags: body.tags,
|
|
179
196
|
maxConcurrentTasks: body.maxConcurrentTasks,
|
|
180
197
|
reportsTo: body.reportsTo,
|
|
181
198
|
});
|
|
199
|
+
if (stewardScheduler.isRunning()) {
|
|
200
|
+
try {
|
|
201
|
+
await stewardScheduler.registerSteward(agent.id);
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
logger.warn('Failed to auto-register steward with scheduler:', err);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
182
207
|
return c.json({ agent }, 201);
|
|
183
208
|
}
|
|
184
209
|
catch (error) {
|
|
@@ -186,7 +211,7 @@ export function createAgentRoutes(services) {
|
|
|
186
211
|
if (errorMessage.includes('already exists') || errorMessage.includes('duplicate')) {
|
|
187
212
|
return c.json({ error: { code: 'ALREADY_EXISTS', message: errorMessage } }, 409);
|
|
188
213
|
}
|
|
189
|
-
|
|
214
|
+
logger.error('Failed to register steward:', error);
|
|
190
215
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: errorMessage } }, 500);
|
|
191
216
|
}
|
|
192
217
|
});
|
|
@@ -201,7 +226,7 @@ export function createAgentRoutes(services) {
|
|
|
201
226
|
return c.json({ agent });
|
|
202
227
|
}
|
|
203
228
|
catch (error) {
|
|
204
|
-
|
|
229
|
+
logger.error('Failed to get agent:', error);
|
|
205
230
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
206
231
|
}
|
|
207
232
|
});
|
|
@@ -238,10 +263,39 @@ export function createAgentRoutes(services) {
|
|
|
238
263
|
model: body.model === null ? undefined : body.model.trim(),
|
|
239
264
|
});
|
|
240
265
|
}
|
|
266
|
+
// Update triggers in agent metadata if provided (steward agents only)
|
|
267
|
+
if (body.triggers !== undefined) {
|
|
268
|
+
const agentMeta = updatedAgent.metadata?.agent;
|
|
269
|
+
if (!agentMeta || agentMeta.agentRole !== 'steward') {
|
|
270
|
+
return c.json({ error: { code: 'VALIDATION_ERROR', message: 'Triggers can only be set on steward agents' } }, 400);
|
|
271
|
+
}
|
|
272
|
+
// Validate each trigger
|
|
273
|
+
for (const trigger of body.triggers) {
|
|
274
|
+
if (trigger.type === 'cron' && !trigger.schedule) {
|
|
275
|
+
return c.json({ error: { code: 'VALIDATION_ERROR', message: 'Cron trigger requires a schedule' } }, 400);
|
|
276
|
+
}
|
|
277
|
+
if (trigger.type === 'event' && !trigger.event) {
|
|
278
|
+
return c.json({ error: { code: 'VALIDATION_ERROR', message: 'Event trigger requires an event name' } }, 400);
|
|
279
|
+
}
|
|
280
|
+
if (trigger.type !== 'cron' && trigger.type !== 'event') {
|
|
281
|
+
return c.json({ error: { code: 'VALIDATION_ERROR', message: 'Trigger type must be "cron" or "event"' } }, 400);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
updatedAgent = await agentRegistry.updateAgentMetadata(agentId, { triggers: body.triggers });
|
|
285
|
+
// Re-register steward with scheduler to pick up new triggers
|
|
286
|
+
if (stewardScheduler.isRunning()) {
|
|
287
|
+
try {
|
|
288
|
+
await stewardScheduler.registerSteward(agentId);
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
logger.warn('Failed to re-register steward with scheduler after trigger update:', err);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
241
295
|
return c.json({ agent: updatedAgent });
|
|
242
296
|
}
|
|
243
297
|
catch (error) {
|
|
244
|
-
|
|
298
|
+
logger.error('Failed to update agent:', error);
|
|
245
299
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
246
300
|
}
|
|
247
301
|
});
|
|
@@ -262,7 +316,7 @@ export function createAgentRoutes(services) {
|
|
|
262
316
|
return c.json({ success: true });
|
|
263
317
|
}
|
|
264
318
|
catch (error) {
|
|
265
|
-
|
|
319
|
+
logger.error('Failed to delete agent:', error);
|
|
266
320
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
267
321
|
}
|
|
268
322
|
});
|
|
@@ -284,7 +338,7 @@ export function createAgentRoutes(services) {
|
|
|
284
338
|
});
|
|
285
339
|
}
|
|
286
340
|
catch (error) {
|
|
287
|
-
|
|
341
|
+
logger.error('Failed to get agent status:', error);
|
|
288
342
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
289
343
|
}
|
|
290
344
|
});
|
|
@@ -303,7 +357,7 @@ export function createAgentRoutes(services) {
|
|
|
303
357
|
return c.json({ agentId, agentName: agent.name, workload, hasCapacity, maxConcurrentTasks });
|
|
304
358
|
}
|
|
305
359
|
catch (error) {
|
|
306
|
-
|
|
360
|
+
logger.error('Failed to get agent workload:', error);
|
|
307
361
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
308
362
|
}
|
|
309
363
|
});
|
|
@@ -323,7 +377,7 @@ export function createAgentRoutes(services) {
|
|
|
323
377
|
return c.json({ providers });
|
|
324
378
|
}
|
|
325
379
|
catch (error) {
|
|
326
|
-
|
|
380
|
+
logger.error('Failed to list providers:', error);
|
|
327
381
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
328
382
|
}
|
|
329
383
|
});
|
|
@@ -352,7 +406,7 @@ export function createAgentRoutes(services) {
|
|
|
352
406
|
// ProviderError indicates the provider SDK failed (auth, process crash, etc.)
|
|
353
407
|
// — treat as 503 (service unavailable) rather than 500 (internal server error)
|
|
354
408
|
if (error instanceof ProviderError) {
|
|
355
|
-
|
|
409
|
+
logger.warn('Provider error listing models:', error.message);
|
|
356
410
|
return c.json({
|
|
357
411
|
error: {
|
|
358
412
|
code: 'PROVIDER_UNAVAILABLE',
|
|
@@ -360,7 +414,7 @@ export function createAgentRoutes(services) {
|
|
|
360
414
|
},
|
|
361
415
|
}, 503);
|
|
362
416
|
}
|
|
363
|
-
|
|
417
|
+
logger.error('Failed to list provider models:', error);
|
|
364
418
|
return c.json({ error: { code: 'INTERNAL_ERROR', message: String(error) } }, 500);
|
|
365
419
|
}
|
|
366
420
|
});
|