@rynx-ai/server 0.1.10 → 0.1.11-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/control-api.d.ts +17 -52
  2. package/dist/control-api.js +755 -341
  3. package/dist/control-web/assets/{highlighted-body-OFNGDK62-DgFZpTNw.js → highlighted-body-OFNGDK62-IdclXfSt.js} +1 -1
  4. package/dist/control-web/assets/index-5n6D-i-c.css +32 -0
  5. package/dist/control-web/assets/index-DhsO7WjD.js +709 -0
  6. package/dist/control-web/assets/{mermaid-GHXKKRXX-BDikE3W1.js → mermaid-GHXKKRXX-BqMPrbIZ.js} +3 -3
  7. package/dist/control-web/index.html +2 -2
  8. package/dist/control-web-dist.d.ts +1 -1
  9. package/dist/control-web-dist.js +4 -2
  10. package/dist/machine-session-service.d.ts +135 -27
  11. package/dist/machine-session-service.js +410 -58
  12. package/dist/remote-runtime-dispatcher.d.ts +12 -2
  13. package/dist/remote-runtime-dispatcher.js +56 -0
  14. package/dist/remote-runtime-session-projection.js +1 -0
  15. package/dist/server.d.ts +59 -29
  16. package/dist/server.js +158 -143
  17. package/dist/session-browser-service.d.ts +8 -0
  18. package/dist/session-browser-service.js +37 -20
  19. package/dist/session-portal.d.ts +42 -0
  20. package/dist/session-portal.js +746 -0
  21. package/dist/session-runtime-index.d.ts +7 -0
  22. package/dist/session-runtime-index.js +42 -6
  23. package/dist/session-terminal-host.d.ts +6 -0
  24. package/dist/session-terminal-host.js +56 -41
  25. package/dist/terminal-ws.js +8 -6
  26. package/package.json +7 -7
  27. package/dist/channel-manager.d.ts +0 -60
  28. package/dist/channel-manager.js +0 -106
  29. package/dist/control-web/assets/index-CnVtOmLv.css +0 -32
  30. package/dist/control-web/assets/index-Dlywgy58.js +0 -661
@@ -1,4 +1,4 @@
1
- import type { RemoteRuntimeEmulatorGesturePoint, RemoteRuntimeRpcRequest, RemoteRuntimeRpcResponse, RemoteRuntimeSequencedSessionEvent } from "@rynx-ai/protocol/remote-runtime-rpc";
1
+ import type { RemoteRuntimeEmulatorGesturePoint, RemoteRuntimeProject, RemoteRuntimeProjectCreateParams, RemoteRuntimeRpcRequest, RemoteRuntimeRpcResponse, RemoteRuntimeSequencedSessionEvent } from "@rynx-ai/protocol/remote-runtime-rpc";
2
2
  import { type DaemonRuntimeHost } from "./remote-runtime.js";
3
3
  import { type MachineSessionService } from "./machine-session-service.js";
4
4
  import { type SessionBrowserService } from "./session-browser-service.js";
@@ -22,10 +22,19 @@ export interface RemoteRuntimeDispatcherOptions {
22
22
  browsers?: RemoteRuntimeBrowserHost;
23
23
  terminals?: SessionTerminalHost;
24
24
  providerClis?: ProviderCliStatusHost;
25
+ projects?: RemoteRuntimeProjectHost;
25
26
  /** Optional diagnostic sink. Wire errors deliberately omit internal details. */
26
27
  onError?: (error: unknown, request: RemoteRuntimeRpcRequest) => void;
27
28
  }
