From 8705d502f087967042aac59272cefcfc737fa500 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Sat, 4 Jul 2026 17:03:45 +0800 Subject: [PATCH 1/5] refactor: remove PromptOrigin from IAgentTurnService.launch Turn origin is tracked on context messages instead; drop it from the turn launch API and wire records. Co-authored-by: Cursor --- .../agent-core-v2/src/agent/goal/goalService.ts | 2 +- .../src/agent/prompt/promptService.ts | 10 ++++------ packages/agent-core-v2/src/agent/turn/turn.ts | 3 +-- .../agent-core-v2/src/agent/turn/turnService.ts | 10 +++------- .../agent-core-v2/test/gateway/gateway.test.ts | 2 +- packages/agent-core-v2/test/goal/goal.test.ts | 6 +++--- .../test/prompt/promptService.test.ts | 4 ++-- packages/agent-core-v2/test/turn/stubs.ts | 16 ++++++++-------- .../agent-core-v2/test/turn/turn-ready.test.ts | 11 ++++------- 9 files changed, 27 insertions(+), 37 deletions(-) diff --git a/packages/agent-core-v2/src/agent/goal/goalService.ts b/packages/agent-core-v2/src/agent/goal/goalService.ts index 6a7eb7b53..f57a9dd25 100644 --- a/packages/agent-core-v2/src/agent/goal/goalService.ts +++ b/packages/agent-core-v2/src/agent/goal/goalService.ts @@ -504,7 +504,7 @@ export class AgentGoalService extends Disposable implements IAgentGoalService { origin: GOAL_CONTINUATION_ORIGIN, }); this.context.splice(this.context.get().length, 0, [message]); - this.turnService.launch(GOAL_CONTINUATION_ORIGIN); + this.turnService.launch(); } private normalizeAfterReplay(): void { diff --git a/packages/agent-core-v2/src/agent/prompt/promptService.ts b/packages/agent-core-v2/src/agent/prompt/promptService.ts index 8cdacf81e..45da94144 100644 --- a/packages/agent-core-v2/src/agent/prompt/promptService.ts +++ b/packages/agent-core-v2/src/agent/prompt/promptService.ts @@ -5,9 +5,7 @@ import { ErrorCodes, KimiError } from '#/errors'; import { ensureMessageId, IAgentContextMemoryService, - USER_PROMPT_ORIGIN, type ContextMessage, - type PromptOrigin, } from '#/agent/contextMemory'; import { IAgentLoopService } from '#/agent/loop'; import { IAgentRecordService } from '#/agent/record'; @@ -56,7 +54,7 @@ export class AgentPromptService implements IAgentPromptService { const stamped = ensureMessageId(message); this.append(stamped); if (await this.blockedByHook(stamped, false)) return undefined; - return this.launch(stamped.origin ?? USER_PROMPT_ORIGIN); + return this.launch(); } steer(message: ContextMessage): PromptSteerHandle { @@ -82,7 +80,7 @@ export class AgentPromptService implements IAgentPromptService { } retry(trigger?: string): Turn | undefined { - return this.launch({ kind: 'retry', trigger }); + return this.launch(); } undo(count: number): number { @@ -134,8 +132,8 @@ export class AgentPromptService implements IAgentPromptService { this.context.splice(this.context.get().length, 0, messages); } - private launch(origin: PromptOrigin): Turn { - const turn = this.turnService.launch(origin); + private launch(): Turn { + const turn = this.turnService.launch(); this.observe(turn); return turn; } diff --git a/packages/agent-core-v2/src/agent/turn/turn.ts b/packages/agent-core-v2/src/agent/turn/turn.ts index f8216c694..455e94135 100644 --- a/packages/agent-core-v2/src/agent/turn/turn.ts +++ b/packages/agent-core-v2/src/agent/turn/turn.ts @@ -1,6 +1,5 @@ import { createDecorator } from "#/_base/di"; import type { TurnResult } from '#/agent/loop'; -import type { PromptOrigin } from '#/agent/contextMemory'; import type { Hooks } from '#/hooks'; export type { TurnResult } from '#/agent/loop'; @@ -23,7 +22,7 @@ export interface TurnEndedContext { export interface IAgentTurnService { readonly _serviceBrand: undefined; - launch(origin: PromptOrigin): Turn; + launch(): Turn; getActiveTurn(): Turn | undefined; readonly hooks: Hooks<{ diff --git a/packages/agent-core-v2/src/agent/turn/turnService.ts b/packages/agent-core-v2/src/agent/turn/turnService.ts index 6d79059ba..082a5c0c6 100644 --- a/packages/agent-core-v2/src/agent/turn/turnService.ts +++ b/packages/agent-core-v2/src/agent/turn/turnService.ts @@ -3,7 +3,6 @@ import { createControlledPromise } from '@antfu/utils'; import { InstantiationType } from '#/_base/di/extensions'; import { LifecycleScope, registerScopedService } from '#/_base/di/scope'; import { ErrorCodes, KimiError, toKimiErrorPayload } from '#/errors'; -import type { PromptOrigin } from '#/agent/contextMemory'; import { OrderedHookSlot } from '#/hooks'; import { IAgentLoopService } from '#/agent/loop'; import { IAgentTelemetryContextService, ITelemetryService } from '#/app/telemetry'; @@ -19,7 +18,6 @@ declare module '#/agent/wireRecord' { interface WireRecordMap { 'turn.launch': { turnId: number; - origin: PromptOrigin; }; } } @@ -47,7 +45,7 @@ export class AgentTurnService implements IAgentTurnService { }); } - launch(origin: PromptOrigin): Turn { + launch(): Turn { if (this.activeTurn !== undefined) { throw new KimiError( ErrorCodes.TURN_AGENT_BUSY, @@ -57,7 +55,7 @@ export class AgentTurnService implements IAgentTurnService { } const turnId = this.nextTurnId; - this.record.append({ type: 'turn.launch', turnId, origin }); + this.record.append({ type: 'turn.launch', turnId }); this.restoreLaunch(turnId); const abortController = new AbortController(); const ready = createControlledPromise(); @@ -69,7 +67,7 @@ export class AgentTurnService implements IAgentTurnService { }; void ready.catch(() => undefined); this.activeTurn = turn; - turn.result = this.runTurn(turn, origin, ready); + turn.result = this.runTurn(turn, ready); void this.hooks.onLaunched.run({ turn }); return turn; } @@ -80,7 +78,6 @@ export class AgentTurnService implements IAgentTurnService { private async runTurn( turn: Turn, - origin: PromptOrigin, ready: ReturnType>, ): Promise { const startedAt = Date.now(); @@ -91,7 +88,6 @@ export class AgentTurnService implements IAgentTurnService { this.record.signal({ type: 'turn.started', turnId: turn.id, - origin, }); result = await this.loop.runTurn(turn.id, { signal: turn.abortController.signal, diff --git a/packages/agent-core-v2/test/gateway/gateway.test.ts b/packages/agent-core-v2/test/gateway/gateway.test.ts index 5c0071342..895711e40 100644 --- a/packages/agent-core-v2/test/gateway/gateway.test.ts +++ b/packages/agent-core-v2/test/gateway/gateway.test.ts @@ -118,7 +118,7 @@ describe('RestGateway', () => { it('aborts the active turn signal on cancel', async () => { const gw = ix.get(IRestGateway); - const turn = turnService.launch({ kind: 'user' }); + const turn = turnService.launch(); await gw.cancel('s1', 'main', 'bye'); expect(turn.abortController.signal.aborted).toBe(true); diff --git a/packages/agent-core-v2/test/goal/goal.test.ts b/packages/agent-core-v2/test/goal/goal.test.ts index 64d9e9c47..d3f675555 100644 --- a/packages/agent-core-v2/test/goal/goal.test.ts +++ b/packages/agent-core-v2/test/goal/goal.test.ts @@ -567,7 +567,7 @@ describe('AgentGoalService core workflow hooks', () => { status: 'active', turnsUsed: 1, }); - expect(turnService.launches).toEqual([{ kind: 'system_trigger', name: 'goal_continuation' }]); + expect(turnService.launches).toHaveLength(1); expect(context.get().at(-1)?.origin).toEqual({ kind: 'system_trigger', name: 'goal_continuation', @@ -596,7 +596,7 @@ describe('AgentGoalService core workflow hooks', () => { await goals.createGoal({ objective: 'finish the task' }); await goals.setBudgetLimits({ budgetLimits: { tokenBudget: 7 } }, 'model'); - const turn = turnService.launch({ kind: 'user' }); + const turn = turnService.launch(); await turnService.hooks.onLaunched.run({ turn }); expect( @@ -653,7 +653,7 @@ describe('AgentGoalService core workflow hooks', () => { status: 'active', turnsUsed: 0, }); - expect(turnService.launches).toEqual([{ kind: 'system_trigger', name: 'goal_continuation' }]); + expect(turnService.launches).toHaveLength(1); }); it('requests one final outcome turn after model completion', async () => { diff --git a/packages/agent-core-v2/test/prompt/promptService.test.ts b/packages/agent-core-v2/test/prompt/promptService.test.ts index bb25db1e8..cc7831eab 100644 --- a/packages/agent-core-v2/test/prompt/promptService.test.ts +++ b/packages/agent-core-v2/test/prompt/promptService.test.ts @@ -85,7 +85,7 @@ describe('AgentPromptService', () => { it('runs submit hooks before queuing active steers', async () => { const { context, loop, prompt, turn } = createHarness({ hasActiveTurn: true }); - const activeTurn = turn.launch({ kind: 'user' }); + const activeTurn = turn.launch(); const seen: Array & { readonly originKind: string | undefined; }> = []; @@ -123,7 +123,7 @@ describe('AgentPromptService', () => { it('does not queue active steers blocked by hooks', async () => { const { context, loop, prompt, turn } = createHarness({ hasActiveTurn: true }); - const activeTurn = turn.launch({ kind: 'user' }); + const activeTurn = turn.launch(); prompt.hooks.onWillSubmitPrompt.register('block', async (ctx) => { ctx.block = true; diff --git a/packages/agent-core-v2/test/turn/stubs.ts b/packages/agent-core-v2/test/turn/stubs.ts index 269b15a37..f768aac34 100644 --- a/packages/agent-core-v2/test/turn/stubs.ts +++ b/packages/agent-core-v2/test/turn/stubs.ts @@ -5,7 +5,6 @@ * production tree. Import from a relative path (`./stubs` or `../turn/stubs`). */ -import type { PromptOrigin } from '#/agent/contextMemory'; import type { IAgentLoopService } from '#/agent/loop'; import type { IAgentToolExecutorService } from '#/agent/toolExecutor'; import type { IAgentTurnService, Turn } from '#/agent/turn'; @@ -20,7 +19,7 @@ export interface StubTurnOptions { } /** - * An `IAgentTurnService` stub that also records `launch` origins and exposes the + * An `IAgentTurnService` stub that also records `launch` calls and exposes the * active turn. `prompts` / `steered` are retained as empty arrays for legacy * assertions — the HEAD `IAgentTurnService` has no `prompt` / `steer` methods, so * tests that used to drive them should be rewritten against `launch` + hooks. @@ -28,7 +27,7 @@ export interface StubTurnOptions { export type StubTurn = IAgentTurnService & { readonly prompts: readonly string[]; readonly steered: readonly string[]; - readonly launches: readonly PromptOrigin[]; + readonly launches: readonly number[]; }; function makeTurn(id: number): Turn { @@ -57,16 +56,17 @@ function makeAgentLoopHookSlots(): IAgentLoopService['hooks'] { /** A configurable `IAgentTurnService` stub backed by real `OrderedHookSlot`s. */ export function stubTurn(options: StubTurnOptions = {}): StubTurn { - const launches: PromptOrigin[] = []; + const launches: number[] = []; let activeTurn: Turn | undefined; let nextId = typeof options.currentId === 'number' ? options.currentId : 0; return { _serviceBrand: undefined, hooks: makeHooks(), - launch(origin) { - launches.push(origin); - activeTurn = makeTurn(nextId++); - return activeTurn; + launch() { + const turn = makeTurn(nextId++); + launches.push(turn.id); + activeTurn = turn; + return turn; }, getActiveTurn() { return options.hasActiveTurn ? activeTurn : undefined; diff --git a/packages/agent-core-v2/test/turn/turn-ready.test.ts b/packages/agent-core-v2/test/turn/turn-ready.test.ts index 64be03eb8..a490b3c53 100644 --- a/packages/agent-core-v2/test/turn/turn-ready.test.ts +++ b/packages/agent-core-v2/test/turn/turn-ready.test.ts @@ -3,7 +3,6 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { DisposableStore } from '#/_base/di/lifecycle'; import { createServices, type TestInstantiationService } from '#/_base/di/test'; -import type { PromptOrigin } from '#/agent/contextMemory'; import { IAgentContextMemoryService } from '#/agent/contextMemory'; import { AgentLoopService, IAgentLoopService } from '#/agent/loop'; import { IAgentLLMRequesterService } from '#/agent/llmRequester'; @@ -21,8 +20,6 @@ import { stubLog } from '../log/stubs'; import { recordingTelemetry } from '../telemetry/stubs'; import { stubLoopWithHooks, stubToolExecutor } from './stubs'; -const SYSTEM_ORIGIN: PromptOrigin = { kind: 'system_trigger', name: 'test' }; - describe('AgentTurnService ready', () => { let disposables: DisposableStore; let ix: TestInstantiationService; @@ -75,7 +72,7 @@ describe('AgentTurnService ready', () => { return { reason: 'completed', steps: 1 }; }; - const turn = ix.get(IAgentTurnService).launch(SYSTEM_ORIGIN); + const turn = ix.get(IAgentTurnService).launch(); void turn.ready.then( () => { readySettled = true; @@ -103,7 +100,7 @@ describe('AgentTurnService ready', () => { const cause = new Error('loop failed before first step'); loop.runTurn = async () => ({ reason: 'failed', error: cause, steps: 0 }); - const turn = ix.get(IAgentTurnService).launch(SYSTEM_ORIGIN); + const turn = ix.get(IAgentTurnService).launch(); let readyError: unknown; await turn.ready.catch((error: unknown) => { readyError = error; @@ -123,10 +120,10 @@ describe('AgentTurnService ready', () => { }; const turnService = ix.get(IAgentTurnService); - const turn = turnService.launch(SYSTEM_ORIGIN); + const turn = turnService.launch(); let error: unknown; try { - turnService.launch(SYSTEM_ORIGIN); + turnService.launch(); } catch (caught) { error = caught; } finally { From c0c9f155da51db90f06862a4845e63b148cc0f08 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Sat, 4 Jul 2026 17:14:50 +0800 Subject: [PATCH 2/5] fix: restore prompt id in server-v2 snapshots --- .../composables/client/useWorkspaceState.ts | 7 +- apps/kimi-web/test/workspace-state.test.ts | 26 +++++ packages/server-v2/src/routes/snapshot.ts | 37 +++++- packages/server-v2/test/snapshot.test.ts | 106 ++++++++++++++++++ 4 files changed, 171 insertions(+), 5 deletions(-) diff --git a/apps/kimi-web/src/composables/client/useWorkspaceState.ts b/apps/kimi-web/src/composables/client/useWorkspaceState.ts index c1a71fc11..e0b400d78 100644 --- a/apps/kimi-web/src/composables/client/useWorkspaceState.ts +++ b/apps/kimi-web/src/composables/client/useWorkspaceState.ts @@ -1266,11 +1266,12 @@ export function useWorkspaceState(rawState: ExtendedState, deps: UseWorkspaceSta // 1. Authoritative id captured at submit time. let promptId = rawState.promptIdBySession[sid]; - // 2. Fallback to projector-derived id only when it is a real daemon prompt_id - // (synthetic `pr_...` ids are rejected by the daemon). + // 2. Fallback to projector-derived id only when it is a real daemon prompt_id. + // The v1 daemon uses `prompt_...`, server-v2 legacy uses `msg_...`; + // only local synthetic `pr_...` ids are rejected by the daemon. if (promptId === undefined) { const candidate = session?.currentPromptId; - if (candidate?.startsWith('prompt_')) { + if (candidate !== undefined && candidate.length > 0 && !candidate.startsWith('pr_')) { promptId = candidate; } } diff --git a/apps/kimi-web/test/workspace-state.test.ts b/apps/kimi-web/test/workspace-state.test.ts index ee1abfe63..6afbd7159 100644 --- a/apps/kimi-web/test/workspace-state.test.ts +++ b/apps/kimi-web/test/workspace-state.test.ts @@ -236,6 +236,32 @@ describe('useWorkspaceState — abortCurrentPrompt', () => { expect(apiMock.abortPrompt).toHaveBeenCalledWith('sess_1', 'prompt_stale'); expect(apiMock.abortSession).not.toHaveBeenCalled(); }); + + it('uses a server-v2 msg prompt id recovered from session state', async () => { + apiMock.abortPrompt.mockResolvedValue({ aborted: true }); + const state = createState(); + state.promptIdBySession = {}; + state.sessions = [{ ...state.sessions[0]!, currentPromptId: 'msg_live' }]; + const workspace = useWorkspaceState(state, createDeps()); + + await workspace.abortCurrentPrompt(); + + expect(apiMock.abortPrompt).toHaveBeenCalledWith('sess_1', 'msg_live'); + expect(apiMock.abortSession).not.toHaveBeenCalled(); + }); + + it('does not send synthetic projector prompt ids to per-prompt abort', async () => { + apiMock.abortSession.mockResolvedValue({ aborted: true }); + const state = createState(); + state.promptIdBySession = {}; + state.sessions = [{ ...state.sessions[0]!, currentPromptId: 'pr_synthetic' }]; + const workspace = useWorkspaceState(state, createDeps()); + + await workspace.abortCurrentPrompt(); + + expect(apiMock.abortPrompt).not.toHaveBeenCalled(); + expect(apiMock.abortSession).toHaveBeenCalledWith('sess_1'); + }); }); describe('mergeWorkspaces', () => { diff --git a/packages/server-v2/src/routes/snapshot.ts b/packages/server-v2/src/routes/snapshot.ts index 4d270ce16..6ea09db33 100644 --- a/packages/server-v2/src/routes/snapshot.ts +++ b/packages/server-v2/src/routes/snapshot.ts @@ -16,15 +16,22 @@ import { IAgentContextMemoryService, IAgentLifecycleService, + IAgentPromptLegacyService, ISessionInteractionService, ISessionContext, ISessionLifecycleService, ISessionMetadata, IWorkspaceRegistry, toProtocolMessage, + type IAgentScopeHandle, type Scope, } from '@moonshot-ai/agent-core-v2'; -import { ErrorCode, sessionSnapshotResponseSchema, type Message } from '@moonshot-ai/protocol'; +import { + ErrorCode, + sessionSnapshotResponseSchema, + type InFlightTurn, + type Message, +} from '@moonshot-ai/protocol'; import { z } from 'zod'; import { errEnvelope, okEnvelope } from '../envelope'; @@ -111,6 +118,14 @@ export function registerSnapshotRoutes(app: SnapshotRouteHost, deps: SnapshotRou const offset = history.length - page.length; items = page.map((msg, i) => toProtocolMessage(session_id, offset + i, msg, meta.createdAt)); } + const currentPromptId = + snapState.inFlightTurn === null + ? undefined + : readCurrentPromptId(main); + const inFlightTurn = attachCurrentPromptIdToInFlight( + snapState.inFlightTurn, + currentPromptId, + ); // Pending approvals / questions. const interaction = handle.accessor.get(ISessionInteractionService); @@ -128,7 +143,7 @@ export function registerSnapshotRoutes(app: SnapshotRouteHost, deps: SnapshotRou epoch: snapState.epoch, session, messages: { items, has_more: hasMore }, - in_flight_turn: snapState.inFlightTurn, + in_flight_turn: inFlightTurn, pending_approvals: pendingApprovals, pending_questions: pendingQuestions, }, @@ -139,3 +154,21 @@ export function registerSnapshotRoutes(app: SnapshotRouteHost, deps: SnapshotRou ); app.get(route.path, route.options, route.handler as Parameters[2]); } + +function readCurrentPromptId(main: IAgentScopeHandle | undefined): string | undefined { + if (main === undefined) return undefined; + try { + return main.accessor.get(IAgentPromptLegacyService).list().active?.prompt_id; + } catch { + // Auxiliary reconnect metadata must not make the whole snapshot fail. + return undefined; + } +} + +function attachCurrentPromptIdToInFlight( + inFlightTurn: InFlightTurn | null, + currentPromptId: string | undefined, +): InFlightTurn | null { + if (inFlightTurn === null || currentPromptId === undefined) return inFlightTurn; + return { ...inFlightTurn, current_prompt_id: currentPromptId }; +} diff --git a/packages/server-v2/test/snapshot.test.ts b/packages/server-v2/test/snapshot.test.ts index 21d6b3559..342b29cd4 100644 --- a/packages/server-v2/test/snapshot.test.ts +++ b/packages/server-v2/test/snapshot.test.ts @@ -11,15 +11,121 @@ import { IAgentContextMemoryService, IAgentEventSinkService, IAgentLifecycleService, + IAgentPromptLegacyService, + ISessionInteractionService, ISessionContext, ISessionLifecycleService, + ISessionMetadata, + IWorkspaceRegistry, } from '@moonshot-ai/agent-core-v2'; import { sessionSnapshotResponseSchema, type AgentEvent } from '@moonshot-ai/protocol'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { registerSnapshotRoutes } from '../src/routes/snapshot'; import { type RunningServer, startServer } from '../src/start'; import { authHeaders } from './helpers/auth'; +function fakeAccessor(entries: ReadonlyArray) { + const services = new Map(entries); + return { + get(id: unknown): T { + if (!services.has(id)) { + throw new Error(`unexpected service request: ${String(id)}`); + } + return services.get(id) as T; + }, + }; +} + +describe('server-v2 snapshot route enrichment', () => { + it('attaches current_prompt_id to an in-flight turn from promptLegacy active state', async () => { + const sessionId = 'sess_snapshot'; + const promptId = 'msg_snapshot_prompt'; + const workspaceId = 'wd_snapshot_012345abcdef'; + const now = Date.parse('2026-01-01T00:00:00.000Z'); + const main = { + accessor: fakeAccessor([ + [IAgentContextMemoryService, { get: () => [] }], + [ + IAgentPromptLegacyService, + { list: () => ({ active: { prompt_id: promptId }, queued: [] }) }, + ], + ]), + }; + const session = { + accessor: fakeAccessor([ + [ISessionContext, { workspaceId }], + [ + ISessionMetadata, + { + read: async () => ({ + id: sessionId, + title: 'Snapshot', + createdAt: now, + updatedAt: now, + archived: false, + }), + }, + ], + [IAgentLifecycleService, { getHandle: () => main }], + [ISessionInteractionService, { listPending: () => [] }], + ]), + }; + const core = { + accessor: fakeAccessor([ + [ISessionLifecycleService, { resume: async () => session }], + [IWorkspaceRegistry, { get: async () => ({ root: '/workspace' }) }], + ]), + }; + const broadcaster = { + getSnapshotState: async () => ({ + seq: 1, + epoch: 'ep_snapshot', + inFlightTurn: { + turn_id: 7, + assistant_text: 'Hello', + thinking_text: '', + running_tools: [], + }, + }), + }; + + let routeHandler: + | (( + req: { id: string; params: { session_id: string } }, + reply: { send(payload: unknown): unknown }, + ) => Promise | void) + | undefined; + registerSnapshotRoutes( + { + get: (_path, _options, handler) => { + routeHandler = handler; + }, + }, + { core: core as never, broadcaster: broadcaster as never }, + ); + + let payload: unknown; + await routeHandler?.( + { id: 'req_snapshot', params: { session_id: sessionId } }, + { + send: (value) => { + payload = value; + }, + }, + ); + + const body = payload as { code: number; data: unknown }; + expect(body.code).toBe(0); + const snap = sessionSnapshotResponseSchema.parse(body.data); + expect(snap.in_flight_turn).toMatchObject({ + turn_id: 7, + assistant_text: 'Hello', + current_prompt_id: promptId, + }); + }); +}); + describe('server-v2 GET /api/v1/sessions/:id/snapshot', () => { let server: RunningServer | undefined; let home: string | undefined; From 0d9d91f584c7f037d40e8257c624044275dee219 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Sat, 4 Jul 2026 17:23:52 +0800 Subject: [PATCH 3/5] fix: remove TurnStartedEvent.origin --- packages/protocol/src/events.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/protocol/src/events.ts b/packages/protocol/src/events.ts index 1af816eaa..de33d2f32 100644 --- a/packages/protocol/src/events.ts +++ b/packages/protocol/src/events.ts @@ -469,7 +469,6 @@ export interface WarningEvent { export interface TurnStartedEvent { readonly type: 'turn.started'; readonly turnId: number; - readonly origin: PromptOrigin; } export interface TurnEndedEvent { From 14e3c769f3af261f198d4168bc3bd7f563afb5c7 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Sat, 4 Jul 2026 17:30:38 +0800 Subject: [PATCH 4/5] refactor: objectify agent loop run options --- packages/agent-core-v2/src/agent/loop/loop.ts | 7 ++--- .../src/agent/loop/loopService.ts | 14 +++++----- .../src/agent/turn/turnService.ts | 5 ++-- .../agent-core-v2/test/loop/basic.test.ts | 4 +-- .../test/task/idle-notification-repro.test.ts | 2 +- packages/agent-core-v2/test/turn/stubs.ts | 4 +-- .../test/turn/turn-ready.test.ts | 27 ++++++++++--------- 7 files changed, 33 insertions(+), 30 deletions(-) diff --git a/packages/agent-core-v2/src/agent/loop/loop.ts b/packages/agent-core-v2/src/agent/loop/loop.ts index 481d85c57..61f18f856 100644 --- a/packages/agent-core-v2/src/agent/loop/loop.ts +++ b/packages/agent-core-v2/src/agent/loop/loop.ts @@ -28,10 +28,11 @@ export interface TurnErrorContext { retry: boolean; } -export interface RunTurnOptions { +export interface RunOptions { + readonly turnId: number; readonly signal?: AbortSignal; /** Fires on the first model response event for a step, or at step completion. */ - readonly onStepStarted?: (step: number) => void; + readonly onStarted?: (step: number) => void; } export interface TurnResult { @@ -47,7 +48,7 @@ export interface IAgentLoopService { afterStep: TurnAfterStepContext; onError: TurnErrorContext; }>; - runTurn(turnId: number, options?: RunTurnOptions): Promise; + run(options: RunOptions): Promise; } export const IAgentLoopService = createDecorator('agentLoopService'); diff --git a/packages/agent-core-v2/src/agent/loop/loopService.ts b/packages/agent-core-v2/src/agent/loop/loopService.ts index 01c399954..3062d55cd 100644 --- a/packages/agent-core-v2/src/agent/loop/loopService.ts +++ b/packages/agent-core-v2/src/agent/loop/loopService.ts @@ -27,7 +27,7 @@ import { } from './errors'; import { IAgentLoopService, - type RunTurnOptions, + type RunOptions, type TurnAfterStepContext, type TurnResult, } from './loop'; @@ -57,10 +57,8 @@ export class AgentLoopService implements IAgentLoopService { @IConfigService private readonly config: IConfigService, ) { } - async runTurn( - turnId: number, - options: RunTurnOptions = {}, - ): Promise { + async run(options: RunOptions): Promise { + const { turnId } = options; const signal = options.signal ?? new AbortController().signal; let steps = 0; @@ -82,7 +80,7 @@ export class AgentLoopService implements IAgentLoopService { turnId, signal, steps, - options.onStepStarted, + options.onStarted, ); activeStep = undefined; @@ -134,7 +132,7 @@ export class AgentLoopService implements IAgentLoopService { turnId: number, signal: AbortSignal, currentStep: number, - onStepStarted: ((step: number) => void) | undefined, + onStarted: ((step: number) => void) | undefined, ): Promise<{ readonly stopReason: FinishReason; readonly continue: boolean; @@ -150,7 +148,7 @@ export class AgentLoopService implements IAgentLoopService { const markStepStarted = (): void => { if (stepStarted) return; stepStarted = true; - onStepStarted?.(currentStep); + onStarted?.(currentStep); }; const emitStreamPart = this.createStreamPartHandler(turnId, markStepStarted); const response = await this.llmRequester.request( diff --git a/packages/agent-core-v2/src/agent/turn/turnService.ts b/packages/agent-core-v2/src/agent/turn/turnService.ts index 082a5c0c6..0761cb15d 100644 --- a/packages/agent-core-v2/src/agent/turn/turnService.ts +++ b/packages/agent-core-v2/src/agent/turn/turnService.ts @@ -89,9 +89,10 @@ export class AgentTurnService implements IAgentTurnService { type: 'turn.started', turnId: turn.id, }); - result = await this.loop.runTurn(turn.id, { + result = await this.loop.run({ + turnId: turn.id, signal: turn.abortController.signal, - onStepStarted: () => ready.resolve(), + onStarted: () => ready.resolve(), }); return result; } catch (error) { diff --git a/packages/agent-core-v2/test/loop/basic.test.ts b/packages/agent-core-v2/test/loop/basic.test.ts index 16e90d4e9..27ce80bca 100644 --- a/packages/agent-core-v2/test/loop/basic.test.ts +++ b/packages/agent-core-v2/test/loop/basic.test.ts @@ -138,7 +138,7 @@ describe('Agent loop', () => { const controller = new AbortController(); controller.abort(new Error('stop')); - const result = await loop.runTurn(0, { signal: controller.signal }); + const result = await loop.run({ turnId: 0, signal: controller.signal }); expect(result.reason).toBe('cancelled'); expect(called).toBe(false); @@ -150,7 +150,7 @@ describe('Agent loop', () => { throw recoveryError; }); - const result = await loop.runTurn(0); + const result = await loop.run({ turnId: 0 }); expect(result.reason).toBe('failed'); if (result.reason === 'failed') { diff --git a/packages/agent-core-v2/test/task/idle-notification-repro.test.ts b/packages/agent-core-v2/test/task/idle-notification-repro.test.ts index 32c8fc021..18f8f6ace 100644 --- a/packages/agent-core-v2/test/task/idle-notification-repro.test.ts +++ b/packages/agent-core-v2/test/task/idle-notification-repro.test.ts @@ -219,7 +219,7 @@ describe('task notification → main agent (real Agent instance)', () => { it('RACE: bg completion fires AFTER LLM returns but BEFORE activeTurn is cleared', async () => { // We're hunting a window: shouldContinueAfterStop reads an empty - // steerBuffer → returns { continue: false } → runTurn unwinds → + // steerBuffer → returns { continue: false } → loop.run unwinds → // finally block hasn't yet set activeTurn = null. If a steer() // lands in this window, it gets buffered, then activeTurn=null // and the buffer is never flushed until the next user prompt. diff --git a/packages/agent-core-v2/test/turn/stubs.ts b/packages/agent-core-v2/test/turn/stubs.ts index f768aac34..b016548bd 100644 --- a/packages/agent-core-v2/test/turn/stubs.ts +++ b/packages/agent-core-v2/test/turn/stubs.ts @@ -99,8 +99,8 @@ export function stubLoopWithHooks(): IAgentLoopService { return { _serviceBrand: undefined, hooks, - runTurn: async (_turnId, options) => { - options?.onStepStarted?.(1); + run: async (options) => { + options.onStarted?.(1); return { reason: 'completed', steps: 0 }; }, }; diff --git a/packages/agent-core-v2/test/turn/turn-ready.test.ts b/packages/agent-core-v2/test/turn/turn-ready.test.ts index a490b3c53..91801abe7 100644 --- a/packages/agent-core-v2/test/turn/turn-ready.test.ts +++ b/packages/agent-core-v2/test/turn/turn-ready.test.ts @@ -60,13 +60,13 @@ describe('AgentTurnService ready', () => { events.push('after'); beforeStepDone.resolve(); }); - loop.runTurn = async (turnId, options) => { + loop.run = async (options) => { events.push('loop'); - const signal = options?.signal ?? new AbortController().signal; + const { turnId, signal = new AbortController().signal } = options; await loop.hooks.beforeStep.run({ turnId, step: 1, signal }); await responseEvent; events.push('response'); - options?.onStepStarted?.(1); + options.onStarted?.(1); await release; events.push('done'); return { reason: 'completed', steps: 1 }; @@ -98,7 +98,7 @@ describe('AgentTurnService ready', () => { it('rejects with an Error when the turn ends before the first step starts', async () => { const cause = new Error('loop failed before first step'); - loop.runTurn = async () => ({ reason: 'failed', error: cause, steps: 0 }); + loop.run = async () => ({ reason: 'failed', error: cause, steps: 0 }); const turn = ix.get(IAgentTurnService).launch(); let readyError: unknown; @@ -114,7 +114,7 @@ describe('AgentTurnService ready', () => { it('throws a KimiError when launching while a turn is active', async () => { const release = createControlledPromise(); - loop.runTurn = async () => { + loop.run = async () => { await release; return { reason: 'completed', steps: 1 }; }; @@ -139,7 +139,7 @@ describe('AgentTurnService ready', () => { }); }); -describe('AgentLoopService onStepStarted', () => { +describe('AgentLoopService onStarted', () => { let disposables: DisposableStore; let ix: TestInstantiationService; @@ -189,8 +189,9 @@ describe('AgentLoopService onStepStarted', () => { }, }); - const result = ix.get(IAgentLoopService).runTurn(1, { - onStepStarted: (step) => { + const result = ix.get(IAgentLoopService).run({ + turnId: 1, + onStarted: (step) => { expect(step).toBe(1); started = true; stepStarted.resolve(); @@ -232,8 +233,9 @@ describe('AgentLoopService onStepStarted', () => { }, }); - const result = ix.get(IAgentLoopService).runTurn(1, { - onStepStarted: (step) => { + const result = ix.get(IAgentLoopService).run({ + turnId: 1, + onStarted: (step) => { expect(step).toBe(1); started = true; stepStarted.resolve(); @@ -262,8 +264,9 @@ describe('AgentLoopService onStepStarted', () => { }); await expect( - ix.get(IAgentLoopService).runTurn(1, { - onStepStarted: () => { + ix.get(IAgentLoopService).run({ + turnId: 1, + onStarted: () => { started = true; }, }), From 9a869d94ad4d7f15461cac3cabcfa4a909502497 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Sat, 4 Jul 2026 17:54:21 +0800 Subject: [PATCH 5/5] style: normalize agent-core-v2 service interface layout Align all DI service contracts on _serviceBrand first, a blank line, methods and properties, then hooks last when present. Co-authored-by: Cursor --- .../agent-core-v2/src/agent/blob/agentBlobService.ts | 1 + .../src/agent/contextInjector/contextInjector.ts | 1 + .../src/agent/contextMemory/contextMemory.ts | 1 + .../src/agent/contextProjector/contextProjector.ts | 1 + .../src/agent/externalHooks/externalHooks.ts | 1 + .../src/agent/fullCompaction/fullCompaction.ts | 9 +++++---- packages/agent-core-v2/src/agent/goal/goal.ts | 1 + .../src/agent/llmRequester/llmRequester.ts | 1 + packages/agent-core-v2/src/agent/loop/loop.ts | 4 +++- packages/agent-core-v2/src/agent/mcp/mcp.ts | 2 +- .../src/agent/microCompaction/microCompaction.ts | 1 + .../src/agent/permissionGate/permissionGate.ts | 10 ++++++---- .../src/agent/permissionMode/permissionMode.ts | 1 + .../src/agent/permissionPolicy/permissionPolicy.ts | 1 + .../src/agent/permissionRules/permissionRules.ts | 2 +- packages/agent-core-v2/src/agent/plan/plan.ts | 1 + packages/agent-core-v2/src/agent/profile/profile.ts | 1 + packages/agent-core-v2/src/agent/prompt/prompt.ts | 1 + .../src/agent/promptLegacy/promptLegacy.ts | 1 + packages/agent-core-v2/src/agent/record/record.ts | 3 +-- packages/agent-core-v2/src/agent/rpc/rpc.ts | 6 ++++-- .../src/agent/scopeContext/scopeContext.ts | 2 +- packages/agent-core-v2/src/agent/skill/skill.ts | 1 - packages/agent-core-v2/src/agent/swarm/swarm.ts | 1 + .../src/agent/systemReminder/systemReminder.ts | 1 - packages/agent-core-v2/src/agent/task/task.ts | 10 ++++------ .../agent-core-v2/src/agent/toolDedupe/toolDedupe.ts | 1 + .../src/agent/toolRegistry/toolRegistry.ts | 1 + .../agent-core-v2/src/agent/toolState/toolState.ts | 1 + packages/agent-core-v2/src/agent/turn/turn.ts | 1 + packages/agent-core-v2/src/agent/usage/usage.ts | 1 + .../agent-core-v2/src/agent/wireRecord/wireRecord.ts | 2 +- .../src/app/agentProfileCatalog/agentProfileCatalog.ts | 1 + packages/agent-core-v2/src/app/auth/auth.ts | 3 +++ .../agent-core-v2/src/app/auth/webSearch/webSearch.ts | 1 + packages/agent-core-v2/src/app/bootstrap/bootstrap.ts | 8 -------- packages/agent-core-v2/src/app/config/config.ts | 3 +-- .../agent-core-v2/src/app/cron/cronTaskPersistence.ts | 1 + packages/agent-core-v2/src/app/event/event.ts | 1 + packages/agent-core-v2/src/app/file/fileService.ts | 2 -- packages/agent-core-v2/src/app/flag/flag.ts | 1 + packages/agent-core-v2/src/app/flag/flagRegistry.ts | 2 -- packages/agent-core-v2/src/app/gateway/gateway.ts | 2 ++ packages/agent-core-v2/src/app/git/git.ts | 1 - .../src/app/globalSkillCatalog/globalSkillCatalog.ts | 1 - .../src/app/globalSkillCatalog/skillDiscovery.ts | 1 - .../src/app/hostFolderBrowser/hostFolderBrowser.ts | 1 - packages/agent-core-v2/src/app/log/log.ts | 3 +++ .../src/app/messageLegacy/messageLegacy.ts | 1 - packages/agent-core-v2/src/app/model/model.ts | 1 + packages/agent-core-v2/src/app/model/modelResolver.ts | 1 + packages/agent-core-v2/src/app/platform/platform.ts | 1 + packages/agent-core-v2/src/app/plugin/plugin.ts | 3 +-- packages/agent-core-v2/src/app/protocol/protocol.ts | 1 + packages/agent-core-v2/src/app/provider/provider.ts | 1 + .../agent-core-v2/src/app/sessionIndex/sessionIndex.ts | 1 + .../src/app/sessionLegacy/sessionLegacy.ts | 1 + .../src/app/sessionLifecycle/sessionLifecycle.ts | 1 + packages/agent-core-v2/src/app/task/task.ts | 1 - .../src/app/telemetry/agentTelemetryContext.ts | 1 + packages/agent-core-v2/src/app/telemetry/telemetry.ts | 1 + packages/agent-core-v2/src/app/web/web.ts | 1 + .../src/app/workspaceRegistry/workspacePersistence.ts | 1 - .../agent-core-v2/src/os/interface/hostEnvironment.ts | 1 - packages/agent-core-v2/src/os/interface/hostProcess.ts | 1 - .../src/persistence/interface/appendLogStore.ts | 5 ----- .../src/persistence/interface/atomicDocumentStore.ts | 5 ----- .../src/persistence/interface/blobStore.ts | 5 ----- .../src/persistence/interface/queryStore.ts | 8 -------- .../agent-core-v2/src/persistence/interface/storage.ts | 8 -------- .../src/session/agentLifecycle/agentLifecycle.ts | 1 + .../agent-core-v2/src/session/approval/approval.ts | 1 + packages/agent-core-v2/src/session/btw/btw.ts | 1 + .../src/session/cron/sessionCronService.ts | 5 +---- .../src/session/execContext/execContext.ts | 3 --- .../src/session/interaction/interaction.ts | 1 + .../agent-core-v2/src/session/question/question.ts | 1 + .../src/session/session/sessionWarning.ts | 1 + .../src/session/sessionActivity/sessionActivity.ts | 1 + .../src/session/sessionContext/sessionContext.ts | 2 +- .../src/session/sessionMetadata/sessionMetadata.ts | 1 + .../src/session/sessionSkillCatalog/skillCatalog.ts | 3 --- .../agent-core-v2/src/session/swarm/sessionSwarm.ts | 1 + .../src/session/terminal/terminalService.ts | 8 -------- .../src/session/workspaceContext/workspaceContext.ts | 1 - 85 files changed, 84 insertions(+), 101 deletions(-) diff --git a/packages/agent-core-v2/src/agent/blob/agentBlobService.ts b/packages/agent-core-v2/src/agent/blob/agentBlobService.ts index bb253c742..b9e27a7ae 100644 --- a/packages/agent-core-v2/src/agent/blob/agentBlobService.ts +++ b/packages/agent-core-v2/src/agent/blob/agentBlobService.ts @@ -19,6 +19,7 @@ export interface AgentBlobServiceOptions { export interface IAgentBlobService { readonly _serviceBrand: undefined; + offloadParts(parts: readonly ContentPart[]): Promise; rehydrateParts(parts: readonly ContentPart[]): Promise; isBlobRef(url: string): boolean; diff --git a/packages/agent-core-v2/src/agent/contextInjector/contextInjector.ts b/packages/agent-core-v2/src/agent/contextInjector/contextInjector.ts index a0cfb14c2..570adc619 100644 --- a/packages/agent-core-v2/src/agent/contextInjector/contextInjector.ts +++ b/packages/agent-core-v2/src/agent/contextInjector/contextInjector.ts @@ -18,6 +18,7 @@ export type ContextInjectionProvider = ( export interface IAgentContextInjectorService { readonly _serviceBrand: undefined; + register( variant: string, provider: ContextInjectionProvider, diff --git a/packages/agent-core-v2/src/agent/contextMemory/contextMemory.ts b/packages/agent-core-v2/src/agent/contextMemory/contextMemory.ts index 56432d637..525537164 100644 --- a/packages/agent-core-v2/src/agent/contextMemory/contextMemory.ts +++ b/packages/agent-core-v2/src/agent/contextMemory/contextMemory.ts @@ -5,6 +5,7 @@ import type { ContextMessage } from './types'; export interface IAgentContextMemoryService { readonly _serviceBrand: undefined; + get(): readonly ContextMessage[]; splice( start: number, diff --git a/packages/agent-core-v2/src/agent/contextProjector/contextProjector.ts b/packages/agent-core-v2/src/agent/contextProjector/contextProjector.ts index f787b8008..a3ab95b43 100644 --- a/packages/agent-core-v2/src/agent/contextProjector/contextProjector.ts +++ b/packages/agent-core-v2/src/agent/contextProjector/contextProjector.ts @@ -5,6 +5,7 @@ import type { ContextMessage } from '#/agent/contextMemory'; export interface IAgentContextProjectorService { readonly _serviceBrand: undefined; + project(messages: readonly ContextMessage[]): readonly Message[]; } diff --git a/packages/agent-core-v2/src/agent/externalHooks/externalHooks.ts b/packages/agent-core-v2/src/agent/externalHooks/externalHooks.ts index 8ad87a374..217e26e3f 100644 --- a/packages/agent-core-v2/src/agent/externalHooks/externalHooks.ts +++ b/packages/agent-core-v2/src/agent/externalHooks/externalHooks.ts @@ -35,6 +35,7 @@ export interface AgentTaskStopHookContext { export interface IAgentExternalHooksService { readonly _serviceBrand: undefined; + /** * Run the blocking `SubagentStart` external hook for an agent task this * agent is launching (via the `Agent` tool / swarm). Called directly by the diff --git a/packages/agent-core-v2/src/agent/fullCompaction/fullCompaction.ts b/packages/agent-core-v2/src/agent/fullCompaction/fullCompaction.ts index 6942c986a..2c6599c50 100644 --- a/packages/agent-core-v2/src/agent/fullCompaction/fullCompaction.ts +++ b/packages/agent-core-v2/src/agent/fullCompaction/fullCompaction.ts @@ -25,14 +25,15 @@ export interface FullCompactionDidCompactContext { export interface IAgentFullCompactionService { readonly _serviceBrand: undefined; + + readonly isCompacting: boolean; + begin(input: CompactInput): boolean; + cancel(): void; + readonly hooks: Hooks<{ onWillCompact: FullCompactionWillCompactContext; onDidCompact: FullCompactionDidCompactContext; }>; - readonly isCompacting: boolean; - - begin(input: CompactInput): boolean; - cancel(): void; } export const IAgentFullCompactionService = createDecorator('agentFullCompactionService'); diff --git a/packages/agent-core-v2/src/agent/goal/goal.ts b/packages/agent-core-v2/src/agent/goal/goal.ts index ae9d7be04..338e36c9e 100644 --- a/packages/agent-core-v2/src/agent/goal/goal.ts +++ b/packages/agent-core-v2/src/agent/goal/goal.ts @@ -13,6 +13,7 @@ export interface GoalReasonInput { export interface IAgentGoalService { readonly _serviceBrand: undefined; + getGoal(): GoalToolResult; createGoal(input: CreateGoalInput, actor?: GoalActor): Promise; pauseGoal(input?: GoalReasonInput, actor?: GoalActor): Promise; diff --git a/packages/agent-core-v2/src/agent/llmRequester/llmRequester.ts b/packages/agent-core-v2/src/agent/llmRequester/llmRequester.ts index f8bfd157e..7696e8baf 100644 --- a/packages/agent-core-v2/src/agent/llmRequester/llmRequester.ts +++ b/packages/agent-core-v2/src/agent/llmRequester/llmRequester.ts @@ -100,6 +100,7 @@ export interface LLMRequestOverrides { export interface IAgentLLMRequesterService { readonly _serviceBrand: undefined; + request( overrides?: LLMRequestOverrides, onPart?: LLMRequestPartHandler, diff --git a/packages/agent-core-v2/src/agent/loop/loop.ts b/packages/agent-core-v2/src/agent/loop/loop.ts index 61f18f856..c7f4b690b 100644 --- a/packages/agent-core-v2/src/agent/loop/loop.ts +++ b/packages/agent-core-v2/src/agent/loop/loop.ts @@ -43,12 +43,14 @@ export interface TurnResult { export interface IAgentLoopService { readonly _serviceBrand: undefined; + + run(options: RunOptions): Promise; + readonly hooks: Hooks<{ beforeStep: TurnBeforeStepContext; afterStep: TurnAfterStepContext; onError: TurnErrorContext; }>; - run(options: RunOptions): Promise; } export const IAgentLoopService = createDecorator('agentLoopService'); diff --git a/packages/agent-core-v2/src/agent/mcp/mcp.ts b/packages/agent-core-v2/src/agent/mcp/mcp.ts index df779fe67..5f6ee4d0b 100644 --- a/packages/agent-core-v2/src/agent/mcp/mcp.ts +++ b/packages/agent-core-v2/src/agent/mcp/mcp.ts @@ -16,8 +16,8 @@ export interface McpResolvedServer { export interface IAgentMcpService { readonly _serviceBrand: undefined; - readonly oauthService: McpOAuthService | undefined; + readonly oauthService: McpOAuthService | undefined; waitForInitialLoad(signal?: AbortSignal): Promise; initialLoadDurationMs(): number; list(): readonly McpServerEntry[]; diff --git a/packages/agent-core-v2/src/agent/microCompaction/microCompaction.ts b/packages/agent-core-v2/src/agent/microCompaction/microCompaction.ts index 59f45d828..2f5d29ad2 100644 --- a/packages/agent-core-v2/src/agent/microCompaction/microCompaction.ts +++ b/packages/agent-core-v2/src/agent/microCompaction/microCompaction.ts @@ -24,6 +24,7 @@ export interface MicroCompactionEffect { export interface IAgentMicroCompactionService { readonly _serviceBrand: undefined; + compact(messages: readonly ContextMessage[]): readonly ContextMessage[]; } diff --git a/packages/agent-core-v2/src/agent/permissionGate/permissionGate.ts b/packages/agent-core-v2/src/agent/permissionGate/permissionGate.ts index cdade93ad..e82ca374d 100644 --- a/packages/agent-core-v2/src/agent/permissionGate/permissionGate.ts +++ b/packages/agent-core-v2/src/agent/permissionGate/permissionGate.ts @@ -44,14 +44,16 @@ export type PermissionApprovalResultContext = export interface IAgentPermissionGate { readonly _serviceBrand: undefined; - readonly hooks: Hooks<{ - onDidRequestApproval: PermissionApprovalRequestContext; - onDidResolveApproval: PermissionApprovalResultContext; - }>; + data(): PermissionData; authorize( context: ResolvedToolExecutionHookContext, ): Promise; + + readonly hooks: Hooks<{ + onDidRequestApproval: PermissionApprovalRequestContext; + onDidResolveApproval: PermissionApprovalResultContext; + }>; } export const IAgentPermissionGate = diff --git a/packages/agent-core-v2/src/agent/permissionMode/permissionMode.ts b/packages/agent-core-v2/src/agent/permissionMode/permissionMode.ts index 1a491d2f5..70070426e 100644 --- a/packages/agent-core-v2/src/agent/permissionMode/permissionMode.ts +++ b/packages/agent-core-v2/src/agent/permissionMode/permissionMode.ts @@ -10,6 +10,7 @@ export interface PermissionModeChangedContext { export interface IAgentPermissionModeService { readonly _serviceBrand: undefined; + readonly mode: PermissionMode; setMode(mode: PermissionMode): void; diff --git a/packages/agent-core-v2/src/agent/permissionPolicy/permissionPolicy.ts b/packages/agent-core-v2/src/agent/permissionPolicy/permissionPolicy.ts index 431eb213d..841e65d56 100644 --- a/packages/agent-core-v2/src/agent/permissionPolicy/permissionPolicy.ts +++ b/packages/agent-core-v2/src/agent/permissionPolicy/permissionPolicy.ts @@ -12,6 +12,7 @@ export interface PermissionPolicyEvaluation { export interface IAgentPermissionPolicyService { readonly _serviceBrand: undefined; + evaluate( context: ResolvedToolExecutionHookContext, ): Promise; diff --git a/packages/agent-core-v2/src/agent/permissionRules/permissionRules.ts b/packages/agent-core-v2/src/agent/permissionRules/permissionRules.ts index 0b890c783..d0ba1c8aa 100644 --- a/packages/agent-core-v2/src/agent/permissionRules/permissionRules.ts +++ b/packages/agent-core-v2/src/agent/permissionRules/permissionRules.ts @@ -43,9 +43,9 @@ export interface PermissionRule { export interface IAgentPermissionRulesService { readonly _serviceBrand: undefined; + readonly rules: readonly PermissionRule[]; readonly sessionApprovalRulePatterns: readonly string[]; - addRules(rules: readonly PermissionRule[]): void; recordApprovalResult(record: PermissionApprovalResultRecord): void; diff --git a/packages/agent-core-v2/src/agent/plan/plan.ts b/packages/agent-core-v2/src/agent/plan/plan.ts index 23128c833..df909b1d8 100644 --- a/packages/agent-core-v2/src/agent/plan/plan.ts +++ b/packages/agent-core-v2/src/agent/plan/plan.ts @@ -10,6 +10,7 @@ export type PlanFilePath = string | null; export interface IAgentPlanService { readonly _serviceBrand: undefined; + enter(id?: string, createFile?: boolean): Promise; cancel(id?: string): void; clear(): Promise; diff --git a/packages/agent-core-v2/src/agent/profile/profile.ts b/packages/agent-core-v2/src/agent/profile/profile.ts index 84f7db6b7..6e1ed0195 100644 --- a/packages/agent-core-v2/src/agent/profile/profile.ts +++ b/packages/agent-core-v2/src/agent/profile/profile.ts @@ -109,6 +109,7 @@ export interface BindAgentInput { export interface IAgentProfileService { readonly _serviceBrand: undefined; + configure(options: ProfileServiceOptions): void; update(changed: ProfileUpdateData): void; /** diff --git a/packages/agent-core-v2/src/agent/prompt/prompt.ts b/packages/agent-core-v2/src/agent/prompt/prompt.ts index 2759b4532..b1dac6615 100644 --- a/packages/agent-core-v2/src/agent/prompt/prompt.ts +++ b/packages/agent-core-v2/src/agent/prompt/prompt.ts @@ -16,6 +16,7 @@ export interface PromptSteerHandle { export interface IAgentPromptService { readonly _serviceBrand: undefined; + prompt(message: ContextMessage): Promise; steer(message: ContextMessage): PromptSteerHandle; retry(trigger?: string): Turn | undefined; diff --git a/packages/agent-core-v2/src/agent/promptLegacy/promptLegacy.ts b/packages/agent-core-v2/src/agent/promptLegacy/promptLegacy.ts index 5ca4a7b76..e5a7dcf7e 100644 --- a/packages/agent-core-v2/src/agent/promptLegacy/promptLegacy.ts +++ b/packages/agent-core-v2/src/agent/promptLegacy/promptLegacy.ts @@ -22,6 +22,7 @@ import { createDecorator, type ServiceIdentifier } from '#/_base/di/instantiatio export interface IAgentPromptLegacyService { readonly _serviceBrand: undefined; + list(): PromptListResponse; submit(body: PromptSubmission): Promise; steer(promptIds: readonly string[]): Promise; diff --git a/packages/agent-core-v2/src/agent/record/record.ts b/packages/agent-core-v2/src/agent/record/record.ts index d95e0a387..f5acf1b9e 100644 --- a/packages/agent-core-v2/src/agent/record/record.ts +++ b/packages/agent-core-v2/src/agent/record/record.ts @@ -98,7 +98,6 @@ export interface IAgentRecordService { * Returns a disposable that unregisters the facets (and the resumer). */ define(type: K, facets: RecordFacets): IDisposable; - /** * Append a record to the replay read model directly. Used when the projected * data is computed inside a domain handler rather than derived from a single @@ -118,9 +117,9 @@ export interface IAgentRecordService { buildReplay(): readonly AgentReplayRecord[]; /** When true, live `append` calls also feed the replay read model. */ captureLiveRecords: boolean; - readonly restoring: WireRecordRestoringContext | null; readonly postRestoring: boolean; + readonly hooks: IAgentWireRecordService['hooks']; } diff --git a/packages/agent-core-v2/src/agent/rpc/rpc.ts b/packages/agent-core-v2/src/agent/rpc/rpc.ts index 6c9bfaa40..ee898b348 100644 --- a/packages/agent-core-v2/src/agent/rpc/rpc.ts +++ b/packages/agent-core-v2/src/agent/rpc/rpc.ts @@ -6,10 +6,12 @@ import type { import type { PromisableMethods } from "#/_base/utils/types"; export interface IAgentRPCService extends PromisableMethods { - readonly _serviceBrand: undefined;} + readonly _serviceBrand: undefined; +} export interface ISessionRPCService extends PromisableMethods { - readonly _serviceBrand: undefined;} + readonly _serviceBrand: undefined; +} export const IAgentRPCService = createDecorator('agentRPCService'); diff --git a/packages/agent-core-v2/src/agent/scopeContext/scopeContext.ts b/packages/agent-core-v2/src/agent/scopeContext/scopeContext.ts index 81b9278cb..b41a59f63 100644 --- a/packages/agent-core-v2/src/agent/scopeContext/scopeContext.ts +++ b/packages/agent-core-v2/src/agent/scopeContext/scopeContext.ts @@ -14,8 +14,8 @@ import { createDecorator, type ServiceIdentifier } from '#/_base/di/instantiatio export interface IAgentScopeContext { readonly _serviceBrand: undefined; - readonly agentId: string; + readonly agentId: string; /** * Persistence scope rooted at this agent. `scope()` returns the agent * scope itself; `scope(subKey)` returns `${agentScope}/${subKey}` (e.g. diff --git a/packages/agent-core-v2/src/agent/skill/skill.ts b/packages/agent-core-v2/src/agent/skill/skill.ts index 840fb04f9..fc7fb2cee 100644 --- a/packages/agent-core-v2/src/agent/skill/skill.ts +++ b/packages/agent-core-v2/src/agent/skill/skill.ts @@ -11,7 +11,6 @@ export interface IAgentSkillService { readonly _serviceBrand: undefined; activate(input: SkillActivationInput): Promise; - /** * Records a model-tool skill activation (an inline skill loaded through the * `Skill` tool) without opening a new turn — the tool builds and steers its diff --git a/packages/agent-core-v2/src/agent/swarm/swarm.ts b/packages/agent-core-v2/src/agent/swarm/swarm.ts index 313d3857c..e421b3209 100644 --- a/packages/agent-core-v2/src/agent/swarm/swarm.ts +++ b/packages/agent-core-v2/src/agent/swarm/swarm.ts @@ -4,6 +4,7 @@ export type SwarmModeTrigger = 'manual' | 'task' | 'tool'; export interface IAgentSwarmService { readonly _serviceBrand: undefined; + readonly isActive: boolean; enter(trigger: SwarmModeTrigger): void; exit(): void; diff --git a/packages/agent-core-v2/src/agent/systemReminder/systemReminder.ts b/packages/agent-core-v2/src/agent/systemReminder/systemReminder.ts index ca4b816c8..0699203c8 100644 --- a/packages/agent-core-v2/src/agent/systemReminder/systemReminder.ts +++ b/packages/agent-core-v2/src/agent/systemReminder/systemReminder.ts @@ -10,7 +10,6 @@ export interface IAgentSystemReminderService { * Returns the created message. */ appendSystemReminder(content: string, origin: PromptOrigin): ContextMessage; - /** * Remove the last context message if it passes the supplied filter. * Returns `true` when a message was removed. diff --git a/packages/agent-core-v2/src/agent/task/task.ts b/packages/agent-core-v2/src/agent/task/task.ts index 70b57465d..d93078d16 100644 --- a/packages/agent-core-v2/src/agent/task/task.ts +++ b/packages/agent-core-v2/src/agent/task/task.ts @@ -98,16 +98,10 @@ export interface AgentTaskNotificationContext { export interface IAgentTaskService { readonly _serviceBrand: undefined; - readonly hooks: Hooks<{ - onDidNotify: AgentTaskNotificationContext; - }>; - /** Track a `ITaskHandle` (from `taskService.run()`). */ track(handle: ITaskHandle, options: AgentTaskTrackOptions): IAgentTaskEntry; - /** @deprecated Use `taskService.run()` + `track()` instead. */ registerTask(task: AgentTask, options?: RegisterAgentTaskOptions): string; - getTask(taskId: string): AgentTaskInfo | undefined; list(activeOnly?: boolean, limit?: number): readonly AgentTaskInfo[]; persistOutput(taskId: string): void; @@ -124,6 +118,10 @@ export interface IAgentTaskService { waitForForegroundRelease( taskId: string, ): Promise; + + readonly hooks: Hooks<{ + onDidNotify: AgentTaskNotificationContext; + }>; } export const IAgentTaskService = diff --git a/packages/agent-core-v2/src/agent/toolDedupe/toolDedupe.ts b/packages/agent-core-v2/src/agent/toolDedupe/toolDedupe.ts index 8de58cbba..b5dffd598 100644 --- a/packages/agent-core-v2/src/agent/toolDedupe/toolDedupe.ts +++ b/packages/agent-core-v2/src/agent/toolDedupe/toolDedupe.ts @@ -36,6 +36,7 @@ export type ToolDedupResult = ToolDedupSuccessResult | ToolDedupErrorResult; export interface IAgentToolDedupeService { readonly _serviceBrand: undefined; + readonly currentStreak: number; } diff --git a/packages/agent-core-v2/src/agent/toolRegistry/toolRegistry.ts b/packages/agent-core-v2/src/agent/toolRegistry/toolRegistry.ts index cc5fd60da..337b23ff6 100644 --- a/packages/agent-core-v2/src/agent/toolRegistry/toolRegistry.ts +++ b/packages/agent-core-v2/src/agent/toolRegistry/toolRegistry.ts @@ -18,6 +18,7 @@ export interface ToolRegistrationOptions { export interface IAgentToolRegistryService { readonly _serviceBrand: undefined; + register(tool: ExecutableTool, options?: ToolRegistrationOptions): IDisposable; list(): readonly ToolInfo[]; resolve(name: string): ExecutableTool | undefined; diff --git a/packages/agent-core-v2/src/agent/toolState/toolState.ts b/packages/agent-core-v2/src/agent/toolState/toolState.ts index 05f1700f5..ddf0ba551 100644 --- a/packages/agent-core-v2/src/agent/toolState/toolState.ts +++ b/packages/agent-core-v2/src/agent/toolState/toolState.ts @@ -17,6 +17,7 @@ export interface ToolStoreUpdate { export interface IAgentToolState extends ToolStore { readonly _serviceBrand: undefined; + data(): Readonly>; readonly hooks: Hooks<{ diff --git a/packages/agent-core-v2/src/agent/turn/turn.ts b/packages/agent-core-v2/src/agent/turn/turn.ts index 455e94135..1521c9e0e 100644 --- a/packages/agent-core-v2/src/agent/turn/turn.ts +++ b/packages/agent-core-v2/src/agent/turn/turn.ts @@ -22,6 +22,7 @@ export interface TurnEndedContext { export interface IAgentTurnService { readonly _serviceBrand: undefined; + launch(): Turn; getActiveTurn(): Turn | undefined; diff --git a/packages/agent-core-v2/src/agent/usage/usage.ts b/packages/agent-core-v2/src/agent/usage/usage.ts index 12510344c..d29a399ce 100644 --- a/packages/agent-core-v2/src/agent/usage/usage.ts +++ b/packages/agent-core-v2/src/agent/usage/usage.ts @@ -11,6 +11,7 @@ export interface UsageStatus { export interface IAgentUsageService { readonly _serviceBrand: undefined; + record(model: string, usage: TokenUsage, source?: LLMRequestSource): void; status(): UsageStatus; } diff --git a/packages/agent-core-v2/src/agent/wireRecord/wireRecord.ts b/packages/agent-core-v2/src/agent/wireRecord/wireRecord.ts index b58746385..5e446ceae 100644 --- a/packages/agent-core-v2/src/agent/wireRecord/wireRecord.ts +++ b/packages/agent-core-v2/src/agent/wireRecord/wireRecord.ts @@ -63,9 +63,9 @@ export interface WireRecordServiceOptions { export interface IAgentWireRecordService { readonly _serviceBrand: undefined; + readonly restoring: WireRecordRestoringContext | null; readonly postRestoring: boolean; - append(record: WireRecord): void; /** * Snapshot of every record currently held in memory (live-appended and diff --git a/packages/agent-core-v2/src/app/agentProfileCatalog/agentProfileCatalog.ts b/packages/agent-core-v2/src/app/agentProfileCatalog/agentProfileCatalog.ts index f0f494056..a900ee0e7 100644 --- a/packages/agent-core-v2/src/app/agentProfileCatalog/agentProfileCatalog.ts +++ b/packages/agent-core-v2/src/app/agentProfileCatalog/agentProfileCatalog.ts @@ -102,6 +102,7 @@ export interface AgentProfile { export interface IAgentProfileCatalogService { readonly _serviceBrand: undefined; + /** Return the profile with the given name, or `undefined` when unknown. */ get(name: string): AgentProfile | undefined; /** diff --git a/packages/agent-core-v2/src/app/auth/auth.ts b/packages/agent-core-v2/src/app/auth/auth.ts index 82667209d..f6618378f 100644 --- a/packages/agent-core-v2/src/app/auth/auth.ts +++ b/packages/agent-core-v2/src/app/auth/auth.ts @@ -36,6 +36,7 @@ export interface AuthStatus { export interface IOAuthService { readonly _serviceBrand: undefined; + startLogin(provider?: string): Promise; getFlow(provider?: string): OAuthFlowSnapshot | undefined; cancelLogin(provider?: string): Promise; @@ -51,6 +52,7 @@ export const IOAuthService: ServiceIdentifier = export interface IOAuthToolkit { readonly _serviceBrand: undefined; + login(providerName?: string, options?: KimiOAuthLoginOptions): Promise; logout(providerName?: string, oauthRef?: KimiOAuthTokenRef): Promise; getCachedAccessToken( @@ -65,6 +67,7 @@ export const IOAuthToolkit: ServiceIdentifier = export interface IAuthSummaryService { readonly _serviceBrand: undefined; + summarize(): Promise; ensureReady(provider?: string): Promise; } diff --git a/packages/agent-core-v2/src/app/auth/webSearch/webSearch.ts b/packages/agent-core-v2/src/app/auth/webSearch/webSearch.ts index 8f78cde16..581f63105 100644 --- a/packages/agent-core-v2/src/app/auth/webSearch/webSearch.ts +++ b/packages/agent-core-v2/src/app/auth/webSearch/webSearch.ts @@ -24,6 +24,7 @@ export interface WebSearchProviderOptions { export interface IWebSearchProviderService { readonly _serviceBrand: undefined; + getWebSearchProvider(): WebSearchProvider | undefined; } diff --git a/packages/agent-core-v2/src/app/bootstrap/bootstrap.ts b/packages/agent-core-v2/src/app/bootstrap/bootstrap.ts index 0a44a696f..6c4e573ef 100644 --- a/packages/agent-core-v2/src/app/bootstrap/bootstrap.ts +++ b/packages/agent-core-v2/src/app/bootstrap/bootstrap.ts @@ -64,7 +64,6 @@ export interface IBootstrapService { readonly arch: string; readonly cwd: string; readonly osHomeDir: string; - readonly homeDir: string; readonly configPath: string; readonly sessionsDir: string; @@ -72,40 +71,33 @@ export interface IBootstrapService { readonly storeDir: string; readonly cacheDir: string; readonly logsDir: string; - getEnv(name: string): string | undefined; - /** * Scope string for a well-known top-level persistence area. Business code * passes this to `IFileSystemStorageService` / `IAtomicDocumentStore` / `IAppendLogStore` * — the backend layer converts it to concrete addressing. */ scope(name: PersistenceScopeName): string; - /** * Scope string for a session's persistence root. * Equivalent to `${scope('sessions')}/${workspaceId}/${sessionId}`. */ sessionScope(workspaceId: string, sessionId: string): string; - /** * Scope string for a specific agent's persistence root under a session. * Equivalent to `${sessionScope(wsId, sId)}/agents/${agentId}`. */ agentScope(workspaceId: string, sessionId: string, agentId: string): string; - /** * File-only: absolute on-disk directory for a session. * Prefer `sessionScope(...)` — this exists for legacy APIs (session logs, * task output files). Non-file bootstraps may throw. */ sessionDir(workspaceId: string, sessionId: string): string; - /** * File-only: absolute on-disk directory for a specific agent. Same caveat. */ agentHomedir(workspaceId: string, sessionId: string, agentId: string): string; - /** Key of the config document under `scope('config')` (file: `'config.toml'`). */ readonly configKey: string; } diff --git a/packages/agent-core-v2/src/app/config/config.ts b/packages/agent-core-v2/src/app/config/config.ts index 9740197f5..a714d4c28 100644 --- a/packages/agent-core-v2/src/app/config/config.ts +++ b/packages/agent-core-v2/src/app/config/config.ts @@ -81,7 +81,6 @@ export interface IConfigRegistry { readonly onDidRegisterSection: Event; readonly onDidRegisterOverlay: Event; - registerSection(domain: string, schema: ConfigSchema, options?: RegisterSectionOptions): void; getSection(domain: string): ConfigSection | undefined; listSections(): readonly ConfigSection[]; @@ -147,10 +146,10 @@ export interface ConfigInspectValue { export interface IConfigService { readonly _serviceBrand: undefined; + readonly ready: Promise; readonly onDidChangeConfiguration: Event; readonly onDidSectionChange: Event; - get(domain: string): T; inspect(domain: string): ConfigInspectValue; getAll(): ResolvedConfig; diff --git a/packages/agent-core-v2/src/app/cron/cronTaskPersistence.ts b/packages/agent-core-v2/src/app/cron/cronTaskPersistence.ts index 8f1e536a9..6d8a7f35d 100644 --- a/packages/agent-core-v2/src/app/cron/cronTaskPersistence.ts +++ b/packages/agent-core-v2/src/app/cron/cronTaskPersistence.ts @@ -18,6 +18,7 @@ export interface CronTaskQuery { export interface ICronTaskPersistence { readonly _serviceBrand: undefined; + get(workspaceId: string, taskId: string): Promise; list(query: CronTaskQuery): Promise; save(workspaceId: string, task: CronTask): Promise; diff --git a/packages/agent-core-v2/src/app/event/event.ts b/packages/agent-core-v2/src/app/event/event.ts index fcc221c14..08396bc57 100644 --- a/packages/agent-core-v2/src/app/event/event.ts +++ b/packages/agent-core-v2/src/app/event/event.ts @@ -16,6 +16,7 @@ export interface DomainEvent { export interface IEventService { readonly _serviceBrand: undefined; + readonly onDidPublish: Event; publish(event: DomainEvent): void; subscribe(handler: (event: DomainEvent) => void): IDisposable; diff --git a/packages/agent-core-v2/src/app/file/fileService.ts b/packages/agent-core-v2/src/app/file/fileService.ts index 4ae15ddba..622368594 100644 --- a/packages/agent-core-v2/src/app/file/fileService.ts +++ b/packages/agent-core-v2/src/app/file/fileService.ts @@ -35,9 +35,7 @@ export interface IFileService { readonly _serviceBrand: undefined; save(source: Readable, filename: string, options?: SaveOptions): Promise; - get(fileId: string): Promise; - delete(fileId: string): Promise; } diff --git a/packages/agent-core-v2/src/app/flag/flag.ts b/packages/agent-core-v2/src/app/flag/flag.ts index ed9b3e539..39ecc19d8 100644 --- a/packages/agent-core-v2/src/app/flag/flag.ts +++ b/packages/agent-core-v2/src/app/flag/flag.ts @@ -61,6 +61,7 @@ export interface ExperimentalFeatureState { export interface IFlagService { readonly _serviceBrand: undefined; + readonly registry: IFlagRegistry; enabled(id: FlagId): boolean; snapshot(): ExperimentalFlagMap; diff --git a/packages/agent-core-v2/src/app/flag/flagRegistry.ts b/packages/agent-core-v2/src/app/flag/flagRegistry.ts index 5991184ed..c585a3c0b 100644 --- a/packages/agent-core-v2/src/app/flag/flagRegistry.ts +++ b/packages/agent-core-v2/src/app/flag/flagRegistry.ts @@ -38,9 +38,7 @@ export interface IFlagRegistry { readonly _serviceBrand: undefined; register(definition: FlagDefinitionInput): IDisposable; - get(id: FlagId): FlagDefinitionInput | undefined; - list(): readonly FlagDefinitionInput[]; } diff --git a/packages/agent-core-v2/src/app/gateway/gateway.ts b/packages/agent-core-v2/src/app/gateway/gateway.ts index b42fc6fe7..a4a9437fd 100644 --- a/packages/agent-core-v2/src/app/gateway/gateway.ts +++ b/packages/agent-core-v2/src/app/gateway/gateway.ts @@ -11,6 +11,7 @@ import { createDecorator, type ServiceIdentifier } from '#/_base/di/instantiatio export interface IRestGateway { readonly _serviceBrand: undefined; + prompt( sessionId: string, agentId: string, @@ -32,6 +33,7 @@ export const IRestGateway: ServiceIdentifier = export interface IWSGateway { readonly _serviceBrand: undefined; + connect(connectionId: string): void; broadcast(sessionId: string, event: unknown): void; } diff --git a/packages/agent-core-v2/src/app/git/git.ts b/packages/agent-core-v2/src/app/git/git.ts index ae09000f3..63af4de7a 100644 --- a/packages/agent-core-v2/src/app/git/git.ts +++ b/packages/agent-core-v2/src/app/git/git.ts @@ -23,7 +23,6 @@ export interface IGitService { * tree or git itself fails. */ status(cwd: string, pathFilter?: ReadonlySet): Promise; - /** * `git diff HEAD -- ` for the repo at `cwd`. `relPath` is the * repo-relative posix path passed to git; `absPath` is the confined absolute diff --git a/packages/agent-core-v2/src/app/globalSkillCatalog/globalSkillCatalog.ts b/packages/agent-core-v2/src/app/globalSkillCatalog/globalSkillCatalog.ts index 58bebd5c1..177b9d727 100644 --- a/packages/agent-core-v2/src/app/globalSkillCatalog/globalSkillCatalog.ts +++ b/packages/agent-core-v2/src/app/globalSkillCatalog/globalSkillCatalog.ts @@ -14,7 +14,6 @@ export interface IGlobalSkillCatalog { readonly _serviceBrand: undefined; readonly catalog: SkillCatalog; - load(): Promise; } diff --git a/packages/agent-core-v2/src/app/globalSkillCatalog/skillDiscovery.ts b/packages/agent-core-v2/src/app/globalSkillCatalog/skillDiscovery.ts index eb521cb51..6ed32afb6 100644 --- a/packages/agent-core-v2/src/app/globalSkillCatalog/skillDiscovery.ts +++ b/packages/agent-core-v2/src/app/globalSkillCatalog/skillDiscovery.ts @@ -26,7 +26,6 @@ export interface ISkillDiscovery { workDir: string, extraRoots?: readonly SkillRoot[], ): Promise; - discoverUser(homeDir: string, osHomeDir: string): Promise; } diff --git a/packages/agent-core-v2/src/app/hostFolderBrowser/hostFolderBrowser.ts b/packages/agent-core-v2/src/app/hostFolderBrowser/hostFolderBrowser.ts index db2177d9b..62b9437ab 100644 --- a/packages/agent-core-v2/src/app/hostFolderBrowser/hostFolderBrowser.ts +++ b/packages/agent-core-v2/src/app/hostFolderBrowser/hostFolderBrowser.ts @@ -57,7 +57,6 @@ export interface IHostFolderBrowser { * target. */ browse(absPath?: string): Promise; - /** `$HOME` plus the most recently opened workspace roots. */ home(): Promise; } diff --git a/packages/agent-core-v2/src/app/log/log.ts b/packages/agent-core-v2/src/app/log/log.ts index 9a6dd2fb4..dd3b16124 100644 --- a/packages/agent-core-v2/src/app/log/log.ts +++ b/packages/agent-core-v2/src/app/log/log.ts @@ -31,6 +31,7 @@ export interface LogEntry { export interface ILogWriterService { readonly _serviceBrand: undefined; + write(entry: LogEntry): void; flush?(): Promise; close?(): Promise; @@ -49,6 +50,7 @@ export interface ILogger { export interface ILogService extends ILogger { readonly _serviceBrand: undefined; + readonly level: LogLevel; setLevel(level: LogLevel): void; flush(): Promise; @@ -72,6 +74,7 @@ export function levelEnabled(level: LogLevel, configured: LogLevel): boolean { export interface ISessionLogService extends ILogger { readonly _serviceBrand: undefined; + flush(): Promise; close(): Promise; } diff --git a/packages/agent-core-v2/src/app/messageLegacy/messageLegacy.ts b/packages/agent-core-v2/src/app/messageLegacy/messageLegacy.ts index a07aac7cb..92feea93f 100644 --- a/packages/agent-core-v2/src/app/messageLegacy/messageLegacy.ts +++ b/packages/agent-core-v2/src/app/messageLegacy/messageLegacy.ts @@ -41,7 +41,6 @@ export interface IMessageLegacyService { * Throws `session.not_found` when `sid` is unknown. */ list(sessionId: string, query: MessageListQuery): Promise>; - /** * `GET /sessions/{sid}/messages/{mid}` — single message by id. * Throws `session.not_found` when `sid` is unknown, `message.not_found` when diff --git a/packages/agent-core-v2/src/app/model/model.ts b/packages/agent-core-v2/src/app/model/model.ts index c3d1e9ce9..55daeb793 100644 --- a/packages/agent-core-v2/src/app/model/model.ts +++ b/packages/agent-core-v2/src/app/model/model.ts @@ -90,6 +90,7 @@ export interface ModelsChangedEvent { export interface IModelService { readonly _serviceBrand: undefined; + readonly onDidChangeModels: Event; get(id: string): ModelConfig | undefined; list(): Readonly>; diff --git a/packages/agent-core-v2/src/app/model/modelResolver.ts b/packages/agent-core-v2/src/app/model/modelResolver.ts index 060b9af25..f5606cd04 100644 --- a/packages/agent-core-v2/src/app/model/modelResolver.ts +++ b/packages/agent-core-v2/src/app/model/modelResolver.ts @@ -20,6 +20,7 @@ import type { Model } from './modelInstance'; export interface IModelResolver { readonly _serviceBrand: undefined; + /** Resolve a Model id into a runnable god-object Model instance. */ resolve(id: string): Model; /** All Model ids whose `name` or `aliases` match the given routing key. */ diff --git a/packages/agent-core-v2/src/app/platform/platform.ts b/packages/agent-core-v2/src/app/platform/platform.ts index 5a4c31239..4c3ff2691 100644 --- a/packages/agent-core-v2/src/app/platform/platform.ts +++ b/packages/agent-core-v2/src/app/platform/platform.ts @@ -65,6 +65,7 @@ export interface PlatformsChangedEvent { export interface IPlatformService { readonly _serviceBrand: undefined; + readonly onDidChangePlatforms: Event; get(name: string): PlatformConfig | undefined; list(): Readonly>; diff --git a/packages/agent-core-v2/src/app/plugin/plugin.ts b/packages/agent-core-v2/src/app/plugin/plugin.ts index f357636a8..dbe43a3ce 100644 --- a/packages/agent-core-v2/src/app/plugin/plugin.ts +++ b/packages/agent-core-v2/src/app/plugin/plugin.ts @@ -38,6 +38,7 @@ export interface GetPluginInfoInput { export interface IPluginService { readonly _serviceBrand: undefined; + listPlugins(): Promise; installPlugin(input: InstallPluginInput): Promise; setPluginEnabled(input: SetPluginEnabledInput): Promise; @@ -47,7 +48,6 @@ export interface IPluginService { getPluginInfo(input: GetPluginInfoInput): Promise; listPluginCommands(): Promise; checkUpdates(): Promise; - // --- consumption plane (loaded from enabled, error-free plugins) --------- /** Skill roots contributed by enabled plugins (fed into skill discovery). */ @@ -58,7 +58,6 @@ export interface IPluginService { enabledMcpServers(): Promise>; /** Hooks contributed by enabled plugins (cwd + env already resolved). */ enabledHooks(): Promise; - /** Fires after a successful `reloadPlugins()` with the reload summary. */ readonly onDidReload: Event; } diff --git a/packages/agent-core-v2/src/app/protocol/protocol.ts b/packages/agent-core-v2/src/app/protocol/protocol.ts index bea5456a9..fc43d8c33 100644 --- a/packages/agent-core-v2/src/app/protocol/protocol.ts +++ b/packages/agent-core-v2/src/app/protocol/protocol.ts @@ -48,6 +48,7 @@ export interface ProtocolAdapterConfig { export interface IProtocolAdapterRegistry { readonly _serviceBrand: undefined; + /** Protocols this registry can build adapters for. */ supportedProtocols(): readonly Protocol[]; } diff --git a/packages/agent-core-v2/src/app/provider/provider.ts b/packages/agent-core-v2/src/app/provider/provider.ts index 886352d78..0ff662710 100644 --- a/packages/agent-core-v2/src/app/provider/provider.ts +++ b/packages/agent-core-v2/src/app/provider/provider.ts @@ -89,6 +89,7 @@ export interface ProvidersChangedEvent { export interface IProviderService { readonly _serviceBrand: undefined; + readonly onDidChangeProviders: Event; get(name: string): ProviderConfig | undefined; list(): Readonly>; diff --git a/packages/agent-core-v2/src/app/sessionIndex/sessionIndex.ts b/packages/agent-core-v2/src/app/sessionIndex/sessionIndex.ts index 13ac1d0f4..39be692d9 100644 --- a/packages/agent-core-v2/src/app/sessionIndex/sessionIndex.ts +++ b/packages/agent-core-v2/src/app/sessionIndex/sessionIndex.ts @@ -41,6 +41,7 @@ export interface SessionListQuery { export interface ISessionIndex { readonly _serviceBrand: undefined; + /** List persisted sessions, optionally filtered by workspace. */ list(query: SessionListQuery): Promise>; /** Fetch a single persisted session by id. */ diff --git a/packages/agent-core-v2/src/app/sessionLegacy/sessionLegacy.ts b/packages/agent-core-v2/src/app/sessionLegacy/sessionLegacy.ts index c9d4794ac..ce9a6b36d 100644 --- a/packages/agent-core-v2/src/app/sessionLegacy/sessionLegacy.ts +++ b/packages/agent-core-v2/src/app/sessionLegacy/sessionLegacy.ts @@ -58,6 +58,7 @@ export interface SessionChildrenPage { export interface ISessionLegacyService { readonly _serviceBrand: undefined; + fork(sessionId: string, body: ForkSessionRequest): Promise; createChild(sessionId: string, body: CreateSessionChildRequest): Promise; listChildren(sessionId: string, query: SessionChildrenQuery): Promise; diff --git a/packages/agent-core-v2/src/app/sessionLifecycle/sessionLifecycle.ts b/packages/agent-core-v2/src/app/sessionLifecycle/sessionLifecycle.ts index a31259e36..81a4e8cd5 100644 --- a/packages/agent-core-v2/src/app/sessionLifecycle/sessionLifecycle.ts +++ b/packages/agent-core-v2/src/app/sessionLifecycle/sessionLifecycle.ts @@ -51,6 +51,7 @@ export interface SessionForkedEvent { export interface ISessionLifecycleService { readonly _serviceBrand: undefined; + readonly onDidCreateSession: Event; readonly onDidCloseSession: Event; readonly onDidArchiveSession: Event; diff --git a/packages/agent-core-v2/src/app/task/task.ts b/packages/agent-core-v2/src/app/task/task.ts index 25e9ff964..eac2c3a0b 100644 --- a/packages/agent-core-v2/src/app/task/task.ts +++ b/packages/agent-core-v2/src/app/task/task.ts @@ -57,7 +57,6 @@ export interface ITaskService { * State: pending → running → completed | failed | cancelled. */ run(fn: (signal: AbortSignal, output: (data: string) => void) => Promise): ITaskHandle; - /** * Create a passive task whose settlement is controlled by the caller * through the returned `resolve` / `reject` methods. diff --git a/packages/agent-core-v2/src/app/telemetry/agentTelemetryContext.ts b/packages/agent-core-v2/src/app/telemetry/agentTelemetryContext.ts index 23f0a9341..f55bf83e8 100644 --- a/packages/agent-core-v2/src/app/telemetry/agentTelemetryContext.ts +++ b/packages/agent-core-v2/src/app/telemetry/agentTelemetryContext.ts @@ -13,6 +13,7 @@ import type { TelemetryProperties } from './telemetry'; export interface IAgentTelemetryContextService { readonly _serviceBrand: undefined; + /** Current ambient telemetry properties for this agent. */ get(): TelemetryProperties; /** Merge a patch into the ambient telemetry context. */ diff --git a/packages/agent-core-v2/src/app/telemetry/telemetry.ts b/packages/agent-core-v2/src/app/telemetry/telemetry.ts index 1838deb3f..5f0b3aeb6 100644 --- a/packages/agent-core-v2/src/app/telemetry/telemetry.ts +++ b/packages/agent-core-v2/src/app/telemetry/telemetry.ts @@ -37,6 +37,7 @@ export interface TelemetryServiceOptions { export interface ITelemetryService { readonly _serviceBrand: undefined; + track(event: string, properties?: TelemetryProperties): void; withContext(patch: TelemetryContextPatch): ITelemetryService; setContext(patch: TelemetryContextPatch): void; diff --git a/packages/agent-core-v2/src/app/web/web.ts b/packages/agent-core-v2/src/app/web/web.ts index a3cee1b4b..fce26174a 100644 --- a/packages/agent-core-v2/src/app/web/web.ts +++ b/packages/agent-core-v2/src/app/web/web.ts @@ -23,6 +23,7 @@ export interface WebFetchServiceOptions { export interface IWebFetchService { readonly _serviceBrand: undefined; + getUrlFetcher(): UrlFetcher; } diff --git a/packages/agent-core-v2/src/app/workspaceRegistry/workspacePersistence.ts b/packages/agent-core-v2/src/app/workspaceRegistry/workspacePersistence.ts index 95ba0bf3b..9a85863a7 100644 --- a/packages/agent-core-v2/src/app/workspaceRegistry/workspacePersistence.ts +++ b/packages/agent-core-v2/src/app/workspaceRegistry/workspacePersistence.ts @@ -41,7 +41,6 @@ export interface IWorkspacePersistence { * - `Workspace[]` (possibly empty) → a materialized catalog; do not rebuild. */ load(): Promise; - /** Atomically replace the persisted catalog. */ save(workspaces: readonly Workspace[]): Promise; } diff --git a/packages/agent-core-v2/src/os/interface/hostEnvironment.ts b/packages/agent-core-v2/src/os/interface/hostEnvironment.ts index cdef451bb..c9e33612a 100644 --- a/packages/agent-core-v2/src/os/interface/hostEnvironment.ts +++ b/packages/agent-core-v2/src/os/interface/hostEnvironment.ts @@ -47,7 +47,6 @@ export interface IHostEnvironment { readonly pathClass: PathClass; /** Absolute path of the current user's home directory (`os.homedir()`). */ readonly homeDir: string; - /** * Resolves once the probe has completed. Every field above is populated by * the time this promise settles. The composition root awaits this before diff --git a/packages/agent-core-v2/src/os/interface/hostProcess.ts b/packages/agent-core-v2/src/os/interface/hostProcess.ts index 29f129d0d..cf9695b97 100644 --- a/packages/agent-core-v2/src/os/interface/hostProcess.ts +++ b/packages/agent-core-v2/src/os/interface/hostProcess.ts @@ -45,7 +45,6 @@ export interface IHostProcess { readonly stdin: Writable; readonly stdout: Readable; readonly stderr: Readable; - /** Wait for the process to exit and return its exit code. */ wait(): Promise; /** Kill the process tree (not just the direct child) with the given signal. */ diff --git a/packages/agent-core-v2/src/persistence/interface/appendLogStore.ts b/packages/agent-core-v2/src/persistence/interface/appendLogStore.ts index 938f127fa..c3ba315ff 100644 --- a/packages/agent-core-v2/src/persistence/interface/appendLogStore.ts +++ b/packages/agent-core-v2/src/persistence/interface/appendLogStore.ts @@ -34,15 +34,10 @@ export interface IAppendLogStore { readonly _serviceBrand: undefined; append(scope: string, key: string, record: R, options?: AppendLogOptions): void; - read(scope: string, key: string): AsyncIterable; - rewrite(scope: string, key: string, records: readonly R[]): Promise; - flush(): Promise; - close(): Promise; - acquire(scope: string, key: string): IDisposable; } diff --git a/packages/agent-core-v2/src/persistence/interface/atomicDocumentStore.ts b/packages/agent-core-v2/src/persistence/interface/atomicDocumentStore.ts index 4e0ea7aa2..cf59f4942 100644 --- a/packages/agent-core-v2/src/persistence/interface/atomicDocumentStore.ts +++ b/packages/agent-core-v2/src/persistence/interface/atomicDocumentStore.ts @@ -22,15 +22,10 @@ export interface IAtomicDocumentStore { readonly _serviceBrand: undefined; get(scope: string, key: string): Promise; - set(scope: string, key: string, value: T): Promise; - delete(scope: string, key: string): Promise; - list(scope: string, prefix?: string): Promise; - watch(scope: string, key: string): Event; - acquire(scope: string, key: string): IDisposable; } diff --git a/packages/agent-core-v2/src/persistence/interface/blobStore.ts b/packages/agent-core-v2/src/persistence/interface/blobStore.ts index d4ba51761..f24d00b2e 100644 --- a/packages/agent-core-v2/src/persistence/interface/blobStore.ts +++ b/packages/agent-core-v2/src/persistence/interface/blobStore.ts @@ -15,15 +15,10 @@ export interface IBlobStore { readonly _serviceBrand: undefined; put(scope: string, key: string, data: Uint8Array): Promise; - get(scope: string, key: string): Promise; - getStream(scope: string, key: string): AsyncIterable; - has(scope: string, key: string): Promise; - delete(scope: string, key: string): Promise; - list(scope: string, prefix?: string): Promise; } diff --git a/packages/agent-core-v2/src/persistence/interface/queryStore.ts b/packages/agent-core-v2/src/persistence/interface/queryStore.ts index c53e6cfd6..a32aa1f96 100644 --- a/packages/agent-core-v2/src/persistence/interface/queryStore.ts +++ b/packages/agent-core-v2/src/persistence/interface/queryStore.ts @@ -83,21 +83,13 @@ export interface IQueryStore { readonly _serviceBrand: undefined; put(collection: string, key: string, value: T): Promise; - batch(ops: readonly WriteOp[]): Promise; - delete(collection: string, key: string): Promise; - get(collection: string, key: string): Promise; - query(collection: string): IQuery; - ensureIndex(collection: string, def: IndexDef): Promise; - getCheckpoint(source: string): Promise; - setCheckpoint(source: string, checkpoint: Checkpoint): Promise; - close(): Promise; } diff --git a/packages/agent-core-v2/src/persistence/interface/storage.ts b/packages/agent-core-v2/src/persistence/interface/storage.ts index 588888bea..a3b7aef2a 100644 --- a/packages/agent-core-v2/src/persistence/interface/storage.ts +++ b/packages/agent-core-v2/src/persistence/interface/storage.ts @@ -41,21 +41,13 @@ export interface IFileSystemStorageService { readonly _serviceBrand: undefined; read(scope: string, key: string): Promise; - readStream(scope: string, key: string): AsyncIterable; - write(scope: string, key: string, data: Uint8Array, options?: StorageWriteOptions): Promise; - append(scope: string, key: string, data: Uint8Array, options?: StorageAppendOptions): Promise; - list(scope: string, prefix?: string): Promise; - delete(scope: string, key: string): Promise; - watch?(scope: string, key: string): Event; - flush(): Promise; - close(): Promise; } diff --git a/packages/agent-core-v2/src/session/agentLifecycle/agentLifecycle.ts b/packages/agent-core-v2/src/session/agentLifecycle/agentLifecycle.ts index 61c313261..e7c653b04 100644 --- a/packages/agent-core-v2/src/session/agentLifecycle/agentLifecycle.ts +++ b/packages/agent-core-v2/src/session/agentLifecycle/agentLifecycle.ts @@ -86,6 +86,7 @@ export interface AgentListFilter { export interface IAgentLifecycleService { readonly _serviceBrand: undefined; + /** Fires after an agent is created and registered, with its scope handle. */ readonly onDidCreate: Event; /** diff --git a/packages/agent-core-v2/src/session/approval/approval.ts b/packages/agent-core-v2/src/session/approval/approval.ts index d1377e586..4e3b611ab 100644 --- a/packages/agent-core-v2/src/session/approval/approval.ts +++ b/packages/agent-core-v2/src/session/approval/approval.ts @@ -32,6 +32,7 @@ export interface ApprovalResponse { export interface ISessionApprovalService { readonly _serviceBrand: undefined; + request(req: ApprovalRequest): Promise; /** * Submit an approval request without blocking on the decision. Returns the diff --git a/packages/agent-core-v2/src/session/btw/btw.ts b/packages/agent-core-v2/src/session/btw/btw.ts index b8eea8e7f..8123b2142 100644 --- a/packages/agent-core-v2/src/session/btw/btw.ts +++ b/packages/agent-core-v2/src/session/btw/btw.ts @@ -34,6 +34,7 @@ IMPORTANT: export interface ISessionBtwService { readonly _serviceBrand: undefined; + /** * Fork the main agent into a side-question child agent (tools disabled, * side-channel reminder appended) and return the child's id. diff --git a/packages/agent-core-v2/src/session/cron/sessionCronService.ts b/packages/agent-core-v2/src/session/cron/sessionCronService.ts index 110f754ca..8291cbee8 100644 --- a/packages/agent-core-v2/src/session/cron/sessionCronService.ts +++ b/packages/agent-core-v2/src/session/cron/sessionCronService.ts @@ -20,18 +20,16 @@ export interface CronLoadOptions { export interface ISessionCronService { readonly _serviceBrand: undefined; - readonly isEnabled: boolean; + readonly isEnabled: boolean; addTask(init: CronTaskInit): CronTask; removeTasks(ids: readonly string[]): readonly string[]; getTask(id: string): CronTask | undefined; list(): readonly CronTask[]; - now(): number; isStale(task: CronTask): boolean; getNextFireTime(): number | null; getNextFireForTask(taskId: string): number | null; - loadFromStore(options?: CronLoadOptions): Promise; start(): void; stop(): Promise; @@ -41,7 +39,6 @@ export interface ISessionCronService { tasks: readonly CronTask[], renderMissedNotification: (tasks: readonly CronTask[]) => readonly ContentPart[], ): Turn | undefined; - emitScheduled(task: CronTask): void; emitDeleted(taskId: string): void; } diff --git a/packages/agent-core-v2/src/session/execContext/execContext.ts b/packages/agent-core-v2/src/session/execContext/execContext.ts index 8ebcf8425..6524b5fb8 100644 --- a/packages/agent-core-v2/src/session/execContext/execContext.ts +++ b/packages/agent-core-v2/src/session/execContext/execContext.ts @@ -26,15 +26,12 @@ export interface IExecContext { /** Absolute path to the session's working directory. */ readonly cwd: string; - /** Ordered list of env overlays applied on top of `process.env` when * spawning a process. Later layers win. */ readonly envLayers: readonly Record[]; - /** Return a new `IExecContext` rooted at `cwd`, keeping the same env * layers. Does not mutate this context. */ withCwd(cwd: string): IExecContext; - /** Return a new `IExecContext` with `env` appended to `envLayers`. Does * not mutate this context. */ withEnv(env: Record): IExecContext; diff --git a/packages/agent-core-v2/src/session/interaction/interaction.ts b/packages/agent-core-v2/src/session/interaction/interaction.ts index b605039d4..50bfee8d7 100644 --- a/packages/agent-core-v2/src/session/interaction/interaction.ts +++ b/packages/agent-core-v2/src/session/interaction/interaction.ts @@ -51,6 +51,7 @@ export interface InteractionPendingChangedEvent { export interface ISessionInteractionService { readonly _serviceBrand: undefined; + request(req: InteractionRequest): Promise; /** * Park a request without blocking on its response. Returns the created diff --git a/packages/agent-core-v2/src/session/question/question.ts b/packages/agent-core-v2/src/session/question/question.ts index 28afd040f..0a0bff561 100644 --- a/packages/agent-core-v2/src/session/question/question.ts +++ b/packages/agent-core-v2/src/session/question/question.ts @@ -53,6 +53,7 @@ export interface QuestionRequest { export interface ISessionQuestionService { readonly _serviceBrand: undefined; + request(req: QuestionRequest): Promise; /** * Post a question without blocking on the answer. Returns the request with diff --git a/packages/agent-core-v2/src/session/session/sessionWarning.ts b/packages/agent-core-v2/src/session/session/sessionWarning.ts index bac12ec72..48a1d7cfd 100644 --- a/packages/agent-core-v2/src/session/session/sessionWarning.ts +++ b/packages/agent-core-v2/src/session/session/sessionWarning.ts @@ -13,6 +13,7 @@ export type { SessionWarning }; export interface ISessionWarningService { readonly _serviceBrand: undefined; + /** * Compute the current session-level warnings. Recomputes the AGENTS.md size * warning on demand (preferring the main agent's cached value when the agent diff --git a/packages/agent-core-v2/src/session/sessionActivity/sessionActivity.ts b/packages/agent-core-v2/src/session/sessionActivity/sessionActivity.ts index d9361afdc..ac80e2d10 100644 --- a/packages/agent-core-v2/src/session/sessionActivity/sessionActivity.ts +++ b/packages/agent-core-v2/src/session/sessionActivity/sessionActivity.ts @@ -14,6 +14,7 @@ export type SessionStatus = 'running' | 'idle' | 'awaiting_approval' | 'awaiting export interface ISessionActivity { readonly _serviceBrand: undefined; + status(): SessionStatus; isIdle(): boolean; } diff --git a/packages/agent-core-v2/src/session/sessionContext/sessionContext.ts b/packages/agent-core-v2/src/session/sessionContext/sessionContext.ts index 085401b4c..284beb5bc 100644 --- a/packages/agent-core-v2/src/session/sessionContext/sessionContext.ts +++ b/packages/agent-core-v2/src/session/sessionContext/sessionContext.ts @@ -14,11 +14,11 @@ import type { ScopeSeed } from '#/_base/di/scope'; export interface ISessionContext { readonly _serviceBrand: undefined; + readonly sessionId: string; readonly workspaceId: string; readonly sessionDir: string; readonly metaScope: string; - /** * Persistence scope rooted at this session. `scope()` returns the session * scope itself; `scope(subKey)` returns `${sessionScope}/${subKey}`. The diff --git a/packages/agent-core-v2/src/session/sessionMetadata/sessionMetadata.ts b/packages/agent-core-v2/src/session/sessionMetadata/sessionMetadata.ts index 0a1a41d75..5c0fbfd6a 100644 --- a/packages/agent-core-v2/src/session/sessionMetadata/sessionMetadata.ts +++ b/packages/agent-core-v2/src/session/sessionMetadata/sessionMetadata.ts @@ -63,6 +63,7 @@ export interface SessionMetadataChangedEvent { export interface ISessionMetadata { readonly _serviceBrand: undefined; + readonly ready: Promise; readonly onDidChangeMetadata: Event; read(): Promise; diff --git a/packages/agent-core-v2/src/session/sessionSkillCatalog/skillCatalog.ts b/packages/agent-core-v2/src/session/sessionSkillCatalog/skillCatalog.ts index 03a05afc0..6f885df16 100644 --- a/packages/agent-core-v2/src/session/sessionSkillCatalog/skillCatalog.ts +++ b/packages/agent-core-v2/src/session/sessionSkillCatalog/skillCatalog.ts @@ -15,11 +15,8 @@ export interface ISessionSkillCatalog { readonly _serviceBrand: undefined; readonly catalog: SkillCatalog; - readonly ready: Promise; - load(): Promise; - reload(): Promise; } diff --git a/packages/agent-core-v2/src/session/swarm/sessionSwarm.ts b/packages/agent-core-v2/src/session/swarm/sessionSwarm.ts index 743cadf42..36a69c1da 100644 --- a/packages/agent-core-v2/src/session/swarm/sessionSwarm.ts +++ b/packages/agent-core-v2/src/session/swarm/sessionSwarm.ts @@ -54,6 +54,7 @@ export interface SessionSwarmRunResult { export interface ISessionSwarmService { readonly _serviceBrand: undefined; + run(args: SessionSwarmRunArgs): Promise[]>; cancel(args: { readonly callerAgentId: string }): void; } diff --git a/packages/agent-core-v2/src/session/terminal/terminalService.ts b/packages/agent-core-v2/src/session/terminal/terminalService.ts index 4dcad5a44..f962d360b 100644 --- a/packages/agent-core-v2/src/session/terminal/terminalService.ts +++ b/packages/agent-core-v2/src/session/terminal/terminalService.ts @@ -46,25 +46,17 @@ export interface ISessionTerminalService { readonly _serviceBrand: undefined; create(input: CreateTerminalRequest): Promise; - list(): Promise; - get(terminalId: string): Promise; - attach( terminalId: string, sink: TerminalAttachSink, options?: TerminalAttachOptions, ): Promise<{ replayed: number }>; - detach(terminalId: string, sinkId: string): void; - detachAllForSink(sinkId: string): void; - write(terminalId: string, data: string): Promise; - resize(terminalId: string, cols: number, rows: number): Promise; - close(terminalId: string): Promise<{ closed: true }>; } diff --git a/packages/agent-core-v2/src/session/workspaceContext/workspaceContext.ts b/packages/agent-core-v2/src/session/workspaceContext/workspaceContext.ts index 1a172c714..4694d68d8 100644 --- a/packages/agent-core-v2/src/session/workspaceContext/workspaceContext.ts +++ b/packages/agent-core-v2/src/session/workspaceContext/workspaceContext.ts @@ -16,7 +16,6 @@ export interface ISessionWorkspaceContext { readonly workDir: string; readonly additionalDirs: readonly string[]; - setWorkDir(workDir: string): void; resolve(rel: string): string; isWithin(absPath: string): boolean;