@ours.network/fleet 1.1.0-nightly.2 → 1.1.0-nightly.21

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 (202) hide show
  1. package/README.md +204 -55
  2. package/dist/agent-recovery-gate.d.ts +17 -0
  3. package/dist/agent-recovery-gate.js +135 -0
  4. package/dist/application/capabilities.js +18 -6
  5. package/dist/application/fleet-query-service.js +20 -5
  6. package/dist/application/role-command-service.js +9 -0
  7. package/dist/application/role-creation-service.d.ts +6 -25
  8. package/dist/application/role-creation-service.js +34 -72
  9. package/dist/application/role-repository.d.ts +4 -2
  10. package/dist/application/role-repository.js +6 -3
  11. package/dist/application/session-control.d.ts +3 -1
  12. package/dist/application/session-control.js +4 -2
  13. package/dist/application/task-room-service.d.ts +58 -6
  14. package/dist/application/task-room-service.js +435 -79
  15. package/dist/briefing.js +74 -24
  16. package/dist/build-info.json +4 -4
  17. package/dist/canonical-json.d.ts +2 -0
  18. package/dist/canonical-json.js +10 -0
  19. package/dist/cli.js +241 -76
  20. package/dist/config-yaml.d.ts +1 -1
  21. package/dist/config.d.ts +75 -3
  22. package/dist/config.js +274 -34
  23. package/dist/creation.d.ts +1 -1
  24. package/dist/creation.js +3 -2
  25. package/dist/daemon-recovery.d.ts +93 -0
  26. package/dist/daemon-recovery.js +328 -0
  27. package/dist/docs.d.ts +1 -1
  28. package/dist/docs.js +192 -66
  29. package/dist/doctor.d.ts +2 -0
  30. package/dist/doctor.js +54 -4
  31. package/dist/fleet-command-audit.d.ts +165 -0
  32. package/dist/fleet-command-audit.js +555 -0
  33. package/dist/fleet-proxy.d.ts +7 -2
  34. package/dist/fleet-proxy.js +30 -8
  35. package/dist/harness/agent-session.d.ts +5 -0
  36. package/dist/harness/claude-code-session.d.ts +2 -0
  37. package/dist/harness/claude-code-session.js +6 -1
  38. package/dist/harness/claude-code.js +2 -0
  39. package/dist/harness/codex-app-server-proxy.d.ts +40 -0
  40. package/dist/harness/codex-app-server-proxy.js +348 -14
  41. package/dist/harness/codex-session.d.ts +11 -2
  42. package/dist/harness/codex-session.js +22 -2
  43. package/dist/harness/codex.d.ts +5 -1
  44. package/dist/harness/codex.js +110 -10
  45. package/dist/harness/types.d.ts +1 -1
  46. package/dist/index.d.ts +5 -4
  47. package/dist/index.js +4 -3
  48. package/dist/init-guidance.d.ts +1 -1
  49. package/dist/init-guidance.js +4 -3
  50. package/dist/init-wizard.d.ts +98 -0
  51. package/dist/init-wizard.js +629 -0
  52. package/dist/lifecycle-summary.d.ts +134 -0
  53. package/dist/lifecycle-summary.js +179 -0
  54. package/dist/loops/config.d.ts +10 -1
  55. package/dist/loops/config.js +38 -5
  56. package/dist/model-env.d.ts +2 -2
  57. package/dist/model-env.js +1 -1
  58. package/dist/model-recovery.d.ts +1 -1
  59. package/dist/ops.js +2 -17
  60. package/dist/owner-channel/channel.d.ts +58 -0
  61. package/dist/owner-channel/channel.js +321 -42
  62. package/dist/owner-channel/commands.d.ts +6 -1
  63. package/dist/owner-channel/commands.js +34 -19
  64. package/dist/owner-channel/state.d.ts +2 -0
  65. package/dist/owner-channel/state.js +8 -2
  66. package/dist/permissions.js +1 -1
  67. package/dist/preset-bootstrap.d.ts +10 -0
  68. package/dist/preset-bootstrap.js +85 -0
  69. package/dist/preset-migration.d.ts +42 -0
  70. package/dist/preset-migration.js +414 -0
  71. package/dist/reports/artifact.d.ts +10 -0
  72. package/dist/reports/artifact.js +32 -0
  73. package/dist/reports/index.d.ts +5 -0
  74. package/dist/reports/index.js +5 -0
  75. package/dist/reports/render.d.ts +6 -0
  76. package/dist/reports/render.js +240 -0
  77. package/dist/reports/service.d.ts +42 -0
  78. package/dist/reports/service.js +57 -0
  79. package/dist/reports/tasks.d.ts +52 -0
  80. package/dist/reports/tasks.js +177 -0
  81. package/dist/reports/types.d.ts +315 -0
  82. package/dist/reports/types.js +6 -0
  83. package/dist/resolved-plan.js +13 -1
  84. package/dist/rooms-tasks/cli.d.ts +2 -0
  85. package/dist/rooms-tasks/cli.js +514 -75
  86. package/dist/rooms-tasks/close.d.ts +9 -1
  87. package/dist/rooms-tasks/close.js +20 -4
  88. package/dist/rooms-tasks/config.js +16 -14
  89. package/dist/rooms-tasks/cowork-adapter.d.ts +1 -0
  90. package/dist/rooms-tasks/cowork-adapter.js +6 -0
  91. package/dist/rooms-tasks/deletion.d.ts +51 -0
  92. package/dist/rooms-tasks/deletion.js +217 -0
  93. package/dist/rooms-tasks/external-worker.d.ts +1 -0
  94. package/dist/rooms-tasks/external-worker.js +14 -9
  95. package/dist/rooms-tasks/launch-snapshot.d.ts +19 -0
  96. package/dist/rooms-tasks/launch-snapshot.js +181 -0
  97. package/dist/rooms-tasks/member-overrides.d.ts +30 -0
  98. package/dist/rooms-tasks/member-overrides.js +204 -0
  99. package/dist/rooms-tasks/provision.js +184 -49
  100. package/dist/rooms-tasks/room-state.d.ts +1 -0
  101. package/dist/rooms-tasks/room-state.js +12 -1
  102. package/dist/rooms-tasks/task-state.d.ts +115 -3
  103. package/dist/rooms-tasks/task-state.js +361 -11
  104. package/dist/rooms-tasks/templates.d.ts +4 -2
  105. package/dist/rooms-tasks/templates.js +42 -78
  106. package/dist/rooms-tasks/terminal.d.ts +3 -0
  107. package/dist/rooms-tasks/terminal.js +7 -3
  108. package/dist/rooms-tasks/types.d.ts +96 -17
  109. package/dist/rooms-tasks/types.js +14 -4
  110. package/dist/runner.d.ts +12 -2
  111. package/dist/runner.js +124 -43
  112. package/dist/session/acp.d.ts +9 -1
  113. package/dist/session/acp.js +35 -9
  114. package/dist/session/arbiter.d.ts +2 -1
  115. package/dist/session/arbiter.js +2 -0
  116. package/dist/session/codex-app-server-transport.d.ts +53 -0
  117. package/dist/session/codex-app-server-transport.js +184 -0
  118. package/dist/session/codex-app-server.d.ts +122 -0
  119. package/dist/session/codex-app-server.js +1031 -0
  120. package/dist/session/control.d.ts +14 -1
  121. package/dist/session/control.js +38 -0
  122. package/dist/session/conversation-types.d.ts +4 -4
  123. package/dist/session/types.d.ts +24 -6
  124. package/dist/session/types.js +28 -0
  125. package/dist/spawn.d.ts +15 -31
  126. package/dist/spawn.js +117 -237
  127. package/dist/temp-lifecycle.d.ts +1 -1
  128. package/dist/watchdog/config.d.ts +10 -7
  129. package/dist/watchdog/config.js +29 -19
  130. package/dist/watchdog/run.js +4 -13
  131. package/dist/web/fleet-config-service.d.ts +1 -0
  132. package/dist/web/fleet-config-service.js +27 -8
  133. package/dist/web/runtime.js +11 -6
  134. package/dist/web/server.js +28 -1
  135. package/dist/web/topology-promote.js +8 -1
  136. package/dist/web-app/assets/index-C0h3ALvs.js +10 -0
  137. package/dist/web-app/index.html +1 -1
  138. package/package.json +3 -2
  139. package/presets/brain-catalog.json +16 -0
  140. package/presets/fleet/agent_templates/Critic.yaml +4 -0
  141. package/presets/fleet/agent_templates/Developer.yaml +4 -0
  142. package/presets/fleet/agent_templates/LocalCoordinator.yaml +4 -0
  143. package/presets/fleet/agents/FleetCoordinator.yaml +3 -0
  144. package/presets/fleet/brains/claude-default.yaml +5 -0
  145. package/presets/fleet/brains/claude-fable-5-high.yaml +5 -0
  146. package/presets/fleet/brains/claude-fable-5-low.yaml +5 -0
  147. package/presets/fleet/brains/claude-fable-5-max.yaml +5 -0
  148. package/presets/fleet/brains/claude-fable-5-medium.yaml +5 -0
  149. package/presets/fleet/brains/claude-fable-5-xhigh.yaml +5 -0
  150. package/presets/fleet/brains/claude-opus-5-high.yaml +5 -0
  151. package/presets/fleet/brains/claude-opus-5-low.yaml +5 -0
  152. package/presets/fleet/brains/claude-opus-5-max.yaml +5 -0
  153. package/presets/fleet/brains/claude-opus-5-medium.yaml +5 -0
  154. package/presets/fleet/brains/claude-opus-5-xhigh.yaml +5 -0
  155. package/presets/fleet/brains/claude-sonnet-5-high.yaml +5 -0
  156. package/presets/fleet/brains/claude-sonnet-5-low.yaml +5 -0
  157. package/presets/fleet/brains/claude-sonnet-5-max.yaml +5 -0
  158. package/presets/fleet/brains/claude-sonnet-5-medium.yaml +5 -0
  159. package/presets/fleet/brains/claude-sonnet-5-xhigh.yaml +5 -0
  160. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-high.yaml +5 -0
  161. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-low.yaml +5 -0
  162. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-medium.yaml +5 -0
  163. package/presets/fleet/brains/codex-gpt-5-3-codex-spark-xhigh.yaml +5 -0
  164. package/presets/fleet/brains/codex-gpt-5-4-high.yaml +5 -0
  165. package/presets/fleet/brains/codex-gpt-5-4-low.yaml +5 -0
  166. package/presets/fleet/brains/codex-gpt-5-4-medium.yaml +5 -0
  167. package/presets/fleet/brains/codex-gpt-5-4-mini-high.yaml +5 -0
  168. package/presets/fleet/brains/codex-gpt-5-4-mini-low.yaml +5 -0
  169. package/presets/fleet/brains/codex-gpt-5-4-mini-medium.yaml +5 -0
  170. package/presets/fleet/brains/codex-gpt-5-4-mini-xhigh.yaml +5 -0
  171. package/presets/fleet/brains/codex-gpt-5-4-xhigh.yaml +5 -0
  172. package/presets/fleet/brains/codex-gpt-5-5-high.yaml +5 -0
  173. package/presets/fleet/brains/codex-gpt-5-5-low.yaml +5 -0
  174. package/presets/fleet/brains/codex-gpt-5-5-medium.yaml +5 -0
  175. package/presets/fleet/brains/codex-gpt-5-5-xhigh.yaml +5 -0
  176. package/presets/fleet/brains/codex-gpt-5-6-luna-high.yaml +5 -0
  177. package/presets/fleet/brains/codex-gpt-5-6-luna-low.yaml +5 -0
  178. package/presets/fleet/brains/codex-gpt-5-6-luna-max.yaml +5 -0
  179. package/presets/fleet/brains/codex-gpt-5-6-luna-medium.yaml +5 -0
  180. package/presets/fleet/brains/codex-gpt-5-6-luna-xhigh.yaml +5 -0
  181. package/presets/fleet/brains/codex-gpt-5-6-sol-high.yaml +5 -0
  182. package/presets/fleet/brains/codex-gpt-5-6-sol-low.yaml +5 -0
  183. package/presets/fleet/brains/codex-gpt-5-6-sol-max.yaml +5 -0
  184. package/presets/fleet/brains/codex-gpt-5-6-sol-medium.yaml +5 -0
  185. package/presets/fleet/brains/codex-gpt-5-6-sol-ultra.yaml +5 -0
  186. package/presets/fleet/brains/codex-gpt-5-6-sol-xhigh.yaml +5 -0
  187. package/presets/fleet/brains/codex-gpt-5-6-terra-high.yaml +5 -0
  188. package/presets/fleet/brains/codex-gpt-5-6-terra-low.yaml +5 -0
  189. package/presets/fleet/brains/codex-gpt-5-6-terra-max.yaml +5 -0
  190. package/presets/fleet/brains/codex-gpt-5-6-terra-medium.yaml +5 -0
  191. package/presets/fleet/brains/codex-gpt-5-6-terra-ultra.yaml +5 -0
  192. package/presets/fleet/brains/codex-gpt-5-6-terra-xhigh.yaml +5 -0
  193. package/presets/fleet/roles/Coordinator.yaml +30 -0
  194. package/presets/fleet/roles/Critic.yaml +19 -0
  195. package/presets/fleet/roles/Developer.yaml +19 -0
  196. package/presets/fleet/roles/LocalCoordinator.yaml +25 -0
  197. package/presets/fleet/room_templates/pair.yaml +10 -0
  198. package/presets/fleet/room_templates/single.yaml +7 -0
  199. package/presets/fleet/room_templates/team.yaml +12 -0
  200. package/presets/fleet.yaml +7 -0
  201. package/presets/manifest.json +6 -0
  202. package/dist/web-app/assets/index-BbE9EX6n.js +0 -10
