@ours.network/fleet 1.2.0-nightly.7 → 1.2.0-nightly.70
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.
- package/README.md +279 -68
- package/dist/account-origin.d.ts +2 -0
- package/dist/account-origin.js +6 -0
- package/dist/agent-ours/bridge.js +26 -9
- package/dist/agent-ours/correspondence.d.ts +10 -0
- package/dist/agent-ours/correspondence.js +1 -0
- package/dist/agent-ours/file-rpc.d.ts +12 -0
- package/dist/agent-ours/file-rpc.js +18 -4
- package/dist/agent-ours/harness.js +9 -1
- package/dist/agent-ours/mcp-endpoint.d.ts +19 -0
- package/dist/agent-ours/mcp-endpoint.js +98 -25
- package/dist/agent-ours/runtime.d.ts +9 -1
- package/dist/agent-ours/runtime.js +50 -2
- package/dist/agent-ours/service.d.ts +24 -1
- package/dist/agent-ours/service.js +97 -13
- package/dist/application/codex-models.d.ts +15 -0
- package/dist/application/codex-models.js +56 -0
- package/dist/application/conversation-history.d.ts +27 -0
- package/dist/application/conversation-history.js +215 -0
- package/dist/application/conversation-role-observer.d.ts +62 -0
- package/dist/application/conversation-role-observer.js +206 -0
- package/dist/application/fleet-query-service.d.ts +1 -1
- package/dist/application/fleet-query-service.js +2 -2
- package/dist/application/log-service.js +8 -8
- package/dist/application/model-catalog.d.ts +1 -1
- package/dist/application/model-catalog.js +5 -2
- package/dist/application/preset-provenance.d.ts +19 -0
- package/dist/application/preset-provenance.js +59 -0
- package/dist/application/role-creation-service.js +3 -2
- package/dist/application/role-removal-service.js +17 -3
- package/dist/application/role-repository.js +19 -2
- package/dist/application/room-layout-definitions.d.ts +45 -0
- package/dist/application/room-layout-definitions.js +130 -0
- package/dist/application/session-control.d.ts +61 -17
- package/dist/application/session-control.js +207 -23
- package/dist/application/supervisor-ours-tools.js +5 -11
- package/dist/application/task-layouts.d.ts +91 -0
- package/dist/application/task-layouts.js +259 -0
- package/dist/application/task-room-service.d.ts +99 -3
- package/dist/application/task-room-service.js +285 -32
- package/dist/application/types.d.ts +2 -0
- package/dist/atomic-file.d.ts +34 -1
- package/dist/atomic-file.js +161 -18
- package/dist/briefing.d.ts +3 -1
- package/dist/briefing.js +97 -31
- package/dist/build-info.json +9 -4
- package/dist/capabilities.d.ts +9 -1
- package/dist/capabilities.js +13 -0
- package/dist/cli.js +400 -37
- package/dist/client-profile.d.ts +5 -17
- package/dist/client-profile.js +4 -127
- package/dist/config.d.ts +45 -0
- package/dist/config.js +57 -6
- package/dist/creation.d.ts +1 -1
- package/dist/creation.js +4 -4
- package/dist/daemon-recovery.d.ts +1 -8
- package/dist/daemon-recovery.js +8 -113
- package/dist/docs.d.ts +1 -1
- package/dist/docs.js +207 -19
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +75 -60
- package/dist/erased-resources.d.ts +9 -0
- package/dist/erased-resources.js +87 -0
- package/dist/file-delivery/reader.d.ts +15 -0
- package/dist/file-delivery/reader.js +63 -0
- package/dist/file-delivery/store.d.ts +15 -0
- package/dist/file-delivery/store.js +124 -0
- package/dist/file-delivery/types.d.ts +19 -0
- package/dist/file-delivery/types.js +1 -0
- package/dist/fleet-command-audit.d.ts +7 -0
- package/dist/fleet-command-audit.js +24 -8
- package/dist/harness/agent-session.d.ts +4 -0
- package/dist/harness/claude-code-session.js +1 -1
- package/dist/harness/claude-code.js +21 -11
- package/dist/harness/claude-runtime.d.ts +12 -0
- package/dist/harness/claude-runtime.js +43 -0
- package/dist/harness/codex-app-server-proxy.d.ts +4 -1
- package/dist/harness/codex-app-server-proxy.js +41 -5
- package/dist/harness/codex-reasoning.d.ts +5 -0
- package/dist/harness/codex-reasoning.js +12 -0
- package/dist/harness/codex-runtime.d.ts +11 -1
- package/dist/harness/codex-runtime.js +31 -4
- package/dist/harness/codex-session.js +2 -2
- package/dist/harness/codex.js +24 -12
- package/dist/init-wizard.d.ts +2 -0
- package/dist/init-wizard.js +38 -19
- package/dist/isolation/policy.js +6 -1
- package/dist/isolation/types.d.ts +5 -0
- package/dist/managed-cli.d.ts +253 -0
- package/dist/managed-cli.js +923 -0
- package/dist/managed-recovery.d.ts +13 -0
- package/dist/managed-recovery.js +31 -0
- package/dist/minimal-setup.d.ts +2 -0
- package/dist/minimal-setup.js +44 -0
- package/dist/monitor.d.ts +8 -34
- package/dist/monitor.js +89 -152
- package/dist/notifications/fleet-producer.d.ts +19 -0
- package/dist/notifications/fleet-producer.js +208 -0
- package/dist/notifications/outbox.d.ts +46 -0
- package/dist/notifications/outbox.js +158 -0
- package/dist/notifications/target-cleanup.d.ts +10 -0
- package/dist/notifications/target-cleanup.js +63 -0
- package/dist/notifications/task-producer.d.ts +18 -0
- package/dist/notifications/task-producer.js +67 -0
- package/dist/ops.d.ts +2 -0
- package/dist/ops.js +20 -3
- package/dist/owner-channel/channel.js +17 -6
- package/dist/owner-channel/commands.d.ts +4 -0
- package/dist/owner-channel/commands.js +8 -0
- package/dist/owner-channel/lifecycle-outbox.js +4 -3
- package/dist/owner-channel/ours-client.js +2 -17
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +2 -0
- package/dist/preset-migration.js +43 -0
- package/dist/process-incarnation.d.ts +23 -0
- package/dist/process-incarnation.js +42 -0
- package/dist/reminders/manager.d.ts +75 -0
- package/dist/reminders/manager.js +278 -0
- package/dist/reminders/runtime.d.ts +27 -0
- package/dist/reminders/runtime.js +32 -0
- package/dist/reminders/schedule.d.ts +37 -0
- package/dist/reminders/schedule.js +104 -0
- package/dist/reminders/store.d.ts +341 -0
- package/dist/reminders/store.js +762 -0
- package/dist/reminders/tools.d.ts +20 -0
- package/dist/reminders/tools.js +114 -0
- package/dist/resolved-plan.js +1 -0
- package/dist/rooms-tasks/add-member.d.ts +48 -0
- package/dist/rooms-tasks/add-member.js +83 -0
- package/dist/rooms-tasks/archived-absence.d.ts +8 -0
- package/dist/rooms-tasks/archived-absence.js +48 -0
- package/dist/rooms-tasks/cli.js +65 -5
- package/dist/rooms-tasks/close.d.ts +6 -2
- package/dist/rooms-tasks/close.js +246 -37
- package/dist/rooms-tasks/config.d.ts +1 -1
- package/dist/rooms-tasks/config.js +11 -4
- package/dist/rooms-tasks/cowork-adapter.d.ts +12 -5
- package/dist/rooms-tasks/cowork-adapter.js +15 -121
- package/dist/rooms-tasks/cowork-http.js +56 -6
- package/dist/rooms-tasks/deletion.d.ts +1 -1
- package/dist/rooms-tasks/deletion.js +84 -5
- package/dist/rooms-tasks/erasure.d.ts +6 -0
- package/dist/rooms-tasks/erasure.js +173 -0
- package/dist/rooms-tasks/external-worker.d.ts +1 -1
- package/dist/rooms-tasks/external-worker.js +3 -4
- package/dist/rooms-tasks/layout-binding-client.d.ts +11 -0
- package/dist/rooms-tasks/layout-binding-client.js +56 -0
- package/dist/rooms-tasks/layout-binding-grants.d.ts +21 -0
- package/dist/rooms-tasks/layout-binding-grants.js +128 -0
- package/dist/rooms-tasks/layout-cli.d.ts +4 -0
- package/dist/rooms-tasks/layout-cli.js +107 -0
- package/dist/rooms-tasks/layout-config.d.ts +11 -0
- package/dist/rooms-tasks/layout-config.js +89 -0
- package/dist/rooms-tasks/layout-control.d.ts +21 -0
- package/dist/rooms-tasks/layout-control.js +52 -0
- package/dist/rooms-tasks/layout-member-retirement.d.ts +10 -0
- package/dist/rooms-tasks/layout-member-retirement.js +90 -0
- package/dist/rooms-tasks/layout-service.d.ts +43 -0
- package/dist/rooms-tasks/layout-service.js +203 -0
- package/dist/rooms-tasks/layout.d.ts +121 -0
- package/dist/rooms-tasks/layout.js +285 -0
- package/dist/rooms-tasks/legacy-task-member.d.ts +19 -0
- package/dist/rooms-tasks/legacy-task-member.js +116 -0
- package/dist/rooms-tasks/live-readiness.d.ts +18 -0
- package/dist/rooms-tasks/live-readiness.js +85 -0
- package/dist/rooms-tasks/member-ownership.d.ts +5 -0
- package/dist/rooms-tasks/member-ownership.js +40 -0
- package/dist/rooms-tasks/member-startup.d.ts +1 -0
- package/dist/rooms-tasks/member-startup.js +2 -0
- package/dist/rooms-tasks/provision.d.ts +3 -0
- package/dist/rooms-tasks/provision.js +101 -49
- package/dist/rooms-tasks/recovery.d.ts +19 -0
- package/dist/rooms-tasks/recovery.js +110 -0
- package/dist/rooms-tasks/room-state.d.ts +4 -2
- package/dist/rooms-tasks/room-state.js +47 -8
- package/dist/rooms-tasks/task-service-retirement.d.ts +11 -0
- package/dist/rooms-tasks/task-service-retirement.js +21 -0
- package/dist/rooms-tasks/task-state.d.ts +51 -8
- package/dist/rooms-tasks/task-state.js +245 -25
- package/dist/rooms-tasks/types.d.ts +40 -0
- package/dist/rooms-tasks/workspace-artifacts.d.ts +6 -0
- package/dist/rooms-tasks/workspace-artifacts.js +93 -0
- package/dist/rooms-tasks/workspace.d.ts +35 -0
- package/dist/rooms-tasks/workspace.js +325 -0
- package/dist/runner.d.ts +33 -4
- package/dist/runner.js +389 -56
- package/dist/session/acp.d.ts +75 -2
- package/dist/session/acp.js +345 -82
- package/dist/session/arbiter.d.ts +98 -0
- package/dist/session/arbiter.js +272 -3
- package/dist/session/codex-app-server.d.ts +45 -1
- package/dist/session/codex-app-server.js +225 -32
- package/dist/session/control.d.ts +17 -3
- package/dist/session/control.js +213 -23
- package/dist/session/conversation-normalizer.d.ts +2 -1
- package/dist/session/conversation-normalizer.js +1 -1
- package/dist/session/conversation-observation.d.ts +25 -0
- package/dist/session/conversation-observation.js +100 -0
- package/dist/session/conversation-replay.d.ts +50 -0
- package/dist/session/conversation-replay.js +203 -0
- package/dist/session/conversation-store.d.ts +15 -1
- package/dist/session/conversation-store.js +206 -26
- package/dist/session/conversation-types.d.ts +57 -4
- package/dist/session/prompt-batch.d.ts +79 -0
- package/dist/session/prompt-batch.js +120 -0
- package/dist/session/task-notice.d.ts +14 -0
- package/dist/session/task-notice.js +13 -0
- package/dist/session/types.d.ts +42 -1
- package/dist/setup-tunnel-preflight.d.ts +34 -0
- package/dist/setup-tunnel-preflight.js +62 -0
- package/dist/socket-path.d.ts +2 -0
- package/dist/socket-path.js +22 -0
- package/dist/spawn.d.ts +5 -1
- package/dist/spawn.js +40 -4
- package/dist/startup-prompt.d.ts +15 -0
- package/dist/startup-prompt.js +71 -0
- package/dist/startup-readiness.d.ts +32 -0
- package/dist/startup-readiness.js +101 -0
- package/dist/startup-telemetry.d.ts +16 -0
- package/dist/startup-telemetry.js +46 -0
- package/dist/subscriptions/cli.d.ts +91 -0
- package/dist/subscriptions/cli.js +223 -0
- package/dist/subscriptions/launch.d.ts +37 -0
- package/dist/subscriptions/launch.js +93 -0
- package/dist/subscriptions/login.d.ts +76 -0
- package/dist/subscriptions/login.js +207 -0
- package/dist/subscriptions/observed.d.ts +7 -0
- package/dist/subscriptions/observed.js +44 -0
- package/dist/subscriptions/probe.d.ts +10 -0
- package/dist/subscriptions/probe.js +73 -0
- package/dist/subscriptions/service.d.ts +102 -0
- package/dist/subscriptions/service.js +364 -0
- package/dist/subscriptions/store.d.ts +71 -0
- package/dist/subscriptions/store.js +140 -0
- package/dist/supervisor/adoption.d.ts +8 -0
- package/dist/supervisor/adoption.js +78 -0
- package/dist/supervisor/catalog.d.ts +62 -0
- package/dist/supervisor/catalog.js +254 -0
- package/dist/supervisor/fleet.d.ts +8 -0
- package/dist/supervisor/fleet.js +89 -0
- package/dist/supervisor/index.js +3 -6
- package/dist/supervisor/launchd.d.ts +1 -1
- package/dist/supervisor/launchd.js +26 -13
- package/dist/supervisor/legacy.d.ts +35 -0
- package/dist/supervisor/legacy.js +524 -0
- package/dist/supervisor/manager.d.ts +15 -0
- package/dist/supervisor/manager.js +270 -0
- package/dist/supervisor/registration-refresh.d.ts +45 -0
- package/dist/supervisor/registration-refresh.js +266 -0
- package/dist/supervisor/scope.d.ts +4 -0
- package/dist/supervisor/scope.js +10 -0
- package/dist/supervisor/systemd.d.ts +2 -2
- package/dist/supervisor/systemd.js +19 -33
- package/dist/task-supervision.d.ts +9 -0
- package/dist/task-supervision.js +145 -0
- package/dist/temp-idle.d.ts +17 -0
- package/dist/temp-idle.js +42 -0
- package/dist/temp-lifecycle.d.ts +23 -8
- package/dist/temp-lifecycle.js +123 -66
- package/dist/temp-supervisor-recovery.d.ts +1 -1
- package/dist/temp-supervisor-recovery.js +2 -2
- package/dist/tunnel-setup-completion.d.ts +7 -0
- package/dist/tunnel-setup-completion.js +13 -0
- package/dist/tunnel-setup-input.d.ts +19 -0
- package/dist/tunnel-setup-input.js +124 -0
- package/dist/web/agent-attachments.d.ts +29 -0
- package/dist/web/agent-attachments.js +162 -0
- package/dist/web/auth.d.ts +65 -2
- package/dist/web/auth.js +201 -11
- package/dist/web/available-port.d.ts +2 -0
- package/dist/web/available-port.js +23 -0
- package/dist/web/control.d.ts +3 -3
- package/dist/web/control.js +10 -8
- package/dist/web/conversation-stream-codec.d.ts +23 -0
- package/dist/web/conversation-stream-codec.js +110 -0
- package/dist/web/conversation-stream.d.ts +25 -0
- package/dist/web/conversation-stream.js +231 -0
- package/dist/web/fleet-config-service.d.ts +4 -1
- package/dist/web/fleet-config-service.js +46 -15
- package/dist/web/prefix-gateway.d.ts +32 -0
- package/dist/web/prefix-gateway.js +238 -0
- package/dist/web/runtime.d.ts +3 -1
- package/dist/web/runtime.js +128 -33
- package/dist/web/server.d.ts +16 -0
- package/dist/web/server.js +639 -55
- package/dist/web/service.d.ts +11 -2
- package/dist/web/service.js +30 -4
- package/dist/web/workspace-devices.d.ts +107 -0
- package/dist/web/workspace-devices.js +277 -0
- package/dist/web/workspace-tunnel.d.ts +1 -0
- package/dist/web/workspace-tunnel.js +34 -0
- package/dist/workspace-enrollment.d.ts +83 -0
- package/dist/workspace-enrollment.js +580 -0
- package/dist/workspace-replacement.d.ts +66 -0
- package/dist/workspace-replacement.js +220 -0
- package/docs/acp-files.md +146 -0
- package/docs/conversation-stream.md +190 -0
- package/docs/fleet-migration.md +54 -0
- package/docs/live-voice.md +13 -0
- package/docs/room-layouts.md +227 -0
- package/docs/self-reminders.md +374 -0
- package/docs/task-workspaces.md +225 -0
- package/docs/validation/managed-cli-permissions.md +421 -0
- package/examples/room-layouts/fresh.yaml +27 -0
- package/examples/room-layouts/scoped.yaml +21 -0
- package/examples/room-layouts/shared.yaml +19 -0
- package/package.json +24 -20
- package/presets/README.md +78 -0
- package/presets/brain-catalog.json +8 -2
- package/presets/fleet/agent_templates/Critic.yaml +1 -1
- package/presets/fleet/agent_templates/Developer.yaml +1 -1
- package/presets/fleet/agent_templates/Engineer.yaml +5 -0
- package/presets/fleet/agent_templates/LocalCoordinator.yaml +4 -2
- package/presets/fleet/agents/FleetCoordinator.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-1-high.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-low.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-max.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-medium.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-xhigh.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-high.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-low.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-max.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-medium.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/claude-haiku-4-5-20251001-default.yaml +4 -0
- package/presets/fleet/brains/claude-opus-5-5-high.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-low.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-max.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-medium.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-xhigh.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-high.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-low.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-max.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-medium.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-high.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-low.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-max.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-medium.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-ultra.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-ultra.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-1-sol-high.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-low.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-max.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-medium.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-ultra.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-xhigh.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-astra-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-ultra.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-luna-high.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-low.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-max.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-medium.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-xhigh.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-high.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-low.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-max.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-medium.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-ultra.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-xhigh.yaml +5 -0
- package/presets/fleet/roles/Coordinator.yaml +12 -11
- package/presets/fleet/roles/Critic.yaml +13 -0
- package/presets/fleet/roles/Developer.yaml +13 -0
- package/presets/fleet/roles/Engineer.yaml +53 -0
- package/presets/fleet/room_layouts/engineering.yaml +25 -0
- package/presets/fleet/room_layouts/pair.yaml +24 -0
- package/presets/fleet/room_layouts/single.yaml +17 -0
- package/presets/fleet/room_layouts/team.yaml +30 -0
- package/presets/fleet/room_templates/engineering.yaml +19 -0
- package/presets/manifest.json +2 -2
- package/dist/web-app/assets/index-59GF-gsZ.css +0 -1
- package/dist/web-app/assets/index-C0h3ALvs.js +0 -10
- package/dist/web-app/icons/ours-fleet-maskable.svg +0 -4
- package/dist/web-app/icons/ours-fleet.svg +0 -4
- package/dist/web-app/index.html +0 -17
- package/dist/web-app/manifest.webmanifest +0 -15
- package/dist/web-app/offline.html +0 -18
- package/dist/web-app/sw.js +0 -51
package/README.md
CHANGED
|
@@ -10,8 +10,9 @@ turns such sessions into **roles**: long-lived agents that
|
|
|
10
10
|
|
|
11
11
|
- **run through structured managed sessions** behind one provider-neutral
|
|
12
12
|
agent-session interface, which you can inspect or prompt,
|
|
13
|
-
- are **supervised** — systemd (Linux) or
|
|
14
|
-
|
|
13
|
+
- are **supervised** — one Fleet systemd service (Linux) or LaunchAgent (macOS)
|
|
14
|
+
runs their existing agent runners, restarts them on crash, and restores the
|
|
15
|
+
desired running roster at boot or login,
|
|
15
16
|
- **resume their context** across restarts (when the harness supports it),
|
|
16
17
|
- **bind an ours.network identity**, so you — and every other agent — can message
|
|
17
18
|
them by name over an end-to-end-encrypted channel
|
|
@@ -44,11 +45,11 @@ brain: { inline: { harness: codex, session: codex-app-server } }
|
|
|
44
45
|
|
|
45
46
|
```
|
|
46
47
|
~/fleet.yaml + ~/fleet/{agents,agent_templates,roles,brains,room_templates}/*.yaml your declaration
|
|
47
|
-
│ ours-fleet up
|
|
48
|
+
│ ours-fleet init, then up
|
|
48
49
|
▼
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
one Fleet OS service ──► private member catalog + existing agent runners
|
|
51
|
+
│
|
|
52
|
+
briefing.md per member ──► session adapter ──► native app-server or ACP transport
|
|
52
53
|
```
|
|
53
54
|
|
|
54
55
|
Each role gets a state dir (`~/.ours-fleet/agents/<Name>/`) holding its briefing,
|
|
@@ -62,9 +63,9 @@ The state dir contract:
|
|
|
62
63
|
|
|
63
64
|
| File | Owner | Lifecycle |
|
|
64
65
|
|---|---|---|
|
|
65
|
-
| `briefing.md` | generated | rewritten on every `up`/`restart`; never hand-edit |
|
|
66
|
-
| `WORKLOG.md` | the agent | seeded empty, agent-appended; survives restarts |
|
|
67
|
-
| `ROUTINES.md` | operator / agent | **optional** recurring-work instructions;
|
|
66
|
+
| `briefing.md` | generated | rewritten on every `up`/`restart`; never hand-edit; the agent reads it once per model session, not per turn or wake |
|
|
67
|
+
| `WORKLOG.md` | the agent | seeded empty, agent-appended; survives restarts; read back once only when a new conversation starts after a restart and it records previous work |
|
|
68
|
+
| `ROUTINES.md` | operator / agent | **optional** recurring-work instructions; read once per session for concrete work, hot-editable **without a restart** — tell the agent it changed so it rereads; absence means "no routines" |
|
|
68
69
|
| `.identity`, `.cwd`, `.session-id`, `.booted`, `.exit-status`, `.config-path` | supervisor | dot-marker state — session resume and boot bookkeeping |
|
|
69
70
|
| `.monitor-state.json`, `.monitor-status` | supervisor monitor | atomic body-free cursor/pending state and health |
|
|
70
71
|
| `.owner-channel-state.json` | owner-channel bridge | bounded wire-ID dedupe only; never message/reply plaintext |
|
|
@@ -79,11 +80,12 @@ The state dir contract:
|
|
|
79
80
|
|---|---|---|
|
|
80
81
|
| Node ≥ 22 | runs `ours-fleet` and its maintained adapters | nodejs.org, `apt`, or `brew` |
|
|
81
82
|
| a harness CLI, logged in | the agent itself | e.g. Claude Code (`claude`) or Codex CLI (`codex`) |
|
|
82
|
-
| `ours` CLI + shared daemon | identity + agent-to-agent messaging | `
|
|
83
|
+
| `ours` CLI + shared daemon | identity + agent-to-agent messaging | `ours-install client --config /absolute/private/profile.json --integrations fleet --fleet-settings /absolute/fleet-settings.json` |
|
|
83
84
|
|
|
84
|
-
Linux only: `ours-fleet init` enables *linger* so
|
|
85
|
-
and
|
|
86
|
-
equivalent)
|
|
85
|
+
Linux only: `ours-fleet init` enables *linger* so Fleet runs without a login session
|
|
86
|
+
and restores running members after reboot. On macOS the Fleet LaunchAgent starts
|
|
87
|
+
**at login** (no linger equivalent). Member logs live in each member's state
|
|
88
|
+
directory; use `ours-fleet logs <Name>` to read them.
|
|
87
89
|
|
|
88
90
|
## Install
|
|
89
91
|
|
|
@@ -103,6 +105,12 @@ maintained adapters require Node 22 or newer.
|
|
|
103
105
|
Each OS user manages their own fleet — to host roles under a sandboxed account,
|
|
104
106
|
become that account and repeat.
|
|
105
107
|
|
|
108
|
+
When upgrading from per-agent services, coordinate package installation with
|
|
109
|
+
explicit `ours-fleet init`. Preserve operator readiness hooks on the common
|
|
110
|
+
parent before migration; new task/temporary creation requires that parent.
|
|
111
|
+
See the [migration and rollback runbook](docs/fleet-migration.md)
|
|
112
|
+
for changed stop/restart behaviour and legacy task transfer limits.
|
|
113
|
+
|
|
106
114
|
## Quickstart
|
|
107
115
|
|
|
108
116
|
```sh
|
|
@@ -139,72 +147,60 @@ the caller's owner channel with the caller and spawned-role details. This is an
|
|
|
139
147
|
honest-actor convenience and attribution path, not a security boundary; host
|
|
140
148
|
shells and deliberately bypassed absolute binaries retain direct behavior.
|
|
141
149
|
|
|
142
|
-
## Local
|
|
150
|
+
## Local HTTP service
|
|
143
151
|
|
|
144
|
-
|
|
145
|
-
|
|
152
|
+
Fleet is an HTTP backend. It serves no pages, bundles no frontend and opens no
|
|
153
|
+
browser: every screen belongs to the App, which calls this API with a device
|
|
154
|
+
credential. Any address outside `/api/` answers JSON `404`.
|
|
146
155
|
|
|
147
156
|
```sh
|
|
148
|
-
|
|
149
|
-
ours-fleet
|
|
157
|
+
ours-fleet setup-tunnel <encoded-v2-grant> # App command; prints QR and connection code
|
|
158
|
+
ours-fleet link-device # connect another browser or device
|
|
150
159
|
# choose a free port for an isolated test:
|
|
151
|
-
ours-fleet web serve --port 0
|
|
152
|
-
# nginx/TLS terminates at the declared
|
|
160
|
+
ours-fleet web serve --port 0
|
|
161
|
+
# nginx/TLS terminates at the declared origin; fleet remains loopback-bound
|
|
153
162
|
ours-fleet web install --public-origin https://fleet.example.com --password-file /secure/fleet-password
|
|
154
|
-
# Intentional no-password mode, for example when nginx already authenticates:
|
|
155
|
-
ours-fleet web install --public-origin https://fleet.example.com --no-password
|
|
156
163
|
```
|
|
157
164
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
+
`ours-fleet web` installs or updates an owner-level native service and starts
|
|
166
|
+
it on stable `127.0.0.1:49271`. Linux uses a systemd user unit and macOS uses a
|
|
167
|
+
LaunchAgent; both restart after process failures and send logs to the native
|
|
168
|
+
supervisor. Service management is explicit through
|
|
169
|
+
`ours-fleet web install|start|stop|restart|status|uninstall`. Use
|
|
170
|
+
`ours-fleet web serve` for a foreground development process. `--no-open` is
|
|
171
|
+
still accepted because installed service units pass it; it has no effect. Linux
|
|
172
|
+
login persistence requires linger; the installer reports when it is missing but
|
|
165
173
|
never enables it or requests root privileges.
|
|
166
174
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
atomic file). The re-pair and revoke controls use an owner-private Unix socket;
|
|
179
|
-
local processes running as the same OS user are therefore inside the trust
|
|
180
|
-
boundary.
|
|
175
|
+
Use `ours-fleet web revoke-all` to revoke every linked device and active
|
|
176
|
+
session. Only a domain-separated SHA-256 device-secret hash and bounded
|
|
177
|
+
timestamps are stored in the owner-private fleet state directory (`0700`
|
|
178
|
+
directory, `0600` atomic file). App browser links use 5-minute access
|
|
179
|
+
credentials and rotating refresh credentials; see
|
|
180
|
+
[workspace onboarding](docs/workspace-onboarding.md#browser-link-credentials). The link and revoke controls use an
|
|
181
|
+
owner-private Unix socket; local processes running as the same OS user are
|
|
182
|
+
therefore inside the trust boundary.
|
|
183
|
+
|
|
184
|
+
The read-only [conversation event stream](docs/conversation-stream.md) documents
|
|
185
|
+
authentication deadlines, replay coverage, bounded framing and filesystem support.
|
|
181
186
|
|
|
182
187
|
On first setup, the CLI requires an explicit access choice: `--password-file`
|
|
183
188
|
or `--pairing` for protected access, or `--no-password` for intentional
|
|
184
189
|
unprotected access. `--password-file` stores only a salted scrypt verifier in
|
|
185
|
-
the owner-private web state; the source file remains operator-managed.
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
who can reach that origin can control the fleet.
|
|
190
|
+
the owner-private web state; the source file remains operator-managed.
|
|
191
|
+
`--no-password` is deliberately named and prints a warning: anyone who can
|
|
192
|
+
reach that origin can control the fleet.
|
|
189
193
|
|
|
190
194
|
For nginx on a VPS, keep the default loopback bind and set the exact external
|
|
191
195
|
`--public-origin` (scheme, hostname, optional port). nginx should proxy HTTP and
|
|
192
196
|
WebSocket upgrades to `127.0.0.1:49271` and provide TLS; rewriting the upstream
|
|
193
|
-
Host is not required because the declared
|
|
197
|
+
Host is not required because the declared Origin remains authoritative. To listen beyond
|
|
194
198
|
loopback, add an explicit `--bind`; fleet refuses a non-loopback bind without a
|
|
195
199
|
public origin. Host and Origin validation use that declaration rather than
|
|
196
200
|
trusting forwarded headers. `localhost` and `127.0.0.1` both work in normal
|
|
197
|
-
local mode; an unconfigured hostname
|
|
198
|
-
of raw internal Host-header JSON.
|
|
201
|
+
local mode; an unconfigured hostname is refused with a JSON error.
|
|
199
202
|
|
|
200
|
-
The
|
|
201
|
-
the data-free offline page and successful content-hashed JavaScript/CSS assets.
|
|
202
|
-
HTML stays network-first and no API, authentication, bootstrap, device,
|
|
203
|
-
WebSocket, terminal, event, audit, log, session, query-bearing, or error response
|
|
204
|
-
is cached. When the local daemon is unavailable, the PWA shows an explicit
|
|
205
|
-
offline shell and no stale fleet state.
|
|
206
|
-
|
|
207
|
-
The console provides evidence-separated inventory and status, ACP activity and
|
|
203
|
+
The API provides evidence-separated inventory and status, ACP activity and
|
|
208
204
|
permission controls, redacted logs, typed text send, confirmed lifecycle
|
|
209
205
|
actions, and transactional permanent/temporary creation. Identity is fixed to
|
|
210
206
|
the role name. Creation uses the authenticated
|
|
@@ -303,10 +299,56 @@ ours-fleet loops reload <Role>
|
|
|
303
299
|
ours-fleet loops run-now|disable|enable <Role> <Loop>
|
|
304
300
|
ours-fleet rm <Name>
|
|
305
301
|
ours-fleet doctor [--harness H]
|
|
302
|
+
ours-fleet service check|refresh [--json] service definitions vs this release (refresh never starts or restarts)
|
|
303
|
+
ours-fleet managed-cli setup [--enable <Agent>]... | status [--json] native harness policy for the task workflow
|
|
306
304
|
ours-fleet version [--json] build identity, capabilities, installs on PATH
|
|
307
305
|
ours-fleet init
|
|
308
306
|
```
|
|
309
307
|
|
|
308
|
+
### Fleet task commands from a harness command sandbox
|
|
309
|
+
|
|
310
|
+
A Codex or Claude command sandbox refuses the supervisor socket, so a managed
|
|
311
|
+
`ours-fleet` call fails with `connect EPERM` before it parses anything. Fleet
|
|
312
|
+
prepares the native harness policy for the packaged Coordinator task workflow;
|
|
313
|
+
you do not write Codex rules or Claude sandbox settings by hand:
|
|
314
|
+
|
|
315
|
+
```sh
|
|
316
|
+
ours-fleet managed-cli setup --enable FleetCoordinator # adds managed_cli: [task-workflow] to that Agent
|
|
317
|
+
ours-fleet managed-cli status # static setup, session policy, observed commands
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
The opt-in is an explicit Agent key and changes no permission. Setup starts no
|
|
321
|
+
session or model, is repeated at every agent start, and `ours-install` runs it
|
|
322
|
+
for you. It prepares `task create|start|finish|block|unblock|review|list|show`,
|
|
323
|
+
`room show|members` and template/plan/help inspection for one pinned
|
|
324
|
+
configuration, and nothing else; `task start`/`task finish` are real authority.
|
|
325
|
+
Qualified end to end on Linux with Codex (native and ACP) and Claude ACP; macOS
|
|
326
|
+
is prepared the same way but not yet qualified. Scope, boundaries, unsupported
|
|
327
|
+
combinations and the evidence are in
|
|
328
|
+
[docs/validation/managed-cli-permissions.md](docs/validation/managed-cli-permissions.md).
|
|
329
|
+
|
|
330
|
+
### Service definitions after an update
|
|
331
|
+
|
|
332
|
+
`ours-fleet init`, `web install` and the watchdog installer write user service
|
|
333
|
+
definitions (systemd units on Linux, LaunchAgents on macOS) that start the exact
|
|
334
|
+
release tree they were written from. An update installs a new tree, but a running
|
|
335
|
+
service keeps its code, and an unrefreshed definition starts the previous release
|
|
336
|
+
again after the next reboot while agents and the CLI use the new one.
|
|
337
|
+
|
|
338
|
+
```sh
|
|
339
|
+
ours-fleet service check # read-only; exit 1 when a definition or running service uses another release
|
|
340
|
+
ours-fleet service refresh # re-point existing definitions at this release
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
`refresh` changes only the release paths in definitions Fleet generated. It keeps
|
|
344
|
+
environment, profile, ports and drop-ins, runs `daemon-reload`, and never creates,
|
|
345
|
+
enables, starts, stops or restarts a service. Definitions that Fleet did not
|
|
346
|
+
generate, or whose `ExecStart` a drop-in overrides, are reported and left alone.
|
|
347
|
+
A running supervisor still uses its old code until you restart it
|
|
348
|
+
(`systemctl --user restart ours-fleet.service`); its agents resume through it.
|
|
349
|
+
`ours-install` runs `refresh` after updating Fleet, and `doctor` shows the same
|
|
350
|
+
rows as `check`.
|
|
351
|
+
|
|
310
352
|
### Which build am I running?
|
|
311
353
|
|
|
312
354
|
`--version` prints a semver, and a semver does not identify an artifact: version
|
|
@@ -325,9 +367,9 @@ Installs predating the stamp are compared by hashing their `dist/`, so two of
|
|
|
325
367
|
those are still told apart.
|
|
326
368
|
|
|
327
369
|
A permanent role brought up via `-c custom.yaml` remembers that file (`.config-path`
|
|
328
|
-
in its state dir) across supervisor-triggered
|
|
329
|
-
|
|
330
|
-
the default `~/fleet.yaml
|
|
370
|
+
in its state dir and its private member registration) across supervisor-triggered
|
|
371
|
+
restarts. Its runner resolves that original configuration instead of falling back
|
|
372
|
+
to the default `~/fleet.yaml`.
|
|
331
373
|
|
|
332
374
|
## split configuration field reference
|
|
333
375
|
|
|
@@ -376,9 +418,9 @@ preserve at most one recent late occurrence. The trusted authoring file and
|
|
|
376
418
|
private sealed role snapshot retain exact prompt text; resolved launch, task,
|
|
377
419
|
room, provenance, and audit presentation surfaces show only bytes and SHA-256.
|
|
378
420
|
|
|
379
|
-
Every packaged `Developer`, `Critic`, and `LocalCoordinator` Agent Template uses
|
|
421
|
+
Every packaged `Developer`, `Engineer`, `Critic`, and `LocalCoordinator` Agent Template uses
|
|
380
422
|
`monitor.mode: fleet` with `monitor.interrupt: after_tool`. Consequently every
|
|
381
|
-
member of the standard `single`, `pair`, and `
|
|
423
|
+
member of the standard `single`, `pair`, `team`, and `engineering` Room Templates resolves to
|
|
382
424
|
that policy. A custom Agent Template or explicit per-member override remains
|
|
383
425
|
authoritative and is merged key by key without rewriting unrelated values.
|
|
384
426
|
|
|
@@ -524,7 +566,7 @@ ours-fleet up
|
|
|
524
566
|
|
|
525
567
|
### Rooms and tasks
|
|
526
568
|
|
|
527
|
-
Init installs editable `single`, `pair`, and `
|
|
569
|
+
Init installs editable `single`, `pair`, `team`, and `engineering` definitions under
|
|
528
570
|
`~/fleet/room_templates/`, plus every exact-cased Agent, Role, and Brain they
|
|
529
571
|
reference. Inspect them with `ours-fleet template list` and
|
|
530
572
|
`ours-fleet template show team`. After configuring the authenticated owner below:
|
|
@@ -533,8 +575,25 @@ reference. Inspect them with `ours-fleet template list` and
|
|
|
533
575
|
ours-fleet task create --title "Solo task" --template single
|
|
534
576
|
ours-fleet task create --title "Reviewed change" --template pair
|
|
535
577
|
ours-fleet task create --title "Phased delivery" --template team
|
|
578
|
+
ours-fleet task create --title "Gated feature build" --template engineering
|
|
536
579
|
```
|
|
537
580
|
|
|
581
|
+
`engineering` pairs a gate-pipeline `Engineer` with the standard `Critic`. The
|
|
582
|
+
Engineer works every non-trivial task through ordered gates — scope and a numbered
|
|
583
|
+
Definition of Done before code, an over-engineering check, spec before
|
|
584
|
+
implementation, test-first, review, a sized security pass, docs, and evidence-backed
|
|
585
|
+
DoD verification — invoking an installed gate-pipeline skill when one is present and
|
|
586
|
+
walking the same gates by hand otherwise. The seat is labelled `Engineer`, so a
|
|
587
|
+
gated seat is never mistaken for a plain `Developer`. To make it the default for
|
|
588
|
+
development tasks, set `tasks: { default_room_template: engineering }` in
|
|
589
|
+
`fleet.yaml`.
|
|
590
|
+
|
|
591
|
+
The `engineering` starter expresses a prompt-level workflow mandate; Fleet does not enforce
|
|
592
|
+
the gates at runtime or install pipeline skills. The Engineer label identifies that mandate,
|
|
593
|
+
not a completed review. When migrating an existing install, a newly added Engineer uses
|
|
594
|
+
the existing Developer template's brain selection and keeps the packaged restrictive permissions.
|
|
595
|
+
Existing customized Engineer files are preserved.
|
|
596
|
+
|
|
538
597
|
The default `team` gives only its LocalCoordinator Agent Template a 15-minute
|
|
539
598
|
continuity loop. Each idle-only pass uses authenticated assigned-room evidence,
|
|
540
599
|
posts at most one missing interval update or status request, and reports `STALLED`
|
|
@@ -588,8 +647,9 @@ non-owner-controlled parent fail closed before host setup and are rechecked unde
|
|
|
588
647
|
per-setup init lock before publication.
|
|
589
648
|
|
|
590
649
|
The generated task experiences are fixed consequences, not extra questions: `single`
|
|
591
|
-
uses `Developer`; `pair` uses `Developer` with an independent `Critic`;
|
|
592
|
-
task-local `LocalCoordinator`, `Developer`, and `Critic
|
|
650
|
+
uses `Developer`; `pair` uses `Developer` with an independent `Critic`; `team` uses
|
|
651
|
+
task-local `LocalCoordinator`, `Developer`, and `Critic`; and `engineering` uses the
|
|
652
|
+
gate-pipeline `Engineer` with an independent `Critic`. The persistent
|
|
593
653
|
`FleetCoordinator` uses the separate packaged `Coordinator` contract and coordination
|
|
594
654
|
model.
|
|
595
655
|
|
|
@@ -666,6 +726,29 @@ continuation is serialized per Task and remains alive until convergence or an
|
|
|
666
726
|
Owner-action blocker. Re-running `task start <id>` safely resumes the same durable
|
|
667
727
|
provisioning operation after the blocker is corrected or a process restarts.
|
|
668
728
|
|
|
729
|
+
Live health is distinct from durable lifecycle. `task show TASK --json` adds a
|
|
730
|
+
`readiness` observation for active tasks (`ready`, `degraded`, or `unknown`); human
|
|
731
|
+
and authenticated Owner task-show output display the same observation. Task start/work
|
|
732
|
+
continue to reject unavailable health with `task_not_ready`. A same-role untracked
|
|
733
|
+
seat or a changed recorded launch cannot satisfy an original slot. Each control,
|
|
734
|
+
liveness, and production Cowork probe is bounded; members are checked sequentially,
|
|
735
|
+
so total latency grows with room size. These are point-in-time observations, not
|
|
736
|
+
proof that a timed-out session is dead or permission to respawn it.
|
|
737
|
+
|
|
738
|
+
Before deliberate recovery, Fleet Coordinator must inspect existing room seats and
|
|
739
|
+
the exact old launch's termination record and worklog under `recovery/temporary`.
|
|
740
|
+
Keep original slot records and archives intact; record verified old/new identity
|
|
741
|
+
and launch provenance privately. Never restore archived identity state or reuse
|
|
742
|
+
consumed invites. A same-role seat is only a possible replacement, not proven ownership.
|
|
743
|
+
|
|
744
|
+
A replacement's empty inbox does not establish that no work is pending. Paginate
|
|
745
|
+
scoped room/operator history to the end, retain the cursor privately, authenticate
|
|
746
|
+
historical Owner instructions from identity metadata, and compare replies, worklogs,
|
|
747
|
+
and already-completed actions before resuming. Ask the Owner when authority or
|
|
748
|
+
completion is uncertain. Transfer only necessary non-secret context; never replay
|
|
749
|
+
instructions blindly. Observation does not adopt seats, launch replacements, change
|
|
750
|
+
lifecycle, or modify retained recovery evidence.
|
|
751
|
+
|
|
669
752
|
Set `room.anonymous: true` on a room template, or pass `--anonymous` to
|
|
670
753
|
`task create`, `task start`, `task work`, or `room create`, to create an
|
|
671
754
|
anonymous Cowork room. `--no-anonymous` explicitly overrides an anonymous
|
|
@@ -1348,8 +1431,9 @@ The command override is exact: Fleet does not append `--profile`, `--search`, or
|
|
|
1348
1431
|
|
|
1349
1432
|
One-off/permanent spawn selects a Brain that owns model, reasoning, native permission,
|
|
1350
1433
|
sandbox, profile, launcher, search, monitor consent, native config, and additional roots.
|
|
1351
|
-
|
|
1352
|
-
|
|
1434
|
+
All roles use the shared gateway profile `~/.ours-client/profile.json`.
|
|
1435
|
+
`OURS_CONFIG` selects an alternate whole profile. Legacy port/token/state-dir
|
|
1436
|
+
overrides are rejected. See the [gateway setup guide](https://github.com/adapt-toolkit/ours-network/blob/prerelease/packages/installer/GATEWAY_SETUP.md).
|
|
1353
1437
|
|
|
1354
1438
|
## Agent isolation
|
|
1355
1439
|
|
|
@@ -1750,3 +1834,130 @@ outcome: inspect state before retrying, because there is no automatic retry or
|
|
|
1750
1834
|
exactly-once guarantee. Contact acceptance alone does not prove peer verification
|
|
1751
1835
|
or message delivery. File tools resolve paths in the invoking CLI process or
|
|
1752
1836
|
Fleet web server's filesystem context, with that process's access permissions.
|
|
1837
|
+
|
|
1838
|
+
Task workspace ownership, retention, safe deletion and legacy migration are documented in [Task workspaces](docs/task-workspaces.md).
|
|
1839
|
+
|
|
1840
|
+
### Active task readiness after interruption
|
|
1841
|
+
|
|
1842
|
+
Task and room list states, and `taskProvisioningOutcome`, describe durable lifecycle
|
|
1843
|
+
and provisioning progress; they are not live health checks. Retrying `task start`
|
|
1844
|
+
or `task work` on an active task checks the current Cowork room identity and seats,
|
|
1845
|
+
member launch ownership, supervisor liveness, and authenticated session status
|
|
1846
|
+
before reporting success. Waiting for provisioning completion also checks live
|
|
1847
|
+
readiness. This is a point-in-time observation, not proof of an agent-authored reply.
|
|
1848
|
+
|
|
1849
|
+
A `task_not_ready` result distinguishes confirmed degradation from unknown health
|
|
1850
|
+
(for example, an unavailable control socket). Ask Fleet Coordinator to inspect room
|
|
1851
|
+
and member status and choose supported recovery. These checks do not restart agents,
|
|
1852
|
+
recreate identities, redeem invites, or rewrite lifecycle state. Temporary room agents
|
|
1853
|
+
remain transient across host reboot; retained launch records do not restore them.
|
|
1854
|
+
|
|
1855
|
+
See [predefined Brain models and runtime requirements](presets/README.md) for the verified model/effort matrix and regeneration instructions.
|
|
1856
|
+
|
|
1857
|
+
### YAML room layouts
|
|
1858
|
+
|
|
1859
|
+
Room layouts describe room composition with shared or fresh participant sessions and independent room closure.
|
|
1860
|
+
See [Room layouts](docs/room-layouts.md) for YAML examples and CLI commands.
|
|
1861
|
+
|
|
1862
|
+
|
|
1863
|
+
### Dedicated notification service
|
|
1864
|
+
|
|
1865
|
+
Configure the web backend with `OURS_NOTIFICATIONS_ORIGIN` and a Fleet-scoped `OURS_NOTIFICATIONS_PRODUCER_TOKEN`. It reads each local supervisor ledger incrementally with persistent checkpoints under web state, correlating owner browser/channel prompts with terminal completion. Monitor/startup turns do not notify. First installation skips existing history; no agent restart or conversation controller is needed. Persist web state across deployment/restarts. Reads are bounded to 256 KiB per role per tick, and oversized model/media records are skipped across chunks. Expose `/notifications` through the generic authenticated prefix gateway with a server-side user token and `stripBrowserContext: true`; producer tokens stay server-side. All browser sessions of this single-owner console map to one stable notification account. See [ours-notifications](https://github.com/adapt-toolkit/ours-notifications) for configuration/API/release details.
|
|
1866
|
+
|
|
1867
|
+
New agent notifications and confirmed role retirement use `/fleet/chats/agents/:roleId`, with each ID escaped once and matching message anchors retained. Deploy the app, notification service, and producers together: old query-based conversation links are intentionally unsupported. Existing pending payload URLs are replayed unchanged for idempotency; obsolete cleanup targets remain stored without being sent or treated as proof of absence. Task management notification paths are unchanged.
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
Existing-host enrollment: `ours-fleet workspace-enroll --file <private-file> --preserve-profile` requires Messenger to advertise preservation support before any enrollment POST. It omits Name/Surname and leaves existing/absent profile untouched. Existing Fleet models and agents are retained; the installer must skip init when its configuration exists. Signed root proof, tunnel setup and device QR issuance remain the normal enrollment flow. Older Messenger fails closed and requires its preservation-capable release.
|
|
1871
|
+
|
|
1872
|
+
### Connect an installed host to the App
|
|
1873
|
+
|
|
1874
|
+
Install Ours network first. In the App's tunnel step, copy the single command and
|
|
1875
|
+
paste it on the intended host, including in an SSH session on a VPS:
|
|
1876
|
+
|
|
1877
|
+
```sh
|
|
1878
|
+
ours-fleet setup-tunnel <encoded-v2-grant>
|
|
1879
|
+
```
|
|
1880
|
+
|
|
1881
|
+
The base64url argument contains only the existing v2 grant: `version: 2`, allowed
|
|
1882
|
+
`appOrigin`, one-use `code`, and `expiresAt`. It names the workspace indirectly
|
|
1883
|
+
through a server-held grant; it includes no broad Cloudflare credential or
|
|
1884
|
+
installer script. The grant can appear in shell history and process listings:
|
|
1885
|
+
keep the command private and remove it from history after use. Base64 is encoding,
|
|
1886
|
+
not encryption. The server enforces its short expiry and one-time redemption.
|
|
1887
|
+
Fleet never prints the grant; it checks host prerequisites before redeeming it
|
|
1888
|
+
over HTTPS POST, with the code in the body rather than a URL. The response supplies
|
|
1889
|
+
only the existing scoped connector and signed-root enrollment data; authorization,
|
|
1890
|
+
account-origin checks and private connector token-file storage remain enforced.
|
|
1891
|
+
|
|
1892
|
+
Optional private transports remain available: `setup-tunnel --file /private/grant`
|
|
1893
|
+
requires an owned regular file with mode 600; `setup-tunnel --stdin` reads a secure
|
|
1894
|
+
pipe with a 32KiB limit and refuses a terminal. Legacy v1 payloads, which contain
|
|
1895
|
+
long-lived scoped credentials, are accepted only through file/stdin, never as
|
|
1896
|
+
command arguments. Use only one payload transport.
|
|
1897
|
+
|
|
1898
|
+
When this host already has a registration, Fleet inspects the one-use grant without
|
|
1899
|
+
consuming it. The same workspace reruns without a deletion prompt or retirement.
|
|
1900
|
+
An account-origin change for that workspace requires `--migrate-app-origin`; a
|
|
1901
|
+
changed server identity is refused. An older App without inspection support falls
|
|
1902
|
+
back to asking before redemption. An unavailable inspection service preserves the
|
|
1903
|
+
grant and setup. Fleet verifies the redeemed destination against the inspection.
|
|
1904
|
+
|
|
1905
|
+
For another workspace, setup describes the existing workspace, tunnel hostname and
|
|
1906
|
+
account origin and asks `[y/N]`. No answer or `no` preserves the setup and grant; a
|
|
1907
|
+
noninteractive caller must pass `--replace-registration`, otherwise it exits with
|
|
1908
|
+
an error. A legacy binding without a server identity must rerun its own workspace
|
|
1909
|
+
first. The original Human root signs retirement. Fleet waits for the account's
|
|
1910
|
+
durable cleanup receipt before stopping the old service and revoking its linked
|
|
1911
|
+
devices. If a migrated database has no old registration, the signed command confirms
|
|
1912
|
+
absence; the service has no old provider resources to delete. Installation identities,
|
|
1913
|
+
profile, agents, history, stable host ID and local pairing are preserved.
|
|
1914
|
+
|
|
1915
|
+
Replacement recovery is saved in an owned private `workspace/replacement.json`
|
|
1916
|
+
after root, host, service and server-contact preconditions pass. The App must
|
|
1917
|
+
explicitly support deadline-enforced retirement; an older App without that
|
|
1918
|
+
capability preserves the existing setup. `setup-tunnel --resume` retries its nonce
|
|
1919
|
+
and saved operation deadline (24 hours less a five-minute clock margin).
|
|
1920
|
+
If the enrollment challenge expires, obtain a fresh App command for the same target
|
|
1921
|
+
and pass `--replace-registration`; completed retirement is retained. The old server
|
|
1922
|
+
identity is pinned: only its own invitation can reconnect it.
|
|
1923
|
+
|
|
1924
|
+
`setup-tunnel --abandon-replacement` removes the private recovery payload only when
|
|
1925
|
+
a fresh private receipt confirms no deletion and the operation was never dispatched
|
|
1926
|
+
or was terminally rejected. A lost transport response remains uncertain. Expired
|
|
1927
|
+
operations require a fresh receipt proving the old binding still exists after the
|
|
1928
|
+
deadline plus five minutes and an explicit server guarantee that the deadline is enforced;
|
|
1929
|
+
older recovery records without that guarantee must be resumed. Abandoning preserves
|
|
1930
|
+
the existing binding, connector and installation data. A terminally rejected operation
|
|
1931
|
+
requires abandonment and a new App command, rather than reusing its nonce.
|
|
1932
|
+
After that deadline, a fresh command for the same target can also resume with a
|
|
1933
|
+
new operation nonce after checking the enforced expiry. This confirms signed
|
|
1934
|
+
absence if an old successful receipt was lost and later pruned.
|
|
1935
|
+
|
|
1936
|
+
If the App accepted the successor proof before Fleet wrote its local binding,
|
|
1937
|
+
a fresh command for that target retains the original private connector from the
|
|
1938
|
+
recovery record. If that successor cannot be recovered, remove it in the App,
|
|
1939
|
+
then use `setup-tunnel --discard-retired-replacement` and a fresh App command.
|
|
1940
|
+
Discard is allowed only after retirement and local cleanup, while the old local
|
|
1941
|
+
binding remains. It removes only the recovery record. This host has no working
|
|
1942
|
+
registration until the new setup completes; the old service was stopped and its
|
|
1943
|
+
linked devices revoked.
|
|
1944
|
+
|
|
1945
|
+
Renewal commands contain no existing live connector credential. Fleet keeps the
|
|
1946
|
+
current private connector byte for byte, and accepts renewal only for its recorded
|
|
1947
|
+
workspace, server, origin and tunnel hostname. Restore a missing or unsafe connector,
|
|
1948
|
+
or remove and re-create that workspace in the App before setting it up again.
|
|
1949
|
+
|
|
1950
|
+
After service and signed tunnel-target confirmation, setup prints both a QR and
|
|
1951
|
+
ordinary private single-use connection code. The App checks readiness automatically
|
|
1952
|
+
and immediately opens the code field. If setup or code output fails after binding,
|
|
1953
|
+
fix the reported problem and run `ours-fleet setup-tunnel --resume`; its private
|
|
1954
|
+
pending record remains until the code is printed, including confirmed nondefault
|
|
1955
|
+
ports. `ours-fleet link-device` still generates another code for additional browsers
|
|
1956
|
+
or expired codes. `--check` checks prerequisites without consuming a grant.
|
|
1957
|
+
|
|
1958
|
+
Prerelease rollout requires this Fleet capability to be published first, then the
|
|
1959
|
+
installer's normal generated version/integrity lock updated, then installer and
|
|
1960
|
+
App released. The currently pinned Fleet nightly.41 does not support v2 grants.
|
|
1961
|
+
These source changes do not publish, merge, or deploy any component.
|
|
1962
|
+
|
|
1963
|
+
See [ACP file sending](docs/acp-files.md) for the same-chat `send_file` flow, available to every Agent by default, and its supported sessions.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const accountOrigins = ['https://app.ours.network', 'https://app.ours-tunnel.com'];
|
|
2
|
+
export function validateAccountOrigin(value) {
|
|
3
|
+
if (typeof value !== 'string' || !accountOrigins.some(origin => origin === value))
|
|
4
|
+
throw Error('Unsupported account origin');
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { openChatFile } from '../file-delivery/reader.js';
|
|
2
3
|
import { createHash } from 'node:crypto';
|
|
3
4
|
import { connect } from 'node:net';
|
|
4
5
|
import { access, mkdir, open, readFile } from 'node:fs/promises';
|
|
@@ -6,6 +7,9 @@ import { constants } from 'node:fs';
|
|
|
6
7
|
import { basename, dirname, resolve } from 'node:path';
|
|
7
8
|
import { fileURLToPath } from 'node:url';
|
|
8
9
|
import { MAX_CHUNK_BYTES, MAX_FRAME_BYTES, Wire } from './wire.js';
|
|
10
|
+
/** A current-chat refusal the agent may see; it names a reason, never a path or content. */
|
|
11
|
+
class ChatFileError extends Error {
|
|
12
|
+
}
|
|
9
13
|
/** Runs inside exactly the harness OS sandbox. Only this process opens agent paths. */
|
|
10
14
|
export async function runBridge(descriptorPath) {
|
|
11
15
|
const descriptor = JSON.parse(await readFile(descriptorPath, 'utf8'));
|
|
@@ -71,7 +75,7 @@ export async function runBridge(descriptorPath) {
|
|
|
71
75
|
value = false;
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
|
-
else if (op === 'read-open' || op === 'write-open') {
|
|
78
|
+
else if (op === 'read-open' || op === 'write-open' || op === 'export-open') {
|
|
75
79
|
if (handles.size >= 32 ||
|
|
76
80
|
typeof args.handle !== 'string' ||
|
|
77
81
|
handles.has(args.handle) ||
|
|
@@ -80,12 +84,20 @@ export async function runBridge(descriptorPath) {
|
|
|
80
84
|
const path = resolve(args.path);
|
|
81
85
|
if (op === 'write-open')
|
|
82
86
|
await mkdir(dirname(path), { recursive: true });
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
if (op === 'export-open') {
|
|
88
|
+
const opened = await openChatFile(process.cwd(), args.path).catch((error) => { throw new ChatFileError(error.message); });
|
|
89
|
+
const stat = await opened.file.stat();
|
|
90
|
+
handles.set(args.handle, { file: opened.file, call, write: false, original: { size: stat.size, mtimeMs: stat.mtimeMs, ctimeMs: stat.ctimeMs } });
|
|
91
|
+
value = { filename: basename(opened.path), size: stat.size, path: opened.path };
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const file = await open(path, op === 'write-open' ? 'w' : 'r');
|
|
95
|
+
handles.set(args.handle, { file, call, write: op === 'write-open' });
|
|
96
|
+
value =
|
|
97
|
+
op === 'write-open'
|
|
98
|
+
? path
|
|
99
|
+
: { filename: basename(path), size: (await file.stat()).size };
|
|
100
|
+
}
|
|
89
101
|
}
|
|
90
102
|
else {
|
|
91
103
|
const row = handles.get(args.handle);
|
|
@@ -105,6 +117,11 @@ export async function runBridge(descriptorPath) {
|
|
|
105
117
|
value = null;
|
|
106
118
|
}
|
|
107
119
|
else if (op === 'read' && !row.write) {
|
|
120
|
+
if (row.original) {
|
|
121
|
+
const stat = await row.file.stat();
|
|
122
|
+
if (!stat.isFile() || stat.nlink !== 1 || stat.size !== row.original.size || stat.mtimeMs !== row.original.mtimeMs || stat.ctimeMs !== row.original.ctimeMs)
|
|
123
|
+
throw new ChatFileError('CHAT_FILE_CHANGED');
|
|
124
|
+
}
|
|
108
125
|
const buffer = Buffer.alloc(MAX_CHUNK_BYTES);
|
|
109
126
|
const { bytesRead } = await row.file.read(buffer);
|
|
110
127
|
value = bytesRead ? buffer.subarray(0, bytesRead).toString('base64') : null;
|
|
@@ -129,8 +146,8 @@ export async function runBridge(descriptorPath) {
|
|
|
129
146
|
}
|
|
130
147
|
await wire.send({ kind: 'fs-result', id: raw.id, value });
|
|
131
148
|
}
|
|
132
|
-
catch {
|
|
133
|
-
await wire.send({ kind: 'fs-result', id: raw.id, error: 'FILE_OPERATION_FAILED' });
|
|
149
|
+
catch (error) {
|
|
150
|
+
await wire.send({ kind: 'fs-result', id: raw.id, error: error instanceof ChatFileError ? error.message : 'FILE_OPERATION_FAILED' });
|
|
134
151
|
}
|
|
135
152
|
})
|
|
136
153
|
.catch(fail);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Read-only operations exposed by the identity-owning supervisor. */
|
|
2
|
+
export interface AgentHistoryQuery {
|
|
3
|
+
peer_cid: string;
|
|
4
|
+
limit?: number;
|
|
5
|
+
before_seq?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SupervisorCorrespondence {
|
|
8
|
+
contacts(): Promise<unknown>;
|
|
9
|
+
history(request: AgentHistoryQuery): Promise<unknown>;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -11,11 +11,23 @@ export declare class FileCallbacks implements FileExecutionContext {
|
|
|
11
11
|
private rpc;
|
|
12
12
|
canRead(path: string, extra: ToolRequestExtra): Promise<boolean>;
|
|
13
13
|
read(path: string, extra: ToolRequestExtra): Promise<{
|
|
14
|
+
path?: string | undefined;
|
|
14
15
|
filename: any;
|
|
15
16
|
size: any;
|
|
16
17
|
body: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
17
18
|
close: () => Promise<void>;
|
|
18
19
|
}>;
|
|
20
|
+
/** Current-chat source: integrity-checked by the bridge, with its real path. */
|
|
21
|
+
readChatFile(path: string, extra: ToolRequestExtra): Promise<{
|
|
22
|
+
path?: string | undefined;
|
|
23
|
+
filename: any;
|
|
24
|
+
size: any;
|
|
25
|
+
body: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
26
|
+
close: () => Promise<void>;
|
|
27
|
+
} & {
|
|
28
|
+
path: string;
|
|
29
|
+
}>;
|
|
30
|
+
private openRead;
|
|
19
31
|
write(path: string, body: ReadableStream<Uint8Array>, extra: ToolRequestExtra): Promise<{
|
|
20
32
|
path: string;
|
|
21
33
|
size: number;
|