28
- export type RemoteRuntimeSessionHost = Pick<MachineSessionService, "list" | "snapshot" | "watch" | "interrupt" | "agentOptions" | "launchOptions" | "create" | "sendMessage" | "resourcePolicy" | "beginResourceUpload" | "writeResourceUploadChunk" | "commitResourceUpload" | "getResource" | "readResource" | "deleteResource" | "enqueueMessage" | "startTerminal" | "delete" | "resolveInteraction">;
29
+ /** Runtime-local Project persistence. Project ids never cross into Session records. */
30
+ export interface RemoteRuntimeProjectHost {
31
+ list(): RemoteRuntimeProject[] | Promise<RemoteRuntimeProject[]>;
32
+ get(projectId: string): RemoteRuntimeProject | undefined | Promise<RemoteRuntimeProject | undefined>;
33
+ create(input: RemoteRuntimeProjectCreateParams): RemoteRuntimeProject | Promise<RemoteRuntimeProject>;
34
+ update(projectId: string, input: RemoteRuntimeProjectCreateParams): RemoteRuntimeProject | undefined | Promise<RemoteRuntimeProject | undefined>;
35
+ remove(projectId: string): boolean | Promise<boolean>;
36
+ }
37
+ export type RemoteRuntimeSessionHost = Pick<MachineSessionService, "list" | "snapshot" | "watch" | "interrupt" | "agentOptions" | "launchOptions" | "executionSettings" | "updateExecutionSettings" | "create" | "fork" | "sendMessage" | "resourcePolicy" | "beginResourceUpload" | "writeResourceUploadChunk" | "commitResourceUpload" | "getResource" | "readResource" | "deleteResource" | "enqueueMessage" | "startTerminal" | "delete" | "resolveInteraction">;
29
38
  export type RemoteRuntimeBrowserHost = Pick<SessionBrowserService, "getState" | "open" | "close" | "createPage" | "closePage" | "activatePage" | "navigatePage" | "goBack" | "goForward" | "reload">;
30
39
  export type RemoteRuntimeSessionEmulatorHost = Pick<SessionEmulatorService, "getState" | "listDevices" | "attach" | "detach" | "tap" | "type" | "button" | "rotate" | "launch" | "gesture" | "releaseDevice" | "stopDevice">;
