@roj-ai/sdk 0.1.21 → 0.1.23

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.
@@ -1,11 +1,18 @@
1
1
  import { afterEach, describe, expect, it } from 'bun:test';
2
+ import { readFile, rm } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
2
5
  import { MemoryEventStore } from '../../core/events/memory.js';
3
6
  import { MockLLMProvider } from '../../core/llm/mock.js';
4
7
  import { selectPluginState } from '../../core/sessions/reducer.js';
8
+ import { SessionId } from '../../core/sessions/schema.js';
5
9
  import { ToolCallId } from '../../core/tools/schema.js';
10
+ import { silentLogger } from '../../lib/logger/logger.js';
11
+ import { createNodePlatform } from '../../testing/node-platform.js';
6
12
  import { createTestPreset, TestHarness } from '../../testing/index.js';
7
13
  import { serviceEvents, servicePlugin } from './plugin.js';
8
14
  import { PortPool } from './port-pool.js';
15
+ import { ServiceExecutor } from './service.js';
9
16
  // ============================================================================
10
17
  // Test Service Configs
11
18
  // ============================================================================
@@ -481,5 +488,79 @@ describe('services plugin', () => {
481
488
  expect(stoppedEvent).toBeDefined();
482
489
  });
483
490
  });
491
+ // =========================================================================
492
+ // Port conflict recovery + concurrent start (ServiceExecutor unit-level)
493
+ // =========================================================================
494
+ describe('port conflict recovery and concurrent start', () => {
495
+ const waitUntil = async (predicate, timeoutMs = 8000) => {
496
+ const deadline = Date.now() + timeoutMs;
497
+ while (Date.now() < deadline) {
498
+ if (predicate())
499
+ return;
500
+ await new Promise((r) => setTimeout(r, 20));
501
+ }
502
+ };
503
+ it('collapses concurrent start() calls onto a single process', async () => {
504
+ const platform = createNodePlatform();
505
+ const executor = new ServiceExecutor(silentLogger, new PortPool(), { fs: platform.fs, process: platform.process });
506
+ const marker = join(tmpdir(), `roj-svc-mutex-${Date.now()}-${Math.floor(Math.random() * 1e6)}`);
507
+ const config = {
508
+ type: 'concurrent',
509
+ description: 'appends one line per spawned process',
510
+ command: `echo spawned >> ${marker} && sleep 30`,
511
+ };
512
+ try {
513
+ const [r1, r2] = await Promise.all([
514
+ executor.start(config, SessionId('s-concurrent')),
515
+ executor.start(config, SessionId('s-concurrent')),
516
+ ]);
517
+ expect(r1.ok).toBe(true);
518
+ expect(r2.ok).toBe(true);
519
+ // Let the shell flush its append.
520
+ await new Promise((r) => setTimeout(r, 400));
521
+ const lines = (await readFile(marker, 'utf-8')).split('\n').filter((l) => l.length > 0);
522
+ // Without the in-flight lock both starts spawn and the file gets two lines.
523
+ expect(lines.length).toBe(1);
524
+ }
525
+ finally {
526
+ await executor.shutdown();
527
+ await rm(marker, { force: true });
528
+ }
529
+ });
530
+ it('recovers on a fresh port when the chosen port is in use (EADDRINUSE)', async () => {
531
+ const platform = createNodePlatform();
532
+ const executor = new ServiceExecutor(silentLogger, new PortPool(), { fs: platform.fs, process: platform.process });
533
+ const marker = join(tmpdir(), `roj-svc-eaddr-${Date.now()}-${Math.floor(Math.random() * 1e6)}`);
534
+ // First spawn fails with an EADDRINUSE-style message; the marker makes the
535
+ // retry (a fresh process) succeed and match the ready pattern.
536
+ const config = {
537
+ type: 'flaky-port',
538
+ description: 'EADDRINUSE on first attempt, ready on retry',
539
+ command: `if [ -f ${marker} ]; then echo "listening READY"; sleep 30; else touch ${marker}; echo "error: listen EADDRINUSE: address already in use" 1>&2; exit 1; fi`,
540
+ readyPattern: 'READY',
541
+ startupTimeoutMs: 5000,
542
+ };
543
+ const observed = [];
544
+ executor.onStatusChanged = (_sessionId, _serviceType, status, port) => {
545
+ observed.push({ status, port });
546
+ };
547
+ try {
548
+ const result = await executor.start(config, SessionId('s-flaky'));
549
+ expect(result.ok).toBe(true);
550
+ await waitUntil(() => executor.getStatus('flaky-port') === 'ready');
551
+ expect(executor.getStatus('flaky-port')).toBe('ready');
552
+ // Two 'starting' events: the conflicted port, then a fresh, different one.
553
+ const startingPorts = observed.filter((e) => e.status === 'starting').map((e) => e.port);
554
+ expect(startingPorts.length).toBe(2);
555
+ expect(startingPorts[0]).not.toBe(startingPorts[1]);
556
+ // The transient EADDRINUSE must NOT surface as a terminal failure.
557
+ expect(observed.some((e) => e.status === 'failed')).toBe(false);
558
+ }
559
+ finally {
560
+ await executor.shutdown();
561
+ await rm(marker, { force: true });
562
+ }
563
+ });
564
+ });
484
565
  });
