@ours.network/fleet 1.2.0-nightly.9 → 2.0.1
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 +280 -68
- package/dist/account-origin.d.ts +5 -0
- package/dist/account-origin.js +31 -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 +22 -0
- package/dist/agent-ours/mcp-endpoint.js +101 -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 +27 -1
- package/dist/agent-ours/service.js +107 -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 +31 -0
- package/dist/application/conversation-history.js +339 -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 +3 -3
- 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/resource-observer.d.ts +43 -0
- package/dist/application/resource-observer.js +323 -0
- package/dist/application/role-creation-service.js +3 -2
- package/dist/application/role-removal-service.js +17 -3
- package/dist/application/role-repository.d.ts +3 -1
- package/dist/application/role-repository.js +89 -54
- 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 +63 -17
- package/dist/application/session-control.js +221 -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 +261 -0
- package/dist/application/task-room-service.d.ts +101 -3
- package/dist/application/task-room-service.js +286 -33
- 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 +5 -1
- package/dist/briefing.js +138 -31
- package/dist/build-info.json +10 -5
- package/dist/capabilities.d.ts +9 -1
- package/dist/capabilities.js +13 -0
- package/dist/cli.js +391 -38
- 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 +14 -9
- package/dist/daemon-recovery.js +124 -115
- package/dist/docs.d.ts +1 -1
- package/dist/docs.js +402 -20
- 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 +13 -0
- package/dist/fleet-command-audit.js +31 -9
- 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 +9 -34
- package/dist/monitor.js +90 -153
- package/dist/notifications/fleet-producer.d.ts +31 -0
- package/dist/notifications/fleet-producer.js +351 -0
- package/dist/notifications/outbox.d.ts +59 -0
- package/dist/notifications/outbox.js +199 -0
- package/dist/notifications/target-cleanup.d.ts +16 -0
- package/dist/notifications/target-cleanup.js +75 -0
- package/dist/notifications/task-producer.d.ts +20 -0
- package/dist/notifications/task-producer.js +100 -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 +5 -0
- package/dist/paths.js +5 -0
- package/dist/preset-migration.js +55 -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 +84 -0
- package/dist/rooms-tasks/archived-absence.d.ts +4 -0
- package/dist/rooms-tasks/archived-absence.js +11 -0
- package/dist/rooms-tasks/cli.js +182 -5
- package/dist/rooms-tasks/close.d.ts +5 -2
- package/dist/rooms-tasks/close.js +224 -36
- 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 +66 -10
- 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 +286 -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-review.d.ts +113 -0
- package/dist/rooms-tasks/task-review.js +561 -0
- 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 -5
- package/dist/rooms-tasks/task-state.js +358 -50
- package/dist/rooms-tasks/task-tools.d.ts +35 -0
- package/dist/rooms-tasks/task-tools.js +134 -0
- package/dist/rooms-tasks/types.d.ts +78 -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 +23 -4
- package/dist/runner.js +409 -61
- 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 +219 -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 +213 -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 +20 -1
- package/dist/startup-readiness.js +66 -3
- 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 +77 -0
- package/dist/subscriptions/login.js +215 -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 +143 -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 +18 -37
- 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 +130 -0
- package/dist/watchdog/query.d.ts +3 -1
- package/dist/watchdog/query.js +2 -1
- 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 +26 -0
- package/dist/web/conversation-stream.js +239 -0
- package/dist/web/events.d.ts +2 -0
- package/dist/web/events.js +9 -0
- package/dist/web/fleet-config-service.d.ts +7 -1
- package/dist/web/fleet-config-service.js +61 -16
- package/dist/web/prefix-gateway.d.ts +32 -0
- package/dist/web/prefix-gateway.js +248 -0
- package/dist/web/resource-views.d.ts +138 -0
- package/dist/web/resource-views.js +519 -0
- package/dist/web/runtime.d.ts +3 -1
- package/dist/web/runtime.js +132 -34
- package/dist/web/server.d.ts +19 -0
- package/dist/web/server.js +893 -71
- 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 +605 -0
- package/dist/workspace-replacement.d.ts +66 -0
- package/dist/workspace-replacement.js +238 -0
- package/docs/acp-files.md +146 -0
- package/docs/conversation-stream.md +216 -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-progress-review.md +143 -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 +25 -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 +6 -3
- 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 +21 -13
- package/presets/fleet/roles/Critic.yaml +24 -0
- package/presets/fleet/roles/Developer.yaml +32 -0
- package/presets/fleet/roles/Engineer.yaml +72 -0
- package/presets/fleet/roles/LocalCoordinator.yaml +17 -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
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
# Self-reminders
|
|
2
|
+
|
|
3
|
+
A Fleet-managed agent can schedule a one-time reminder that wakes **itself** at a
|
|
4
|
+
later date and time. When the reminder is due, the agent's own supervisor starts
|
|
5
|
+
a turn for it; the agent reads the reminder and decides what to do.
|
|
6
|
+
|
|
7
|
+
A reminder is not a message. It has no recipient, chat, route, API key or
|
|
8
|
+
Telegram setting, and Fleet never sends anything on the agent's behalf. If the
|
|
9
|
+
agent decides someone should hear about it, it uses its ordinary messaging tools
|
|
10
|
+
under its existing instructions and authorization.
|
|
11
|
+
|
|
12
|
+
It works for every managed session (`session: acp` or `session: codex-app-server`,
|
|
13
|
+
Claude or Codex) and every lifetime: persistent, temporary and task-owned. There
|
|
14
|
+
is nothing to install or enable.
|
|
15
|
+
|
|
16
|
+
## When to use it
|
|
17
|
+
|
|
18
|
+
- Come back to something at a known time: "check whether the release CI finished
|
|
19
|
+
at 16:00", "follow up on the review on Monday morning".
|
|
20
|
+
- Replace polling or sleeping inside a turn. A reminder costs nothing while it
|
|
21
|
+
waits; a turn that sleeps or a loop that polls costs model time every tick.
|
|
22
|
+
- Wait for a peer without forgetting the task: see [Waiting on a peer](#waiting-on-a-peer).
|
|
23
|
+
- Not for recurring maintenance: use configured `loops` for that.
|
|
24
|
+
|
|
25
|
+
## Tools
|
|
26
|
+
|
|
27
|
+
The tools are served by the agent's own fixed-identity ours MCP server. No
|
|
28
|
+
argument names an agent or identity: every call acts on the caller's own
|
|
29
|
+
reminders, and an id that belongs to another agent is simply not found.
|
|
30
|
+
|
|
31
|
+
| Tool | Arguments | Result |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| `fleet_reminder_create` | `request_key`, `title`, `note`?, `local_time`, `time_zone`, `fold`?, `late_window_seconds`?, `interrupt`? | the reminder (`id`, `revision`, `due_at`, `expires_at`, `interrupt`, …) and `created` |
|
|
34
|
+
| `fleet_reminder_list` | `state`? (`open` default, `closed`, `all`), `limit`? (1–100), `after`? | a page of reminders, `more`, `after`, `uncertain_events` |
|
|
35
|
+
| `fleet_reminder_update` | `id`, `expected_revision`, any of the schedule fields | the reminder at its new revision |
|
|
36
|
+
| `fleet_reminder_cancel` | `id`, `expected_revision` | the cancelled reminder |
|
|
37
|
+
| `fleet_reminder_inspect` | `event_id` | the event (with `interrupt` / `interrupt_deferred` for an urgent one), its reminder (with `note`), `current`, `eligible` |
|
|
38
|
+
| `fleet_reminder_ack` | `event_id`, `expected_revision` | `acknowledged` (repeat calls return `duplicate: true`) |
|
|
39
|
+
|
|
40
|
+
### Time
|
|
41
|
+
|
|
42
|
+
`local_time` is a calendar date and wall-clock time **without** an offset
|
|
43
|
+
(`2027-01-20T16:00` or `2027-01-20T16:00:00`); `time_zone` is an IANA zone such
|
|
44
|
+
as `Europe/London`, `America/New_York` or `UTC`. Use the zone of the person or
|
|
45
|
+
task the reminder is about; Fleet never assumes the host's zone. "Tomorrow at
|
|
46
|
+
nine" must be resolved by the agent to a real date first.
|
|
47
|
+
|
|
48
|
+
Daylight-saving changes are explicit:
|
|
49
|
+
|
|
50
|
+
- A time skipped when clocks go forward (`2027-03-28T01:30` in `Europe/London`)
|
|
51
|
+
does not exist and is refused (`nonexistent_local_time`).
|
|
52
|
+
- A time that occurs twice when clocks go back (`2027-10-31T01:30` in
|
|
53
|
+
`Europe/London`) needs `fold`: `0` for the first occurrence, `1` for the second
|
|
54
|
+
(`ambiguous_local_time` otherwise).
|
|
55
|
+
- Invalid dates (`2027-02-30`) are refused. The time must be in the future and
|
|
56
|
+
within five years.
|
|
57
|
+
|
|
58
|
+
`late_window_seconds` (60–604800, default 3600) is how late the wake may still
|
|
59
|
+
arrive if the agent, Fleet or the host was down, paused or busy at the due time.
|
|
60
|
+
After the window the reminder expires without a turn.
|
|
61
|
+
|
|
62
|
+
`interrupt` (default `false`) marks a reminder as urgent; see
|
|
63
|
+
[Urgent reminders](#urgent-reminders-interrupt-true). Leave it out for ordinary
|
|
64
|
+
reminders.
|
|
65
|
+
|
|
66
|
+
### Idempotency and revisions
|
|
67
|
+
|
|
68
|
+
`request_key` identifies one scheduling decision. Repeating `create` with the same
|
|
69
|
+
key and the same input returns the existing reminder, so a retried call after a
|
|
70
|
+
timeout never creates a second one; the same key with different input is refused
|
|
71
|
+
(`request_key_conflict`). Keys are remembered while the reminder is retained (the
|
|
72
|
+
200 most recent closed reminders are kept; at most 100 can be open).
|
|
73
|
+
|
|
74
|
+
An urgent request differs from an ordinary one: repeating a call made without
|
|
75
|
+
`interrupt` (or with `interrupt: false`) matches the original, while the same key
|
|
76
|
+
with `interrupt: true` is a `request_key_conflict`. `update` can turn urgency on or
|
|
77
|
+
off; it keeps its current value when not given.
|
|
78
|
+
|
|
79
|
+
Every `update` and `cancel` names the revision it expects (`stale_revision`
|
|
80
|
+
otherwise) and bumps it. A wake issued for an older revision is void: if it is
|
|
81
|
+
still waiting it is dropped before it reaches the model, and if it was already
|
|
82
|
+
delivered it can no longer be acknowledged.
|
|
83
|
+
|
|
84
|
+
## Example
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
fleet_reminder_create {
|
|
88
|
+
"request_key": "release-ci-check-2027-01-20",
|
|
89
|
+
"title": "Check release CI",
|
|
90
|
+
"note": "PR #412 on prerelease. If CI is green, post the result in the task room; do not merge.",
|
|
91
|
+
"local_time": "2027-01-20T16:00",
|
|
92
|
+
"time_zone": "Europe/London"
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
At 16:00 London time the agent receives a turn like:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
[fleet-reminder]
|
|
100
|
+
event_id: rev_7c0d…
|
|
101
|
+
reminder_id: rem_1b9e…
|
|
102
|
+
revision: 1
|
|
103
|
+
title: "Check release CI"
|
|
104
|
+
due: 2027-01-20T16:00:00 Europe/London (2027-01-20T16:00:00.000Z)
|
|
105
|
+
|
|
106
|
+
This is a reminder you scheduled for yourself through Fleet. …
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
It then calls `fleet_reminder_inspect {"event_id": "rev_7c0d…"}`, does the work
|
|
110
|
+
(or decides nothing is needed), and calls
|
|
111
|
+
`fleet_reminder_ack {"event_id": "rev_7c0d…", "expected_revision": 1}`. To
|
|
112
|
+
postpone instead, it calls `fleet_reminder_update` with a new `local_time`; the
|
|
113
|
+
current wake becomes void and a new one is issued at the new time.
|
|
114
|
+
|
|
115
|
+
## Delivery guarantees and limits
|
|
116
|
+
|
|
117
|
+
- **Who keeps time.** The supervisor process that runs the agent owns the timer
|
|
118
|
+
and the private state (`.self-reminders.json`, mode 0600, in the agent's state
|
|
119
|
+
directory). With no open reminders it arms no timer; otherwise it checks at the
|
|
120
|
+
next due time and at least once a minute. Only a due reminder creates a model
|
|
121
|
+
turn.
|
|
122
|
+
- **When it arrives.** By default, at the first idle turn boundary after the
|
|
123
|
+
due time, and only after the agent's startup turn has succeeded. An ordinary
|
|
124
|
+
wake never interrupts the agent and never waits in a queue behind other work;
|
|
125
|
+
a busy agent receives it when its current work finishes. An urgent reminder may
|
|
126
|
+
instead stop interruptible busy work once (next section). A reminder wake always
|
|
127
|
+
runs as its own turn and is never combined with owner or mail input.
|
|
128
|
+
- **Offline.** Nothing runs while the host is off or asleep, or while Fleet or the
|
|
129
|
+
agent is stopped. Reminders are kept, and those still inside their late window
|
|
130
|
+
are delivered when the agent is back; the rest expire without a turn. Pause and
|
|
131
|
+
restart keep reminders; they never start a stopped agent.
|
|
132
|
+
- **Deletion.** Removing or retiring an agent, or deleting or finishing its task,
|
|
133
|
+
cancels its reminders and deletes their state, including from retained
|
|
134
|
+
evidence. A replaced identity or a new agent with the same name never inherits
|
|
135
|
+
them: a store is bound to the agent's role and identity (and, for a temporary
|
|
136
|
+
or task agent, its runtime instance), and a store that does not match is set
|
|
137
|
+
aside and nothing in it is delivered.
|
|
138
|
+
- **At most once.** Four facts are separate: the supervisor queued the wake, the
|
|
139
|
+
wake was released to the model, the agent acknowledged it, and any external
|
|
140
|
+
action the agent took. A wake is recorded as dispatched, durably, at the moment
|
|
141
|
+
it is handed to the model; if that record cannot be written, it is not handed
|
|
142
|
+
over. After a crash, an event that was never released is retried as the same
|
|
143
|
+
event; an event that may have reached the model is held as `uncertain` and is
|
|
144
|
+
never sent again. `list` reports `uncertain_events`; the agent checks its own
|
|
145
|
+
records, then acknowledges it or schedules something new.
|
|
146
|
+
- **Privacy.** Titles and notes are visible only through the agent's own tools.
|
|
147
|
+
The wake text contains the title, not the note, and the conversation ledger
|
|
148
|
+
stores only a digest of the wake. Logs carry event ids, never reminder text.
|
|
149
|
+
|
|
150
|
+
## Urgent reminders (`interrupt: true`)
|
|
151
|
+
|
|
152
|
+
An ordinary reminder waits for the agent to be idle, so a long busy turn delays
|
|
153
|
+
it. For a return that is genuinely bound to a time — a deadline, a meeting, a
|
|
154
|
+
window that closes — the agent can create the reminder with `interrupt: true`.
|
|
155
|
+
When it is due and the agent is busy, the supervisor may ask the current turn to
|
|
156
|
+
stop and then start the wake in the same session, instead of waiting.
|
|
157
|
+
|
|
158
|
+
What happens, as separate recorded facts:
|
|
159
|
+
|
|
160
|
+
1. **Due.** The reminder reaches its time (nothing happens before it).
|
|
161
|
+
2. **Interruption requested.** Only if the busy turn is interruptible (below).
|
|
162
|
+
The request and its exact target (the turn's source, prompt id and session
|
|
163
|
+
generation; `inspect` shows them as `interrupt.target`) are durably recorded
|
|
164
|
+
*before* the session is asked to stop. Each reminder revision may request
|
|
165
|
+
this **once**. Urgent reminders that may still interrupt are considered
|
|
166
|
+
before ordinary ones and before urgent ones whose interruption is spent.
|
|
167
|
+
3. **Terminal.** How the stop ended, shown by `inspect` as `interrupt.state`:
|
|
168
|
+
`cancelled` (the target turn's own result confirms this request cancelled it),
|
|
169
|
+
`ended` (the session reported it settled, but cancellation is not confirmed),
|
|
170
|
+
`forced` (the adapter ignored the stop and was restarted), `failed` (the
|
|
171
|
+
control call failed) or `unknown` (Fleet restarted before the outcome).
|
|
172
|
+
4. **Released.** The wake is handed to the model through the same release fence
|
|
173
|
+
as every reminder. After `forced` or `failed` it is not queued; it is
|
|
174
|
+
delivered later, idle-only, within its late window.
|
|
175
|
+
5. **Acknowledged**, and any **external action** the agent then takes, are the
|
|
176
|
+
agent's own and remain separate facts.
|
|
177
|
+
|
|
178
|
+
The session and its context are kept: nothing is reset, no second agent and no
|
|
179
|
+
parallel model turn is started. The wake tells the agent what it interrupted so
|
|
180
|
+
it can re-check and resume that work. It sends nothing to anyone and grants no
|
|
181
|
+
authority.
|
|
182
|
+
|
|
183
|
+
An urgent reminder **never** stops, and instead waits like an ordinary one:
|
|
184
|
+
|
|
185
|
+
- an owner-channel request or an owner admin-console turn (owner commands keep
|
|
186
|
+
priority, and cancelling one would end the owner's request and its reply);
|
|
187
|
+
- the startup turn, a stall-recovery turn, or another reminder's wake;
|
|
188
|
+
- a turn with a pending permission decision;
|
|
189
|
+
- work queued behind the current turn, or another admission waiting for the role;
|
|
190
|
+
- a turn Fleet cannot identify exactly (for example one started by adapter-side
|
|
191
|
+
steering, which reports the role idle).
|
|
192
|
+
|
|
193
|
+
Interruptible turns are mail wakes, scheduled loops and local-console prompts.
|
|
194
|
+
When the reminder defers, `inspect` shows why in `event.interrupt_deferred`, and it
|
|
195
|
+
interrupts at a later boundary if one becomes interruptible. A mail wake that was
|
|
196
|
+
stopped is retried by the monitor and queued behind the reminder; it cannot stop
|
|
197
|
+
the reminder in turn.
|
|
198
|
+
|
|
199
|
+
Limits:
|
|
200
|
+
|
|
201
|
+
- Not a hard real-time alarm: the dispatcher checks at least once a minute, and
|
|
202
|
+
stopping a turn and starting a model turn both take time.
|
|
203
|
+
- Nothing happens while the host is off or asleep, or Fleet or the agent is down.
|
|
204
|
+
- One interruption per revision: after it (whatever its outcome) the wake is
|
|
205
|
+
idle-only. A failed or forced stop means the urgency was lost for that event,
|
|
206
|
+
and `inspect` says so; it never reports a successful interruption.
|
|
207
|
+
- Use it sparingly. Ordinary coordination waits stay `interrupt: false`.
|
|
208
|
+
|
|
209
|
+
## Waiting on a peer
|
|
210
|
+
|
|
211
|
+
In paired work (Developer and Critic, Engineer and Critic) an agent that stops to
|
|
212
|
+
wait for a review, answer, artifact or check schedules **one** idle-only reminder
|
|
213
|
+
about 20 minutes out (or at the agreed time), naming the task or room and the
|
|
214
|
+
exact expectation:
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
fleet_reminder_create {
|
|
218
|
+
"request_key": "pr-412-wait-critic-final-1",
|
|
219
|
+
"title": "PR 412: Critic FINAL on head 1a2b3c",
|
|
220
|
+
"note": "Task room for PR 412: waiting for the Critic's FINAL on head 1a2b3c. If it arrived, just ack.",
|
|
221
|
+
"local_time": "2027-01-20T16:20",
|
|
222
|
+
"time_zone": "UTC"
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
- The answer arrives, the state changes or the work is finished: `cancel` (or
|
|
227
|
+
`update`) the reminder with its current revision.
|
|
228
|
+
- On the wake: `inspect`, re-check the task. Resolved or closed: `ack`, nothing
|
|
229
|
+
else. Still waiting: one concise follow-up in the same room, `ack`, and at most
|
|
230
|
+
one more reminder; if that one finds no progress either, report the
|
|
231
|
+
nonresponse or blocker once through the configured routes and stop reminding.
|
|
232
|
+
- Never a short polling interval, a recurring chain of reminders, repeated
|
|
233
|
+
follow-ups or acknowledgements, or a "done" status because a reminder fired.
|
|
234
|
+
- A deleted or finished task removes the agent's reminders, so a closed task
|
|
235
|
+
produces no wake.
|
|
236
|
+
|
|
237
|
+
Operators can see an agent's reminders through the existing supervisor tool
|
|
238
|
+
route, which acts as that agent's supervisor:
|
|
239
|
+
|
|
240
|
+
```sh
|
|
241
|
+
ours-fleet ours call DeveloperA fleet_reminder_list
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Migrating from the standalone `self-reminders` worker
|
|
245
|
+
|
|
246
|
+
The standalone skill ran one Python worker, its own SQLite ledger and a user
|
|
247
|
+
service per agent. Built-in reminders replace it; the worker is deprecated.
|
|
248
|
+
Personal-assistant reminder, source and outbound messaging stores are separate
|
|
249
|
+
systems and are not touched by this procedure. Migration is a deliberate,
|
|
250
|
+
separately authorized operation per agent; nothing migrates automatically.
|
|
251
|
+
|
|
252
|
+
Reminder data is handled **by the agent itself** with both tool sets, so its text
|
|
253
|
+
never passes through an operator. The operator only fences and later removes the
|
|
254
|
+
old service.
|
|
255
|
+
|
|
256
|
+
### 1. Preconditions
|
|
257
|
+
|
|
258
|
+
- The agent runs a Fleet release with built-in reminders:
|
|
259
|
+
`ours-fleet ours tools Name` lists `fleet_reminder_create`.
|
|
260
|
+
- `fleet_reminder_list {"state": "all"}` (every page) shows each reminder's
|
|
261
|
+
`request_key`. Any key starting with `legacy:` belongs to an earlier attempt:
|
|
262
|
+
reconcile it with the rollback table below before starting again. Keys map
|
|
263
|
+
back to old ids (`legacy:<old id>:r<old revision>`), so an interrupted run
|
|
264
|
+
is always resumable from the two lists.
|
|
265
|
+
|
|
266
|
+
### 2. Fence the old producer persistently
|
|
267
|
+
|
|
268
|
+
A `stop` alone is not a fence: an enabled unit starts again at the next login or
|
|
269
|
+
boot. The operator records the unit's prior state and its unit file, then
|
|
270
|
+
disables it. The old setup enabled a generated unit by absolute path outside the
|
|
271
|
+
unit search path, so disabling removes its only link; keep the recorded path and
|
|
272
|
+
do not delete that file until step 6:
|
|
273
|
+
|
|
274
|
+
```sh
|
|
275
|
+
systemctl --user is-enabled self-reminders-Name.service # record: enabled/linked/...
|
|
276
|
+
systemctl --user is-active self-reminders-Name.service # record: active/inactive
|
|
277
|
+
systemctl --user show -p FragmentPath self-reminders-Name.service # record the absolute unit file
|
|
278
|
+
systemctl --user disable --now self-reminders-Name.service
|
|
279
|
+
systemctl --user is-enabled self-reminders-Name.service # must not be enabled
|
|
280
|
+
systemctl --user is-active self-reminders-Name.service # must be inactive
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
From here on no old wake can be produced, across worker, Fleet or host
|
|
284
|
+
restarts, until someone deliberately re-enables the unit. Do not run the old
|
|
285
|
+
`tick` or `serve` commands during the cutover.
|
|
286
|
+
|
|
287
|
+
### 3. Classify every old reminder
|
|
288
|
+
|
|
289
|
+
The old CLI lists reminders but not events, and its `cancel` leaves earlier
|
|
290
|
+
events in whatever state they had. Classification therefore uses the old
|
|
291
|
+
system's own eligibility rule, not raw event states: an event is **live** only
|
|
292
|
+
if its reminder is still `active`, the event's revision equals the reminder's
|
|
293
|
+
current revision, and its state is `submitting`, `queued` or `uncertain`.
|
|
294
|
+
Anything else is historical: superseded by an update or cancellation, or
|
|
295
|
+
belonging to a reminder that is already `handled`, `cancelled` or `expired`.
|
|
296
|
+
|
|
297
|
+
The operator supplies the metadata with a read-only query that selects no
|
|
298
|
+
title or context:
|
|
299
|
+
|
|
300
|
+
```sh
|
|
301
|
+
sqlite3 -readonly /path/to/old/ledger.sqlite "
|
|
302
|
+
SELECT r.id, r.revision, r.state,
|
|
303
|
+
datetime(r.due, 'unixepoch'), datetime(r.expires, 'unixepoch'),
|
|
304
|
+
e.id, e.revision, e.state
|
|
305
|
+
FROM self_reminders r LEFT JOIN self_events e
|
|
306
|
+
ON e.reminder_id = r.id AND e.revision = r.revision
|
|
307
|
+
ORDER BY r.due, r.id"
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Each old reminder falls into exactly one row:
|
|
311
|
+
|
|
312
|
+
| Old reminder (current revision) | Meaning | Action |
|
|
313
|
+
| --- | --- | --- |
|
|
314
|
+
| `handled`, `cancelled` or `expired` | finished; its events are historical | nothing |
|
|
315
|
+
| `active`, `expires` already passed | lapsed while fenced; the old worker would expire it | old `cancel`, nothing to migrate |
|
|
316
|
+
| `active`, due in the future, no event | not yet fired | **migrate** (step 4), then old `cancel` (step 5) |
|
|
317
|
+
| `active`, already due, no event or event `pending` | due, never submitted | **decide**: migrate to a new future time, or old `cancel`; never both |
|
|
318
|
+
| `active`, event `submitting`, `queued` or `uncertain` | live: may already have reached the agent | **hold**: check the conversation and your own records. If handled and still inside its window, old `complete`. Otherwise old `cancel`, which makes the event historical, and create a new reminder only if one is still useful. Never re-create the old event as-is |
|
|
319
|
+
| `active`, event `handled`, `failed` or `invalidated` | finished for this revision | old `cancel` |
|
|
320
|
+
|
|
321
|
+
**Stop condition:** do not continue to step 6 while any old reminder is still
|
|
322
|
+
`active`. When every row above has been applied, nothing is active and no
|
|
323
|
+
event is live.
|
|
324
|
+
|
|
325
|
+
### 4. Re-create the reminders that migrate
|
|
326
|
+
|
|
327
|
+
For each reminder marked *migrate*, the agent calls `fleet_reminder_create` with:
|
|
328
|
+
|
|
329
|
+
- `request_key` `legacy:<old id>:r<old revision>`;
|
|
330
|
+
- the same title, with the old `context` as `note`;
|
|
331
|
+
- the same `local_time`, `timezone` and `fold`;
|
|
332
|
+
- the old window (`expires − due`) as `late_window_seconds`.
|
|
333
|
+
|
|
334
|
+
The key makes this step safe to repeat. A reminder whose time has meanwhile
|
|
335
|
+
passed is refused as not in the future. It is then a *decide* row: pick a new
|
|
336
|
+
time, using `request_key` `legacy:<old id>:r<old revision>:retimed`, or let it
|
|
337
|
+
lapse.
|
|
338
|
+
|
|
339
|
+
### 5. Verify, then retire the old entries
|
|
340
|
+
|
|
341
|
+
`fleet_reminder_list` shows exactly one `legacy:` reminder per migrated old id.
|
|
342
|
+
The agent then cancels each migrated old reminder with the old `cancel` (`id`,
|
|
343
|
+
`expected_revision`). Afterwards the old `list` shows no `active` reminders and
|
|
344
|
+
no unsettled events.
|
|
345
|
+
|
|
346
|
+
### 6. Remove the old service
|
|
347
|
+
|
|
348
|
+
Only after step 5 is verified, the operator removes the user unit and the
|
|
349
|
+
worker's config (it is already disabled and stopped). Keep or delete the old
|
|
350
|
+
ledger according to the owner's retention policy; never point Fleet at it.
|
|
351
|
+
|
|
352
|
+
### Rollback
|
|
353
|
+
|
|
354
|
+
Rollback is a reconciliation, not a restart. While the old unit stays disabled,
|
|
355
|
+
the agent goes through each `legacy:` Fleet reminder:
|
|
356
|
+
|
|
357
|
+
| Fleet reminder state | Action before the old producer may run again |
|
|
358
|
+
| --- | --- |
|
|
359
|
+
| open, no event or event `pending` | First check the old reminder named by the key (`legacy:<old id>:…`). Only if it is still `active` in the old system, `fleet_reminder_cancel` the Fleet copy. If the old one is no longer active, the Fleet copy is the only schedule: keep it |
|
|
360
|
+
| event `dispatched` or `uncertain`, or `acknowledged` | the wake already happened in Fleet: **cancel the old reminder** so it cannot fire again, and keep the Fleet record |
|
|
361
|
+
| `cancelled` or `expired` | nothing; make sure the old reminder is not active either unless that is intended |
|
|
362
|
+
|
|
363
|
+
Only when every `legacy:` reminder has been reconciled may the operator restore
|
|
364
|
+
the unit to its recorded prior state from the recorded unit file, for example
|
|
365
|
+
`systemctl --user enable --now /recorded/FragmentPath/self-reminders-Name.service`
|
|
366
|
+
if it was enabled and active. Never have both producers active for the same
|
|
367
|
+
reminder.
|
|
368
|
+
|
|
369
|
+
### Instructions to update
|
|
370
|
+
|
|
371
|
+
Remove instructions that tell the agent to run the worker script, and replace
|
|
372
|
+
them with: "Use the `fleet_reminder_*` tools to schedule wakes for yourself. A
|
|
373
|
+
due wake is an internal event: inspect it, decide, then acknowledge it. Message
|
|
374
|
+
anyone only through your normal configured channels."
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Task Progress and To review
|
|
2
|
+
|
|
3
|
+
Every task can carry two optional sections next to its description. Tasks created
|
|
4
|
+
before this feature, or that never use it, have neither and behave as before.
|
|
5
|
+
|
|
6
|
+
- **Progress** is an append-only, chronological milestone log: free-form text
|
|
7
|
+
entries, each with a stable ID, the time it was recorded and its author. It is
|
|
8
|
+
for significant verified milestones (root cause found, PR opened with its link,
|
|
9
|
+
a measured result with its honest scope, final deliverable ready), not for room
|
|
10
|
+
chat, routine status, handoffs or ordinary review rounds. Entries cannot be
|
|
11
|
+
edited or removed.
|
|
12
|
+
- **To review** is the self-contained package the Owner reviews before deciding
|
|
13
|
+
on the task: Markdown plus retained files. It should let the Owner review
|
|
14
|
+
without reading the room or the task description: concise outcome, clickable PR
|
|
15
|
+
and specification links, attached documents, validation and required-CI results
|
|
16
|
+
for the exact heads, the independent verdict where one applies, material limits
|
|
17
|
+
and any Owner decision. Research and document tasks attach their documents and
|
|
18
|
+
need no PR.
|
|
19
|
+
|
|
20
|
+
The web App shows both as compact **Progress** and **To review** buttons with
|
|
21
|
+
counts on the task screen, each opening its own view. Review links use the same
|
|
22
|
+
safe Markdown and link rules as the task description.
|
|
23
|
+
|
|
24
|
+
## Who writes them
|
|
25
|
+
|
|
26
|
+
The packaged default roles divide the work so milestones are not duplicated:
|
|
27
|
+
|
|
28
|
+
| Role | Progress | To review |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| LocalCoordinator | Default writer: appends significant verified milestones during room turns it already takes. Its 15-minute continuity pass never writes Progress. | Makes sure members prepare the package before a Review handoff; hands it to the Fleet Coordinator. |
|
|
31
|
+
| Developer, Engineer | Not by default. | Prepare and keep the package current before reporting completion or asking for Review. |
|
|
32
|
+
| Critic | Not by default. | Check that the package matches what was verified; withhold sign-off while it is missing, stale or misleading. |
|
|
33
|
+
| Coordinator (Fleet Coordinator) | Not by default. | Before `task review`, check that the package exists and attaches the original description; if not, ask the room to complete it instead of writing it. Then replace the description with only the PR links (or deliverable links when there are no PRs). Finish only when the Owner accepts or asks. |
|
|
34
|
+
|
|
35
|
+
This is default instruction policy, not an access rule: any agent bound to the
|
|
36
|
+
task, and the local operator, can use the surfaces below. Preparing a package
|
|
37
|
+
grants no lifecycle authority. A role moves a task to Review only when its
|
|
38
|
+
instructions grant that; otherwise it hands the complete package to its
|
|
39
|
+
authorized coordinator. Nothing here merges, deploys or marks a task done.
|
|
40
|
+
|
|
41
|
+
At Review, the task description and the To review package have separate jobs.
|
|
42
|
+
The description is replaced with only the clickable Markdown PR links, one per
|
|
43
|
+
line, with no status or evidence. A research or document task without PRs links
|
|
44
|
+
its actual deliverables instead; it never invents a PR. The package holds everything the Owner needs
|
|
45
|
+
to review, including the original task description as an attached file. Package
|
|
46
|
+
authors save and attach that file before the handoff, the Critic checks it, and
|
|
47
|
+
the Coordinator replaces the description only once the package has it.
|
|
48
|
+
|
|
49
|
+
Fresh installations get these instructions with preset revision 12. An existing
|
|
50
|
+
configuration keeps its installed copies until you run
|
|
51
|
+
`ours-fleet migrate-role-defaults -c FILE` (a zero-write plan) and then with
|
|
52
|
+
`--write`: untouched revision-11 copies of the Developer, Critic, Engineer,
|
|
53
|
+
LocalCoordinator and Coordinator roles and the LocalCoordinator Agent Template
|
|
54
|
+
adopt the new text, and edited copies are preserved byte-for-byte. Running
|
|
55
|
+
agents keep the instructions they started with until they are restarted.
|
|
56
|
+
|
|
57
|
+
## Agent tools
|
|
58
|
+
|
|
59
|
+
Every managed agent launched for a task gets these tools on its own MCP endpoint.
|
|
60
|
+
The task and the author come from the agent's supervisor launch records, never from
|
|
61
|
+
tool arguments, so an agent can only read and write the task it belongs to. An
|
|
62
|
+
agent that is a listed task member must match that member's identity CID.
|
|
63
|
+
|
|
64
|
+
| Tool | Purpose |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| `fleet_task_progress_list` | Read the log oldest first, in pages; pass `after` = the previous page's `next_after`. |
|
|
67
|
+
| `fleet_task_progress_append` | Append one entry (`text`, optional `request_key`). |
|
|
68
|
+
| `fleet_task_review_show` | Read the package Markdown and file list. |
|
|
69
|
+
| `fleet_task_review_set` | Replace the Markdown; pass the Markdown you last read as `expected_markdown` (`""` when empty). |
|
|
70
|
+
| `fleet_task_review_detach` | Remove one file by `artifact_id`. |
|
|
71
|
+
|
|
72
|
+
Files are attached with the CLI below. It runs in the agent's own process, so the
|
|
73
|
+
harness's command approval and sandbox decide what it may read.
|
|
74
|
+
|
|
75
|
+
## CLI
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
ours-fleet task progress TASK [--json]
|
|
79
|
+
ours-fleet task progress TASK --text "PR opened: https://..." [--request-key KEY]
|
|
80
|
+
ours-fleet task progress TASK --text-file milestone.md [--request-key KEY]
|
|
81
|
+
ours-fleet task review-package TASK [--json]
|
|
82
|
+
ours-fleet task review-package TASK --markdown-file review.md
|
|
83
|
+
ours-fleet task review-package TASK --attach docs/spec.md [--request-key KEY]
|
|
84
|
+
ours-fleet task review-package TASK --detach ARTIFACT_ID
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Run inside a managed agent, the supervisor-verified caller is recorded as the
|
|
88
|
+
author (with its identity CID); otherwise the author is the local operator.
|
|
89
|
+
`--text`, `--text-file`, `--markdown`, `--markdown-file` and `--attach` values are
|
|
90
|
+
redacted from the supervisor's command ledger. `--markdown-file` replaces the
|
|
91
|
+
Markdown current at the time of the call; use `fleet_task_review_set` when a
|
|
92
|
+
concurrent change must be refused.
|
|
93
|
+
|
|
94
|
+
## HTTP API
|
|
95
|
+
|
|
96
|
+
Authenticated like the rest of `/api/v1`; writes need the CSRF token or a
|
|
97
|
+
workspace-device bearer. `GET /api/v1/meta` reports API minor version 1.
|
|
98
|
+
|
|
99
|
+
| Route | Result |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| `GET /tasks`, `GET /tasks/:id` and other task payloads | `progress_count` and `review: {has_markdown, artifact_count, revision, updated_at?}`; `revision` grows with every package change (0 without a package). Bodies are not inlined. |
|
|
102
|
+
| `GET /tasks/:id/progress` | `{progress: [{id, at, author, text}]}`, oldest first. |
|
|
103
|
+
| `POST /tasks/:id/progress` | `{text, requestKey?}` (or an `Idempotency-Key` header): 201 new, 200 replay, 409 conflicting replay. |
|
|
104
|
+
| `GET /tasks/:id/review` | `{review: {markdown, updated_at, updated_by, artifacts: [{id, name, mime, size, sha256, added_at, added_by}]}}` or `{review: null}`. |
|
|
105
|
+
| `PUT /tasks/:id/review` | `{markdown, expectedMarkdown}`; 409 when the Markdown changed meanwhile. |
|
|
106
|
+
| `GET /tasks/:id/review/artifacts/:artifactId` | The retained bytes as `application/octet-stream` attachment with `Content-Security-Policy: default-src 'none'; sandbox`, `nosniff` and `no-store`. Another task's artifact ID is 404. |
|
|
107
|
+
|
|
108
|
+
The HTTP API has no upload route: the browser never submits a file path.
|
|
109
|
+
|
|
110
|
+
## Limits, retries and concurrency
|
|
111
|
+
|
|
112
|
+
- Progress text: 1-4000 characters, kept exactly as written; whitespace-only text
|
|
113
|
+
is rejected. At most 200 entries per task.
|
|
114
|
+
- Review Markdown: up to 50,000 characters. At most 20 files of 20 MiB each per
|
|
115
|
+
task, and 200 MiB stored per task including unreferenced copies.
|
|
116
|
+
- Every change is a read-modify-write under the task's cross-process lock, so
|
|
117
|
+
concurrent appends and attachments are never lost.
|
|
118
|
+
- `request_key` (1-128 of letters, digits, `.`, `_`, `:` and `-`) makes a retry
|
|
119
|
+
safe. Keys are scoped to the author: an agent by its identity CID (the same
|
|
120
|
+
through MCP and the CLI), or by role name when no CID is known; the operator by
|
|
121
|
+
surface. Repeating a key with the same text, or the same file name and content,
|
|
122
|
+
returns the original; different content is a conflict. A keyed file retry is
|
|
123
|
+
compared by content without storing another copy. Without a key, an interrupted
|
|
124
|
+
call may or may not have taken effect: read the log or package before retrying.
|
|
125
|
+
- Writes are refused once deletion is accepted or a terminal settlement is pending.
|
|
126
|
+
|
|
127
|
+
## Files and their lifetime
|
|
128
|
+
|
|
129
|
+
An attached file must be one regular, singly linked file inside the task's owned
|
|
130
|
+
workspace. Each path component below the workspace is opened without following
|
|
131
|
+
symlinks, so symlinks, hard links, any `..` component and paths outside the
|
|
132
|
+
workspace (including sibling folders with a common name prefix) are refused.
|
|
133
|
+
The file must not change while it is copied. The copy goes to Fleet's private
|
|
134
|
+
store at `.ours-fleet/task-review-artifacts/<task-id>/`, outside the
|
|
135
|
+
agent-writable workspace, with owner-only permissions. It is made durable before
|
|
136
|
+
the package references it and is integrity-checked (size and SHA-256) on every
|
|
137
|
+
download. Nothing is uploaded automatically.
|
|
138
|
+
|
|
139
|
+
Retained files survive later edits or deletion of the workspace copy, review,
|
|
140
|
+
return to work and service restarts. Detaching removes a file. Deleting the task
|
|
141
|
+
removes all of them together with the workspace. Copies left by an interrupted
|
|
142
|
+
attach are removed after ten minutes by the next attach and count toward the
|
|
143
|
+
quota until then.
|