31
40
  export interface OpenRemoteRuntimeSessionEvents {
@@ -88,6 +97,7 @@ export declare class RemoteRuntimeDispatcher {
88
97
  openSessionEvents(sessionId: string, context: RemoteRuntimeDispatchContext): OpenRemoteRuntimeSessionEvents;
89
98
  openSessionTerminal(sessionId: string, options: SessionTerminalOpenOptions, context: RemoteRuntimeDispatchContext): Promise<SessionTerminalAttachment>;
90
99
  private withEmulator;
100
+ private withProjects;
91
101
  private withSessions;
92
102
  private withSessionEmulators;
93
103
  private withBrowsers;
@@ -1,4 +1,5 @@
1
1
  import { encodeRemoteRuntimeRpcResponse, parseRemoteRuntimeRpcResponseForMethod, REMOTE_RUNTIME_RPC_METHOD_METADATA, } from "@rynx-ai/protocol/remote-runtime-rpc";
2
+ import { RuntimeProjectInputError } from "@rynx-ai/core";
2
3
  import { encodeDaemonStatus } from "./remote-runtime.js";
3
4
  import { MachineSessionServiceFailure, MachineSessionServiceInputError, } from "./machine-session-service.js";
4
5
  import { SessionBrowserServiceError, } from "./session-browser-service.js";
@@ -35,6 +36,30 @@ export class RemoteRuntimeDispatcher {
35
36
  return this.options.providerClis
36
37
  ? rpcResult(request, await this.options.providerClis.listStatuses())
37
38
  : rpcError(request.id, "method_not_found", "Provider CLI status is unavailable");
39
+ case "project.list":
40
+ return await this.withProjects(request, async (projects) => ({
41
+ projects: await projects.list(),
42
+ }));
43
+ case "project.get":
44
+ return await this.withProjects(request, async (projects) => ({
45
+ project: requireProject(await projects.get(request.params.projectId)),
46
+ }));
47
+ case "project.create":
48
+ return await this.withProjects(request, async (projects) => ({
49
+ project: await projects.create(request.params),
50
+ }));
51
+ case "project.update": {
52
+ const { projectId, ...input } = request.params;
53
+ return await this.withProjects(request, async (projects) => ({
54
+ project: requireProject(await projects.update(projectId, input)),
55
+ }));
56
+ }
57
+ case "project.delete":
58
+ return await this.withProjects(request, async (projects) => {
59
+ if (!await projects.remove(request.params.projectId))
60
+ throw new ProjectNotFoundError();
61
+ return { deleted: true };
62
+ });
38
63
  case "emulator.devices.list":
39
64
  return await this.withEmulator(request, (emulator) => emulator.devices());
40
65
  case "emulator.active.get":
@@ -100,8 +125,14 @@ export class RemoteRuntimeDispatcher {
100
125
  return await this.withSessions(request, (sessions) => sessions.agentOptions());
101
126
  case "session.launchOptions.list":
102
127
  return await this.withSessions(request, (sessions) => sessions.launchOptions());
128
+ case "session.execution.get":
129
+ return await this.withSessions(request, (sessions) => sessions.executionSettings(request.params.sessionId));
130
+ case "session.execution.update":
131
+ return await this.withSessions(request, (sessions) => sessions.updateExecutionSettings(request.params));
103
132
  case "session.create":
104
133
  return await this.withSessions(request, (sessions) => sessions.create(request.params));
134
+ case "session.fork":
135
+ return await this.withSessions(request, (sessions) => sessions.fork(request.params));
105
136
  case "session.message.send":
106
137
  return await this.withSessions(request, (sessions) => {
107
138
  const { sessionId, ...input } = request.params;
@@ -234,6 +265,13 @@ export class RemoteRuntimeDispatcher {
234
265
  }
235
266
  return rpcResult(request, await invoke(emulator));
236
267
  }
268
+ async withProjects(request, invoke) {
269
+ const projects = this.options.projects;
270
+ if (!projects) {
271
+ return rpcError(request.id, "method_not_found", "Runtime Projects are unavailable");
272
+ }
273
+ return rpcResult(request, await invoke(projects));
274
+ }
237
275
  async withSessions(request, invoke) {
238
276
  const sessions = this.options.sessions;
239
277
  if (!sessions) {
@@ -257,6 +295,17 @@ export class RemoteRuntimeDispatcher {
257
295
  }
258
296
  }
259
297
  function mapHostError(request, error) {
298
+ if (error instanceof ProjectNotFoundError) {
299
+ return { code: "not_found", message: "Runtime Project was not found" };
300
+ }
301
+ if (error instanceof RuntimeProjectInputError) {
302
+ return {
303
+ code: error.code,
304
+ message: error.code === "invalid_request"
305
+ ? "Runtime Project configuration is invalid"
306
+ : "Runtime Project directory is unavailable",
307
+ };
308
+ }
260
309
  if (error instanceof SessionBrowserServiceError) {
261
310
  switch (error.code) {
262
311
  case "invalid_request":
@@ -340,6 +389,13 @@ function mapHostError(request, error) {
340
389
  }
341
390
  return { code: "internal", message: "Remote Runtime request failed" };
342
391
  }
392
+ class ProjectNotFoundError extends Error {
393
+ }
394
+ function requireProject(project) {
395
+ if (!project)
396
+ throw new ProjectNotFoundError();
397
+ return project;
398
+ }
343
399
  function idempotentCancel(watch) {
344
400
  let pending;
345
401
  return () => {
@@ -64,6 +64,7 @@ function projectRuntimeSnapshot(value) {
64
64
  const originalActive = runtime.activeResponseIds;
65
65
  const projected = {
66
66
  status: runtime.status,
67
+ ...(runtime.statusKind === undefined ? {} : { statusKind: runtime.statusKind }),
67
68
  activeResponseIds: [],
68
69
  pendingInteractions: [],
69
70
  };
package/dist/server.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type { Server as HttpServer } from "node:http";
2
2
  import Koa from "koa";
3
- import { ConversationRuntime, type AgentCapabilities, type AgentSessionStore, type AppConfig, type ChannelInstanceDescriptor, type SessionEvent, type SessionBus, type SessionLogStore, type SessionRegistry } from "@rynx-ai/core";
3
+ import { ConversationRuntime, type AdmissionReservation, type AgentCapabilities, type AgentSessionStore, type AppConfig, type SessionEvent, type SessionBus, type SessionLogStore, type SessionRegistry } from "@rynx-ai/core";
4
4
  import type { SessionInteractionResolution } from "@rynx-ai/protocol";
5
5
  import type { ControlRuntimeShareAddress, DaemonBrowserArtifactCleanResult, DaemonBrowserArtifactInstallInput, DaemonBrowserArtifactInstallResult, DaemonBrowserArtifactUpdateInput, DaemonBrowserArtifactVersionResult, DaemonCleanupSessionsInput, DaemonCleanupSessionsResult, DaemonChromeInspectionConfigureInput, DaemonChromeInspectionStatus, DaemonShutdownIfIdleResult } from "@rynx-ai/protocol/control";
6
- import type { PluginInstallCommitInput, PluginInstallCommitResult, PluginInstallPreparation, PluginInstallPrepareInput, PluginManagementItem } from "@rynx-ai/protocol/plugin-management";
6
+ import type { PluginInstallCommitInput, PluginInstallCommitResult, PluginInstallPreparation, PluginInstallPrepareInput, PluginManagementItem, PluginMarketplaceAddInput, PluginMarketplaceItem } from "@rynx-ai/protocol/plugin-management";
7
+ import type { PluginJsonValue } from "@rynx-ai/plugin-sdk";
7
8
  import type { PairingOffer } from "@rynx-ai/protocol/direct-runtime";
8
9
  import type { DaemonStatus } from "@rynx-ai/protocol/remote-runtime";
9
10
  import type { RuntimeBrowserBootstrapCredential, RuntimeBrowserEndpointDescriptor } from "@rynx-ai/protocol/runtime-browser-bootstrap";
@@ -13,20 +14,21 @@ import type { RuntimeEmulatorSurfaceImageFrame, RuntimeEmulatorSurfaceReadyFrame
13
14
  import type { RemoteRuntimeRpcMethod, RemoteRuntimeRpcParams, RemoteRuntimeRpcResultFor, RemoteRuntimeSequencedSessionEvent } from "@rynx-ai/protocol/remote-runtime-rpc";
14
15
  import type { PluginAgentSummary, PluginResolvedSessionExecution, PluginSessionExecutionSnapshot } from "@rynx-ai/plugin-sdk";
15
16
  import { RunnerManager, type CodexSessionStore, type RunnerSessionContextProvider } from "@rynx-ai/runtime";
16
- import { ChannelManager } from "./channel-manager.js";
17
17
  import { type ControlPlaneDeps, type LocalSessionResourceHost, type SessionResourceLifecycle } from "./control-api.js";
18
+ import type { MachineSessionService } from "./machine-session-service.js";
18
19
  import type { DaemonRuntimeHost } from "./remote-runtime.js";
19
20
  import { type AttachDesktopBrowserHostServerOptions } from "./desktop-browser-host.js";
21
+ import { type SessionPortalAuthorizationPorts } from "./session-portal.js";
22
+ export { createSessionPortalApp, startSessionPortal } from "./session-portal.js";
23
+ export type { SessionPortalAuthorization, SessionPortalAuthorizationPorts, SessionPortalOptions, SessionPortalServer, } from "./session-portal.js";
20
24
  import { SessionRuntimeIndex } from "./session-runtime-index.js";
21
25
  import type { SessionEmulatorService } from "./session-emulator-service.js";
22
26
  import { type SessionTerminalHost } from "./session-terminal-host.js";
23
27
  import type { ProviderCliManagementHost } from "./provider-cli-host.js";
24
28
  import { type RuntimeWebAccessPolicy } from "./runtime-web-auth.js";
25
- export { ChannelManager } from "./channel-manager.js";
26
- export type { ChannelInstanceStatus } from "./channel-manager.js";
27
29
  export type { ProviderCliManagementHost, ProviderCliStatusHost, } from "./provider-cli-host.js";
28
30
  export { MachineSessionService, MachineSessionServiceFailure, MachineSessionServiceInputError, synthesizeSessionTitle, } from "./machine-session-service.js";
29
- export type { MachineSessionAgentCatalogPort, MachineSessionCreateInput, MachineSessionCreateResult, MachineSessionDeleteResult, MachineSessionInterruptPort, MachineSessionInterruptResult, MachineSessionInteractionResult, MachineSessionListInput, MachineSessionListPage, MachineSessionMessageResult, MachineSessionMessageEnqueueResult, MachineSessionMessageInput, MachineSessionMessageOperationState, MachineSessionPendingMessage, MachineSessionPendingMessagePort, MachineSessionPreparedInput, MachineSessionResourcePort, MachineSessionRunnerPort, MachineSessionRuntimeStatePort, MachineSessionServiceFailureCode, MachineSessionServiceOptions, MachineSessionServicePorts, MachineSessionSnapshotInput, MachineSessionSnapshotPage, MachineSessionWatch, } from "./machine-session-service.js";
31
+ export type { MachineSessionAgentCatalogPort, MachineSessionCreateInput, MachineSessionCreateResult, MachineSessionDeleteResult, MachineSessionForkInput, MachineSessionForkOperationRecord, MachineSessionForkOperationState, MachineSessionForkResult, MachineSessionForkStorePort, MachineSessionNativeRotationInput, MachineSessionInterruptPort, MachineSessionInterruptResult, MachineSessionInteractionResult, MachineSessionListInput, MachineSessionListPage, MachineSessionMessageResult, MachineSessionMessageEnqueueResult, MachineSessionMessageInput, MachineSessionMessageOperationState, MachineSessionPendingMessage, MachineSessionPendingMessagePort, MachineSessionPreparedInput, MachineSessionResourcePort, MachineSessionRunnerPort, MachineSessionRuntimeStatePort, MachineSessionServiceFailureCode, MachineSessionServiceOptions, MachineSessionServicePorts, MachineSessionSnapshotInput, MachineSessionSnapshotPage, MachineSessionWatch, } from "./machine-session-service.js";
30
32
  export { SessionBrowserHostError, SessionBrowserService, SessionBrowserServiceError, SessionBrowserSurfaceUnsupportedError, } from "./session-browser-service.js";
31
33
  export type { SessionBrowserHost, SessionBrowserHostCreateInput, SessionBrowserHostErrorCode, SessionBrowserHostEvent, SessionBrowserHostHandle, SessionBrowserHostPage, SessionBrowserHostSurfaceFrame, SessionBrowserHostSurfaceOpenInput, SessionBrowserHostSurfaceSource, SessionBrowserHostSurfaceTrustedInput, SessionBrowserHostSurfaceViewport, SessionBrowserHostSnapshot, SessionBrowserInspectionEndpoint, SessionBrowserInspectionTarget, SessionBrowserRegistryPort, SessionBrowserServiceErrorCode, SessionBrowserServiceOptions, SessionBrowserServicePorts, SessionBrowserSurfaceOpenInput, SessionBrowserSurfaceSource, } from "./session-browser-service.js";
32
34
  export { SessionEmulatorBindingConflictError, SessionEmulatorService, SessionEmulatorServiceError, } from "./session-emulator-service.js";
@@ -48,14 +50,14 @@ export { RemoteRuntimeDispatcher } from "./remote-runtime-dispatcher.js";
48
50
  export type { AuthenticatedRuntimeSubject, RemoteRuntimeEmulatorHost, RemoteRuntimeSessionEmulatorHost, RemoteRuntimeDispatchContext, RemoteRuntimeDispatcherOptions, } from "./remote-runtime-dispatcher.js";
49
51
  export { createRunnerSessionTerminalHost, SessionTerminalOpenError, SessionTerminalStreamError, } from "./session-terminal-host.js";
50
52
  export type { RunnerSessionTerminalHostOptions, RunnerSessionTerminalHost, SessionTerminalAttachment, SessionTerminalCloseInfo, SessionTerminalCloseReason, SessionTerminalHost, SessionTerminalOpenErrorCode, SessionTerminalOpenOptions, SessionTerminalRole, } from "./session-terminal-host.js";
51
- export type { ControlChannel, ControlChannelType, ControlInstanceConfig, ControlInstanceStatus, ControlAgentSummary, } from "@rynx-ai/protocol/control";
53
+ export type { ControlAgentSummary } from "@rynx-ai/protocol/control";
54
+ export { listRuntimeModels } from "@rynx-ai/runtime";
52
55
  export interface CreateAppOptions {
53
56
  config?: AppConfig;
54
57
  /** When present, mount the control plane (page + JSON API) beside `/health`.
55
58
  * `runtime`/`sessionBus`/`sessionLog`/`runnerManager` (from `startServer`'s
56
59
  * scope) enable the channel-agnostic `/api/sessions` agent-run endpoints. */
57
60
  control?: {
58
- manager: ChannelManager;
59
61
  deps: ControlPlaneDeps;
60
62
  runtime?: ConversationRuntime;
61
63
  sessionBus?: SessionBus;
@@ -63,8 +65,6 @@ export interface CreateAppOptions {
63
65
  runnerManager?: RunnerManager;
64
66
  sessionStore?: CodexSessionStore;
65
67
  pluginRuntimeStatus?: () => unknown;
66
- pluginRuntimeReload?: (pluginId: string) => Promise<unknown>;
67
- pluginRuntimeEnsure?: (pluginId: string) => Promise<unknown>;
68
68
  daemonManagement?: DaemonManagementHost;
69
69
  remoteRuntime?: DaemonRuntimeHost;
70
70
  remoteRuntimeAdmin?: RemoteRuntimeAdminHost;
@@ -72,6 +72,7 @@ export interface CreateAppOptions {
72
72
  runtimeWebAccess?: RuntimeWebAccessPolicy;
73
73
  runtimeConnectionResolver?: RuntimeConnectionResolverHost;
74
74
  localSessionResources?: LocalSessionResourceHost;
75
+ localMachineSessions?: MachineSessionService;
75
76
  sessionEmulators?: SessionEmulatorService;
76
77
  /** Host lifecycle signal for ending SSE/video streams before drain. */
77
78
  shutdownSignal?: AbortSignal;
@@ -83,29 +84,20 @@ export interface CreateAppOptions {
83
84
  }
84
85
  export interface StartServerOptions {
85
86
  config?: AppConfig;
86
- /** Static set of channel instances to mount, each with its own context. */
87
- channelInstances?: ChannelInstanceDescriptor[];
88
87
  /**
89
- * Dynamic source of channel instance descriptors, re-read on reloads. When
90
- * provided, the server mounts them via a {@link ChannelManager} (the seam the
91
- * control plane drives). Takes precedence over `channelInstances`.
92
- */
93
- loadInstances?: () => Promise<ChannelInstanceDescriptor[]>;
94
- /**
95
- * Control-plane deps (config + agent-spec mutators + log tail) injected by the
96
- * daemon. When present (and instances are managed), the server serves the
97
- * control page + JSON API. Requires `loadInstances`/`channelInstances`.
88
+ * Control-plane deps injected by the daemon. Plugin/channel management is
89
+ * exposed through the plugin host rather than generic channel instances.
98
90
  */
99
91
  control?: ControlPlaneDeps;
100
92
  /**
101
93
  * Durable canonical session log (the daemon injects the SQLite-backed store).
102
- * Absent channels render from the live stream without persisting.
94
+ * Absent means live session events are not persisted by this server.
103
95
  */
104
96
  sessionLog?: SessionLogStore;
105
97
  /**
106
- * Unified machine-session registry (the daemon injects the SQLite-backed store
107
- * over `sessions`). Handed to mounted channels so they register an identity row
108
- * per session; the control plane lists every session uniformly from it.
98
+ * Unified machine-session registry (the daemon injects the SQLite-backed
99
+ * store over `sessions`). Plugins reach it through Host RPC; the control plane
100
+ * lists every session uniformly from it.
109
101
  */
110
102
  sessionRegistry?: SessionRegistry;
111
103
  /** Trusted daemon-side bridge for isolated plugin runners. Installed plugin
@@ -124,6 +116,8 @@ export interface StartServerOptions {
124
116
  runtimeConnectionResolver?: RuntimeConnectionResolverHost;
125
117
  /** In-process resource authority used only by the Local Runtime BFF. */
126
118
  localSessionResources?: LocalSessionResourceHost;
119
+ /** Canonical same-daemon Session service used by Local compatibility routes. */
120
+ localMachineSessions?: MachineSessionService;
127
121
  /** Runtime-owned Session Emulator binding authority for Local compatibility routes. */
128
122
  sessionEmulators?: SessionEmulatorService;
129
123
  /** Pre-composed daemon-owned Session runtime. Supplying this lets the daemon
@@ -141,6 +135,9 @@ export interface StartServerOptions {
141
135
  providerClis?: ProviderCliManagementHost;
142
136
  /** Private resident-app Browser Host socket, authenticated by daemonManagement. */
143
137
  desktopBrowserHost?: Omit<AttachDesktopBrowserHostServerOptions, "managementToken">;
138
+ /** Hashed ticket/grant authority for the native Session Portal. Required
139
+ * when RYNX_SESSION_PORTAL_PORT enables that listener. */
140
+ sessionPortalAuthorization?: SessionPortalAuthorizationPorts;
144
141
  }
145
142
  export interface SessionRuntimeServices {
146
143
  sessionStore: CodexSessionStore;
@@ -148,6 +145,7 @@ export interface SessionRuntimeServices {
148
145
  sessionBus: SessionBus;
149
146
  sessionRuntimeIndex: SessionRuntimeIndex;
150
147
  conversationRuntime: ConversationRuntime;
148
+ publishSessionEvent: (sessionId: string, event: SessionEvent) => Promise<void>;
151
149
  }
152
150
  export interface PluginRuntimeHostServices {
153
151
  conversationRuntime: ConversationRuntime;
@@ -163,15 +161,23 @@ export interface PluginRuntimeHostServices {
163
161
  }): Promise<PluginResolvedSessionExecution>;
164
162
  };
165
163
  interruptSession(sessionId: string): Promise<boolean>;
164
+ terminateSession?(sessionId: string): Promise<boolean>;
166
165
  resolveSessionInteraction(sessionId: string, interactionId: string, resolution: SessionInteractionResolution): Promise<{
167
166
  disposition: "applied" | "already_resolved" | "not_found" | "invalid";
168
167
  }>;
168
+ /** Dynamic daemon-wide admission state. Plugin runtimes may start while this is
169
+ * closed, but cannot provision Sessions or begin Turns. */
170
+ admissionOpen?: () => boolean;
171
+ admissionReserve?: () => AdmissionReservation | undefined;
172
+ sessionPortal?: {
173
+ scheme: "http" | "https";
174
+ bindHost: string;
175
+ port: number;
176
+ };
169
177
  }
170
178
  export interface PluginRuntimeLifecycle {
171
179
  bindHostServices(services: PluginRuntimeHostServices): void;
172
180
  startPluginRuntimes(): Promise<void>;
173
- reloadPluginRuntime(pluginId: string): Promise<unknown>;
174
- ensurePluginRuntime(pluginId: string): Promise<unknown>;
175
181
  /** Cached process/contribution health; must not block on plugin RPC. */
176
182
  statusSnapshot(): unknown;
177
183
  dispose(): Promise<void>;
@@ -206,8 +212,24 @@ export interface PluginManagementHost {
206
212
  prepareInstallation(input: PluginInstallPrepareInput, context: DaemonManagementInvocationContext): Promise<PluginInstallPreparation>;
207
213
  commitInstallation(token: string, input: PluginInstallCommitInput, context: DaemonManagementInvocationContext): Promise<PluginInstallCommitResult>;
208
214
  cancelPreparation(token: string): boolean | Promise<boolean>;
215
+ settingsUi(pluginId: string): {
216
+ generation: string;
217
+ assetGeneration: string;
218
+ html: string;
219
+ } | undefined;
220
+ settingsUiAsset(pluginId: string, assetGeneration: string, assetPath: string): {
221
+ contentType: string;
222
+ data: Buffer;
223
+ } | undefined;
224
+ callSettings(pluginId: string, generation: string, method: string, params: PluginJsonValue | undefined, context: DaemonManagementInvocationContext): Promise<PluginJsonValue>;
209
225
  dispose?(): void | Promise<void>;
210
226
  }
227
+ export interface PluginMarketplaceManagementHost {
228
+ list(): PluginMarketplaceItem[] | Promise<PluginMarketplaceItem[]>;
229
+ add(input: PluginMarketplaceAddInput, context: DaemonManagementInvocationContext): Promise<PluginMarketplaceItem>;
230
+ refresh(id: string, context: DaemonManagementInvocationContext): Promise<PluginMarketplaceItem>;
231
+ remove(id: string): boolean | Promise<boolean>;
232
+ }
211
233
  export interface BrowserArtifactManagementHost {
212
234
  install(input: DaemonBrowserArtifactInstallInput, context: DaemonManagementInvocationContext): Promise<DaemonBrowserArtifactInstallResult>;
213
235
  update(input: DaemonBrowserArtifactUpdateInput, context: DaemonManagementInvocationContext): Promise<DaemonBrowserArtifactInstallResult>;
@@ -230,9 +252,15 @@ export interface DaemonManagementHost {
230
252
  restartRequired: boolean;
231
253
  };
232
254
  /** Perform one final activity check and schedule shutdown only when idle. */
233
- shutdownIfIdle?(): DaemonShutdownIfIdleResult;
255
+ shutdownIfIdle?(maintenanceLeaseToken?: string): DaemonShutdownIfIdleResult | Promise<DaemonShutdownIfIdleResult>;
256
+ /** Release a cross-process maintenance fence after a verified cutover. */
257
+ releaseMaintenanceLease?(maintenanceLeaseToken: string): {
258
+ outcome: "released" | "not_active" | "denied";
259
+ };
234
260
  /** Stateful plugin registry operations owned by the resident daemon. */
235
261
  pluginManagement?: PluginManagementHost;
262
+ /** Registered Git/local plugin catalogs. */
263
+ pluginMarketplaces?: PluginMarketplaceManagementHost;
236
264
  /** Stateful Chrome for Testing artifact operations owned by the daemon. */
237
265
  browserArtifacts?: BrowserArtifactManagementHost;
238
266
  /** Destructive maintenance operations over daemon-owned state. */
@@ -407,6 +435,8 @@ export declare function createSessionRuntimeServices(input: {
407
435
  sessionLog?: SessionLogStore;
408
436
  onMirrorError?: (error: unknown, sessionId: string) => void;
409
437
  sessionContextProvider?: RunnerSessionContextProvider;
438
+ admissionOpen?: () => boolean;
439
+ admissionReserve?: () => AdmissionReservation | undefined;
410
440
  }): SessionRuntimeServices;
411
441
  /**
412
442
  * The HTTP surface is just a liveness probe for container orchestration — all
@@ -415,4 +445,4 @@ export declare function createSessionRuntimeServices(input: {
415
445
  * no agent request / response / SSE endpoints are exposed here.
416
446
  */
417
447
  export declare function createApp({ config, control }?: CreateAppOptions): Koa<Koa.DefaultState, Koa.DefaultContext>;
418
- export declare function startServer({ config, channelInstances, loadInstances, control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, }?: StartServerOptions): Promise<RynxServer>;
448
+ export declare function startServer({ config, control, sessionLog, sessionRegistry, pluginRuntime, daemonManagement, remoteRuntime, remoteRuntimeAdmin, runtimeTargetControl, runtimeConnectionResolver, localSessionResources, localMachineSessions, sessionEmulators, sessionRuntimeServices, sessionLifecycle, sessionTerminals, runtimeLocalBrowser, providerClis, desktopBrowserHost, sessionPortalAuthorization, }?: StartServerOptions): Promise<RynxServer>;