485
566
  //# sourceMappingURL=services.integration.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"services.integration.test.js","sourceRoot":"","sources":["../../../src/plugins/services/services.integration.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"services.integration.test.js","sourceRoot":"","sources":["../../../src/plugins/services/services.integration.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roj-ai/sdk",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -135,7 +135,7 @@
135
135
  "type-check": "tsc --noEmit"
136
136
  },
137
137
  "dependencies": {
138
- "@roj-ai/transport": "^0.1.21",
138
+ "@roj-ai/transport": "^0.1.23",
139
139
  "@hono/zod-validator": "0.7.6",
140
140
  "hono": "4.12.5",
141
141
  "ignore": "7.0.5",
package/src/index.ts CHANGED
@@ -82,7 +82,8 @@ export type { BuiltinEvent } from './builtin-events.js'
82
82
  export type { AgentChatMessage, AskUserChatMessage, ChatMessage, UserChatMessage } from '~/plugins/user-chat/index.js'
83
83
 
84
84
  // Plugins
85
- export { agentStatusPlugin } from '~/plugins/agent-status/plugin.js'
85
+ export { agentStatusPlugin, agentStoppedNotificationSchema } from '~/plugins/agent-status/plugin.js'
86
+ export type { AgentStoppedNotification } from '~/plugins/agent-status/plugin.js'
86
87
  export { agentsPlugin } from '~/plugins/agents/plugin.js'
87
88
  export type { AgentsPluginConfig } from '~/plugins/agents/plugin.js'
88
89
  export { contextCompactPlugin } from '~/plugins/context-compact/plugin.js'
@@ -0,0 +1,164 @@
1
+ import { describe, expect, it } from 'bun:test'
2
+ import { AgentId } from '~/core/agents/schema.js'
3
+ import { MockLLMProvider } from '~/core/llm/mock.js'
4
+ import type { PluginNotification } from '~/core/plugins/plugin-builder.js'
5
+ import { ToolCallId } from '~/core/tools/schema.js'
6
+ import { limitsGuardPlugin } from '~/plugins/limits-guard/plugin.js'
7
+ import { createMultiAgentPreset, createTestPreset, type TestSession, TestHarness } from '~/testing/index.js'
8
+ import { type AgentStoppedNotification, agentStatusPlugin } from './plugin.js'
9
+
10
+ type StatusPayload = { sessionId: string; agentId: string; status: string; definitionName?: string; timestamp: number }
11
+
12
+ const agentStatusNotifications = (session: TestSession): StatusPayload[] =>
13
+ session.getNotifications()
14
+ .filter((n: PluginNotification) => n.pluginName === 'agent-status' && n.type === 'agentStatus')
15
+ .map((n) => n.payload as StatusPayload)
16
+
17
+ const agentStoppedNotifications = (session: TestSession): AgentStoppedNotification[] =>
18
+ session.getNotifications()
19
+ .filter((n: PluginNotification) => n.pluginName === 'agent-status' && n.type === 'agentStopped')
20
+ .map((n) => n.payload as AgentStoppedNotification)
21
+
22
+ async function waitForAgentStatus(session: TestSession, agentId: AgentId, status: string, timeoutMs = 5000): Promise<void> {
23
+ const deadline = Date.now() + timeoutMs
24
+ while (Date.now() < deadline) {
25
+ const agentState = session.state.agents.get(agentId)
26
+ if (agentState?.status === status) return
27
+ await new Promise((r) => setTimeout(r, 10))
28
+ }
29
+ throw new Error(`waitForAgentStatus timed out after ${timeoutMs}ms (wanted ${status}) for agent ${agentId}`)
30
+ }
31
+
32
+ describe('agent-status plugin', () => {
33
+ describe('agentStatus (existing behavior)', () => {
34
+ it('emits thinking on start and idle on completion', async () => {
35
+ const harness = new TestHarness({
36
+ presets: [createTestPreset()],
37
+ systemPlugins: [agentStatusPlugin],
38
+ llmProvider: MockLLMProvider.withFixedResponse({ content: 'Done', toolCalls: [] }),
39
+ })
40
+
41
+ const session = await harness.createSession('test')
42
+ const entryAgentId = session.getEntryAgentId()!
43
+ await session.sendAndWaitForIdle('Hello')
44
+
45
+ const statuses = agentStatusNotifications(session).map((p) => p.status)
46
+ expect(statuses).toContain('thinking')
47
+ expect(statuses).toContain('idle')
48
+
49
+ // No abnormal-terminal notification for a normal completion.
50
+ expect(agentStoppedNotifications(session)).toHaveLength(0)
51
+
52
+ await harness.shutdown()
53
+ })
54
+ })
55
+
56
+ describe('agentStopped on pause', () => {
57
+ it('manual pause → agentStopped kind:paused reason:manual with message', async () => {
58
+ let orchestratorCalls = 0
59
+ const harness = new TestHarness({
60
+ presets: [createMultiAgentPreset(
61
+ [{ name: 'worker', system: 'Worker agent.', tools: [], agents: [] }],
62
+ { orchestratorSystem: 'Orchestrator agent.' },
63
+ )],
64
+ systemPlugins: [agentStatusPlugin],
65
+ mockHandler: (request) => {
66
+ if (request.systemPrompt.includes('Orchestrator')) {
67
+ orchestratorCalls++
68
+ if (orchestratorCalls === 1) {
69
+ return {
70
+ content: null,
71
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Work' } }],
72
+ finishReason: 'stop',
73
+ metrics: MockLLMProvider.defaultMetrics(),
74
+ }
75
+ }
76
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
77
+ }
78
+ return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
79
+ },
80
+ })
81
+
82
+ const session = await harness.createSession('test')
83
+ await session.sendAndWaitForIdle('Start')
84
+
85
+ // Manual pause via Session.pauseAgent — the real manual-pause API that
86
+ // runs onPause hooks (agents.pause only emits the event, no hooks).
87
+ const innerSession = (session as unknown as { session: { pauseAgent: (id: AgentId, message?: string) => Promise<{ ok: boolean }> } }).session
88
+ const result = await innerSession.pauseAgent(AgentId('worker_1'), 'Pausing for review')
89
+ expect(result.ok).toBe(true)
90
+
91
+ const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === 'worker_1')
92
+ expect(stopped).toHaveLength(1)
93
+ expect(stopped[0].kind).toBe('paused')
94
+ expect(stopped[0].reason).toBe('manual')
95
+ expect(stopped[0].message).toBe('Pausing for review')
96
+ expect(stopped[0].definitionName).toBe('worker')
97
+ expect(typeof stopped[0].timestamp).toBe('number')
98
+
99
+ // idle agentStatus still emitted alongside.
100
+ expect(agentStatusNotifications(session).some((p) => p.agentId === 'worker_1' && p.status === 'idle')).toBe(true)
101
+
102
+ await harness.shutdown()
103
+ })
104
+
105
+ it('limits-guard hard limit → agentStopped kind:paused with reason and message', async () => {
106
+ let inferenceCount = 0
107
+ const harness = new TestHarness({
108
+ presets: [createTestPreset({
109
+ orchestratorSystem: 'Test agent.',
110
+ orchestratorPlugins: [limitsGuardPlugin.configureAgent({ limits: { maxTurns: 2 } })],
111
+ })],
112
+ systemPlugins: [agentStatusPlugin, limitsGuardPlugin],
113
+ mockHandler: () => {
114
+ inferenceCount++
115
+ return {
116
+ content: null,
117
+ toolCalls: [{ id: ToolCallId(`tc${inferenceCount}`), name: 'tell_user', input: { message: `Turn ${inferenceCount}` } }],
118
+ finishReason: 'stop',
119
+ metrics: MockLLMProvider.defaultMetrics(),
120
+ }
121
+ },
122
+ })
123
+
124
+ const session = await harness.createSession('test')
125
+ const entryAgentId = session.getEntryAgentId()!
126
+ await session.sendMessage('Start')
127
+ await waitForAgentStatus(session, entryAgentId, 'paused')
128
+
129
+ const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === String(entryAgentId))
130
+ expect(stopped.length).toBeGreaterThanOrEqual(1)
131
+ expect(stopped[0].kind).toBe('paused')
132
+ // limits-guard pauses via beforeInference {action:'pause'} → reason 'handler',
133
+ // with the human-readable budget detail in `message`.
134
+ expect(stopped[0].reason).toBe('handler')
135
+ expect(stopped[0].message).toBeTruthy()
136
+
137
+ await harness.shutdown()
138
+ })
139
+ })
140
+
141
+ describe('agentStopped on error', () => {
142
+ it('non-retryable LLM error → agentStopped kind:errored with message', async () => {
143
+ const harness = new TestHarness({
144
+ presets: [createTestPreset()],
145
+ systemPlugins: [agentStatusPlugin],
146
+ llmProvider: MockLLMProvider.withError({ type: 'invalid_request', message: 'Bad request' }),
147
+ })
148
+
149
+ const session = await harness.createSession('test')
150
+ const entryAgentId = session.getEntryAgentId()!
151
+ await session.sendMessage('Trigger error')
152
+ await waitForAgentStatus(session, entryAgentId, 'errored')
153
+
154
+ const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === String(entryAgentId))
155
+ expect(stopped).toHaveLength(1)
156
+ expect(stopped[0].kind).toBe('errored')
157
+ expect(stopped[0].reason).toBeUndefined()
158
+ expect(stopped[0].message).toBe('Bad request')
159
+ expect(stopped[0].definitionName).toBeDefined()
160
+
161
+ await harness.shutdown()
162
+ })
163
+ })
164
+ })
@@ -14,6 +14,11 @@
14
14
  * `idle` fires on `onComplete`, `onError`, and `onPause` — covers every terminal