@@ -16,6 +16,7 @@ const LAUNCHERS = ['auto', 'ours-codex', 'codex'];
16
16
  const SANDBOX_MODES = ['read-only', 'workspace-write', 'danger-full-access'];
17
17
  /** Codex CLI's accepted `--ask-for-approval` values. */
18
18
  const APPROVAL_POLICIES = ['untrusted', 'on-request', 'never'];
19
+ const NATIVE_CONFIG_ALLOWLIST = new Set(['model_reasoning_effort']);
19
20
  const BUNDLED_CODEX_ACP_VERSION = '1.1.7';
20
21
  const CODEX_ACP_PACKAGE = '@agentclientprotocol/codex-acp';
21
22
  const CODEX_PROXY_APPROVAL_ENV = 'OURS_FLEET_CODEX_APPROVAL';
@@ -119,6 +120,34 @@ function approvalPolicy(role) {
119
120
  throw new Error(`invalid harness_options.approval "${a}"; allowed: ${APPROVAL_POLICIES.join(', ')}`);
120
121
  return a;
121
122
  }
123
+ /** Native app-server policy comes only from Fleet's public permission contract. */
124
+ function neutralApprovalPolicy(role) {
125
+ if (role.permissions?.approval === 'allow')
126
+ return 'never';
127
+ if (role.permissions?.approval === 'ask')
128
+ return 'untrusted';
129
+ return 'on-request';
130
+ }
131
+ /** Native app-server sandbox comes only from Fleet's public filesystem contract. */
132
+ function neutralSandboxMode(role) {
133
+ if (role.permissions?.filesystem === 'read-only')
134
+ return 'read-only';
135
+ if (role.permissions?.filesystem === 'unrestricted')
136
+ return 'danger-full-access';
137
+ return 'workspace-write';
138
+ }
139
+ /** Native config is fail-closed because Codex adds authority-bearing keys over time. */
140
+ function isNativeConfigKeyAllowed(key) {
141
+ return NATIVE_CONFIG_ALLOWLIST.has(key);
142
+ }
143
+ /** Defense in depth for callers which launch a role after validation was bypassed. */
144
+ export function nativeCodexConfig(role) {
145
+ const options = role.harness_options;
146
+ if (!options?.config)
147
+ return undefined;
148
+ return Object.fromEntries(Object.entries(options.config)
149
+ .filter(([key]) => isNativeConfigKeyAllowed(key)));
150
+ }
122
151
  function launcherMode(role) {
123
152
  return role.harness_options?.launcher ?? 'auto';
124
153
  }
