@provos/ironcurtain 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +14 -12
  2. package/dist/cli.js +6 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/config-command.d.ts +33 -1
  5. package/dist/config/config-command.js +608 -11
  6. package/dist/config/config-command.js.map +1 -1
  7. package/dist/config/openrouter-catalog.d.ts +46 -0
  8. package/dist/config/openrouter-catalog.js +111 -0
  9. package/dist/config/openrouter-catalog.js.map +1 -0
  10. package/dist/config/openrouter-models-fallback.d.ts +15 -0
  11. package/dist/config/openrouter-models-fallback.js +49 -0
  12. package/dist/config/openrouter-models-fallback.js.map +1 -0
  13. package/dist/config/types.d.ts +8 -0
  14. package/dist/config/user-config.d.ts +133 -7
  15. package/dist/config/user-config.js +234 -5
  16. package/dist/config/user-config.js.map +1 -1
  17. package/dist/daemon/daemon-command.js.map +1 -1
  18. package/dist/daemon/ironcurtain-daemon.js +6 -0
  19. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  20. package/dist/docker/adapters/claude-code.js +109 -1
  21. package/dist/docker/adapters/claude-code.js.map +1 -1
  22. package/dist/docker/adapters/codex.d.ts +10 -1
  23. package/dist/docker/adapters/codex.js +99 -20
  24. package/dist/docker/adapters/codex.js.map +1 -1
  25. package/dist/docker/adapters/goose.js +38 -2
  26. package/dist/docker/adapters/goose.js.map +1 -1
  27. package/dist/docker/agent-adapter.d.ts +29 -5
  28. package/dist/docker/agent-registry.js +1 -1
  29. package/dist/docker/agent-registry.js.map +1 -1
  30. package/dist/docker/apple-container-manager.d.ts +4 -4
  31. package/dist/docker/apple-container-manager.js +44 -22
  32. package/dist/docker/apple-container-manager.js.map +1 -1
  33. package/dist/docker/ca.js +9 -2
  34. package/dist/docker/ca.js.map +1 -1
  35. package/dist/docker/container-lifecycle.js +9 -0
  36. package/dist/docker/container-lifecycle.js.map +1 -1
  37. package/dist/docker/docker-agent-session.d.ts +31 -0
  38. package/dist/docker/docker-agent-session.js +67 -6
  39. package/dist/docker/docker-agent-session.js.map +1 -1
  40. package/dist/docker/docker-infrastructure.d.ts +55 -15
  41. package/dist/docker/docker-infrastructure.js +261 -61
  42. package/dist/docker/docker-infrastructure.js.map +1 -1
  43. package/dist/docker/docker-manager.js +127 -0
  44. package/dist/docker/docker-manager.js.map +1 -1
  45. package/dist/docker/docker-resource-lifecycle.d.ts +71 -0
  46. package/dist/docker/docker-resource-lifecycle.js +454 -0
  47. package/dist/docker/docker-resource-lifecycle.js.map +1 -0
  48. package/dist/docker/gc-command.d.ts +2 -0
  49. package/dist/docker/gc-command.js +37 -0
  50. package/dist/docker/gc-command.js.map +1 -0
  51. package/dist/docker/mitm-proxy.d.ts +6 -4
  52. package/dist/docker/mitm-proxy.js +105 -17
  53. package/dist/docker/mitm-proxy.js.map +1 -1
  54. package/dist/docker/network-topology.d.ts +16 -9
  55. package/dist/docker/network-topology.js +17 -10
  56. package/dist/docker/network-topology.js.map +1 -1
  57. package/dist/docker/openrouter.d.ts +107 -0
  58. package/dist/docker/openrouter.js +236 -0
  59. package/dist/docker/openrouter.js.map +1 -0
  60. package/dist/docker/orientation.js +1 -1
  61. package/dist/docker/orientation.js.map +1 -1
  62. package/dist/docker/platform.d.ts +3 -1
  63. package/dist/docker/platform.js +3 -1
  64. package/dist/docker/platform.js.map +1 -1
  65. package/dist/docker/provider-config.d.ts +6 -0
  66. package/dist/docker/provider-config.js.map +1 -1
  67. package/dist/docker/pty-session.d.ts +7 -0
  68. package/dist/docker/pty-session.js +111 -29
  69. package/dist/docker/pty-session.js.map +1 -1
  70. package/dist/docker/pty-types.d.ts +15 -0
  71. package/dist/docker/pty-types.js +8 -0
  72. package/dist/docker/pty-types.js.map +1 -1
  73. package/dist/docker/sse-extractor.js +55 -5
  74. package/dist/docker/sse-extractor.js.map +1 -1
  75. package/dist/docker/stream-delay.d.ts +86 -0
  76. package/dist/docker/stream-delay.js +218 -0
  77. package/dist/docker/stream-delay.js.map +1 -0
  78. package/dist/docker/token-stream-types.d.ts +15 -0
  79. package/dist/docker/trajectory-reassembler.d.ts +2 -2
  80. package/dist/docker/trajectory-reassembler.js +22 -2
  81. package/dist/docker/trajectory-reassembler.js.map +1 -1
  82. package/dist/docker/trajectory-tap.js +2 -2
  83. package/dist/docker/trajectory-tap.js.map +1 -1
  84. package/dist/docker/types.d.ts +63 -5
  85. package/dist/doctor/checks.d.ts +3 -3
  86. package/dist/doctor/checks.js +28 -11
  87. package/dist/doctor/checks.js.map +1 -1
  88. package/dist/doctor/doctor-command.js +1 -1
  89. package/dist/doctor/doctor-command.js.map +1 -1
  90. package/dist/escalation/escalation-watcher.js +6 -0
  91. package/dist/escalation/escalation-watcher.js.map +1 -1
  92. package/dist/{mux → escalation}/trusted-input.d.ts +7 -4
  93. package/dist/{mux → escalation}/trusted-input.js +8 -5
  94. package/dist/escalation/trusted-input.js.map +1 -0
  95. package/dist/hash.js.map +1 -1
  96. package/dist/index.js +37 -6
  97. package/dist/index.js.map +1 -1
  98. package/dist/mux/mux-app.d.ts +7 -0
  99. package/dist/mux/mux-app.js +17 -16
  100. package/dist/mux/mux-app.js.map +1 -1
  101. package/dist/mux/mux-command.js +8 -3
  102. package/dist/mux/mux-command.js.map +1 -1
  103. package/dist/mux/mux-input-handler.d.ts +26 -2
  104. package/dist/mux/mux-input-handler.js +93 -11
  105. package/dist/mux/mux-input-handler.js.map +1 -1
  106. package/dist/mux/mux-renderer.d.ts +2 -1
  107. package/dist/mux/mux-renderer.js +67 -0
  108. package/dist/mux/mux-renderer.js.map +1 -1
  109. package/dist/mux/provider-profile-snapshot.d.ts +44 -0
  110. package/dist/mux/provider-profile-snapshot.js +56 -0
  111. package/dist/mux/provider-profile-snapshot.js.map +1 -0
  112. package/dist/mux/types.d.ts +3 -2
  113. package/dist/mux/types.js +6 -2
  114. package/dist/mux/types.js.map +1 -1
  115. package/dist/observe/observe-command.js.map +1 -1
  116. package/dist/pipeline/constitution-compiler.js.map +1 -1
  117. package/dist/pipeline/generate-with-repair.js.map +1 -1
  118. package/dist/pipeline/refresh-lists.js.map +1 -1
  119. package/dist/pipeline/scenario-schema-validator.js.map +1 -1
  120. package/dist/{mux → pty}/pty-bridge.d.ts +39 -3
  121. package/dist/{mux → pty}/pty-bridge.js +68 -18
  122. package/dist/pty/pty-bridge.js.map +1 -0
  123. package/dist/pty/resolve-ironcurtain-bin.d.ts +17 -0
  124. package/dist/pty/resolve-ironcurtain-bin.js +22 -0
  125. package/dist/pty/resolve-ironcurtain-bin.js.map +1 -0
  126. package/dist/servers/fetch-server.js +2 -0
  127. package/dist/servers/fetch-server.js.map +1 -1
  128. package/dist/session/index.d.ts +1 -1
  129. package/dist/session/index.js +11 -2
  130. package/dist/session/index.js.map +1 -1
  131. package/dist/session/preflight.d.ts +19 -5
  132. package/dist/session/preflight.js +41 -25
  133. package/dist/session/preflight.js.map +1 -1
  134. package/dist/session/resource-budget-tracker.js +8 -0
  135. package/dist/session/resource-budget-tracker.js.map +1 -1
  136. package/dist/session/session-manager.d.ts +7 -0
  137. package/dist/session/session-manager.js.map +1 -1
  138. package/dist/session/types.d.ts +14 -0
  139. package/dist/signal/signal-bot-daemon.d.ts +1 -0
  140. package/dist/signal/signal-bot-daemon.js +9 -2
  141. package/dist/signal/signal-bot-daemon.js.map +1 -1
  142. package/dist/trusted-process/mcp-error-utils.js +4 -1
  143. package/dist/trusted-process/mcp-error-utils.js.map +1 -1
  144. package/dist/trusted-process/mcp-proxy-server.js +2 -0
  145. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  146. package/dist/trusted-process/policy-engine.js.map +1 -1
  147. package/dist/trusted-process/tcp-server-transport.d.ts +7 -0
  148. package/dist/trusted-process/tcp-server-transport.js +48 -10
  149. package/dist/trusted-process/tcp-server-transport.js.map +1 -1
  150. package/dist/utils/preflight-checks.js +1 -3
  151. package/dist/utils/preflight-checks.js.map +1 -1
  152. package/dist/utils/stdio-guard.d.ts +1 -0
  153. package/dist/utils/stdio-guard.js +27 -0
  154. package/dist/utils/stdio-guard.js.map +1 -0
  155. package/dist/web-ui/__tests__/config-dispatch.test.d.ts +13 -0
  156. package/dist/web-ui/__tests__/config-dispatch.test.js +383 -0
  157. package/dist/web-ui/__tests__/config-dispatch.test.js.map +1 -0
  158. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +6 -0
  159. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -1
  160. package/dist/web-ui/dispatch/config-dispatch.d.ts +15 -0
  161. package/dist/web-ui/dispatch/config-dispatch.js +277 -0
  162. package/dist/web-ui/dispatch/config-dispatch.js.map +1 -0
  163. package/dist/web-ui/dispatch/escalation-dispatch.js +11 -2
  164. package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -1
  165. package/dist/web-ui/dispatch/pty-dispatch.d.ts +15 -0
  166. package/dist/web-ui/dispatch/pty-dispatch.js +66 -0
  167. package/dist/web-ui/dispatch/pty-dispatch.js.map +1 -0
  168. package/dist/web-ui/dispatch/session-dispatch.js +69 -4
  169. package/dist/web-ui/dispatch/session-dispatch.js.map +1 -1
  170. package/dist/web-ui/dispatch/types.d.ts +12 -0
  171. package/dist/web-ui/dispatch/types.js +38 -1
  172. package/dist/web-ui/dispatch/types.js.map +1 -1
  173. package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -1
  174. package/dist/web-ui/json-rpc-dispatch.js +3 -0
  175. package/dist/web-ui/json-rpc-dispatch.js.map +1 -1
  176. package/dist/web-ui/pty-session-manager.d.ts +234 -0
  177. package/dist/web-ui/pty-session-manager.js +599 -0
  178. package/dist/web-ui/pty-session-manager.js.map +1 -0
  179. package/dist/web-ui/web-event-bus.d.ts +9 -0
  180. package/dist/web-ui/web-event-bus.js.map +1 -1
  181. package/dist/web-ui/web-session-transport.js.map +1 -1
  182. package/dist/web-ui/web-ui-server.d.ts +8 -0
  183. package/dist/web-ui/web-ui-server.js +25 -0
  184. package/dist/web-ui/web-ui-server.js.map +1 -1
  185. package/dist/web-ui/web-ui-types.d.ts +80 -1
  186. package/dist/web-ui/web-ui-types.js.map +1 -1
  187. package/dist/web-ui-static/assets/index-CCVI4nEK.css +1 -0
  188. package/dist/web-ui-static/assets/index-Dm012gvY.js +114 -0
  189. package/dist/web-ui-static/index.html +2 -2
  190. package/dist/workflow/daemon-gate-commands.js +38 -42
  191. package/dist/workflow/daemon-gate-commands.js.map +1 -1
  192. package/dist/workflow/machine-builder.js.map +1 -1
  193. package/dist/workflow/orchestrator.js +10 -7
  194. package/dist/workflow/orchestrator.js.map +1 -1
  195. package/dist/workflow/shutdown-signals.d.ts +7 -0
  196. package/dist/workflow/shutdown-signals.js +40 -0
  197. package/dist/workflow/shutdown-signals.js.map +1 -0
  198. package/dist/workflow/validate.js.map +1 -1
  199. package/dist/workflow/workflow-command.js +10 -8
  200. package/dist/workflow/workflow-command.js.map +1 -1
  201. package/dist/workflow/workflows/evolve/README.md +66 -0
  202. package/dist/workflow/workflows/vuln-discovery/README.md +54 -0
  203. package/docker/entrypoint-claude-code.sh +22 -0
  204. package/package.json +31 -27
  205. package/src/workflow/workflows/evolve/README.md +66 -0
  206. package/src/workflow/workflows/vuln-discovery/README.md +54 -0
  207. package/dist/mux/pty-bridge.js.map +0 -1
  208. package/dist/mux/trusted-input.js.map +0 -1
  209. package/dist/web-ui-static/assets/index-BD5U6ILh.css +0 -1
  210. package/dist/web-ui-static/assets/index-FMsHWEfK.js +0 -79
  211. package/packages/web-ui/README.md +0 -113
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Config-related JSON-RPC method dispatch.
3
+ *
4
+ * Handles `config.*` methods, scoped to the `modelProviders` provider-profile
5
+ * registry only (see docs/designs/openrouter-integration.md §5-G / §12.6):
6
+ * - `config.getModelProviders` — read; masks every openrouter profile's key.
7
+ * - `config.setModelProviders` — mutation; gated on `ctx.allowPolicyMutation`,
8
+ * persists the WHOLE section via `saveUserConfig`, emits `config.changed`.
9
+ *
10
+ * Mirrors the `personas.*` gated-mutation pattern for the gate + change-event
11
+ * (persona-dispatch.ts:219,286). Unlike personas, the mutation persists to
12
+ * `~/.ironcurtain/config.json` via `saveUserConfig`.
13
+ */
14
+ import { z } from 'zod';
15
+ import { validateParams } from './types.js';
16
+ import { RpcError, MethodNotFoundError, } from '../web-ui-types.js';
17
+ import { loadUserConfig, saveUserConfig, maskApiKey, cloneProviderPreference, DOCKER_AGENTS, NATIVE_PROFILE_NAME, } from '../../config/user-config.js';
18
+ import { listOpenrouterModels } from '../../config/openrouter-catalog.js';
19
+ // The mask FORMAT that `maskApiKey` produces is the DTO contract (§12.6): the
20
+ // `resolveApiKey` round-trip below compares an incoming wire value against
21
+ // `maskApiKey(currentKey)`, and the frontend renders the same shape. It is
22
+ // shared from the `user-config.ts` leaf so the CLI editor and this daemon
23
+ // dispatch cannot drift — without dragging the editor's `@clack/prompts` import
24
+ // onto the WS path.
25
+ // ---------------------------------------------------------------------------
26
+ // Param schemas
27
+ // ---------------------------------------------------------------------------
28
+ const modelMapRuleDtoSchema = z.object({
29
+ match: z.string().min(1),
30
+ model: z.string().min(1),
31
+ });
32
+ const providerPreferenceDtoSchema = z.object({
33
+ order: z.array(z.string().min(1)).optional(),
34
+ only: z.array(z.string().min(1)).optional(),
35
+ allowFallbacks: z.boolean().optional(),
36
+ });
37
+ const nativeProfileDtoSchema = z.object({ type: z.literal('native') }).strict();
38
+ /**
39
+ * The openrouter profile DTO on the write path. `apiKey` is intentionally
40
+ * permissive (string | null | absent) because the M5 mask-unchanged contract
41
+ * distinguishes absent/null/mask-equal ("keep") from '' ("clear") from any
42
+ * other string ("set") — the empty string is a MEANINGFUL sentinel here, so it
43
+ * must not be rejected by a `.min(1)`.
44
+ */
45
+ const openrouterProfileDtoSchema = z
46
+ .object({
47
+ type: z.literal('openrouter'),
48
+ apiKey: z.string().nullable().optional(),
49
+ modelMap: z.array(modelMapRuleDtoSchema).optional(),
50
+ perAgent: z.record(z.string(), z.string().min(1).optional()).optional(),
51
+ providerPreference: providerPreferenceDtoSchema.optional(),
52
+ sessionAffinity: z.boolean().optional(),
53
+ })
54
+ .strict();
55
+ const profileDtoSchema = z.discriminatedUnion('type', [nativeProfileDtoSchema, openrouterProfileDtoSchema]);
56
+ const setModelProvidersSchema = z.object({
57
+ default: z.string().min(1).optional(),
58
+ profiles: z.record(z.string().min(1), profileDtoSchema),
59
+ });
60
+ const getModelProvidersSchema = z.object({});
61
+ const listOpenrouterModelsSchema = z.object({ forceRefresh: z.boolean().optional() });
62
+ // ---------------------------------------------------------------------------
63
+ // Dispatch
64
+ // ---------------------------------------------------------------------------
65
+ export async function configDispatch(ctx, method, params) {
66
+ switch (method) {
67
+ case 'config.getModelProviders': {
68
+ validateParams(getModelProvidersSchema, params);
69
+ return getModelProviders();
70
+ }
71
+ case 'config.setModelProviders': {
72
+ requirePolicyMutation(ctx);
73
+ const input = validateParams(setModelProvidersSchema, params);
74
+ return setModelProviders(ctx, input);
75
+ }
76
+ // Ungated read of the PUBLIC OpenRouter catalog (mirrors getModelProviders).
77
+ case 'config.listOpenrouterModels': {
78
+ const input = validateParams(listOpenrouterModelsSchema, params);
79
+ const result = await listOpenrouterModels({ forceRefresh: input.forceRefresh });
80
+ return { models: result.models, source: result.source };
81
+ }
82
+ default:
83
+ throw new MethodNotFoundError(method);
84
+ }
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Read
88
+ // ---------------------------------------------------------------------------
89
+ /**
90
+ * Returns the resolved `modelProviders` registry with every openrouter
91
+ * profile's `apiKey` masked. Read-only load so a bare read never mutates the
92
+ * config file. The `native` profile is included key-less.
93
+ */
94
+ function getModelProviders() {
95
+ const resolved = loadUserConfig({ readOnly: true }).modelProviders;
96
+ return toGetDto(resolved);
97
+ }
98
+ /** Maps a resolved registry to the masked wire DTO. */
99
+ function toGetDto(resolved) {
100
+ const profiles = {};
101
+ for (const [name, profile] of Object.entries(resolved.profiles)) {
102
+ profiles[name] = profile.type === 'native' ? { type: 'native' } : toOpenrouterDto(profile);
103
+ }
104
+ return { default: resolved.default, profiles };
105
+ }
106
+ function toOpenrouterDto(profile) {
107
+ const perAgent = {};
108
+ for (const agent of DOCKER_AGENTS)
109
+ perAgent[agent] = profile.perAgent[agent];
110
+ return {
111
+ type: 'openrouter',
112
+ apiKey: maskApiKey(profile.apiKey),
113
+ // A default-tracking profile OMITS `modelMap` so a set-back round-trip
114
+ // re-persists the omission (not today's materialized DEFAULT_MODEL_MAP).
115
+ // An explicit map (including `[]`) is serialized verbatim.
116
+ modelMap: profile.usesDefaultMap ? undefined : profile.modelMap.map((r) => ({ match: r.match, model: r.model })),
117
+ perAgent,
118
+ providerPreference: profile.providerPreference ? cloneProviderPreference(profile.providerPreference) : undefined,
119
+ sessionAffinity: profile.sessionAffinity,
120
+ };
121
+ }
122
+ /**
123
+ * Persists the whole `modelProviders` section. Applies, in order:
124
+ * - F7: silently drop a verbatim `profiles.native = { type: 'native' }`;
125
+ * reject any other value under the `native` key.
126
+ * - M5: per-profile apiKey — absent/null/mask-equal → keep stored key,
127
+ * '' → clear, other → set (compared against the currently-resolved key).
128
+ * - F10: if `default` names a profile absent from the write, re-point it to
129
+ * 'native' in the same write (never persist a dangling `default`).
130
+ *
131
+ * Writes the whole section via `saveUserConfig` (the shallow `deepMergeConfig`
132
+ * replaces `profiles` wholesale, so a partial write drops unmentioned profiles).
133
+ * Emits `config.changed`, then returns the fresh masked get DTO.
134
+ */
135
+ function setModelProviders(ctx, input) {
136
+ // Snapshot the currently-resolved registry so M5 can compare against the
137
+ // stored key (preserve when the wire value equals its mask) and F10 can see
138
+ // the stored default when the write omits one.
139
+ const current = loadUserConfig({ readOnly: true }).modelProviders;
140
+ const currentProfiles = current.profiles;
141
+ const profiles = {};
142
+ for (const [name, dto] of Object.entries(input.profiles)) {
143
+ if (name === NATIVE_PROFILE_NAME) {
144
+ // F7: accept-and-drop a verbatim native echo; reject anything else.
145
+ if (dto.type === 'native')
146
+ continue;
147
+ throw new RpcError('INVALID_PARAMS', `"${NATIVE_PROFILE_NAME}" is a reserved profile name and cannot be redefined.`);
148
+ }
149
+ if (dto.type === 'native') {
150
+ // A user-named native profile is inert but harmless; persist as-is.
151
+ profiles[name] = { type: 'native' };
152
+ continue;
153
+ }
154
+ profiles[name] = buildOpenrouterInput(name, dto, currentProfiles[name]);
155
+ }
156
+ // F10: re-point a `default` that names a profile DROPPED in this write (one
157
+ // that existed in the stored config but is absent from the new `profiles`).
158
+ // A `default` naming a profile that never existed at all is NOT re-pointed —
159
+ // it falls through to the Zod `.refine` in saveUserConfig and is rejected
160
+ // (validation-passthrough: the request itself set a bad default).
161
+ const priorNames = Object.keys(currentProfiles);
162
+ let resolvedDefault = repointDefault(input.default, profiles, priorNames);
163
+ if (input.default === undefined) {
164
+ // The client omitted `default`; the shallow config merge would preserve the
165
+ // stored default. If THIS write deletes the profile that default names, that
166
+ // preserved default would dangle and saveUserConfig's schema `.refine` would
167
+ // reject the whole write with a confusing INVALID_PARAMS. Auto-repoint to
168
+ // native for that case — the same F10 outcome as sending it explicitly.
169
+ if (current.default !== NATIVE_PROFILE_NAME &&
170
+ !(current.default in profiles) &&
171
+ priorNames.includes(current.default)) {
172
+ resolvedDefault = NATIVE_PROFILE_NAME;
173
+ }
174
+ }
175
+ const modelProviders = { profiles };
176
+ if (resolvedDefault !== undefined)
177
+ modelProviders.default = resolvedDefault;
178
+ // saveUserConfig re-validates via the Zod schema (including the reserved-name
179
+ // and default-must-exist `.refine`s), so a request that names a genuinely
180
+ // missing profile in `default` (not the F10 delete case) throws here.
181
+ try {
182
+ saveUserConfig({ modelProviders });
183
+ }
184
+ catch (err) {
185
+ throw new RpcError('INVALID_PARAMS', err instanceof Error ? err.message : String(err));
186
+ }
187
+ ctx.eventBus.emit('config.changed', {});
188
+ return getModelProviders();
189
+ }
190
+ /**
191
+ * Builds one openrouter profile's persisted input shape from its DTO, resolving
192
+ * the M5 apiKey contract against the currently-stored profile.
193
+ */
194
+ function buildOpenrouterInput(name, dto, current) {
195
+ const currentKey = current?.type === 'openrouter' ? current.apiKey : '';
196
+ const resolvedKey = resolveApiKey(dto.apiKey, currentKey);
197
+ const out = { type: 'openrouter' };
198
+ // The persisted schema requires apiKey.min(1); an empty resolved key means
199
+ // "no key" and is written by OMITTING the field entirely.
200
+ if (resolvedKey)
201
+ out.apiKey = resolvedKey;
202
+ if (dto.modelMap !== undefined)
203
+ out.modelMap = dto.modelMap.map((r) => ({ match: r.match, model: r.model }));
204
+ const perAgent = buildPerAgent(dto.perAgent);
205
+ if (perAgent)
206
+ out.perAgent = perAgent;
207
+ if (dto.providerPreference) {
208
+ out.providerPreference = cloneProviderPreference(dto.providerPreference);
209
+ }
210
+ if (dto.sessionAffinity !== undefined)
211
+ out.sessionAffinity = dto.sessionAffinity;
212
+ return out;
213
+ }
214
+ /**
215
+ * M5 per-profile apiKey resolution:
216
+ * - absent / null / equal-to-the-current-mask → keep the stored key
217
+ * - '' (empty) → clear
218
+ * - any other string → set
219
+ */
220
+ function resolveApiKey(wire, currentKey) {
221
+ if (wire === undefined || wire === null)
222
+ return currentKey;
223
+ if (wire === maskApiKey(currentKey))
224
+ return currentKey;
225
+ if (wire === '')
226
+ return '';
227
+ return wire;
228
+ }
229
+ /** Compacts a perAgent DTO to the persisted shape, dropping undefined/blank slugs. */
230
+ function buildPerAgent(input) {
231
+ if (!input)
232
+ return undefined;
233
+ const out = {};
234
+ for (const agent of DOCKER_AGENTS) {
235
+ const slug = input[agent];
236
+ if (slug)
237
+ out[agent] = slug;
238
+ }
239
+ return Object.keys(out).length > 0 ? out : undefined;
240
+ }
241
+ /**
242
+ * F10 — resolves the `default` to persist.
243
+ * - unset → `undefined` (leaves it unset; resolves to 'native' at load).
244
+ * - 'native' or a name present in the new `profiles` → kept as-is.
245
+ * - a name absent from `profiles` but present in `priorNames` (a profile
246
+ * DELETED by this write) → re-pointed to 'native' (never persist a dangling
247
+ * default, which would make the next `loadUserConfig` a HARD error).
248
+ * - a name absent from BOTH `profiles` and `priorNames` (a bad/typo default
249
+ * the request itself introduced) → returned unchanged, so the Zod `.refine`
250
+ * in saveUserConfig rejects it (validation-passthrough, §12.6).
251
+ */
252
+ function repointDefault(requested, profiles, priorNames) {
253
+ if (requested === undefined)
254
+ return undefined;
255
+ if (requested === NATIVE_PROFILE_NAME)
256
+ return NATIVE_PROFILE_NAME;
257
+ if (requested in profiles)
258
+ return requested;
259
+ // Present before this write => it was just deleted => repoint. Otherwise it
260
+ // was never a real profile => leave it dangling so validation rejects it.
261
+ return priorNames.includes(requested) ? NATIVE_PROFILE_NAME : requested;
262
+ }
263
+ // ---------------------------------------------------------------------------
264
+ // Gate
265
+ // ---------------------------------------------------------------------------
266
+ /**
267
+ * Kill-switch gate for the mutation. Throws POLICY_MUTATION_FORBIDDEN when the
268
+ * daemon was not launched with `--allow-policy-mutation`. Fires BEFORE any disk
269
+ * read so a read-only client never learns config/credential state (mirrors
270
+ * persona-dispatch.ts:252).
271
+ */
272
+ function requirePolicyMutation(ctx) {
273
+ if (ctx.allowPolicyMutation !== true) {
274
+ throw new RpcError('POLICY_MUTATION_FORBIDDEN', 'Policy mutation is not enabled on this daemon.');
275
+ }
276
+ }
277
+ //# sourceMappingURL=config-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-dispatch.js","sourceRoot":"","sources":["../../../src/web-ui/dispatch/config-dispatch.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,14 @@ export async function escalationDispatch(ctx, method, params) {
23
23
  return listEscalations(ctx);
24
24
  case 'escalations.resolve': {
25
25
  const validated = validateParams(escalationResolveSchema, params);
26
- const result = await ctx.sessionManager.resolveSessionEscalation(validated.escalationId, validated.decision, validated.whitelistSelection != null ? { whitelistSelection: validated.whitelistSelection } : undefined);
26
+ const options = validated.whitelistSelection != null ? { whitelistSelection: validated.whitelistSelection } : undefined;
27
+ // PTY sessions own their escalations outside SessionManager; route to the
28
+ // PTY manager (writes the response file + emits escalation.resolved).
29
+ if (ctx.ptySessionManager?.hasEscalation(validated.escalationId)) {
30
+ ctx.ptySessionManager.resolveEscalation(validated.escalationId, validated.decision, options);
31
+ return;
32
+ }
33
+ const result = await ctx.sessionManager.resolveSessionEscalation(validated.escalationId, validated.decision, options);
27
34
  if (!result.resolved) {
28
35
  throw new RpcError(result.reason === 'already_resolving' ? 'SESSION_BUSY' : 'ESCALATION_NOT_FOUND', result.reason ?? 'Failed to resolve escalation');
29
36
  }
@@ -37,7 +44,7 @@ export async function escalationDispatch(ctx, method, params) {
37
44
  // Helpers
38
45
  // ---------------------------------------------------------------------------
39
46
  function listEscalations(ctx) {
40
- return ctx.sessionManager.withPendingEscalation().flatMap((m) => {
47
+ const turnBased = ctx.sessionManager.withPendingEscalation().flatMap((m) => {
41
48
  const esc = m.pendingEscalation;
42
49
  if (!esc)
43
50
  return [];
@@ -48,5 +55,7 @@ function listEscalations(ctx) {
48
55
  },
49
56
  ];
50
57
  });
58
+ const pty = ctx.ptySessionManager?.listPendingEscalationDtos() ?? [];
59
+ return [...turnBased, ...pty];
51
60
  }
52
61
  //# sourceMappingURL=escalation-dispatch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"escalation-dispatch.js","sourceRoot":"","sources":["../../../src/web-ui/dispatch/escalation-dispatch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAwB,cAAc,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAsB,QAAQ,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEvF,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CAC9D,CAAC,CAAC;AAEH,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAoB,EACpB,MAAc,EACd,MAA+B;IAE/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,kBAAkB;YACrB,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,MAAM,SAAS,GAAG,cAAc,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YAClE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,wBAAwB,CAC9D,SAAS,CAAC,YAAY,EACtB,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,kBAAkB,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CACxG,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,IAAI,QAAQ,CAChB,MAAM,CAAC,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,EAC/E,MAAM,CAAC,MAAM,IAAI,8BAA8B,CAChD,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD;YACE,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,eAAe,CAAC,GAAoB;IAC3C,OAAO,GAAG,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9D,MAAM,GAAG,GAAG,CAAC,CAAC,iBAAiB,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO;YACL;gBACE,GAAG,GAAG;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM;aACxB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"escalation-dispatch.js","sourceRoot":"","sources":["../../../src/web-ui/dispatch/escalation-dispatch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAwB,cAAc,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAsB,QAAQ,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEvF,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CAC9D,CAAC,CAAC;AAEH,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAoB,EACpB,MAAc,EACd,MAA+B;IAE/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,kBAAkB;YACrB,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,MAAM,SAAS,GAAG,cAAc,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YAClE,MAAM,OAAO,GACX,SAAS,CAAC,kBAAkB,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAE1G,0EAA0E;YAC1E,sEAAsE;YACtE,IAAI,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjE,GAAG,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC7F,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,wBAAwB,CAC9D,SAAS,CAAC,YAAY,EACtB,SAAS,CAAC,QAAQ,EAClB,OAAO,CACR,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,IAAI,QAAQ,CAChB,MAAM,CAAC,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,EAC/E,MAAM,CAAC,MAAM,IAAI,8BAA8B,CAChD,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD;YACE,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,eAAe,CAAC,GAAoB;IAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACzE,MAAM,GAAG,GAAG,CAAC,CAAC,iBAAiB,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO;YACL;gBACE,GAAG,GAAG;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM;aACxB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC;IACrE,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,GAAG,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * PTY terminal subscription JSON-RPC dispatch.
3
+ *
4
+ * Handles the four per-client PTY methods:
5
+ * - sessions.ptyAttach (subscribe + one-shot replay snapshot)
6
+ * - sessions.ptyDetach (unsubscribe)
7
+ * - sessions.ptyInput (forward base64 keystroke bytes to the child stdin)
8
+ * - sessions.ptyResize (resize the child PTY)
9
+ *
10
+ * All delegate to `ctx.ptySessionManager`. Mirrors token-stream-dispatch.ts:
11
+ * attach/detach are keyed to the calling WebSocket, so the client is required.
12
+ */
13
+ import type { WebSocket as WsWebSocket } from 'ws';
14
+ import { type DispatchContext } from './types.js';
15
+ export declare function ptyDispatch(ctx: DispatchContext, method: string, params: Record<string, unknown>, client: WsWebSocket): unknown;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * PTY terminal subscription JSON-RPC dispatch.
3
+ *
4
+ * Handles the four per-client PTY methods:
5
+ * - sessions.ptyAttach (subscribe + one-shot replay snapshot)
6
+ * - sessions.ptyDetach (unsubscribe)
7
+ * - sessions.ptyInput (forward base64 keystroke bytes to the child stdin)
8
+ * - sessions.ptyResize (resize the child PTY)
9
+ *
10
+ * All delegate to `ctx.ptySessionManager`. Mirrors token-stream-dispatch.ts:
11
+ * attach/detach are keyed to the calling WebSocket, so the client is required.
12
+ */
13
+ import { z } from 'zod';
14
+ import { validateParams, labelSchema } from './types.js';
15
+ import { MethodNotFoundError, RpcError } from '../web-ui-types.js';
16
+ // ---------------------------------------------------------------------------
17
+ // Param validation schemas
18
+ // ---------------------------------------------------------------------------
19
+ const ptyInputSchema = z.object({ label: z.number().int().positive(), data: z.string() });
20
+ const ptyResizeSchema = z.object({
21
+ label: z.number().int().positive(),
22
+ cols: z.number().int().positive(),
23
+ rows: z.number().int().positive(),
24
+ });
25
+ // A trusted user message (not raw keystrokes): the daemon writes user-context
26
+ // (source 'mux-trusted-input') and injects the text into the PTY.
27
+ const ptyPromptSchema = z.object({ label: z.number().int().positive(), text: z.string().min(1) });
28
+ // ---------------------------------------------------------------------------
29
+ // Dispatch
30
+ // ---------------------------------------------------------------------------
31
+ export function ptyDispatch(ctx, method, params, client) {
32
+ const manager = ctx.ptySessionManager;
33
+ if (!manager) {
34
+ throw new RpcError('INTERNAL_ERROR', 'PTY session manager not available');
35
+ }
36
+ switch (method) {
37
+ case 'sessions.ptyAttach': {
38
+ const { label } = validateParams(labelSchema, params);
39
+ manager.attach(label, client);
40
+ return { attached: true };
41
+ }
42
+ case 'sessions.ptyDetach': {
43
+ const { label } = validateParams(labelSchema, params);
44
+ manager.detach(label, client);
45
+ return { detached: true };
46
+ }
47
+ case 'sessions.ptyInput': {
48
+ const { label, data } = validateParams(ptyInputSchema, params);
49
+ manager.input(label, data);
50
+ return { accepted: true };
51
+ }
52
+ case 'sessions.ptyResize': {
53
+ const { label, cols, rows } = validateParams(ptyResizeSchema, params);
54
+ manager.resize(label, cols, rows);
55
+ return { resized: true };
56
+ }
57
+ case 'sessions.ptyPrompt': {
58
+ const { label, text } = validateParams(ptyPromptSchema, params);
59
+ manager.sendPrompt(label, text);
60
+ return { accepted: true };
61
+ }
62
+ default:
63
+ throw new MethodNotFoundError(method);
64
+ }
65
+ }
66
+ //# sourceMappingURL=pty-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-dispatch.js","sourceRoot":"","sources":["../../../src/web-ui/dispatch/pty-dispatch.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,10 @@
5
5
  * budget, history, diagnostics.
6
6
  */
7
7
  import { z } from 'zod';
8
- import { validateParams, toSessionDto, toBudgetDto, labelSchema } from './types.js';
8
+ import { validateParams, toSessionDto, toBudgetDto, zeroedBudgetDto, labelSchema, } from './types.js';
9
9
  import { RpcError, SessionNotFoundError, MethodNotFoundError, } from '../web-ui-types.js';
10
10
  import { tokenStreamDispatch } from './token-stream-dispatch.js';
11
+ import { ptyDispatch } from './pty-dispatch.js';
11
12
  import { WebSessionTransport } from '../web-session-transport.js';
12
13
  import { loadConfig } from '../../config/index.js';
13
14
  import { createStandaloneSession } from '../../session/index.js';
@@ -27,6 +28,14 @@ const sessionCreateSchema = z.object({
27
28
  * docs/designs/mitm-token-trajectory-capture.md §10.
28
29
  */
29
30
  captureTraces: z.boolean().optional(),
31
+ /**
32
+ * Docker-agent (web-pty) launch options, mirroring mux `/new`. Ignored by the
33
+ * code-mode chatbox path. The child `ironcurtain start --pty` validates the
34
+ * workspace (containment) and resolves the provider profile / model.
35
+ */
36
+ workspacePath: z.string().min(1).optional(),
37
+ providerProfileName: z.string().min(1).optional(),
38
+ model: z.string().min(1).optional(),
30
39
  });
31
40
  const sessionSendSchema = z.object({ label: z.number().int().positive(), text: z.string().min(1) });
32
41
  // ---------------------------------------------------------------------------
@@ -40,6 +49,13 @@ export async function sessionDispatch(ctx, method, params, client) {
40
49
  }
41
50
  return tokenStreamDispatch(ctx, method, params, client);
42
51
  }
52
+ // Delegate PTY terminal methods to dedicated dispatch module
53
+ if (method.startsWith('sessions.pty')) {
54
+ if (!client) {
55
+ throw new RpcError('INTERNAL_ERROR', 'PTY methods require a WebSocket client');
56
+ }
57
+ return ptyDispatch(ctx, method, params, client);
58
+ }
43
59
  switch (method) {
44
60
  case 'sessions.list':
45
61
  return listSessions(ctx);
@@ -48,11 +64,21 @@ export async function sessionDispatch(ctx, method, params, client) {
48
64
  return getSession(ctx, label);
49
65
  }
50
66
  case 'sessions.create': {
51
- const { persona, captureTraces } = validateParams(sessionCreateSchema, params);
52
- return createWebSession(ctx, persona, captureTraces);
67
+ const opts = validateParams(sessionCreateSchema, params);
68
+ // Docker mode streams a live terminal (web-pty); code mode keeps the
69
+ // turn-based chatbox session. The daemon's SessionMode is process-global.
70
+ if (ctx.mode.kind === 'docker') {
71
+ return createPtySession(ctx, opts);
72
+ }
73
+ return createWebSession(ctx, opts.persona, opts.captureTraces);
53
74
  }
54
75
  case 'sessions.end': {
55
76
  const { label } = validateParams(labelSchema, params);
77
+ // Route PTY labels to their manager (they are not in SessionManager).
78
+ if (ctx.ptySessionManager?.has(label)) {
79
+ ctx.ptySessionManager.end(label);
80
+ return;
81
+ }
56
82
  const endManaged = ctx.sessionManager.get(label);
57
83
  const endSessionId = endManaged?.session.getInfo().id;
58
84
  await ctx.sessionManager.end(label);
@@ -68,6 +94,10 @@ export async function sessionDispatch(ctx, method, params, client) {
68
94
  }
69
95
  case 'sessions.budget': {
70
96
  const { label } = validateParams(labelSchema, params);
97
+ // PTY sessions have no turn/budget accounting; return a zeroed budget
98
+ // rather than throwing, so a stale/racing client degrades cleanly (§11 D2).
99
+ if (ctx.ptySessionManager?.has(label))
100
+ return zeroedBudgetDto();
71
101
  const managed = ctx.sessionManager.get(label);
72
102
  if (!managed)
73
103
  throw new SessionNotFoundError(label);
@@ -75,6 +105,9 @@ export async function sessionDispatch(ctx, method, params, client) {
75
105
  }
76
106
  case 'sessions.history': {
77
107
  const { label } = validateParams(labelSchema, params);
108
+ // PTY sessions carry no turn history (§11 D2).
109
+ if (ctx.ptySessionManager?.has(label))
110
+ return [];
78
111
  const managed = ctx.sessionManager.get(label);
79
112
  if (!managed)
80
113
  throw new SessionNotFoundError(label);
@@ -82,6 +115,9 @@ export async function sessionDispatch(ctx, method, params, client) {
82
115
  }
83
116
  case 'sessions.diagnostics': {
84
117
  const { label } = validateParams(labelSchema, params);
118
+ // PTY sessions carry no diagnostic log (§11 D2).
119
+ if (ctx.ptySessionManager?.has(label))
120
+ return [];
85
121
  const managed = ctx.sessionManager.get(label);
86
122
  if (!managed)
87
123
  throw new SessionNotFoundError(label);
@@ -99,9 +135,17 @@ function cleanupSessionQueue(ctx, label) {
99
135
  ctx.sessionQueues.delete(label);
100
136
  }
101
137
  function listSessions(ctx) {
102
- return ctx.sessionManager.all().map((m) => toSessionDto(m));
138
+ const managed = ctx.sessionManager.all().map((m) => toSessionDto(m));
139
+ const pty = ctx.ptySessionManager?.listDtos() ?? [];
140
+ return [...managed, ...pty];
103
141
  }
104
142
  function getSession(ctx, label) {
143
+ // PTY sessions have no turn history/diagnostics; return the DTO with empty
144
+ // logs rather than throwing, since selecting one drives this call.
145
+ const ptyDto = ctx.ptySessionManager?.getDto(label);
146
+ if (ptyDto) {
147
+ return { ...ptyDto, history: [], diagnosticLog: [] };
148
+ }
105
149
  const managed = ctx.sessionManager.get(label);
106
150
  if (!managed)
107
151
  throw new SessionNotFoundError(label);
@@ -111,6 +155,27 @@ function getSession(ctx, label) {
111
155
  diagnosticLog: managed.session.getDiagnosticLog(),
112
156
  };
113
157
  }
158
+ /**
159
+ * Creates a Docker-agent PTY session (docker mode). Enforces the SAME
160
+ * concurrency cap as the turn-based path, counting PTY sessions (§11 D4) —
161
+ * each is a full container, so an unbounded spawn is a real resource concern.
162
+ */
163
+ async function createPtySession(ctx, opts) {
164
+ const manager = ctx.ptySessionManager;
165
+ if (!manager) {
166
+ throw new RpcError('INTERNAL_ERROR', 'PTY session manager not available');
167
+ }
168
+ if (manager.size >= ctx.maxConcurrentWebSessions) {
169
+ throw new RpcError('RATE_LIMITED', `PTY session limit reached (max ${ctx.maxConcurrentWebSessions})`);
170
+ }
171
+ return manager.create({
172
+ ...(opts.persona ? { persona: opts.persona } : {}),
173
+ ...(opts.captureTraces !== undefined ? { captureTraces: opts.captureTraces } : {}),
174
+ ...(opts.workspacePath ? { workspacePath: opts.workspacePath } : {}),
175
+ ...(opts.providerProfileName ? { providerProfileName: opts.providerProfileName } : {}),
176
+ ...(opts.model ? { model: opts.model } : {}),
177
+ });
178
+ }
114
179
  async function createWebSession(ctx, persona, captureTracesOverride) {
115
180
  const webCount = ctx.sessionManager.byKind('web').length;
116
181
  if (webCount >= ctx.maxConcurrentWebSessions) {
@@ -1 +1 @@
1
- {"version":3,"file":"session-dispatch.js","sourceRoot":"","sources":["../../../src/web-ui/dispatch/session-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-dispatch.js","sourceRoot":"","sources":["../../../src/web-ui/dispatch/session-dispatch.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import type { SessionManager, ManagedSession } from '../../session/session-manag
9
9
  import type { ControlRequestHandler } from '../../daemon/control-socket.js';
10
10
  import type { SessionMode } from '../../session/types.js';
11
11
  import type { TokenStreamBridge } from '../token-stream-bridge.js';
12
+ import type { PtySessionManager, PtyWebSession } from '../pty-session-manager.js';
12
13
  import type { WebEventBus } from '../web-event-bus.js';
13
14
  import { type SessionDto, type BudgetSummaryDto, type DaemonStatusDto } from '../web-ui-types.js';
14
15
  export declare const labelSchema: z.ZodObject<{
@@ -24,6 +25,8 @@ export interface DispatchContext {
24
25
  readonly sessionQueues: Map<number, Promise<void>>;
25
26
  /** Bridge for per-client token stream subscriptions. */
26
27
  tokenStreamBridge?: TokenStreamBridge;
28
+ /** Manager for Docker-agent PTY terminal sessions (docker mode only). */
29
+ ptySessionManager?: PtySessionManager;
27
30
  /**
28
31
  * Daemon-process capture-traces default. Used by `sessions.create`
29
32
  * when the JSON-RPC payload does not include `captureTraces`. See
@@ -50,5 +53,14 @@ export interface DispatchContext {
50
53
  }
51
54
  export declare function validateParams<T>(schema: z.ZodType<T>, params: Record<string, unknown>): T;
52
55
  export declare function toSessionDto(managed: ManagedSession): SessionDto;
56
+ /**
57
+ * Builds a SessionDto for a Docker-agent PTY session. A PTY session has no
58
+ * turn/budget accounting, so `turnCount` is 0 and the budget is zeroed with
59
+ * `tokenTrackingAvailable:false`. `status` reflects the child's liveness so an
60
+ * abandoned-but-alive terminal is distinguishable in the list. The frontend
61
+ * branches on `source.kind === 'web-pty'` to render a terminal (Phase 5).
62
+ */
63
+ export declare function toPtySessionDto(session: PtyWebSession): SessionDto;
64
+ export declare function zeroedBudgetDto(): BudgetSummaryDto;
53
65
  export declare function toBudgetDto(managed: ManagedSession): BudgetSummaryDto;
54
66
  export declare function buildStatusDto(ctx: DispatchContext): DaemonStatusDto;