15
15
  * state of an agent turn, including hard-limit pauses (limits-guard) and manual
16
16
  * `Session.pauseAgent` calls that would otherwise leave the indicator hung.
17
+ *
18
+ * Alongside the `idle` status, abnormal terminal states (pause / error) also emit
19
+ * a dedicated `agentStopped` notification carrying the pause reason / error detail,
20
+ * so consumers (e.g. a Cloudflare worker) can alert on a budget pause or crash —
21
+ * which the coarse `idle` status alone can't distinguish from a normal completion.
17
22
  */
18
23
 
19
24
  import z from 'zod/v4'
@@ -21,6 +26,24 @@ import { agentIdSchema, protocolAgentStatusSchema } from '~/core/agents/schema.j
21
26
  import { definePlugin } from '~/core/plugins/index.js'
22
27
  import { sessionIdSchema } from '~/core/sessions/schema.js'
23
28
 
29
+ /**
30
+ * Payload for the `agentStopped` notification — emitted when an agent reaches an
31
+ * abnormal terminal state (paused or errored), as opposed to a normal idle.
32
+ */
33
+ export const agentStoppedNotificationSchema = z.object({
34
+ sessionId: sessionIdSchema,
35
+ agentId: agentIdSchema,
36
+ definitionName: z.string().optional(),
37
+ kind: z.enum(['paused', 'errored']),
38
+ /** Present when kind === 'paused' — why the agent was paused. */
39
+ reason: z.enum(['limit', 'handler', 'manual']).optional(),
40
+ /** Human-readable detail (budget message / error message). */
41
+ message: z.string().optional(),
42
+ timestamp: z.number(),
43
+ })
44
+
45
+ export type AgentStoppedNotification = z.infer<typeof agentStoppedNotificationSchema>
46
+
24
47
  export const agentStatusPlugin = definePlugin('agent-status')