@@ -126,6 +155,36 @@ function bundledCodexAcp() {
126
155
  return resolveBundledAcpAgent(CODEX_ACP_PACKAGE, 'codex-acp', 'codex-acp');
127
156
  }
128
157
  function codexAgentLaunch(role, prep) {
158
+ if (role.session === 'codex-app-server') {
159
+ const configured = role.session_options?.codex_app_server?.command;
160
+ if (Array.isArray(configured))
161
+ return { argv: [...configured], env: prep.env };
162
+ if (typeof configured === 'string')
163
+ return { argv: ['sh', '-c', configured], env: prep.env };
164
+ const launcher = launcherMode(role);
165
+ const options = role.harness_options;
166
+ const flags = [
167
+ ...(options?.search ? ['--search'] : []),
168
+ 'app-server',
169
+ ];
170
+ // Preserve the established `auto` launcher contract without resolving PATH
171
+ // during synchronous launch preparation. The static shell fragment passes
172
+ // every dynamic value as an argv element and `exec`s the selected process.
173
+ if (launcher === 'auto')
174
+ return {
175
+ argv: [
176
+ 'sh', '-c',
177
+ 'if command -v ours-codex >/dev/null 2>&1; then exec ours-codex "$@"; else exec codex "$@"; fi',
178
+ 'ours-fleet-codex', ...flags,
179
+ ],
180
+ env: prep.env,
181
+ };
182
+ const command = launcher === 'ours-codex' ? 'ours-codex' : 'codex';
183
+ return {
184
+ argv: [command, ...flags],
185
+ env: prep.env,
186
+ };
187
+ }
129
188
  const configured = role.session_options?.acp?.command;
130
189
  const resolved = configured == null
131
190
  ? codexAcpLaunchForResolution(bundledCodexAcp())
@@ -247,7 +306,7 @@ function hasInstalledOursPlugin(output) {
247
306
  return false;
248
307
  }
249
308
  }
