@cluesmith/codev 3.2.3 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard-dist/assets/index-BZRTEMtH.css +32 -0
- package/dashboard-dist/assets/{index-BZ1x7x1X.js → index-JCbkpAcV.js} +33 -33
- package/dashboard-dist/assets/index-JCbkpAcV.js.map +1 -0
- package/dashboard-dist/index.html +2 -2
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +173 -0
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/attach.js +2 -2
- package/dist/agent-farm/commands/attach.js.map +1 -1
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
- package/dist/agent-farm/commands/cleanup.js +16 -0
- package/dist/agent-farm/commands/cleanup.js.map +1 -1
- package/dist/agent-farm/commands/inbox.d.ts +42 -0
- package/dist/agent-farm/commands/inbox.d.ts.map +1 -0
- package/dist/agent-farm/commands/inbox.js +129 -0
- package/dist/agent-farm/commands/inbox.js.map +1 -0
- package/dist/agent-farm/commands/interrupt.d.ts +20 -0
- package/dist/agent-farm/commands/interrupt.d.ts.map +1 -0
- package/dist/agent-farm/commands/interrupt.js +65 -0
- package/dist/agent-farm/commands/interrupt.js.map +1 -0
- package/dist/agent-farm/commands/reset/constants.d.ts +52 -0
- package/dist/agent-farm/commands/reset/constants.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/constants.js +52 -0
- package/dist/agent-farm/commands/reset/constants.js.map +1 -0
- package/dist/agent-farm/commands/reset/context.d.ts +230 -0
- package/dist/agent-farm/commands/reset/context.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/context.js +428 -0
- package/dist/agent-farm/commands/reset/context.js.map +1 -0
- package/dist/agent-farm/commands/reset/index.d.ts +192 -0
- package/dist/agent-farm/commands/reset/index.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/index.js +488 -0
- package/dist/agent-farm/commands/reset/index.js.map +1 -0
- package/dist/agent-farm/commands/reset/receipt.d.ts +97 -0
- package/dist/agent-farm/commands/reset/receipt.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/receipt.js +149 -0
- package/dist/agent-farm/commands/reset/receipt.js.map +1 -0
- package/dist/agent-farm/commands/reset/reorient.d.ts +117 -0
- package/dist/agent-farm/commands/reset/reorient.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset/reorient.js +313 -0
- package/dist/agent-farm/commands/reset/reorient.js.map +1 -0
- package/dist/agent-farm/commands/reset.d.ts +19 -0
- package/dist/agent-farm/commands/reset.d.ts.map +1 -0
- package/dist/agent-farm/commands/reset.js +292 -0
- package/dist/agent-farm/commands/reset.js.map +1 -0
- package/dist/agent-farm/commands/send.d.ts +2 -2
- package/dist/agent-farm/commands/send.d.ts.map +1 -1
- package/dist/agent-farm/commands/send.js +52 -11
- package/dist/agent-farm/commands/send.js.map +1 -1
- package/dist/agent-farm/commands/setup.d.ts +4 -1
- package/dist/agent-farm/commands/setup.d.ts.map +1 -1
- package/dist/agent-farm/commands/setup.js +8 -4
- package/dist/agent-farm/commands/setup.js.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.d.ts +116 -6
- package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.js +345 -74
- package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +13 -1
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +105 -9
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/commands/tower-sweep-husks.d.ts +6 -0
- package/dist/agent-farm/commands/tower-sweep-husks.d.ts.map +1 -0
- package/dist/agent-farm/commands/tower-sweep-husks.js +77 -0
- package/dist/agent-farm/commands/tower-sweep-husks.js.map +1 -0
- package/dist/agent-farm/commands/tower.d.ts.map +1 -1
- package/dist/agent-farm/commands/tower.js +34 -0
- package/dist/agent-farm/commands/tower.js.map +1 -1
- package/dist/agent-farm/commands/whoami.d.ts +65 -0
- package/dist/agent-farm/commands/whoami.d.ts.map +1 -0
- package/dist/agent-farm/commands/whoami.js +196 -0
- package/dist/agent-farm/commands/whoami.js.map +1 -0
- package/dist/agent-farm/db/index.d.ts +1 -1
- package/dist/agent-farm/db/index.d.ts.map +1 -1
- package/dist/agent-farm/db/index.js +80 -1
- package/dist/agent-farm/db/index.js.map +1 -1
- package/dist/agent-farm/db/mailbox.d.ts +222 -0
- package/dist/agent-farm/db/mailbox.d.ts.map +1 -0
- package/dist/agent-farm/db/mailbox.js +304 -0
- package/dist/agent-farm/db/mailbox.js.map +1 -0
- package/dist/agent-farm/db/schema.d.ts +1 -1
- package/dist/agent-farm/db/schema.d.ts.map +1 -1
- package/dist/agent-farm/db/schema.js +35 -0
- package/dist/agent-farm/db/schema.js.map +1 -1
- package/dist/agent-farm/db/types.d.ts +45 -0
- package/dist/agent-farm/db/types.d.ts.map +1 -1
- package/dist/agent-farm/db/types.js.map +1 -1
- package/dist/agent-farm/lib/builder-lookup.d.ts +1 -1
- package/dist/agent-farm/lib/builder-lookup.js +2 -2
- package/dist/agent-farm/lib/builder-lookup.js.map +1 -1
- package/dist/agent-farm/lib/reconnect-backoff.d.ts +54 -0
- package/dist/agent-farm/lib/reconnect-backoff.d.ts.map +1 -0
- package/dist/agent-farm/lib/reconnect-backoff.js +47 -0
- package/dist/agent-farm/lib/reconnect-backoff.js.map +1 -0
- package/dist/agent-farm/lib/tower-client.d.ts +16 -6
- package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
- package/dist/agent-farm/lib/tower-client.js +37 -6
- package/dist/agent-farm/lib/tower-client.js.map +1 -1
- package/dist/agent-farm/lib/tunnel-client.d.ts +69 -1
- package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -1
- package/dist/agent-farm/lib/tunnel-client.js +218 -27
- package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
- package/dist/agent-farm/servers/architect-session-holder.d.ts +133 -0
- package/dist/agent-farm/servers/architect-session-holder.d.ts.map +1 -0
- package/dist/agent-farm/servers/architect-session-holder.js +268 -0
- package/dist/agent-farm/servers/architect-session-holder.js.map +1 -0
- package/dist/agent-farm/servers/cron-delivery.d.ts +72 -0
- package/dist/agent-farm/servers/cron-delivery.d.ts.map +1 -0
- package/dist/agent-farm/servers/cron-delivery.js +80 -0
- package/dist/agent-farm/servers/cron-delivery.js.map +1 -0
- package/dist/agent-farm/servers/delayed-send.d.ts +85 -0
- package/dist/agent-farm/servers/delayed-send.d.ts.map +1 -0
- package/dist/agent-farm/servers/delayed-send.js +165 -0
- package/dist/agent-farm/servers/delayed-send.js.map +1 -0
- package/dist/agent-farm/servers/gate-profiles.d.ts +67 -0
- package/dist/agent-farm/servers/gate-profiles.d.ts.map +1 -0
- package/dist/agent-farm/servers/gate-profiles.js +113 -0
- package/dist/agent-farm/servers/gate-profiles.js.map +1 -0
- package/dist/agent-farm/servers/mailbox-delivery.d.ts +370 -0
- package/dist/agent-farm/servers/mailbox-delivery.d.ts.map +1 -0
- package/dist/agent-farm/servers/mailbox-delivery.js +617 -0
- package/dist/agent-farm/servers/mailbox-delivery.js.map +1 -0
- package/dist/agent-farm/servers/mailbox-wiring.d.ts +125 -0
- package/dist/agent-farm/servers/mailbox-wiring.d.ts.map +1 -0
- package/dist/agent-farm/servers/mailbox-wiring.js +425 -0
- package/dist/agent-farm/servers/mailbox-wiring.js.map +1 -0
- package/dist/agent-farm/servers/message-write.d.ts +53 -1
- package/dist/agent-farm/servers/message-write.d.ts.map +1 -1
- package/dist/agent-farm/servers/message-write.js +63 -0
- package/dist/agent-farm/servers/message-write.js.map +1 -1
- package/dist/agent-farm/servers/overview.d.ts.map +1 -1
- package/dist/agent-farm/servers/overview.js +23 -4
- package/dist/agent-farm/servers/overview.js.map +1 -1
- package/dist/agent-farm/servers/process-census.d.ts +41 -0
- package/dist/agent-farm/servers/process-census.d.ts.map +1 -0
- package/dist/agent-farm/servers/process-census.js +62 -0
- package/dist/agent-farm/servers/process-census.js.map +1 -0
- package/dist/agent-farm/servers/render-gate.d.ts +141 -0
- package/dist/agent-farm/servers/render-gate.d.ts.map +1 -0
- package/dist/agent-farm/servers/render-gate.js +251 -0
- package/dist/agent-farm/servers/render-gate.js.map +1 -0
- package/dist/agent-farm/servers/session-log-sweep.d.ts +93 -0
- package/dist/agent-farm/servers/session-log-sweep.d.ts.map +1 -0
- package/dist/agent-farm/servers/session-log-sweep.js +165 -0
- package/dist/agent-farm/servers/session-log-sweep.js.map +1 -0
- package/dist/agent-farm/servers/session-submit.d.ts +90 -0
- package/dist/agent-farm/servers/session-submit.d.ts.map +1 -0
- package/dist/agent-farm/servers/session-submit.js +127 -0
- package/dist/agent-farm/servers/session-submit.js.map +1 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.d.ts +87 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.d.ts.map +1 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.js +129 -0
- package/dist/agent-farm/servers/shellper-husk-sweep.js.map +1 -0
- package/dist/agent-farm/servers/tower-cron.d.ts +10 -7
- package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-cron.js +58 -53
- package/dist/agent-farm/servers/tower-cron.js.map +1 -1
- package/dist/agent-farm/servers/tower-instances.d.ts +14 -2
- package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-instances.js +128 -19
- package/dist/agent-farm/servers/tower-instances.js.map +1 -1
- package/dist/agent-farm/servers/tower-messages.d.ts +38 -1
- package/dist/agent-farm/servers/tower-messages.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-messages.js +106 -1
- package/dist/agent-farm/servers/tower-messages.js.map +1 -1
- package/dist/agent-farm/servers/tower-routes.d.ts +16 -4
- package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-routes.js +807 -99
- package/dist/agent-farm/servers/tower-routes.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +241 -15
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.d.ts +17 -2
- package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.js +139 -124
- package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
- package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-tunnel.js +63 -4
- package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
- package/dist/agent-farm/servers/tower-types.d.ts +2 -1
- package/dist/agent-farm/servers/tower-types.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-utils.d.ts +99 -1
- package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-utils.js +242 -6
- package/dist/agent-farm/servers/tower-utils.js.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.js +6 -21
- package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
- package/dist/agent-farm/servers/write-queue.d.ts +35 -0
- package/dist/agent-farm/servers/write-queue.d.ts.map +1 -0
- package/dist/agent-farm/servers/write-queue.js +56 -0
- package/dist/agent-farm/servers/write-queue.js.map +1 -0
- package/dist/agent-farm/state.d.ts +6 -1
- package/dist/agent-farm/state.d.ts.map +1 -1
- package/dist/agent-farm/state.js +5 -2
- package/dist/agent-farm/state.js.map +1 -1
- package/dist/agent-farm/types.d.ts +39 -0
- package/dist/agent-farm/types.d.ts.map +1 -1
- package/dist/agent-farm/utils/agent-names.d.ts +2 -2
- package/dist/agent-farm/utils/agent-names.d.ts.map +1 -1
- package/dist/agent-farm/utils/agent-names.js +3 -3
- package/dist/agent-farm/utils/agent-names.js.map +1 -1
- package/dist/agent-farm/utils/architect-name.d.ts +2 -2
- package/dist/agent-farm/utils/architect-name.d.ts.map +1 -1
- package/dist/agent-farm/utils/architect-name.js +3 -3
- package/dist/agent-farm/utils/architect-name.js.map +1 -1
- package/dist/agent-farm/utils/config.d.ts +13 -0
- package/dist/agent-farm/utils/config.d.ts.map +1 -1
- package/dist/agent-farm/utils/config.js +33 -1
- package/dist/agent-farm/utils/config.js.map +1 -1
- package/dist/agent-farm/utils/harness.d.ts +103 -7
- package/dist/agent-farm/utils/harness.d.ts.map +1 -1
- package/dist/agent-farm/utils/harness.js +126 -19
- package/dist/agent-farm/utils/harness.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -32
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts +3 -2
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +7 -6
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/agy-auth-cache.d.ts +97 -0
- package/dist/commands/consult/agy-auth-cache.d.ts.map +1 -0
- package/dist/commands/consult/agy-auth-cache.js +320 -0
- package/dist/commands/consult/agy-auth-cache.js.map +1 -0
- package/dist/commands/consult/cli-options.d.ts +34 -0
- package/dist/commands/consult/cli-options.d.ts.map +1 -0
- package/dist/commands/consult/cli-options.js +67 -0
- package/dist/commands/consult/cli-options.js.map +1 -0
- package/dist/commands/consult/index.d.ts +56 -2
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +330 -27
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/consult/metrics.d.ts +42 -0
- package/dist/commands/consult/metrics.d.ts.map +1 -1
- package/dist/commands/consult/metrics.js +129 -9
- package/dist/commands/consult/metrics.js.map +1 -1
- package/dist/commands/doctor.d.ts +28 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +258 -22
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +3 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +7 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/checks.d.ts +23 -0
- package/dist/commands/porch/checks.d.ts.map +1 -1
- package/dist/commands/porch/checks.js +60 -0
- package/dist/commands/porch/checks.js.map +1 -1
- package/dist/commands/porch/config.d.ts +20 -0
- package/dist/commands/porch/config.d.ts.map +1 -1
- package/dist/commands/porch/config.js +20 -0
- package/dist/commands/porch/config.js.map +1 -1
- package/dist/commands/porch/index.d.ts.map +1 -1
- package/dist/commands/porch/index.js +32 -36
- package/dist/commands/porch/index.js.map +1 -1
- package/dist/commands/porch/next.d.ts.map +1 -1
- package/dist/commands/porch/next.js +2 -41
- package/dist/commands/porch/next.js.map +1 -1
- package/dist/commands/update.d.ts +4 -4
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +9 -11
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/config.d.ts +70 -3
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +67 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/consult-lanes.d.ts +149 -0
- package/dist/lib/consult-lanes.d.ts.map +1 -0
- package/dist/lib/consult-lanes.js +360 -0
- package/dist/lib/consult-lanes.js.map +1 -0
- package/dist/lib/default-branch.d.ts +1 -1
- package/dist/lib/default-branch.js +1 -1
- package/dist/lib/github.js +1 -1
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/gitignore.d.ts +25 -2
- package/dist/lib/gitignore.d.ts.map +1 -1
- package/dist/lib/gitignore.js +70 -0
- package/dist/lib/gitignore.js.map +1 -1
- package/dist/lib/migration-backup-audit.d.ts +64 -0
- package/dist/lib/migration-backup-audit.d.ts.map +1 -0
- package/dist/lib/migration-backup-audit.js +145 -0
- package/dist/lib/migration-backup-audit.js.map +1 -0
- package/dist/lib/prompt-behavior-metrics.d.ts +67 -0
- package/dist/lib/prompt-behavior-metrics.d.ts.map +1 -0
- package/dist/lib/prompt-behavior-metrics.js +290 -0
- package/dist/lib/prompt-behavior-metrics.js.map +1 -0
- package/dist/lib/protocol-drift-audit.d.ts +118 -0
- package/dist/lib/protocol-drift-audit.d.ts.map +1 -0
- package/dist/lib/protocol-drift-audit.js +217 -0
- package/dist/lib/protocol-drift-audit.js.map +1 -0
- package/dist/lib/scaffold.d.ts +10 -3
- package/dist/lib/scaffold.d.ts.map +1 -1
- package/dist/lib/scaffold.js +29 -26
- package/dist/lib/scaffold.js.map +1 -1
- package/dist/lib/skeleton.d.ts +22 -1
- package/dist/lib/skeleton.d.ts.map +1 -1
- package/dist/lib/skeleton.js +120 -0
- package/dist/lib/skeleton.js.map +1 -1
- package/dist/lib/test-env.d.ts +74 -0
- package/dist/lib/test-env.d.ts.map +1 -0
- package/dist/lib/test-env.js +92 -0
- package/dist/lib/test-env.js.map +1 -0
- package/dist/terminal/pty-manager.d.ts +9 -0
- package/dist/terminal/pty-manager.d.ts.map +1 -1
- package/dist/terminal/pty-manager.js +32 -6
- package/dist/terminal/pty-manager.js.map +1 -1
- package/dist/terminal/pty-session.d.ts +156 -4
- package/dist/terminal/pty-session.d.ts.map +1 -1
- package/dist/terminal/pty-session.js +307 -42
- package/dist/terminal/pty-session.js.map +1 -1
- package/dist/terminal/ring-buffer.d.ts +39 -6
- package/dist/terminal/ring-buffer.d.ts.map +1 -1
- package/dist/terminal/ring-buffer.js +74 -6
- package/dist/terminal/ring-buffer.js.map +1 -1
- package/dist/terminal/session-manager.d.ts +129 -0
- package/dist/terminal/session-manager.d.ts.map +1 -1
- package/dist/terminal/session-manager.js +337 -44
- package/dist/terminal/session-manager.js.map +1 -1
- package/dist/terminal/session-screen.d.ts +91 -0
- package/dist/terminal/session-screen.d.ts.map +1 -0
- package/dist/terminal/session-screen.js +135 -0
- package/dist/terminal/session-screen.js.map +1 -0
- package/dist/terminal/shellper-client.d.ts +19 -4
- package/dist/terminal/shellper-client.d.ts.map +1 -1
- package/dist/terminal/shellper-client.js +70 -8
- package/dist/terminal/shellper-client.js.map +1 -1
- package/dist/terminal/shellper-main.js +2 -1
- package/dist/terminal/shellper-main.js.map +1 -1
- package/dist/terminal/shellper-process.d.ts +1 -1
- package/dist/terminal/shellper-process.d.ts.map +1 -1
- package/dist/terminal/shellper-process.js +33 -9
- package/dist/terminal/shellper-process.js.map +1 -1
- package/dist/terminal/shellper-protocol.d.ts +40 -2
- package/dist/terminal/shellper-protocol.d.ts.map +1 -1
- package/dist/terminal/shellper-protocol.js +72 -5
- package/dist/terminal/shellper-protocol.js.map +1 -1
- package/dist/terminal/shellper-replay-buffer.d.ts +69 -7
- package/dist/terminal/shellper-replay-buffer.d.ts.map +1 -1
- package/dist/terminal/shellper-replay-buffer.js +167 -31
- package/dist/terminal/shellper-replay-buffer.js.map +1 -1
- package/package.json +11 -9
- package/skeleton/.claude/skills/afx/SKILL.md +27 -1
- package/skeleton/.claude/skills/arch-init/SKILL.md +135 -0
- package/skeleton/.claude/skills/arch-save/SKILL.md +183 -0
- package/skeleton/.claude/skills/codev/SKILL.md +33 -2
- package/skeleton/.claude/skills/runnable-worktrees/SKILL.md +119 -0
- package/skeleton/.codex/skills/afx/SKILL.md +170 -0
- package/skeleton/.codex/skills/arch-init/SKILL.md +135 -0
- package/skeleton/.codex/skills/arch-save/SKILL.md +183 -0
- package/skeleton/.codex/skills/codev/SKILL.md +90 -0
- package/skeleton/.codex/skills/consult/SKILL.md +96 -0
- package/skeleton/.codex/skills/generate-image/SKILL.md +45 -0
- package/skeleton/.codex/skills/porch/SKILL.md +60 -0
- package/skeleton/.codex/skills/runnable-worktrees/SKILL.md +119 -0
- package/skeleton/.codex/skills/update-arch-docs/SKILL.md +132 -0
- package/skeleton/protocols/air/builder-prompt.md +28 -47
- package/skeleton/protocols/air/consult-types/impl-review.md +17 -34
- package/skeleton/protocols/air/consult-types/pr-review.md +14 -37
- package/skeleton/protocols/air/prompts/implement.md +20 -73
- package/skeleton/protocols/air/prompts/pr.md +22 -54
- package/skeleton/protocols/air/protocol.md +40 -71
- package/skeleton/protocols/aspir/builder-prompt.md +29 -66
- package/skeleton/protocols/aspir/consult-types/impl-review.md +17 -44
- package/skeleton/protocols/aspir/consult-types/phase-review.md +17 -44
- package/skeleton/protocols/aspir/consult-types/plan-review.md +14 -38
- package/skeleton/protocols/aspir/consult-types/pr-review.md +13 -39
- package/skeleton/protocols/aspir/consult-types/spec-review.md +13 -33
- package/skeleton/protocols/aspir/prompts/implement.md +27 -196
- package/skeleton/protocols/aspir/prompts/plan.md +21 -85
- package/skeleton/protocols/aspir/prompts/review.md +29 -228
- package/skeleton/protocols/aspir/prompts/specify.md +25 -111
- package/skeleton/protocols/aspir/protocol.json +10 -0
- package/skeleton/protocols/aspir/protocol.md +36 -82
- package/skeleton/protocols/bugfix/builder-prompt.md +23 -45
- package/skeleton/protocols/bugfix/consult-types/impl-review.md +21 -45
- package/skeleton/protocols/bugfix/consult-types/pr-review.md +18 -52
- package/skeleton/protocols/bugfix/prompts/fix.md +16 -61
- package/skeleton/protocols/bugfix/prompts/investigate.md +18 -62
- package/skeleton/protocols/bugfix/prompts/pr.md +22 -57
- package/skeleton/protocols/bugfix/protocol.md +44 -50
- package/skeleton/protocols/experiment/builder-prompt.md +25 -58
- package/skeleton/protocols/experiment/protocol.md +22 -188
- package/skeleton/protocols/experiment/templates/notes.md +11 -71
- package/skeleton/protocols/maintain/builder-prompt.md +24 -45
- package/skeleton/protocols/maintain/consult-types/impl-review.md +17 -44
- package/skeleton/protocols/maintain/consult-types/pr-review.md +13 -39
- package/skeleton/protocols/maintain/prompts/maintain.md +1 -1
- package/skeleton/protocols/maintain/protocol.md +32 -266
- package/skeleton/protocols/maintain/templates/maintenance-run.md +11 -0
- package/skeleton/protocols/pir/builder-prompt.md +30 -64
- package/skeleton/protocols/pir/consult-types/impl-review.md +17 -50
- package/skeleton/protocols/pir/consult-types/pr-review.md +11 -40
- package/skeleton/protocols/pir/prompts/implement.md +1 -2
- package/skeleton/protocols/pir/prompts/plan.md +0 -3
- package/skeleton/protocols/pir/prompts/review.md +1 -1
- package/skeleton/protocols/pir/protocol.md +54 -177
- package/skeleton/protocols/research/builder-prompt.md +27 -58
- package/skeleton/protocols/research/protocol.md +28 -153
- package/skeleton/protocols/spike/builder-prompt.md +30 -48
- package/skeleton/protocols/spike/protocol.md +24 -107
- package/skeleton/protocols/spike/templates/findings.md +9 -39
- package/skeleton/protocols/spir/builder-prompt.md +33 -62
- package/skeleton/protocols/spir/consult-types/impl-review.md +17 -44
- package/skeleton/protocols/spir/consult-types/phase-review.md +17 -44
- package/skeleton/protocols/spir/consult-types/plan-review.md +14 -38
- package/skeleton/protocols/spir/consult-types/pr-review.md +13 -39
- package/skeleton/protocols/spir/consult-types/spec-review.md +13 -33
- package/skeleton/protocols/spir/prompts/implement.md +26 -195
- package/skeleton/protocols/spir/prompts/plan.md +20 -84
- package/skeleton/protocols/spir/prompts/review.md +28 -227
- package/skeleton/protocols/spir/prompts/specify.md +24 -110
- package/skeleton/protocols/spir/protocol.json +10 -0
- package/skeleton/protocols/spir/protocol.md +84 -633
- package/skeleton/protocols/spir/templates/plan.md +28 -147
- package/skeleton/protocols/spir/templates/review.md +21 -80
- package/skeleton/protocols/spir/templates/spec.md +24 -118
- package/skeleton/resources/commands/agent-farm.md +348 -0
- package/skeleton/resources/commands/codev.md +5 -0
- package/skeleton/resources/commands/consult.md +262 -8
- package/skeleton/resources/commands/overview.md +1 -0
- package/skeleton/roles/architect.md +67 -306
- package/skeleton/roles/builder.md +77 -191
- package/skeleton/templates/AGENTS.md +2 -0
- package/skeleton/templates/CLAUDE.md +2 -0
- package/templates/tower.html +39 -2
- package/dashboard-dist/assets/index-BZ1x7x1X.js.map +0 -1
- package/dashboard-dist/assets/index-DB1KBSNE.css +0 -32
- package/dist/agent-farm/servers/send-buffer.d.ts +0 -59
- package/dist/agent-farm/servers/send-buffer.d.ts.map +0 -1
- package/dist/agent-farm/servers/send-buffer.js +0 -103
- package/dist/agent-farm/servers/send-buffer.js.map +0 -1
- package/skeleton/porch/prompts/defend.md +0 -108
- package/skeleton/porch/prompts/diagnose.md +0 -70
- package/skeleton/porch/prompts/evaluate.md +0 -132
- package/skeleton/porch/prompts/fix.md +0 -59
- package/skeleton/porch/prompts/implement.md +0 -88
- package/skeleton/porch/prompts/plan.md +0 -74
- package/skeleton/porch/prompts/pr.md +0 -84
- package/skeleton/porch/prompts/review.md +0 -249
- package/skeleton/porch/prompts/specify.md +0 -53
- package/skeleton/porch/prompts/test.md +0 -63
- package/skeleton/protocols/aspir/templates/plan.md +0 -184
- package/skeleton/protocols/aspir/templates/review.md +0 -120
- package/skeleton/protocols/aspir/templates/spec.md +0 -154
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session submission lock (Spec 1273, verify phase).
|
|
3
|
+
*
|
|
4
|
+
* ## The bug this exists to make impossible
|
|
5
|
+
*
|
|
6
|
+
* `writeMessageToSession` writes text to the PTY and schedules the Enter that
|
|
7
|
+
* submits it **50–80ms later** (`message-write.ts`). The write functions return
|
|
8
|
+
* that completion offset but do not wait for it, and `/api/send` responded as
|
|
9
|
+
* soon as the write was *scheduled*. So an awaited send resolved before its own
|
|
10
|
+
* message had been submitted.
|
|
11
|
+
*
|
|
12
|
+
* In production (`afx reset`, 2026-07-31) that gap swallowed a `/clear`
|
|
13
|
+
* entirely. Reset awaited the raw write of `/clear`, then wrote the
|
|
14
|
+
* re-orientation — landing inside the 50ms window, into the same composer,
|
|
15
|
+
* ahead of the Enter. One Enter then submitted both as a single message
|
|
16
|
+
* beginning `/clear### [ARCHITECT INSTRUCTION...`. The slash command was never
|
|
17
|
+
* executed, the builder's context was never cleared, and every layer reported
|
|
18
|
+
* success.
|
|
19
|
+
*
|
|
20
|
+
* ## Ordering is not atomicity
|
|
21
|
+
*
|
|
22
|
+
* The paced writer already threads a delay offset between consecutive writes, and the
|
|
23
|
+
* mailbox delivery path serialises messages to one agent (`deliverAgentMailSerialized`
|
|
24
|
+
* chains each delivery on the prior one's paced completion). Both fix the *order* in
|
|
25
|
+
* which queued messages reach a session. Neither would have prevented this: the two
|
|
26
|
+
* writes were correctly ordered and still coalesced, because being second is not the
|
|
27
|
+
* same as being separate. What was missing is a guarantee that a submission completes —
|
|
28
|
+
* Enter included — before the next write to that session begins.
|
|
29
|
+
*
|
|
30
|
+
* ## What this provides
|
|
31
|
+
*
|
|
32
|
+
* A promise chain per session key. Each submission waits for the previous one to
|
|
33
|
+
* finish (including its Enter), so concurrent `/api/send` requests to the same
|
|
34
|
+
* terminal cannot interleave in the composer. `await submitToSession(...)` means
|
|
35
|
+
* *submitted*, not *scheduled* — which is what every caller already assumed it
|
|
36
|
+
* meant.
|
|
37
|
+
*
|
|
38
|
+
* Deliberately keyed by session id rather than holding a session object: Tower
|
|
39
|
+
* re-fetches sessions by id, and a lock that outlived its session would pin a
|
|
40
|
+
* dead reference.
|
|
41
|
+
*
|
|
42
|
+
* ## Exactly what it covers — this is NOT blanket per-session atomicity
|
|
43
|
+
*
|
|
44
|
+
* A lock only serialises writers that take it. Currently that is the `escape`
|
|
45
|
+
* and `interrupt` paths of `/api/send`. Every other PTY writer still writes
|
|
46
|
+
* directly, and it is worth being precise about why:
|
|
47
|
+
*
|
|
48
|
+
* - The mailbox delivery path (`deliverAgentMailSerialized`, Spec 1313) — every
|
|
49
|
+
* normal `/api/send` AND every cron notification (Phase 6 rerouted cron here; the
|
|
50
|
+
* old blind `writeMessageToSession` is gone). NOT covered by this lock, and does not
|
|
51
|
+
* need it: it runs its OWN per-agent write serializer that completion-chains each
|
|
52
|
+
* delivery on the prior one's paced write (text + Enter), so two mailbox deliveries
|
|
53
|
+
* to one agent cannot interleave. That is a disjoint lock from this per-session one,
|
|
54
|
+
* so a mailbox delivery is not serialised against a concurrent `escape`/`interrupt`
|
|
55
|
+
* here — but a normal mailbox delivery only ever writes onto a render-gate-verified
|
|
56
|
+
* empty prompt, and `interrupt` is the explicit gate-bypassing human action (see
|
|
57
|
+
* tower-routes.ts), so that residual cross-path race is an accepted, documented
|
|
58
|
+
* boundary, not a regression this lock must close.
|
|
59
|
+
* - `POST /api/terminals/:id/write` — NOT covered. It is a raw passthrough
|
|
60
|
+
* with no Enter semantics of its own.
|
|
61
|
+
* - `tower-websocket.ts` keystrokes and the shellper frame relay — DELIBERATELY
|
|
62
|
+
* not covered. That is a human typing into their own terminal; serialising
|
|
63
|
+
* it behind an agent's message would make the UI feel stuck, and the human
|
|
64
|
+
* is the composer's owner.
|
|
65
|
+
*
|
|
66
|
+
* So the guarantee is: **two lock-taking `/api/send` submissions (escape/interrupt)
|
|
67
|
+
* to one session cannot interleave**, which is the failure that reached production.
|
|
68
|
+
* Anything stronger requires the remaining writers to take the lock too.
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* Tail of the in-flight submission chain per session.
|
|
72
|
+
*
|
|
73
|
+
* A session's entry is deleted once its chain drains, so this cannot grow
|
|
74
|
+
* without bound across a long-lived Tower.
|
|
75
|
+
*/
|
|
76
|
+
const chains = new Map();
|
|
77
|
+
const realClock = {
|
|
78
|
+
sleep: (ms) => new Promise(resolve => setTimeout(resolve, ms)),
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Run a write against a session so that it completes before any other
|
|
82
|
+
* submission to the same session begins.
|
|
83
|
+
*
|
|
84
|
+
* @param sessionId terminal/session id — the lock's granularity
|
|
85
|
+
* @param write performs the write; returns ms from now until the final
|
|
86
|
+
* keystroke (the Enter) has been written. This is exactly what
|
|
87
|
+
* `writeMessageToSession` / `writeEscapeToSession` already
|
|
88
|
+
* return, so callers pass them through unchanged.
|
|
89
|
+
* @returns resolves once the submission is complete
|
|
90
|
+
*/
|
|
91
|
+
export function submitToSession(sessionId, write, clock = realClock) {
|
|
92
|
+
const previous = chains.get(sessionId) ?? Promise.resolve();
|
|
93
|
+
const current = previous
|
|
94
|
+
// A failed predecessor must not poison the chain — the next submission is a
|
|
95
|
+
// separate message and is still entitled to run.
|
|
96
|
+
.catch(() => undefined)
|
|
97
|
+
.then(async () => {
|
|
98
|
+
const completesInMs = write();
|
|
99
|
+
// Wait out the scheduled Enter. Zero means the write was fully synchronous
|
|
100
|
+
// (`noEnter`), so there is nothing pending to wait for.
|
|
101
|
+
if (completesInMs > 0)
|
|
102
|
+
await clock.sleep(completesInMs);
|
|
103
|
+
});
|
|
104
|
+
chains.set(sessionId, current);
|
|
105
|
+
// Drop the entry once this is the last submission in flight, so the map does
|
|
106
|
+
// not accumulate one promise per session for the life of the process.
|
|
107
|
+
//
|
|
108
|
+
// The rejection is swallowed HERE and re-surfaced only through the returned
|
|
109
|
+
// promise: without the catch, this bookkeeping branch would raise an
|
|
110
|
+
// unhandled rejection for any failed write, even when the caller handled it.
|
|
111
|
+
void current
|
|
112
|
+
.then(() => undefined, () => undefined)
|
|
113
|
+
.then(() => {
|
|
114
|
+
if (chains.get(sessionId) === current)
|
|
115
|
+
chains.delete(sessionId);
|
|
116
|
+
});
|
|
117
|
+
return current;
|
|
118
|
+
}
|
|
119
|
+
/** Number of sessions with a submission in flight. Test/observability only. */
|
|
120
|
+
export function pendingSubmissionSessions() {
|
|
121
|
+
return chains.size;
|
|
122
|
+
}
|
|
123
|
+
/** Drop all chains. Test-only; a live Tower should let them drain. */
|
|
124
|
+
export function resetSubmissionChains() {
|
|
125
|
+
chains.clear();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=session-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-submit.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/session-submit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;AAOhD,MAAM,SAAS,GAAgB;IAC7B,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;CACvE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,KAAmB,EACnB,QAAqB,SAAS;IAE9B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAE5D,MAAM,OAAO,GAAG,QAAQ;QACtB,4EAA4E;QAC5E,iDAAiD;SAChD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SACtB,IAAI,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,aAAa,GAAG,KAAK,EAAE,CAAC;QAC9B,2EAA2E;QAC3E,wDAAwD;QACxD,IAAI,aAAa,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEL,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE/B,6EAA6E;IAC7E,sEAAsE;IACtE,EAAE;IACF,4EAA4E;IAC5E,qEAAqE;IACrE,6EAA6E;IAC7E,KAAK,OAAO;SACT,IAAI,CACH,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB;SACA,IAAI,CAAC,GAAG,EAAE;QACT,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,qBAAqB;IACnC,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issue #1227: a stricter, second-pass reap for shellper "husks" — a shellper
|
|
3
|
+
* whose PTY child has exited (deliberate lingering behavior from #905/#1198 so
|
|
4
|
+
* a reconnect can replay history) but which `killOrphanedShellpers`
|
|
5
|
+
* (`../../terminal/session-manager.ts`) can never reap, because that function
|
|
6
|
+
* unconditionally protects any shellper whose Unix socket still responds.
|
|
7
|
+
*
|
|
8
|
+
* A husk still answers its socket, so it survives `killOrphanedShellpers`
|
|
9
|
+
* forever. The predicate here is stricter and orthogonal: a shellper is a husk
|
|
10
|
+
* only when it is simultaneously
|
|
11
|
+
* - unregistered — not a live PID in `terminal_sessions.shellper_pid`
|
|
12
|
+
* - childless — no process in the table has it as a parent (OS-level
|
|
13
|
+
* signal; there is no wire-protocol "has-child" frame)
|
|
14
|
+
* - aged — older than `graceMs`, which absorbs any legitimate
|
|
15
|
+
* mid-respawn / mid-adoption transient (seconds), so the
|
|
16
|
+
* three conditions together can only ever be true for a
|
|
17
|
+
* genuine husk (per the issue: "unregistered and
|
|
18
|
+
* childless" is a terminal state — a shellper that lost
|
|
19
|
+
* its registration can never receive another SPAWN).
|
|
20
|
+
*
|
|
21
|
+
* The actual kill is delegated to `reapShellpers` (`./architect-session-holder.js`,
|
|
22
|
+
* SIGTERM → poll → SIGKILL → confirm-death) rather than reimplemented here.
|
|
23
|
+
*/
|
|
24
|
+
import type Database from 'better-sqlite3';
|
|
25
|
+
import { type ProcessCensusEntry } from './process-census.js';
|
|
26
|
+
export declare const SHELLPER_MARKER = "shellper-main.js";
|
|
27
|
+
/**
|
|
28
|
+
* The set of shellper PIDs Tower currently believes are registered, per
|
|
29
|
+
* `terminal_sessions` — validated against each PID's actual process start
|
|
30
|
+
* time to guard against PID reuse (a stale row whose PID was reused by an
|
|
31
|
+
* unrelated process does not count as registered).
|
|
32
|
+
*/
|
|
33
|
+
export declare function computeRegisteredShellperPids(db: Database.Database, getStartTime?: (pid: number) => Promise<number | null>): Promise<Set<number>>;
|
|
34
|
+
export interface FindHuskShellpersOptions {
|
|
35
|
+
/** This Tower instance's socket directory — scopes the sweep so another
|
|
36
|
+
* instance's (or another user's) legitimate shellpers are never touched. */
|
|
37
|
+
socketDir: string;
|
|
38
|
+
registeredShellperPids: Set<number>;
|
|
39
|
+
graceMs: number;
|
|
40
|
+
/**
|
|
41
|
+
* Seam, defaults to `listProcessCensus`. Accepts a plain array too (not just
|
|
42
|
+
* a function returning one) so a caller that already took a snapshot for
|
|
43
|
+
* another purpose (e.g. RSS display) can pass it through and avoid a second
|
|
44
|
+
* `ps` scan — see `handleHuskPreview` in tower-routes.ts.
|
|
45
|
+
*/
|
|
46
|
+
census?: () => ProcessCensusEntry[] | Promise<ProcessCensusEntry[]>;
|
|
47
|
+
/** Seam, defaults to `Date.now()`. */
|
|
48
|
+
now?: number;
|
|
49
|
+
/** Seam, defaults to `getProcessStartTime`. */
|
|
50
|
+
getStartTime?: (pid: number) => Promise<number | null>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns the PIDs of shellper-main.js processes, scoped to `socketDir`, that
|
|
54
|
+
* are unregistered AND childless AND older than `graceMs`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function findHuskShellpers(opts: FindHuskShellpersOptions): Promise<number[]>;
|
|
57
|
+
/**
|
|
58
|
+
* The husk grace period (env `SHELLPER_HUSK_GRACE_MS`, default 1 hour), shared
|
|
59
|
+
* by every trigger (startup, periodic, on-demand preview/apply) so a preview
|
|
60
|
+
* always predicts what the periodic sweep would actually do.
|
|
61
|
+
*
|
|
62
|
+
* NaN-checked rather than `parsed || default`: `0` is a legitimate override
|
|
63
|
+
* (tests want an immediate-eligibility grace period) and `0` is falsy in JS,
|
|
64
|
+
* so `parsed || default` would silently discard a deliberate zero.
|
|
65
|
+
*/
|
|
66
|
+
export declare function resolveHuskGraceMs(env?: NodeJS.ProcessEnv): number;
|
|
67
|
+
export interface SweepShellperHusksOptions {
|
|
68
|
+
socketDir: string;
|
|
69
|
+
db: Database.Database;
|
|
70
|
+
graceMs: number;
|
|
71
|
+
log?: (msg: string) => void;
|
|
72
|
+
census?: () => ProcessCensusEntry[] | Promise<ProcessCensusEntry[]>;
|
|
73
|
+
now?: number;
|
|
74
|
+
getStartTime?: (pid: number) => Promise<number | null>;
|
|
75
|
+
/** Seam, defaults to `reapShellpers`. */
|
|
76
|
+
reap?: (pids: number[]) => Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Compute the registered-shellper set from the DB, find husk candidates, and
|
|
80
|
+
* reap them. Returns the swept PIDs so callers (startup log, periodic-timer
|
|
81
|
+
* log, on-demand CLI) can report what happened.
|
|
82
|
+
*/
|
|
83
|
+
export declare function sweepShellperHusks(opts: SweepShellperHusksOptions): Promise<{
|
|
84
|
+
swept: number;
|
|
85
|
+
pids: number[];
|
|
86
|
+
}>;
|
|
87
|
+
//# sourceMappingURL=shellper-husk-sweep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shellper-husk-sweep.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/shellper-husk-sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAgBlD;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,YAAY,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAuB,GAC1E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAmBtB;AAED,MAAM,WAAW,wBAAwB;IACvC;gFAC4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,kBAAkB,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACpE,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACxD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAG/E;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,kBAAkB,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,yCAAyC;IACzC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAmB5C"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issue #1227: a stricter, second-pass reap for shellper "husks" — a shellper
|
|
3
|
+
* whose PTY child has exited (deliberate lingering behavior from #905/#1198 so
|
|
4
|
+
* a reconnect can replay history) but which `killOrphanedShellpers`
|
|
5
|
+
* (`../../terminal/session-manager.ts`) can never reap, because that function
|
|
6
|
+
* unconditionally protects any shellper whose Unix socket still responds.
|
|
7
|
+
*
|
|
8
|
+
* A husk still answers its socket, so it survives `killOrphanedShellpers`
|
|
9
|
+
* forever. The predicate here is stricter and orthogonal: a shellper is a husk
|
|
10
|
+
* only when it is simultaneously
|
|
11
|
+
* - unregistered — not a live PID in `terminal_sessions.shellper_pid`
|
|
12
|
+
* - childless — no process in the table has it as a parent (OS-level
|
|
13
|
+
* signal; there is no wire-protocol "has-child" frame)
|
|
14
|
+
* - aged — older than `graceMs`, which absorbs any legitimate
|
|
15
|
+
* mid-respawn / mid-adoption transient (seconds), so the
|
|
16
|
+
* three conditions together can only ever be true for a
|
|
17
|
+
* genuine husk (per the issue: "unregistered and
|
|
18
|
+
* childless" is a terminal state — a shellper that lost
|
|
19
|
+
* its registration can never receive another SPAWN).
|
|
20
|
+
*
|
|
21
|
+
* The actual kill is delegated to `reapShellpers` (`./architect-session-holder.js`,
|
|
22
|
+
* SIGTERM → poll → SIGKILL → confirm-death) rather than reimplemented here.
|
|
23
|
+
*/
|
|
24
|
+
import { listProcessCensus } from './process-census.js';
|
|
25
|
+
import { getProcessStartTime } from '../../terminal/session-manager.js';
|
|
26
|
+
import { reapShellpers } from './architect-session-holder.js';
|
|
27
|
+
export const SHELLPER_MARKER = 'shellper-main.js';
|
|
28
|
+
/**
|
|
29
|
+
* Same tolerance `SessionManager.reconnectSession` uses
|
|
30
|
+
* (`../../terminal/session-manager.ts:471`) to detect PID reuse: a live
|
|
31
|
+
* process's actual start time must match the DB-recorded one within this
|
|
32
|
+
* window, or the DB row is stale (its PID was reused by an unrelated
|
|
33
|
+
* process) and must not count as "registered".
|
|
34
|
+
*/
|
|
35
|
+
const PID_REUSE_TOLERANCE_MS = 2000;
|
|
36
|
+
/**
|
|
37
|
+
* The set of shellper PIDs Tower currently believes are registered, per
|
|
38
|
+
* `terminal_sessions` — validated against each PID's actual process start
|
|
39
|
+
* time to guard against PID reuse (a stale row whose PID was reused by an
|
|
40
|
+
* unrelated process does not count as registered).
|
|
41
|
+
*/
|
|
42
|
+
export async function computeRegisteredShellperPids(db, getStartTime = getProcessStartTime) {
|
|
43
|
+
const rows = db
|
|
44
|
+
.prepare('SELECT shellper_pid, shellper_start_time FROM terminal_sessions WHERE shellper_pid IS NOT NULL')
|
|
45
|
+
.all();
|
|
46
|
+
const registered = new Set();
|
|
47
|
+
for (const row of rows) {
|
|
48
|
+
if (row.shellper_start_time === null) {
|
|
49
|
+
// Legacy row with no recorded start time — no positive signal to
|
|
50
|
+
// invalidate it, so trust the registration.
|
|
51
|
+
registered.add(row.shellper_pid);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const actual = await getStartTime(row.shellper_pid);
|
|
55
|
+
if (actual !== null && Math.abs(actual - row.shellper_start_time) <= PID_REUSE_TOLERANCE_MS) {
|
|
56
|
+
registered.add(row.shellper_pid);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return registered;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns the PIDs of shellper-main.js processes, scoped to `socketDir`, that
|
|
63
|
+
* are unregistered AND childless AND older than `graceMs`.
|
|
64
|
+
*/
|
|
65
|
+
export async function findHuskShellpers(opts) {
|
|
66
|
+
const census = await (opts.census ?? listProcessCensus)();
|
|
67
|
+
const now = opts.now ?? Date.now();
|
|
68
|
+
const getStartTime = opts.getStartTime ?? getProcessStartTime;
|
|
69
|
+
// Match the trailing-'/' scope-marker technique already proven in
|
|
70
|
+
// findShellperProcesses (../../terminal/session-manager.ts:782-793) to
|
|
71
|
+
// prevent prefix collisions (e.g. /run matching /run2).
|
|
72
|
+
const scopeMarker = opts.socketDir.endsWith('/') ? opts.socketDir : `${opts.socketDir}/`;
|
|
73
|
+
const parentPids = new Set(census.map((entry) => entry.ppid));
|
|
74
|
+
const candidates = [];
|
|
75
|
+
for (const entry of census) {
|
|
76
|
+
if (!entry.cmdline.includes(SHELLPER_MARKER))
|
|
77
|
+
continue;
|
|
78
|
+
if (!entry.cmdline.includes(scopeMarker))
|
|
79
|
+
continue;
|
|
80
|
+
if (opts.registeredShellperPids.has(entry.pid))
|
|
81
|
+
continue;
|
|
82
|
+
if (parentPids.has(entry.pid))
|
|
83
|
+
continue; // has a live child — not a husk
|
|
84
|
+
const startTime = await getStartTime(entry.pid);
|
|
85
|
+
if (startTime === null)
|
|
86
|
+
continue; // can't confirm age — safe default is to skip
|
|
87
|
+
if (now - startTime < opts.graceMs)
|
|
88
|
+
continue; // too young — race-safety window
|
|
89
|
+
candidates.push(entry.pid);
|
|
90
|
+
}
|
|
91
|
+
return candidates;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The husk grace period (env `SHELLPER_HUSK_GRACE_MS`, default 1 hour), shared
|
|
95
|
+
* by every trigger (startup, periodic, on-demand preview/apply) so a preview
|
|
96
|
+
* always predicts what the periodic sweep would actually do.
|
|
97
|
+
*
|
|
98
|
+
* NaN-checked rather than `parsed || default`: `0` is a legitimate override
|
|
99
|
+
* (tests want an immediate-eligibility grace period) and `0` is falsy in JS,
|
|
100
|
+
* so `parsed || default` would silently discard a deliberate zero.
|
|
101
|
+
*/
|
|
102
|
+
export function resolveHuskGraceMs(env = process.env) {
|
|
103
|
+
const parsed = parseInt(env.SHELLPER_HUSK_GRACE_MS || '3600000', 10);
|
|
104
|
+
return Math.max(Number.isNaN(parsed) ? 3600000 : parsed, 0);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Compute the registered-shellper set from the DB, find husk candidates, and
|
|
108
|
+
* reap them. Returns the swept PIDs so callers (startup log, periodic-timer
|
|
109
|
+
* log, on-demand CLI) can report what happened.
|
|
110
|
+
*/
|
|
111
|
+
export async function sweepShellperHusks(opts) {
|
|
112
|
+
const getStartTime = opts.getStartTime ?? getProcessStartTime;
|
|
113
|
+
const registeredShellperPids = await computeRegisteredShellperPids(opts.db, getStartTime);
|
|
114
|
+
const pids = await findHuskShellpers({
|
|
115
|
+
socketDir: opts.socketDir,
|
|
116
|
+
registeredShellperPids,
|
|
117
|
+
graceMs: opts.graceMs,
|
|
118
|
+
census: opts.census,
|
|
119
|
+
now: opts.now,
|
|
120
|
+
getStartTime,
|
|
121
|
+
});
|
|
122
|
+
if (pids.length > 0) {
|
|
123
|
+
opts.log?.(`Sweeping ${pids.length} husk shellper process(es): ${pids.join(', ')}`);
|
|
124
|
+
const reap = opts.reap ?? reapShellpers;
|
|
125
|
+
await reap(pids);
|
|
126
|
+
}
|
|
127
|
+
return { swept: pids.length, pids };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=shellper-husk-sweep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shellper-husk-sweep.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/shellper-husk-sweep.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type CronDeliveryResult } from './cron-delivery.js';
|
|
1
2
|
export interface CronTask {
|
|
2
3
|
name: string;
|
|
3
4
|
schedule: string;
|
|
@@ -13,12 +14,14 @@ export interface CronTask {
|
|
|
13
14
|
export interface CronDeps {
|
|
14
15
|
log: (level: 'INFO' | 'ERROR' | 'WARN', message: string) => void;
|
|
15
16
|
getKnownWorkspacePaths: () => string[];
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Route a cron notification through the Spec 1313 mailbox + gate (Phase 6): persist
|
|
19
|
+
* it with the task's supersede key, then attempt the single gated delivery shared
|
|
20
|
+
* with `handleSend`. Returns the run's real outcome so the log is honest instead of
|
|
21
|
+
* unconditional "delivered". Injected so the scheduler stays unit-testable without a
|
|
22
|
+
* live Tower; the production implementation is `deliverCronMessage` (tower-routes).
|
|
23
|
+
*/
|
|
24
|
+
deliver: (task: CronTask, message: string) => Promise<CronDeliveryResult>;
|
|
22
25
|
}
|
|
23
26
|
export declare function initCron(cronDeps: CronDeps): void;
|
|
24
27
|
export declare function shutdownCron(): void;
|
|
@@ -30,5 +33,5 @@ export declare function executeTask(task: CronTask): Promise<{
|
|
|
30
33
|
result: string;
|
|
31
34
|
output: string;
|
|
32
35
|
}>;
|
|
33
|
-
export declare function evaluateCondition(condition: string, output: string): boolean;
|
|
36
|
+
export declare function evaluateCondition(condition: string, output: string, exitCode?: number): boolean;
|
|
34
37
|
//# sourceMappingURL=tower-cron.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tower-cron.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-cron.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tower-cron.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-cron.ts"],"names":[],"mappings":"AAaA,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAO1E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,sBAAsB,EAAE,MAAM,MAAM,EAAE,CAAC;IACvC;;;;;;OAMG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC3E;AAeD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAejD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAOnC;AAED,wBAAgB,WAAW,IAAI,QAAQ,EAAE,CAOxC;AAMD,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,EAAE,CAwDpE;AAMD,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzE;AAMD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B1C;AA0BD,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAwD7F;AAmCD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,OAAO,CAI1F"}
|
|
@@ -5,13 +5,11 @@
|
|
|
5
5
|
// messages via the Tower send pipeline (format + write + broadcast).
|
|
6
6
|
import { exec } from 'node:child_process';
|
|
7
7
|
import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
8
|
-
import { join
|
|
8
|
+
import { join } from 'node:path';
|
|
9
9
|
import { createHash } from 'node:crypto';
|
|
10
10
|
import * as yaml from 'js-yaml';
|
|
11
11
|
import { parseCronExpression, isDue } from './tower-cron-parser.js';
|
|
12
|
-
import {
|
|
13
|
-
import { broadcastMessage } from './tower-messages.js';
|
|
14
|
-
import { writeMessageToSession } from './message-write.js';
|
|
12
|
+
import { CRON_SENDER } from './cron-delivery.js';
|
|
15
13
|
import { getGlobalDb } from '../db/index.js';
|
|
16
14
|
// ============================================================================
|
|
17
15
|
// Module state
|
|
@@ -172,17 +170,21 @@ export async function executeTask(task) {
|
|
|
172
170
|
const taskId = getTaskId(task.workspacePath, task.name);
|
|
173
171
|
deps.log('INFO', `Executing cron task: ${task.name}`);
|
|
174
172
|
let output;
|
|
173
|
+
let exitCode;
|
|
175
174
|
let result;
|
|
176
175
|
try {
|
|
177
|
-
output = await runCommand(task.command, {
|
|
176
|
+
({ output, exitCode } = await runCommand(task.command, {
|
|
178
177
|
cwd: task.cwd ?? task.workspacePath,
|
|
179
178
|
timeout: task.timeout * 1000,
|
|
180
|
-
});
|
|
181
|
-
result = 'success';
|
|
179
|
+
}));
|
|
180
|
+
result = exitCode === 0 ? 'success' : 'failure';
|
|
182
181
|
}
|
|
183
182
|
catch (err) {
|
|
183
|
+
// Infrastructure error: spawn failure or timeout/kill. 124 mirrors the
|
|
184
|
+
// coreutils `timeout` convention; -1 means the process never ran cleanly.
|
|
184
185
|
const execErr = err;
|
|
185
|
-
output = execErr.stdout
|
|
186
|
+
output = execErr.stdout || execErr.stderr || execErr.message || String(err);
|
|
187
|
+
exitCode = execErr.killed ? 124 : -1;
|
|
186
188
|
result = 'failure';
|
|
187
189
|
}
|
|
188
190
|
// Truncate output for storage
|
|
@@ -190,24 +192,27 @@ export async function executeTask(task) {
|
|
|
190
192
|
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
191
193
|
// Update SQLite state
|
|
192
194
|
updateTaskState(taskId, task.workspacePath, task.name, nowSeconds, result, truncatedOutput);
|
|
193
|
-
//
|
|
194
|
-
|
|
195
|
+
// Decide delivery. With a condition, the condition alone decides (a non-zero
|
|
196
|
+
// exit is data the condition can inspect via exitCode, not noise). Without
|
|
197
|
+
// one, deliver only on clean exit so flaky commands don't alert-spam.
|
|
198
|
+
let shouldNotify;
|
|
195
199
|
if (task.condition) {
|
|
196
200
|
try {
|
|
197
|
-
shouldNotify = evaluateCondition(task.condition, output.trim());
|
|
201
|
+
shouldNotify = evaluateCondition(task.condition, output.trim(), exitCode);
|
|
198
202
|
}
|
|
199
203
|
catch (err) {
|
|
200
204
|
deps.log('WARN', `Condition evaluation failed for '${task.name}': ${err}`);
|
|
201
205
|
shouldNotify = false;
|
|
202
206
|
}
|
|
203
207
|
}
|
|
204
|
-
|
|
208
|
+
else {
|
|
209
|
+
shouldNotify = result === 'success';
|
|
210
|
+
}
|
|
211
|
+
if (shouldNotify) {
|
|
205
212
|
const renderedMessage = task.message.replace(/\$\{output\}/g, output.trim());
|
|
206
|
-
deliverMessage(task, renderedMessage);
|
|
213
|
+
await deliverMessage(task, renderedMessage);
|
|
207
214
|
}
|
|
208
215
|
else if (result === 'failure') {
|
|
209
|
-
// Command itself errored (non-zero exit, timeout, etc.) — log but don't alert.
|
|
210
|
-
// Command errors are infrastructure noise, not actionable CI failures.
|
|
211
216
|
deps.log('WARN', `Cron command failed for '${task.name}': ${output.trim().slice(0, 200)}`);
|
|
212
217
|
}
|
|
213
218
|
deps.log('INFO', `Cron task '${task.name}' completed: ${result}`);
|
|
@@ -221,60 +226,60 @@ function runCommand(command, options) {
|
|
|
221
226
|
maxBuffer: 1024 * 1024, // 1MB
|
|
222
227
|
env: process.env,
|
|
223
228
|
}, (error, stdout, stderr) => {
|
|
224
|
-
if (error) {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
error.stderr = stderr;
|
|
228
|
-
reject(error);
|
|
229
|
+
if (!error) {
|
|
230
|
+
resolve({ output: stdout, exitCode: 0 });
|
|
231
|
+
return;
|
|
229
232
|
}
|
|
230
|
-
|
|
231
|
-
|
|
233
|
+
// A numeric code with no kill signal means the process ran and exited
|
|
234
|
+
// non-zero — that's data for conditions, not an infrastructure error.
|
|
235
|
+
if (typeof error.code === 'number' && !error.killed && !error.signal) {
|
|
236
|
+
resolve({ output: stdout || stderr, exitCode: error.code });
|
|
237
|
+
return;
|
|
232
238
|
}
|
|
239
|
+
// Spawn failure or timeout/kill — attach stdout/stderr for the caller
|
|
240
|
+
error.stdout = stdout;
|
|
241
|
+
error.stderr = stderr;
|
|
242
|
+
reject(error);
|
|
233
243
|
});
|
|
234
244
|
});
|
|
235
245
|
}
|
|
236
246
|
// ============================================================================
|
|
237
247
|
// Condition evaluation
|
|
238
248
|
// ============================================================================
|
|
239
|
-
export function evaluateCondition(condition, output) {
|
|
249
|
+
export function evaluateCondition(condition, output, exitCode = 0) {
|
|
240
250
|
// eslint-disable-next-line no-new-func
|
|
241
|
-
const fn = new Function('output', 'return ' + condition);
|
|
242
|
-
return !!fn(output);
|
|
251
|
+
const fn = new Function('output', 'exitCode', 'return ' + condition);
|
|
252
|
+
return !!fn(output, exitCode);
|
|
243
253
|
}
|
|
244
254
|
// ============================================================================
|
|
245
255
|
// Message delivery (shared send pipeline)
|
|
246
256
|
// ============================================================================
|
|
247
|
-
|
|
257
|
+
/**
|
|
258
|
+
* Hand a cron notification to the mailbox + gate (Spec 1313, Phase 6) and log its real
|
|
259
|
+
* outcome. The blind `writeMessageToSession` is gone: `deps.deliver` persists the
|
|
260
|
+
* message with the task's supersede key and attempts the single gated delivery, so a
|
|
261
|
+
* busy/menu screen holds it for the backstop rather than fusing it with a draft. The
|
|
262
|
+
* delivered-message broadcast now fires inside that shared path (as `source:'mailbox'`),
|
|
263
|
+
* not here — cron no longer double-broadcasts.
|
|
264
|
+
*/
|
|
265
|
+
async function deliverMessage(task, message) {
|
|
248
266
|
if (!deps)
|
|
249
267
|
return;
|
|
250
|
-
const result = deps.
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
268
|
+
const result = await deps.deliver(task, message);
|
|
269
|
+
switch (result.outcome) {
|
|
270
|
+
case 'delivered':
|
|
271
|
+
deps.log('INFO', `Cron message delivered: ${CRON_SENDER} → ${task.target} (task '${task.name}')`);
|
|
272
|
+
break;
|
|
273
|
+
case 'superseded':
|
|
274
|
+
deps.log('INFO', `Cron message held (${result.reason ?? 'busy'}), superseding the prior held run: ${CRON_SENDER} → ${task.target} (task '${task.name}')`);
|
|
275
|
+
break;
|
|
276
|
+
case 'held':
|
|
277
|
+
deps.log('INFO', `Cron message held (${result.reason ?? 'busy'}): ${CRON_SENDER} → ${task.target} (task '${task.name}')`);
|
|
278
|
+
break;
|
|
279
|
+
case 'unresolved':
|
|
280
|
+
// deliverCronMessage already logged a WARN naming the unresolved target.
|
|
281
|
+
break;
|
|
254
282
|
}
|
|
255
|
-
const session = deps.getTerminalManager().getSession(result.terminalId);
|
|
256
|
-
if (!session) {
|
|
257
|
-
deps.log('WARN', `Cannot deliver cron message for '${task.name}': terminal session gone`);
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
const formatted = formatBuilderMessage('af-cron', message);
|
|
261
|
-
// Bugfix #584: pace multi-line output to avoid paste detection.
|
|
262
|
-
writeMessageToSession(session, formatted, false);
|
|
263
|
-
broadcastMessage({
|
|
264
|
-
type: 'message',
|
|
265
|
-
from: {
|
|
266
|
-
project: basename(task.workspacePath),
|
|
267
|
-
agent: 'af-cron',
|
|
268
|
-
},
|
|
269
|
-
to: {
|
|
270
|
-
project: basename(result.workspacePath),
|
|
271
|
-
agent: result.agent,
|
|
272
|
-
},
|
|
273
|
-
content: message,
|
|
274
|
-
metadata: { source: 'cron' },
|
|
275
|
-
timestamp: new Date().toISOString(),
|
|
276
|
-
});
|
|
277
|
-
deps.log('INFO', `Cron message delivered: af-cron → ${result.agent}`);
|
|
278
283
|
}
|
|
279
284
|
// ============================================================================
|
|
280
285
|
// SQLite state management
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tower-cron.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-cron.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tower-cron.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-cron.ts"],"names":[],"mappings":"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"}
|