25
48
  .notification('agentStatus', {
26
49
  schema: z.object({
@@ -31,6 +54,9 @@ export const agentStatusPlugin = definePlugin('agent-status')
31
54
  timestamp: z.number(),
32
55
  }),
33
56
  })
57
+ .notification('agentStopped', {
58
+ schema: agentStoppedNotificationSchema,
59
+ })
34
60
  .hook('onStart', async (ctx) => {
35
61
  ctx.notify('agentStatus', {
36
62
  sessionId: ctx.sessionId,
@@ -82,6 +108,15 @@ export const agentStatusPlugin = definePlugin('agent-status')
82
108
  definitionName: ctx.agentState.definitionName,
83
109
  timestamp: Date.now(),
84
110
  })
111
+ // Additive abnormal-terminal signal for alerting (e.g. worker crash alert).
112
+ ctx.notify('agentStopped', {
113
+ sessionId: ctx.sessionId,
114
+ agentId: ctx.agentId,
115
+ definitionName: ctx.agentState.definitionName,
116
+ kind: 'errored',
117
+ message: ctx.error,
118
+ timestamp: Date.now(),
119
+ })
85
120
  return null
86
121
  })
87
122
  .hook('onPause', async (ctx) => {
@@ -95,6 +130,20 @@ export const agentStatusPlugin = definePlugin('agent-status')
95
130
  definitionName: ctx.agentState.definitionName,
96
131
  timestamp: Date.now(),
97
132
  })