250
- export function makeCodexAdapter(exec = realExec, transport) {
309
+ export function makeCodexAdapter(exec = realExec, transport, nativeTransport) {
251
310
  return {
252
311
  id: 'codex',
253
312
  agentSession: new CodexAgentSessionAdapter({
@@ -274,10 +333,20 @@ export function makeCodexAdapter(exec = realExec, transport) {
274
333
  ? { adapterState: { permissionMetadataSource } } : {}),
275
334
  };
276
335
  },
336
+ sessionConfigSelections: role => [
337
+ ...(typeof role.model === 'string'
338
+ ? [{ configId: 'model', value: role.model }] : []),
339
+ ...(typeof role.effort === 'string'
340
+ ? [{ configId: 'reasoning_effort', value: role.effort }] : []),
341
+ ],
277
342
  permissionModeId: role => acpAgentMode(role),
278
343
  mcpServers: () => undefined,
279
344
  sessionMeta: () => undefined,
280
- }, transport),
345
+ approvalPolicy: neutralApprovalPolicy,
346
+ sandbox: neutralSandboxMode,
347
+ nativeConfig: nativeCodexConfig,
348
+ addDirs: role => role.harness_options?.add_dirs,
349
+ }, transport, nativeTransport),
281
350
  supportsResume: true,