133
+ // Additive abnormal-terminal signal carrying the structured pause reason and
134
+ // message. Read from agentState (set by the agent_paused reducer) rather than
135
+ // the loosely-typed `ctx.reason`, which actually carries the message string.
136
+ // A budget breach surfaces as reason:'handler' with the budget detail in
137
+ // `message` (limits-guard pauses via beforeInference `{action:'pause'}`).
138
+ ctx.notify('agentStopped', {
139
+ sessionId: ctx.sessionId,
140
+ agentId: ctx.agentId,
141
+ definitionName: ctx.agentState.definitionName,
142
+ kind: 'paused',
143
+ reason: ctx.agentState.pauseReason,
144
+ message: ctx.agentState.pauseMessage,
145
+ timestamp: Date.now(),
146
+ })
98
147
  return null
99
148
  })
100
149
  .build()
@@ -59,6 +59,17 @@ interface RunningService {
59
59
  logs: RingBuffer
60
60
  }
61
61
 
62
+ /** Matches a port bind-conflict across the Node and Bun runtimes. */
63
+ const PORT_CONFLICT_PATTERN = /EADDRINUSE|address already in use/i
64
+
65
+ /**
66
+ * How many times {@link ServiceExecutor.start} will silently re-allocate a fresh
67
+ * port and retry when the chosen port is already held by a foreign process
68
+ * (EADDRINUSE). Bounded so a service that is genuinely unstartable still ends up
69
+ * `failed` instead of looping forever.
70
+ */
71
+ const MAX_PORT_CONFLICT_RETRIES = 3
72
+
62
73
  // ============================================================================
63
74
  // ServiceExecutor
64
75
  // ============================================================================