282
351
  async checkPrereqs() {
283
352
  const [r, hasOursCodex, plugins] = await Promise.all([
@@ -313,7 +382,7 @@ export function makeCodexAdapter(exec = realExec, transport) {
313
382
  ],
314
383
  };
315
384
  },
316
- validateOptions(opts) {
385
+ validateOptions(opts, role) {
317
386
  if (opts == null)
318
387
  return [];
319
388
  if (typeof opts !== 'object' || Array.isArray(opts))
@@ -322,6 +391,28 @@ export function makeCodexAdapter(exec = realExec, transport) {
322
391
  .filter(k => !OPTION_KEYS.includes(k))
323
392
  .map(k => ({ path: `harness_options.${k}`, message: `unknown option; allowed: ${OPTION_KEYS.join(', ')}` }));
324
393
  const o = opts;
394
+ if (role?.session === 'codex-app-server') {
395
+ if (o.profile != null)
396
+ errs.push({
397
+ path: 'harness_options.profile',
398
+ message: 'is not accepted for codex-app-server; Codex rejects --profile for app-server',
399
+ });
400
+ if (o.approval != null)
401
+ errs.push({
402
+ path: 'harness_options.approval',
403
+ message: 'is not accepted for codex-app-server; use permissions.approval: ask|auto|allow',
404
+ });
405
+ if (o.permission_mode != null)
406
+ errs.push({
407
+ path: 'harness_options.permission_mode',
408
+ message: 'is not accepted for codex-app-server; use permissions.approval: ask|auto|allow',
409
+ });
410
+ if (o.sandbox != null)
411
+ errs.push({
412
+ path: 'harness_options.sandbox',
413
+ message: 'is not accepted for codex-app-server; use permissions.filesystem: read-only|workspace|unrestricted',
414
+ });
415
+ }
325
416
  if (o.launcher != null && !LAUNCHERS.includes(o.launcher))
326
417
  errs.push({ path: 'harness_options.launcher', message: `must be one of: ${LAUNCHERS.join(', ')}` });
327
418
  if (o.sandbox != null && !SANDBOX_MODES.includes(o.sandbox))
@@ -345,6 +436,13 @@ export function makeCodexAdapter(exec = realExec, transport) {
345
436
  errs.push({ path: 'harness_options.config', message: 'must be a map of Codex config keys to TOML scalar/array values' });
346
437
  else
347
438
  for (const [key, value] of Object.entries(o.config)) {
439
+ if (role?.session === 'codex-app-server' && !isNativeConfigKeyAllowed(key)) {
440
+ errs.push({
441
+ path: `harness_options.config.${key}`,
442
+ message: 'is not accepted for codex-app-server; only model_reasoning_effort is allowed',
443
+ });
444
+ continue;
445
+ }
348
446
  try {
349
447
  encodeTomlValue(value);
350
448
  }
@@ -388,7 +486,9 @@ export function makeCodexAdapter(exec = realExec, transport) {
388
486
  ],
389
487
  };
390
488
  },
391
- nativePermissionOverrides(options) {
489
+ nativePermissionOverrides(options, role) {
490
+ if (role?.session === 'codex-app-server')
491
+ return {};
392
492
  const o = options;
393
493
  const approval = o?.approval ?? o?.permission_mode; // permission_mode is the alias
394
494
  return {
@@ -416,6 +516,8 @@ export function makeCodexAdapter(exec = realExec, transport) {
416
516
  const translated = this.translatePermissions(role.permissions);
417
517
  if (!translated.supported)
418
518
  return translated;
519
+ if (role.session === 'codex-app-server')
520
+ return translated;
419
521
  const approval = approvalPolicy(role) ?? 'on-request';
420
522
  const sandbox = sandboxMode(role) ?? 'workspace-write';
421
523
  if (role.session === 'acp') {
@@ -440,11 +542,7 @@ export function makeCodexAdapter(exec = realExec, transport) {
440
542
  capabilities: codexCapabilities(actual.approval, actual.sandbox),
441
543
  };
442
544
  }
443
- return {
444
- ...translated,
445
- native: { approval, sandbox },
446
- capabilities: codexCapabilities(approval, sandbox),
447
- };
545
+ return translated;
448
546
  },
449
547
  effectivePermissionMode(role) {
450
548
  if (role.session === 'acp') {
@@ -457,10 +555,12 @@ export function makeCodexAdapter(exec = realExec, transport) {
457
555
  fleetMode: fleetModeForApproval(acpModePermissions(nativeMode).approval), nativeMode,
458
556
  };
459
557
  }
460
- const nativeMode = approvalPolicy(role) ?? 'untrusted';
558
+ const nativeMode = neutralApprovalPolicy(role);
461
559
  return { fleetMode: fleetModeForApproval(nativeMode), nativeMode };
462
560
  },
463
561
  inheritedPermissionMode(role) {
562
+ if (role.session === 'codex-app-server')
563
+ return fleetModeForApproval(neutralApprovalPolicy(role));
464
564
  return fleetModeForApproval(approvalPolicy(role) ?? 'untrusted');
465
565
  },
466
566
  vocabulary: {
@@ -145,7 +145,7 @@ export interface HarnessAdapter {
145
145
  * keyed the same way `translatePermissions().native` is, so the two can be
146
146
  * compared directly. Only keys the operator actually wrote appear.
147
147
  */
148
- nativePermissionOverrides(options: unknown): Record<string, unknown>;
148
+ nativePermissionOverrides(options: unknown, role?: ResolvedRole): Record<string, unknown>;
149
149
  /**
150
150
  * Host paths this harness needs inside a sandbox, split into a per-role
151
151
  * writable home and shared read-only credentials/config. Omit for a
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export { loadConfig, findRole, resolvePermissions, ConfigError } from './config.js';
2
2
  export type { FleetConfig, ResolvedRole, RoleConfig, OverseeEntry, SessionBackendId, CommonPermissions, FleetPermissionMode, ApprovalMode, SessionOptions, OwnerChannelConfig, } from './config.js';
3
3
  export type { HarnessAdapter, BriefingVocab, ExitPolicy, PrereqReport, PrereqCheck, SessionPrep, Launch, AcpLaunch, PermissionTranslation, RoleDirs, ValidationError, } from './harness/types.js';
4
- export type { AgentSession, SessionHandle, SessionSnapshot, SessionEvent, TurnResult, InterruptOutcome, InterruptResult, TurnCancellationSource, QueuedPrompt, ExitRecord, } from './session/types.js';
5
- export { interruptOutcome } from './session/types.js';
4
+ export type { AgentSession, SessionHandle, SessionSnapshot, SessionEvent, TurnResult, InterruptOutcome, InterruptResult, TurnCancellationSource, QueuedPrompt, ExitRecord, AgentSessionCapabilities, } from './session/types.js';
5
+ export { interruptOutcome, sessionBackendCapabilities } from './session/types.js';
6
6
  export { AcpSession } from './session/acp.js';
7
+ export { CodexAppServerSession } from './session/codex-app-server.js';
7
8
  export { OwnerChannel } from './owner-channel/channel.js';
8
9
  export { registerAdapter, getAdapter, knownAdapters } from './harness/registry.js';
9
10
  export { claudeCodeAdapter, makeClaudeCodeAdapter } from './harness/claude-code.js';
@@ -13,10 +14,10 @@ export { effectivePermissionMode } from './permissions.js';
13
14
  export { pickBackend } from './supervisor/index.js';
14
15
  export type { SupervisorBackend } from './supervisor/types.js';
15
16
  export { up, down, restartRoles, rmRole, applyRole } from './ops.js';
16
- export { spawnPermanent, spawnTemp, buildRoleConfig, profileValues, validateSpawnOpts, } from './spawn.js';
17
+ export { spawnPermanent, spawnTemp, agentDefinitionFromSpawn, validateSpawnOpts, } from './spawn.js';
17
18
  export { RoleRepository } from './application/role-repository.js';
18
19
  export { FleetQueryService } from './application/fleet-query-service.js';
19
- export { AcpRoleSessionAdapter } from './application/session-control.js';
20
+ export { RoleSessionControlAdapter, AcpRoleSessionAdapter, } from './application/session-control.js';
20
21
  export { RoleCreationService } from './application/role-creation-service.js';
21
22
  export { RoleCommandService, RoleLifecycleService } from './application/role-command-service.js';
22
23
  export { StructuredLogService } from './application/log-service.js';
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export { loadConfig, findRole, resolvePermissions, ConfigError } from './config.js';
2
- export { interruptOutcome } from './session/types.js';
2
+ export { interruptOutcome, sessionBackendCapabilities } from './session/types.js';
3
3
  export { AcpSession } from './session/acp.js';
4
+ export { CodexAppServerSession } from './session/codex-app-server.js';
4
5
  export { OwnerChannel } from './owner-channel/channel.js';
5
6
  export { registerAdapter, getAdapter, knownAdapters } from './harness/registry.js';
6
7
  export { claudeCodeAdapter, makeClaudeCodeAdapter } from './harness/claude-code.js';
@@ -9,10 +10,10 @@ export { generateBriefing } from './briefing.js';
9
10
  export { effectivePermissionMode } from './permissions.js';
10
11
  export { pickBackend } from './supervisor/index.js';
11
12
  export { up, down, restartRoles, rmRole, applyRole } from './ops.js';
12
- export { spawnPermanent, spawnTemp, buildRoleConfig, profileValues, validateSpawnOpts, } from './spawn.js';
13
+ export { spawnPermanent, spawnTemp, agentDefinitionFromSpawn, validateSpawnOpts, } from './spawn.js';
13
14
  export { RoleRepository } from './application/role-repository.js';
14
15
  export { FleetQueryService } from './application/fleet-query-service.js';
15
- export { AcpRoleSessionAdapter } from './application/session-control.js';
16
+ export { RoleSessionControlAdapter, AcpRoleSessionAdapter, } from './application/session-control.js';
16
17
  export { RoleCreationService } from './application/role-creation-service.js';
17
18
  export { RoleCommandService, RoleLifecycleService } from './application/role-command-service.js';
18
19
  export { StructuredLogService } from './application/log-service.js';
@@ -1 +1 @@
1
- export declare const INIT_COMPLETION_GUIDANCE = "\nNext:\n cp \"$(npm root -g)/@ours.network/fleet/examples/fleet.yaml\" ~/fleet.yaml\n cp -R \"$(npm root -g)/@ours.network/fleet/examples/fleet\" ~/fleet\n edit ~/fleet.yaml and ~/fleet/{agents,roles,brains}/*.yaml, then: ours-fleet up";
1
+ export declare const INIT_COMPLETION_GUIDANCE = "\nNext:\n ours-fleet config\n ours-fleet template list\n review the generated manifest and fleet/{agents,agent_templates,roles,brains,room_templates}/*.yaml\n configure rooms.owner, then create a task with --template single, pair, or team";
@@ -1,5 +1,6 @@
1
1
  export const INIT_COMPLETION_GUIDANCE = `
2
2
  Next:
3
- cp "$(npm root -g)/@ours.network/fleet/examples/fleet.yaml" ~/fleet.yaml
4
- cp -R "$(npm root -g)/@ours.network/fleet/examples/fleet" ~/fleet
5
- edit ~/fleet.yaml and ~/fleet/{agents,roles,brains}/*.yaml, then: ours-fleet up`;
3
+ ours-fleet config
4
+ ours-fleet template list
5
+ review the generated manifest and fleet/{agents,agent_templates,roles,brains,room_templates}/*.yaml
6
+ configure rooms.owner, then create a task with --template single, pair, or team`;
@@ -0,0 +1,98 @@
1
+ import type { Stats } from 'node:fs';
2
+ import type { ReadStream, WriteStream } from 'node:tty';
3
+ export type Subscription = 'codex' | 'claude';
4
+ export type WorkKind = 'development' | 'review' | 'coordination';
5
+ export type ReasoningPreference = 'quick' | 'balanced' | 'thorough';
6
+ export type AssignmentStrategy = 'one-model' | 'per-job';
7
+ export interface CatalogModel {
8
+ harness: 'codex' | 'claude-code';
9
+ session: 'acp';
10
+ model: string;
11
+ efforts: string[];
12
+ }
13
+ export interface InitAnswers {
14
+ subscriptions: Subscription[];
15
+ assignmentStrategy: AssignmentStrategy;
16
+ models: Record<WorkKind, CatalogModel>;
17
+ reasoning: ReasoningPreference;
18
+ }
19
+ export interface Choice<T> {
20
+ label: string;
21
+ value: T;
22
+ }
23
+ export interface InitPrompter {
24
+ confirm(message: string, detail: string): Promise<boolean | undefined>;
25
+ multiSelect<T>(message: string, choices: Choice<T>[]): Promise<T[] | undefined>;
26
+ select<T>(message: string, choices: Choice<T>[], initial?: number): Promise<T | undefined>;
27
+ note(message: string): void;
28
+ }
29
+ export interface BrainCatalog {
30
+ schema_version: number;
31
+ models: CatalogModel[];
32
+ }
33
+ export interface GeneratedSetup {
34
+ files: Map<string, string>;
35
+ answers: InitAnswers;
36
+ }
37
+ export interface InitPublishResult {
38
+ configPath: string;
39
+ splitRoot: string;
40
+ recoveryPath: string;
41
+ replacedExisting: boolean;
42
+ manifestExisted: boolean;
43
+ rootExisted: boolean;
44
+ }
45
+ export declare function validateCatalog(value: BrainCatalog, path?: string): BrainCatalog;
46
+ export declare function askInitQuestions(prompter: InitPrompter, configuration: string): Promise<InitAnswers | undefined>;
47
+ export declare function formatSetupSummary(answers: InitAnswers, configuration: string): string;
48
+ /** Build the exact, deterministic default experience without writing to disk. */
49
+ export declare function generateSetup(answers: InitAnswers): GeneratedSetup;
50
+ /** Run the mutation boundary only after the complete questionnaire is accepted. */
51
+ export declare function executeInitWizard(prompter: InitPrompter, configuration: string, deps: {
52
+ hostSetup(): Promise<void>;
53
+ publish(configuration: string, setup: GeneratedSetup): Promise<InitPublishResult>;
54
+ generate?(answers: InitAnswers): GeneratedSetup;
55
+ preflight?(configuration: string): InitPathState;
56
+ }): Promise<InitPublishResult | undefined>;
57
+ export interface InitPathInspectionDeps {
58
+ exists?(path: string): boolean;
59
+ lstat?(path: string): Stats;
60
+ stat?(path: string): Stats;
61
+ uid?(): number | undefined;
62
+ entries?(path: string): string[];
63
+ }
64
+ export interface InitPathState {
65
+ configPath: string;
66
+ splitRoot: string;
67
+ parent: string;
68
+ manifestExisted: boolean;
69
+ rootExisted: boolean;
70
+ }
71
+ /** Read-only safety gate. Run once before host setup and again under the init lock. */
72
+ export declare function preflightInitPaths(configuration: string, overrides?: InitPathInspectionDeps): InitPathState;
73
+ /** Replace the complete configuration under one lock, retaining a private recovery copy. */
74
+ export declare function publishSetup(configuration: string, setup: GeneratedSetup, hooks?: {
75
+ beforeArtifact?(entry: 'stage' | 'recovery'): void;
76
+ beforePublish?(entry: 'root' | 'manifest'): void;
77
+ }): Promise<InitPublishResult>;
78
+ type Key = 'up' | 'down' | 'space' | 'enter' | 'escape' | 'yes' | 'no' | 'other';
79
+ export declare function decodeKey(chunk: Buffer | string): Key;
80
+ export interface MultiSelectState {
81
+ cursor: number;
82
+ selected: boolean[];
83
+ }
84
+ export declare function updateMultiSelect(state: MultiSelectState, key: Key): MultiSelectState;
85
+ export declare class TerminalPrompter implements InitPrompter {
86
+ private readonly input;
87
+ private readonly output;
88
+ private readonly notes;
89
+ constructor(input: ReadStream, output: WriteStream);
90
+ note(message: string): void;
91
+ confirm(message: string, detail: string): Promise<boolean | undefined>;
92
+ multiSelect<T>(message: string, choices: Choice<T>[]): Promise<T[] | undefined>;
93
+ select<T>(message: string, choices: Choice<T>[], initial?: number): Promise<T | undefined>;
94
+ private render;
95
+ private key;
96
+ }
97
+ export declare const isInteractiveTerminal: (input: NodeJS.ReadStream, output: NodeJS.WriteStream) => boolean;
98
+ export {};