@@ -72,6 +83,10 @@ export class ServiceExecutor {
72
83
  private readonly services = new Map<string, RunningService>()
73
84
  private readonly allocatedPorts = new Map<string, number>()
74
85
  private readonly waiters = new Map<string, Array<{ resolve: (result: Result<void, ToolError>) => void; timer: ReturnType<typeof setTimeout> }>>()
86
+ /** Per-type lock collapsing concurrent start() calls onto a single in-flight start. */
87
+ private readonly startInFlight = new Map<string, Promise<Result<void, ToolError>>>()
88
+ /** Per-type counter bounding automatic EADDRINUSE port re-allocation retries. */
89
+ private readonly portConflictRetries = new Map<string, number>()
75
90
  private readonly logger: Logger
76
91
  private readonly portPool: PortPool
77
92
  private readonly fs: FileSystem
@@ -158,12 +173,40 @@ export class ServiceExecutor {
158
173
 
159
174
  /**
160
175
  * Start a service. Idempotent — returns Ok if already running or starting.
176
+ *
177
+ * Concurrent calls for the same service type are collapsed onto a single
178
+ * in-flight start. The executor mutates its per-type state (`services` /
179
+ * `allocatedPorts`) only between awaits, so without this guard two overlapping
180
+ * starts could both pass the "already running" check and spawn two processes
181
+ * on the same allocated port: one wins the port, the other dies with
182
+ * EADDRINUSE, and — because state is keyed by service type — the loser's
183
+ * `failed` event overwrites the winner's `ready`, leaving a healthy-but-
184
+ * untracked listener while the control plane believes the service failed.
185
+ * Deduping here guarantees exactly one process per type.
161
186
  */
162
187
  async start(
163
188
  config: ServiceConfig,
164
189
  sessionId: SessionId,
165
190
  workspaceDir?: string,
166
191
  preferredPort?: number,
192
+ ): Promise<Result<void, ToolError>> {
193
+ const inFlight = this.startInFlight.get(config.type)
194
+ if (inFlight) return inFlight
195
+
196
+ const promise = this.startInternal(config, sessionId, workspaceDir, preferredPort)
197
+ this.startInFlight.set(config.type, promise)
198
+ try {
199
+ return await promise
200
+ } finally {
201
+ this.startInFlight.delete(config.type)
202
+ }
203
+ }
204
+
205
+ private async startInternal(
206
+ config: ServiceConfig,
207
+ sessionId: SessionId,
208
+ workspaceDir?: string,
209
+ preferredPort?: number,
167
210
  ): Promise<Result<void, ToolError>> {
168
211
  const existing = this.services.get(config.type)
169
212
  if (existing && (existing.status === 'starting' || existing.status === 'ready')) {
@@ -227,6 +270,9 @@ export class ServiceExecutor {
227
270
 
228
271
  const logs = new RingBuffer(logBufferSize)
229
272
  const startTime = Date.now()
273
+ // Set when the child reports a port bind-conflict; read by the close handler
274
+ // to decide between a fresh-port retry and a terminal failure.
275
+ let portConflictDetected = false
230
276
 
231
277
  const entry: RunningService = {
232
278
  config,
@@ -240,6 +286,9 @@ export class ServiceExecutor {
240
286
 
241
287
  const processLine = (line: string) => {
242
288
  logs.push(line)
289
+ if (PORT_CONFLICT_PATTERN.test(line)) {
290
+ portConflictDetected = true
291
+ }
243
292
  const current = this.services.get(config.type)
244
293
  if (!current || current.process !== child) return
245
294
 
@@ -252,6 +301,7 @@ export class ServiceExecutor {
252
301
  if (readyRegex.test(line)) {
253
302
  current.status = 'ready'
254
303
  if (startupTimer) clearTimeout(startupTimer)
304
+ this.portConflictRetries.delete(config.type)
255
305
  const startupDurationMs = Date.now() - startTime
256
306
  this.notifyStatusChanged(sessionId, config.type, 'ready', current.port)
257
307
  this.logger.info('Service ready', {
@@ -327,6 +377,28 @@ export class ServiceExecutor {
327
377
  current.status = 'stopped'
328
378
  this.notifyStatusChanged(sessionId, config.type, 'stopped')
329
379
  } else if (current.status === 'starting' || current.status === 'ready') {
380
+ const retries = this.portConflictRetries.get(config.type) ?? 0
381
+ if (portConflictDetected && retries < MAX_PORT_CONFLICT_RETRIES) {
382
+ // The chosen port is held by a foreign process (e.g. a service
383
+ // leaked from another session, or a survivor of a previous boot).
384
+ // Re-allocate a fresh port and retry so the service recovers on a
385
+ // different port instead of wedging on the occupied one. The
386
+ // conflicted port stays reserved in the pool — it is physically in
387
+ // use, so releasing it would let a later allocation hand it out and
388
+ // collide again — while we drop only our type→port pin so the retry
389
+ // picks a new one.
390
+ this.portConflictRetries.set(config.type, retries + 1)
391
+ this.logger.warn('Service port in use — re-allocating to a fresh port', {
392
+ serviceType: config.type,
393
+ conflictedPort: current.port,
394
+ attempt: retries + 1,
395
+ })
396
+ this.allocatedPorts.delete(config.type)
397
+ this.services.delete(config.type)
398
+ void this.start(config, sessionId, workspaceDir)
399
+ return
400
+ }
401
+
330
402
  // Unexpected exit
331
403
  current.status = 'failed'
332
404
  const errorMsg = `Process exited unexpectedly with code ${code}`
@@ -335,6 +407,7 @@ export class ServiceExecutor {
335
407
  serviceType: config.type,
336
408
  code,
337
409
  })
410
+ this.portConflictRetries.delete(config.type)
338
411
  }
339
412
  })
340
413