agent-tempo 1.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/CLAUDE.md +213 -0
- package/LICENSE +21 -0
- package/README.md +289 -0
- package/assets/icon-32.png +0 -0
- package/assets/icon-512.png +0 -0
- package/assets/icon-64.png +0 -0
- package/assets/icon-dark-32.png +0 -0
- package/assets/icon-dark-64.png +0 -0
- package/assets/icon-dark.svg +9 -0
- package/assets/icon.svg +9 -0
- package/assets/logo-dark.svg +11 -0
- package/assets/logo-light.svg +11 -0
- package/dashboard/README.md +91 -0
- package/dashboard/dist/assets/index-CB78ToNE.css +2 -0
- package/dashboard/dist/assets/index-_5jV0Znu.js +62 -0
- package/dashboard/dist/assets/index-_5jV0Znu.js.map +1 -0
- package/dashboard/dist/index.html +21 -0
- package/dashboard/package.json +47 -0
- package/dist/activities/hard-terminate.d.ts +32 -0
- package/dist/activities/hard-terminate.js +460 -0
- package/dist/activities/maestro.d.ts +72 -0
- package/dist/activities/maestro.js +254 -0
- package/dist/activities/outbox.d.ts +188 -0
- package/dist/activities/outbox.js +849 -0
- package/dist/activities/resolve.d.ts +64 -0
- package/dist/activities/resolve.js +129 -0
- package/dist/activities/schedule-fire.d.ts +36 -0
- package/dist/activities/schedule-fire.js +147 -0
- package/dist/adapters/base.d.ts +426 -0
- package/dist/adapters/base.js +1270 -0
- package/dist/adapters/claude-api/adapter.d.ts +168 -0
- package/dist/adapters/claude-api/adapter.js +797 -0
- package/dist/adapters/claude-api/api-error.d.ts +96 -0
- package/dist/adapters/claude-api/api-error.js +191 -0
- package/dist/adapters/claude-api/index.d.ts +16 -0
- package/dist/adapters/claude-api/index.js +21 -0
- package/dist/adapters/claude-api/mcp-bridge.d.ts +50 -0
- package/dist/adapters/claude-api/mcp-bridge.js +157 -0
- package/dist/adapters/claude-code/adapter.d.ts +133 -0
- package/dist/adapters/claude-code/adapter.js +274 -0
- package/dist/adapters/claude-code/index.d.ts +15 -0
- package/dist/adapters/claude-code/index.js +20 -0
- package/dist/adapters/claude-code-headless/adapter.d.ts +131 -0
- package/dist/adapters/claude-code-headless/adapter.js +710 -0
- package/dist/adapters/claude-code-headless/error-mapper.d.ts +107 -0
- package/dist/adapters/claude-code-headless/error-mapper.js +281 -0
- package/dist/adapters/claude-code-headless/index.d.ts +17 -0
- package/dist/adapters/claude-code-headless/index.js +26 -0
- package/dist/adapters/claude-code-headless/pre-flight.d.ts +51 -0
- package/dist/adapters/claude-code-headless/pre-flight.js +207 -0
- package/dist/adapters/claude-code-headless/prompt.d.ts +93 -0
- package/dist/adapters/claude-code-headless/prompt.js +79 -0
- package/dist/adapters/claude-code-headless/stream-json.d.ts +242 -0
- package/dist/adapters/claude-code-headless/stream-json.js +208 -0
- package/dist/adapters/claude-code-headless/types.d.ts +28 -0
- package/dist/adapters/claude-code-headless/types.js +36 -0
- package/dist/adapters/copilot/adapter.d.ts +100 -0
- package/dist/adapters/copilot/adapter.js +730 -0
- package/dist/adapters/copilot/index.d.ts +15 -0
- package/dist/adapters/copilot/index.js +20 -0
- package/dist/adapters/index.d.ts +42 -0
- package/dist/adapters/index.js +115 -0
- package/dist/adapters/opencode/adapter.d.ts +82 -0
- package/dist/adapters/opencode/adapter.js +710 -0
- package/dist/adapters/opencode/config.d.ts +90 -0
- package/dist/adapters/opencode/config.js +137 -0
- package/dist/adapters/opencode/helpers.d.ts +40 -0
- package/dist/adapters/opencode/helpers.js +144 -0
- package/dist/adapters/opencode/index.d.ts +12 -0
- package/dist/adapters/opencode/index.js +17 -0
- package/dist/adapters/opencode/server-bridge.d.ts +124 -0
- package/dist/adapters/opencode/server-bridge.js +216 -0
- package/dist/adapters/sdk/base.d.ts +95 -0
- package/dist/adapters/sdk/base.js +134 -0
- package/dist/adapters/sdk/system-prompt.d.ts +64 -0
- package/dist/adapters/sdk/system-prompt.js +78 -0
- package/dist/adapters/terminal-error.d.ts +27 -0
- package/dist/adapters/terminal-error.js +39 -0
- package/dist/channel.d.ts +3 -0
- package/dist/channel.js +48 -0
- package/dist/cli/commands.d.ts +245 -0
- package/dist/cli/commands.js +2438 -0
- package/dist/cli/config-command.d.ts +8 -0
- package/dist/cli/config-command.js +254 -0
- package/dist/cli/daemon-command.d.ts +57 -0
- package/dist/cli/daemon-command.js +493 -0
- package/dist/cli/daemon.d.ts +217 -0
- package/dist/cli/daemon.js +632 -0
- package/dist/cli/dashboard-command.d.ts +20 -0
- package/dist/cli/dashboard-command.js +241 -0
- package/dist/cli/dev-banner.d.ts +107 -0
- package/dist/cli/dev-banner.js +190 -0
- package/dist/cli/dev-mode-bootstrap.d.ts +29 -0
- package/dist/cli/dev-mode-bootstrap.js +36 -0
- package/dist/cli/dev-verbs.d.ts +43 -0
- package/dist/cli/dev-verbs.js +254 -0
- package/dist/cli/help-text.d.ts +1 -0
- package/dist/cli/help-text.js +158 -0
- package/dist/cli/legacy-migration.d.ts +35 -0
- package/dist/cli/legacy-migration.js +335 -0
- package/dist/cli/mcp.d.ts +8 -0
- package/dist/cli/mcp.js +63 -0
- package/dist/cli/output.d.ts +12 -0
- package/dist/cli/output.js +37 -0
- package/dist/cli/preflight.d.ts +9 -0
- package/dist/cli/preflight.js +96 -0
- package/dist/cli/removed-verbs.d.ts +9 -0
- package/dist/cli/removed-verbs.js +78 -0
- package/dist/cli/sa-preflight.d.ts +99 -0
- package/dist/cli/sa-preflight.js +183 -0
- package/dist/cli/scenarios-command.d.ts +6 -0
- package/dist/cli/scenarios-command.js +167 -0
- package/dist/cli/startup.d.ts +112 -0
- package/dist/cli/startup.js +641 -0
- package/dist/cli/upgrade-command.d.ts +5 -0
- package/dist/cli/upgrade-command.js +240 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +680 -0
- package/dist/client/core.d.ts +33 -0
- package/dist/client/core.js +1260 -0
- package/dist/client/ensure-conductor-spawned.d.ts +35 -0
- package/dist/client/ensure-conductor-spawned.js +48 -0
- package/dist/client/index.d.ts +32 -0
- package/dist/client/index.js +22 -0
- package/dist/client/interface.d.ts +461 -0
- package/dist/client/interface.js +2 -0
- package/dist/client/subscribe.d.ts +108 -0
- package/dist/client/subscribe.js +598 -0
- package/dist/client/with-spawn.d.ts +27 -0
- package/dist/client/with-spawn.js +87 -0
- package/dist/config.d.ts +323 -0
- package/dist/config.js +593 -0
- package/dist/connection.d.ts +7 -0
- package/dist/connection.js +46 -0
- package/dist/constants.d.ts +50 -0
- package/dist/constants.js +74 -0
- package/dist/copilot-bridge.d.ts +22 -0
- package/dist/copilot-bridge.js +565 -0
- package/dist/daemon-adapter-versions.d.ts +52 -0
- package/dist/daemon-adapter-versions.js +170 -0
- package/dist/daemon.d.ts +275 -0
- package/dist/daemon.js +989 -0
- package/dist/ensemble/agent-types.d.ts +23 -0
- package/dist/ensemble/agent-types.js +132 -0
- package/dist/ensemble/loader.d.ts +14 -0
- package/dist/ensemble/loader.js +140 -0
- package/dist/ensemble/saver.d.ts +49 -0
- package/dist/ensemble/saver.js +201 -0
- package/dist/ensemble/schema.d.ts +71 -0
- package/dist/ensemble/schema.js +3 -0
- package/dist/git-info.d.ts +4 -0
- package/dist/git-info.js +29 -0
- package/dist/http/aggregate.d.ts +319 -0
- package/dist/http/aggregate.js +684 -0
- package/dist/http/auth.d.ts +67 -0
- package/dist/http/auth.js +177 -0
- package/dist/http/body.d.ts +71 -0
- package/dist/http/body.js +121 -0
- package/dist/http/catalog.d.ts +67 -0
- package/dist/http/catalog.js +209 -0
- package/dist/http/cors.d.ts +42 -0
- package/dist/http/cors.js +111 -0
- package/dist/http/dashboard-pair.d.ts +94 -0
- package/dist/http/dashboard-pair.js +148 -0
- package/dist/http/dashboard.d.ts +20 -0
- package/dist/http/dashboard.js +160 -0
- package/dist/http/event-bus.d.ts +217 -0
- package/dist/http/event-bus.js +365 -0
- package/dist/http/event-id.d.ts +77 -0
- package/dist/http/event-id.js +117 -0
- package/dist/http/event-types.d.ts +348 -0
- package/dist/http/event-types.js +36 -0
- package/dist/http/fixtures/chat-stress.d.ts +8 -0
- package/dist/http/fixtures/chat-stress.js +63 -0
- package/dist/http/fixtures/conductor-leaving.d.ts +8 -0
- package/dist/http/fixtures/conductor-leaving.js +80 -0
- package/dist/http/fixtures/constants.d.ts +10 -0
- package/dist/http/fixtures/constants.js +13 -0
- package/dist/http/fixtures/eight-player-broadcast.d.ts +10 -0
- package/dist/http/fixtures/eight-player-broadcast.js +81 -0
- package/dist/http/fixtures/empty-ensemble.d.ts +6 -0
- package/dist/http/fixtures/empty-ensemble.js +26 -0
- package/dist/http/fixtures/index.d.ts +55 -0
- package/dist/http/fixtures/index.js +110 -0
- package/dist/http/fixtures/single-conductor.d.ts +7 -0
- package/dist/http/fixtures/single-conductor.js +46 -0
- package/dist/http/fixtures/sse-reconnect.d.ts +8 -0
- package/dist/http/fixtures/sse-reconnect.js +77 -0
- package/dist/http/index.d.ts +21 -0
- package/dist/http/index.js +61 -0
- package/dist/http/port-file.d.ts +22 -0
- package/dist/http/port-file.js +132 -0
- package/dist/http/responses.d.ts +27 -0
- package/dist/http/responses.js +40 -0
- package/dist/http/ring-buffer.d.ts +41 -0
- package/dist/http/ring-buffer.js +80 -0
- package/dist/http/server.d.ts +122 -0
- package/dist/http/server.js +459 -0
- package/dist/http/snapshot.d.ts +85 -0
- package/dist/http/snapshot.js +180 -0
- package/dist/http/sse-handler.d.ts +87 -0
- package/dist/http/sse-handler.js +294 -0
- package/dist/http/writes.d.ts +55 -0
- package/dist/http/writes.js +240 -0
- package/dist/palette/index.d.ts +138 -0
- package/dist/palette/index.js +221 -0
- package/dist/reconcile/orphans.d.ts +255 -0
- package/dist/reconcile/orphans.js +340 -0
- package/dist/scripts/258-spotcheck.js +303 -0
- package/dist/scripts/check-components-css-sync.js +199 -0
- package/dist/scripts/run-shard.js +121 -0
- package/dist/scripts/verify-daemon-isolation-guard.js +128 -0
- package/dist/server-tools.d.ts +87 -0
- package/dist/server-tools.js +146 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +366 -0
- package/dist/spawn.d.ts +296 -0
- package/dist/spawn.js +747 -0
- package/dist/tools/agent-types.d.ts +2 -0
- package/dist/tools/agent-types.js +21 -0
- package/dist/tools/attachment-info.d.ts +4 -0
- package/dist/tools/attachment-info.js +48 -0
- package/dist/tools/broadcast.d.ts +4 -0
- package/dist/tools/broadcast.js +76 -0
- package/dist/tools/cancel-stage.d.ts +3 -0
- package/dist/tools/cancel-stage.js +20 -0
- package/dist/tools/clear-state.d.ts +3 -0
- package/dist/tools/clear-state.js +37 -0
- package/dist/tools/coat-check-evict.d.ts +4 -0
- package/dist/tools/coat-check-evict.js +43 -0
- package/dist/tools/coat-check-get.d.ts +4 -0
- package/dist/tools/coat-check-get.js +56 -0
- package/dist/tools/coat-check-list.d.ts +4 -0
- package/dist/tools/coat-check-list.js +60 -0
- package/dist/tools/coat-check-put.d.ts +4 -0
- package/dist/tools/coat-check-put.js +53 -0
- package/dist/tools/cue.d.ts +44 -0
- package/dist/tools/cue.js +201 -0
- package/dist/tools/destroy.d.ts +4 -0
- package/dist/tools/destroy.js +188 -0
- package/dist/tools/detach.d.ts +4 -0
- package/dist/tools/detach.js +45 -0
- package/dist/tools/encore.d.ts +4 -0
- package/dist/tools/encore.js +31 -0
- package/dist/tools/ensemble.d.ts +32 -0
- package/dist/tools/ensemble.js +198 -0
- package/dist/tools/evaluate-gate.d.ts +3 -0
- package/dist/tools/evaluate-gate.js +32 -0
- package/dist/tools/fetch-state.d.ts +13 -0
- package/dist/tools/fetch-state.js +78 -0
- package/dist/tools/gates.d.ts +3 -0
- package/dist/tools/gates.js +41 -0
- package/dist/tools/helpers.d.ts +21 -0
- package/dist/tools/helpers.js +25 -0
- package/dist/tools/hosts.d.ts +4 -0
- package/dist/tools/hosts.js +40 -0
- package/dist/tools/listen.d.ts +3 -0
- package/dist/tools/listen.js +22 -0
- package/dist/tools/load-lineup.d.ts +5 -0
- package/dist/tools/load-lineup.js +381 -0
- package/dist/tools/migrate.d.ts +4 -0
- package/dist/tools/migrate.js +60 -0
- package/dist/tools/pause-ensemble.d.ts +4 -0
- package/dist/tools/pause-ensemble.js +58 -0
- package/dist/tools/pause.d.ts +4 -0
- package/dist/tools/pause.js +36 -0
- package/dist/tools/play.d.ts +4 -0
- package/dist/tools/play.js +57 -0
- package/dist/tools/quality-gate.d.ts +3 -0
- package/dist/tools/quality-gate.js +26 -0
- package/dist/tools/recall.d.ts +3 -0
- package/dist/tools/recall.js +32 -0
- package/dist/tools/recruit.d.ts +38 -0
- package/dist/tools/recruit.js +447 -0
- package/dist/tools/release.d.ts +4 -0
- package/dist/tools/release.js +98 -0
- package/dist/tools/report.d.ts +3 -0
- package/dist/tools/report.js +29 -0
- package/dist/tools/resolve.d.ts +1 -0
- package/dist/tools/resolve.js +7 -0
- package/dist/tools/restart.d.ts +35 -0
- package/dist/tools/restart.js +131 -0
- package/dist/tools/restore.d.ts +4 -0
- package/dist/tools/restore.js +107 -0
- package/dist/tools/resume-ensemble.d.ts +4 -0
- package/dist/tools/resume-ensemble.js +79 -0
- package/dist/tools/save-lineup.d.ts +4 -0
- package/dist/tools/save-lineup.js +36 -0
- package/dist/tools/save-state.d.ts +3 -0
- package/dist/tools/save-state.js +57 -0
- package/dist/tools/schedule.d.ts +4 -0
- package/dist/tools/schedule.js +152 -0
- package/dist/tools/schedules.d.ts +4 -0
- package/dist/tools/schedules.js +54 -0
- package/dist/tools/set-ensemble-description.d.ts +4 -0
- package/dist/tools/set-ensemble-description.js +37 -0
- package/dist/tools/set-name.d.ts +4 -0
- package/dist/tools/set-name.js +45 -0
- package/dist/tools/set-part.d.ts +3 -0
- package/dist/tools/set-part.js +20 -0
- package/dist/tools/shutdown.d.ts +4 -0
- package/dist/tools/shutdown.js +54 -0
- package/dist/tools/stage.d.ts +3 -0
- package/dist/tools/stage.js +28 -0
- package/dist/tools/stages.d.ts +3 -0
- package/dist/tools/stages.js +35 -0
- package/dist/tools/stop.d.ts +4 -0
- package/dist/tools/stop.js +29 -0
- package/dist/tools/unschedule.d.ts +4 -0
- package/dist/tools/unschedule.js +35 -0
- package/dist/tools/who-am-i.d.ts +3 -0
- package/dist/tools/who-am-i.js +34 -0
- package/dist/tools/worktree.d.ts +4 -0
- package/dist/tools/worktree.js +181 -0
- package/dist/tui/App.d.ts +85 -0
- package/dist/tui/App.js +1791 -0
- package/dist/tui/bootstrap-types.d.ts +46 -0
- package/dist/tui/bootstrap-types.js +7 -0
- package/dist/tui/client.d.ts +6 -0
- package/dist/tui/client.js +9 -0
- package/dist/tui/commands.d.ts +71 -0
- package/dist/tui/commands.js +1375 -0
- package/dist/tui/components/ActivityLog.d.ts +16 -0
- package/dist/tui/components/ActivityLog.js +36 -0
- package/dist/tui/components/ChatView.d.ts +35 -0
- package/dist/tui/components/ChatView.js +54 -0
- package/dist/tui/components/CommandOverlay.d.ts +15 -0
- package/dist/tui/components/CommandOverlay.js +34 -0
- package/dist/tui/components/CommandPalette.d.ts +21 -0
- package/dist/tui/components/CommandPalette.js +67 -0
- package/dist/tui/components/ConductorChat.d.ts +16 -0
- package/dist/tui/components/ConductorChat.js +32 -0
- package/dist/tui/components/ConversationStream.d.ts +114 -0
- package/dist/tui/components/ConversationStream.js +307 -0
- package/dist/tui/components/CreateEnsembleWizard.d.ts +19 -0
- package/dist/tui/components/CreateEnsembleWizard.js +223 -0
- package/dist/tui/components/DestroyConfirmModal.d.ts +17 -0
- package/dist/tui/components/DestroyConfirmModal.js +62 -0
- package/dist/tui/components/EnsembleListView.d.ts +14 -0
- package/dist/tui/components/EnsembleListView.js +32 -0
- package/dist/tui/components/EnsemblePanel.d.ts +12 -0
- package/dist/tui/components/EnsemblePanel.js +40 -0
- package/dist/tui/components/ErrorView.d.ts +31 -0
- package/dist/tui/components/ErrorView.js +129 -0
- package/dist/tui/components/HomeView.d.ts +54 -0
- package/dist/tui/components/HomeView.js +306 -0
- package/dist/tui/components/InputBar.d.ts +13 -0
- package/dist/tui/components/InputBar.js +58 -0
- package/dist/tui/components/LoadLineupModal.d.ts +18 -0
- package/dist/tui/components/LoadLineupModal.js +79 -0
- package/dist/tui/components/MainView.d.ts +21 -0
- package/dist/tui/components/MainView.js +107 -0
- package/dist/tui/components/NewEnsembleModal.d.ts +9 -0
- package/dist/tui/components/NewEnsembleModal.js +73 -0
- package/dist/tui/components/Picker.d.ts +23 -0
- package/dist/tui/components/Picker.js +70 -0
- package/dist/tui/components/PlayerDetailView.d.ts +26 -0
- package/dist/tui/components/PlayerDetailView.js +118 -0
- package/dist/tui/components/PromptArea.d.ts +50 -0
- package/dist/tui/components/PromptArea.js +303 -0
- package/dist/tui/components/RecruitWizard.d.ts +17 -0
- package/dist/tui/components/RecruitWizard.js +221 -0
- package/dist/tui/components/RestoreConfirmModal.d.ts +18 -0
- package/dist/tui/components/RestoreConfirmModal.js +71 -0
- package/dist/tui/components/ScheduleOverlay.d.ts +13 -0
- package/dist/tui/components/ScheduleOverlay.js +113 -0
- package/dist/tui/components/ScheduleWizard.d.ts +19 -0
- package/dist/tui/components/ScheduleWizard.js +259 -0
- package/dist/tui/components/Splash.d.ts +23 -0
- package/dist/tui/components/Splash.js +221 -0
- package/dist/tui/components/StatusBar.d.ts +48 -0
- package/dist/tui/components/StatusBar.js +128 -0
- package/dist/tui/components/StatusOverlay.d.ts +15 -0
- package/dist/tui/components/StatusOverlay.js +76 -0
- package/dist/tui/components/TitleBar.d.ts +10 -0
- package/dist/tui/components/TitleBar.js +21 -0
- package/dist/tui/components/TopBar.d.ts +12 -0
- package/dist/tui/components/TopBar.js +15 -0
- package/dist/tui/core-api.d.ts +26 -0
- package/dist/tui/core-api.js +67 -0
- package/dist/tui/hooks/useEnsembleDiscovery.d.ts +3 -0
- package/dist/tui/hooks/useEnsembleDiscovery.js +30 -0
- package/dist/tui/hooks/useMaestroPoller.d.ts +3 -0
- package/dist/tui/hooks/useMaestroPoller.js +36 -0
- package/dist/tui/hooks/useSendCommand.d.ts +7 -0
- package/dist/tui/hooks/useSendCommand.js +29 -0
- package/dist/tui/index.d.ts +15 -0
- package/dist/tui/index.js +156 -0
- package/dist/tui/ink-context.d.ts +18 -0
- package/dist/tui/ink-context.js +59 -0
- package/dist/tui/ink-loader.d.ts +26 -0
- package/dist/tui/ink-loader.js +42 -0
- package/dist/tui/removed-commands.d.ts +9 -0
- package/dist/tui/removed-commands.js +22 -0
- package/dist/tui/sse-handler.d.ts +52 -0
- package/dist/tui/sse-handler.js +157 -0
- package/dist/tui/store.d.ts +598 -0
- package/dist/tui/store.js +753 -0
- package/dist/tui/utils/format.d.ts +56 -0
- package/dist/tui/utils/format.js +155 -0
- package/dist/tui/utils/fullscreen.d.ts +23 -0
- package/dist/tui/utils/fullscreen.js +71 -0
- package/dist/tui/utils/history.d.ts +10 -0
- package/dist/tui/utils/history.js +85 -0
- package/dist/tui/utils/platform.d.ts +45 -0
- package/dist/tui/utils/platform.js +258 -0
- package/dist/tui/utils/theme.d.ts +21 -0
- package/dist/tui/utils/theme.js +24 -0
- package/dist/types.d.ts +1020 -0
- package/dist/types.js +39 -0
- package/dist/utils/attachment-format.d.ts +22 -0
- package/dist/utils/attachment-format.js +32 -0
- package/dist/utils/default-part.d.ts +43 -0
- package/dist/utils/default-part.js +104 -0
- package/dist/utils/duration.d.ts +30 -0
- package/dist/utils/duration.js +69 -0
- package/dist/utils/ensemble-ops.d.ts +61 -0
- package/dist/utils/ensemble-ops.js +77 -0
- package/dist/utils/format-hosts.d.ts +21 -0
- package/dist/utils/format-hosts.js +73 -0
- package/dist/utils/hosts.d.ts +113 -0
- package/dist/utils/hosts.js +265 -0
- package/dist/utils/parent-death-watchdog.d.ts +1 -0
- package/dist/utils/parent-death-watchdog.js +47 -0
- package/dist/utils/query-timeout.d.ts +103 -0
- package/dist/utils/query-timeout.js +113 -0
- package/dist/utils/recall-format.d.ts +78 -0
- package/dist/utils/recall-format.js +105 -0
- package/dist/utils/restore-format.d.ts +49 -0
- package/dist/utils/restore-format.js +91 -0
- package/dist/utils/safe-path.d.ts +10 -0
- package/dist/utils/safe-path.js +43 -0
- package/dist/utils/sdk-probe.d.ts +9 -0
- package/dist/utils/sdk-probe.js +45 -0
- package/dist/utils/search-attributes.d.ts +76 -0
- package/dist/utils/search-attributes.js +86 -0
- package/dist/utils/validation.d.ts +113 -0
- package/dist/utils/validation.js +163 -0
- package/dist/utils/visibility-deadline.d.ts +186 -0
- package/dist/utils/visibility-deadline.js +158 -0
- package/dist/utils/worktree.d.ts +103 -0
- package/dist/utils/worktree.js +327 -0
- package/dist/worker.d.ts +14 -0
- package/dist/worker.js +146 -0
- package/dist/workflows/attachment-math.d.ts +56 -0
- package/dist/workflows/attachment-math.js +47 -0
- package/dist/workflows/index.d.ts +3 -0
- package/dist/workflows/index.js +11 -0
- package/dist/workflows/maestro-signals.d.ts +217 -0
- package/dist/workflows/maestro-signals.js +155 -0
- package/dist/workflows/maestro.d.ts +3 -0
- package/dist/workflows/maestro.js +812 -0
- package/dist/workflows/scheduler-signals.d.ts +10 -0
- package/dist/workflows/scheduler-signals.js +14 -0
- package/dist/workflows/scheduler.d.ts +17 -0
- package/dist/workflows/scheduler.js +143 -0
- package/dist/workflows/session.d.ts +2 -0
- package/dist/workflows/session.js +1638 -0
- package/dist/workflows/signals.d.ts +297 -0
- package/dist/workflows/signals.js +239 -0
- package/examples/agents/tempo-composer.md +56 -0
- package/examples/agents/tempo-conductor.md +117 -0
- package/examples/agents/tempo-critic.md +73 -0
- package/examples/agents/tempo-improv.md +74 -0
- package/examples/agents/tempo-liner.md +75 -0
- package/examples/agents/tempo-roadie.md +61 -0
- package/examples/agents/tempo-soloist.md +71 -0
- package/examples/agents/tempo-tuner.md +94 -0
- package/examples/ensembles/tempo-big-band.yaml +146 -0
- package/examples/ensembles/tempo-dev-team.yaml +58 -0
- package/examples/ensembles/tempo-headless-jam.yaml +77 -0
- package/examples/ensembles/tempo-jam-session.yaml +41 -0
- package/examples/ensembles/tempo-mock-jam.yaml +79 -0
- package/examples/ensembles/tempo-review-squad.yaml +32 -0
- package/package.json +172 -0
- package/packaging/launchd/com.agent.tempo.plist +46 -0
- package/packaging/systemd/agent-tempo.service +32 -0
- package/packaging/windows/install-task.ps1 +71 -0
- package/scenarios/conductor-recruit-mock.yaml +33 -0
- package/scenarios/echo-roundtrip.yaml +15 -0
- package/scenarios/multi-player-handoff.yaml +38 -0
- package/scenarios/recruit-cascade.yaml +38 -0
- package/scenarios/two-player-conversation.yaml +33 -0
- package/workflow-bundle.js +14146 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import type { SessionMetadata, Message, SentMessage, HistoryEntry, OutboxEntry, OutboxEntryInput, QualityGate, WorktreeEntry, StageEntry, AttachmentToken, AttachmentInfo, AdapterClass, DetachReason, OrphanSummary, PlayerStateEntry } from '../types';
|
|
2
|
+
export type { SessionMetadata, SessionInput, Message, Command, PlayerReport, SentMessage, HistoryEntry, OutboxEntry, OutboxEntryInput, OutboxEntryStatus, CueOutboxEntry, RecruitOutboxEntry, ReportOutboxEntry, StopOutboxEntry, ReleaseOutboxEntry, SpawnOutboxEntry, AgentType, QualityGate, QualityGateCriterion, WorktreeEntry, StageEntry, StagePlayerStatus, AttachmentToken, AttachmentInfo, AttachmentPhase, Attachment, AdapterClass, AdapterDescriptor, DetachReason, AdapterDirective, OrphanSummary, PlayerStateEntry, } from '../types';
|
|
3
|
+
export declare const receiveMessageSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
4
|
+
from: string;
|
|
5
|
+
text: string;
|
|
6
|
+
isMaestro?: boolean;
|
|
7
|
+
isScheduled?: boolean;
|
|
8
|
+
scheduleName?: string;
|
|
9
|
+
responseRequested?: boolean;
|
|
10
|
+
broadcastId?: string;
|
|
11
|
+
attachmentTicket?: string;
|
|
12
|
+
}], string>;
|
|
13
|
+
export declare const recordSentMessageSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
14
|
+
to: string;
|
|
15
|
+
text: string;
|
|
16
|
+
broadcastId?: string;
|
|
17
|
+
}], string>;
|
|
18
|
+
export declare const setPartSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
|
|
19
|
+
export declare const markDeliveredSignal: import("@temporalio/workflow").SignalDefinition<[string[]], string>;
|
|
20
|
+
export declare const setNameSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
|
|
21
|
+
export declare const updateMetadataSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
22
|
+
hostname?: string;
|
|
23
|
+
gitBranch?: string;
|
|
24
|
+
gitRoot?: string;
|
|
25
|
+
terminatedBy?: string;
|
|
26
|
+
enableStaleDetection?: boolean;
|
|
27
|
+
playerType?: string;
|
|
28
|
+
playerTypeDescription?: string;
|
|
29
|
+
worktreePath?: string;
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
}], string>;
|
|
32
|
+
export declare const getPartQuery: import("@temporalio/workflow").QueryDefinition<string, [], string>;
|
|
33
|
+
export declare const getMetadataQuery: import("@temporalio/workflow").QueryDefinition<SessionMetadata, [], string>;
|
|
34
|
+
export declare const pendingMessagesQuery: import("@temporalio/workflow").QueryDefinition<Message[], [], string>;
|
|
35
|
+
export declare const allMessagesQuery: import("@temporalio/workflow").QueryDefinition<Message[], [], string>;
|
|
36
|
+
export declare const allSentMessagesQuery: import("@temporalio/workflow").QueryDefinition<SentMessage[], [], string>;
|
|
37
|
+
/** Release a held session — unlocks the outbox and delivers the stored initial message. */
|
|
38
|
+
export declare const releaseHeldSignal: import("@temporalio/workflow").SignalDefinition<[], "releaseHeld">;
|
|
39
|
+
/** Query whether the session's outbox is locked (warm hold). */
|
|
40
|
+
export declare const outboxLockedQuery: import("@temporalio/workflow").QueryDefinition<boolean, [], string>;
|
|
41
|
+
/** Set the paused state for the session (ensemble-wide pause/resume). */
|
|
42
|
+
export declare const setPausedSignal: import("@temporalio/workflow").SignalDefinition<[boolean], string>;
|
|
43
|
+
/** Query whether the session is paused. */
|
|
44
|
+
export declare const pausedQuery: import("@temporalio/workflow").QueryDefinition<boolean, [], string>;
|
|
45
|
+
export declare const commandSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
46
|
+
text: string;
|
|
47
|
+
source: string;
|
|
48
|
+
replyTo?: string;
|
|
49
|
+
}], string>;
|
|
50
|
+
export declare const playerReportSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
51
|
+
playerId: string;
|
|
52
|
+
text: string;
|
|
53
|
+
type: "result" | "blocker" | "question";
|
|
54
|
+
}], string>;
|
|
55
|
+
export declare const historyQuery: import("@temporalio/workflow").QueryDefinition<HistoryEntry[], [], string>;
|
|
56
|
+
/** Signal that the adapter has started processing an inbound message (blocking LLM/tool call). */
|
|
57
|
+
export declare const processingStartUpdate: import("@temporalio/common").UpdateDefinition<{
|
|
58
|
+
inFlightCount: number;
|
|
59
|
+
}, [{
|
|
60
|
+
messageId: string;
|
|
61
|
+
expectedAttachmentId?: string;
|
|
62
|
+
}], string>;
|
|
63
|
+
/** Signal that the adapter has finished processing an inbound message. */
|
|
64
|
+
export declare const processingEndUpdate: import("@temporalio/common").UpdateDefinition<{
|
|
65
|
+
inFlightCount: number;
|
|
66
|
+
}, [{
|
|
67
|
+
messageId: string;
|
|
68
|
+
expectedAttachmentId?: string;
|
|
69
|
+
}], string>;
|
|
70
|
+
/** Query currently in-flight message IDs. */
|
|
71
|
+
export declare const inFlightMessagesQuery: import("@temporalio/workflow").QueryDefinition<string[], [], string>;
|
|
72
|
+
/** Destroy the session: abandon in-flight outbox per §2.5, emit audit event, COMPLETE. */
|
|
73
|
+
export declare const destroyUpdate: import("@temporalio/common").UpdateDefinition<void, [{
|
|
74
|
+
reason?: string;
|
|
75
|
+
terminatedBy?: string;
|
|
76
|
+
}], string>;
|
|
77
|
+
/** Query whether the session has been destroyed. */
|
|
78
|
+
export declare const isDestroyedQuery: import("@temporalio/workflow").QueryDefinition<boolean, [], string>;
|
|
79
|
+
/**
|
|
80
|
+
* Transactionally claim or renew the attachment lease on this workflow.
|
|
81
|
+
*
|
|
82
|
+
* - **First claim**: `expectedAttachmentId` absent, no live attachment → fresh `Attachment`
|
|
83
|
+
* created, phase `booting → attached` (or `detached → attached`).
|
|
84
|
+
* - **Renewal**: `expectedAttachmentId` matches current attachment AND lease not expired
|
|
85
|
+
* → extend `expiresAt` and `lastHeartbeatAt`. Returns same token.
|
|
86
|
+
* - **Conflict**: live attachment held by a different claimant → rejects with
|
|
87
|
+
* `AttachmentConflict` ApplicationFailure.
|
|
88
|
+
* - **WorkflowGone**: phase is `gone` → rejects with `WorkflowGone`.
|
|
89
|
+
*/
|
|
90
|
+
export declare const claimAttachmentUpdate: import("@temporalio/common").UpdateDefinition<AttachmentToken, [{
|
|
91
|
+
host: string;
|
|
92
|
+
adapterId: string;
|
|
93
|
+
adapterClass: AdapterClass;
|
|
94
|
+
leaseMs: number;
|
|
95
|
+
/** Present on renewal; absent on fresh claim. */
|
|
96
|
+
expectedAttachmentId?: string;
|
|
97
|
+
}], string>;
|
|
98
|
+
/**
|
|
99
|
+
* Revoke the current attachment. Options for drain-grace behavior during `draining` phase.
|
|
100
|
+
* Returns `{ reaped: true }` when a live attachment was revoked, `{ reaped: false }` when
|
|
101
|
+
* already detached (idempotent).
|
|
102
|
+
*/
|
|
103
|
+
export declare const forceDetachUpdate: import("@temporalio/common").UpdateDefinition<{
|
|
104
|
+
reaped: boolean;
|
|
105
|
+
previousAttachmentId?: string;
|
|
106
|
+
}, [{
|
|
107
|
+
reason: DetachReason;
|
|
108
|
+
/** If provided, only act if the current attachmentId matches. Prevents TOCTOU. */
|
|
109
|
+
expectedAttachmentId?: string;
|
|
110
|
+
/** 0 = immediate; >0 = wait up to this long for `drainingDeadline` first. */
|
|
111
|
+
gracePeriodMs: number;
|
|
112
|
+
}], string>;
|
|
113
|
+
/**
|
|
114
|
+
* Queue a spawn-outbox entry carrying the claim token. Called by `restart` after a successful
|
|
115
|
+
* `claimAttachment`. Workflow-side spawn-failure rollback lives in §8.4.
|
|
116
|
+
*/
|
|
117
|
+
export declare const enqueueSpawnUpdate: import("@temporalio/common").UpdateDefinition<{
|
|
118
|
+
spawnEntryId: string;
|
|
119
|
+
}, [{
|
|
120
|
+
host: string;
|
|
121
|
+
attachmentId: string;
|
|
122
|
+
runId: string;
|
|
123
|
+
resume: boolean;
|
|
124
|
+
sessionId?: string;
|
|
125
|
+
adapterId: string;
|
|
126
|
+
/** Resolved agent definition so restart spawns `--agent`/`--system-prompt`
|
|
127
|
+
* the same way recruit does. See #184. */
|
|
128
|
+
agentDefinition?: string;
|
|
129
|
+
agentDefinitionPath?: string;
|
|
130
|
+
nativeResolvable?: boolean;
|
|
131
|
+
/** #131 Phase C — claude-api model id carried across restart. */
|
|
132
|
+
model?: string;
|
|
133
|
+
}], string>;
|
|
134
|
+
/** Record a preferred host for daemon reconcile-on-boot targeting. */
|
|
135
|
+
export declare const setPreferredHostUpdate: import("@temporalio/common").UpdateDefinition<void, [{
|
|
136
|
+
host: string;
|
|
137
|
+
}], string>;
|
|
138
|
+
/**
|
|
139
|
+
* Liveness heartbeat from the adapter. Resets `lastHeartbeatAt` and extends `expiresAt` to
|
|
140
|
+
* `workflow.now() + leaseMs` iff `attachmentId` matches the current attachment; otherwise ignored.
|
|
141
|
+
*/
|
|
142
|
+
export declare const heartbeatSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
143
|
+
attachmentId: string;
|
|
144
|
+
at: string;
|
|
145
|
+
}], string>;
|
|
146
|
+
/**
|
|
147
|
+
* Adapter-, conductor-, or operator-initiated request to detach gracefully.
|
|
148
|
+
* Phase transitions to `draining`; outbox continues to drain up to `deadlineMs` then
|
|
149
|
+
* the main loop reaps.
|
|
150
|
+
*/
|
|
151
|
+
export declare const requestDetachSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
152
|
+
reason: DetachReason;
|
|
153
|
+
deadlineMs: number;
|
|
154
|
+
}], string>;
|
|
155
|
+
/**
|
|
156
|
+
* Final acknowledgement from a detaching adapter. Collapses `draining → detached` immediately
|
|
157
|
+
* if `attachmentId` matches the current attachment; ignored on `detached` (no-op).
|
|
158
|
+
*/
|
|
159
|
+
export declare const adapterExitedSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
160
|
+
attachmentId: string;
|
|
161
|
+
reason: DetachReason;
|
|
162
|
+
}], string>;
|
|
163
|
+
/** Current attachment state + phase + in-flight count. Read by adapters, tools, and the TUI. */
|
|
164
|
+
export declare const attachmentInfoQuery: import("@temporalio/workflow").QueryDefinition<AttachmentInfo, [], string>;
|
|
165
|
+
/**
|
|
166
|
+
* Daemon and CLI `restore` summary — metadata to render a detached-orphan card and decide
|
|
167
|
+
* whether auto-restore applies.
|
|
168
|
+
*/
|
|
169
|
+
export declare const orphanSummaryQuery: import("@temporalio/workflow").QueryDefinition<OrphanSummary, [], string>;
|
|
170
|
+
/**
|
|
171
|
+
* Save curated state for the calling player into a named slot.
|
|
172
|
+
*
|
|
173
|
+
* Validation (pre-handler):
|
|
174
|
+
* - `key` matches `PLAYER_STATE_KEY_REGEX` (alphanumeric + underscore + hyphen,
|
|
175
|
+
* 1–32 chars). `PlayerStateInvalidKey` on mismatch.
|
|
176
|
+
* - `content` byte length ≤ `PLAYER_STATE_CONTENT_MAX` (32 KiB).
|
|
177
|
+
* `PlayerStateContentTooLarge` on overflow.
|
|
178
|
+
* - When the key is new and slots already at `PLAYER_STATE_SLOTS_MAX` (4),
|
|
179
|
+
* rejects with `PlayerStateSlotsFull` and lists existing keys so the LLM
|
|
180
|
+
* can pick which slot to clear.
|
|
181
|
+
*
|
|
182
|
+
* On success, writes `{ content, savedAt: workflowNow().toISOString(), savedBy }`
|
|
183
|
+
* to `playerState[key]`. Carried via `continueAsNew`.
|
|
184
|
+
*/
|
|
185
|
+
export declare const savePlayerStateUpdate: import("@temporalio/common").UpdateDefinition<{
|
|
186
|
+
saved: true;
|
|
187
|
+
savedAt: string;
|
|
188
|
+
}, [{
|
|
189
|
+
key: string;
|
|
190
|
+
content: string;
|
|
191
|
+
savedBy: string;
|
|
192
|
+
}], string>;
|
|
193
|
+
/**
|
|
194
|
+
* Clear the named slot. Returns `{ cleared: true }` if the slot existed,
|
|
195
|
+
* `{ cleared: false }` if it was already empty (idempotent). Validates `key`
|
|
196
|
+
* against `PLAYER_STATE_KEY_REGEX`.
|
|
197
|
+
*/
|
|
198
|
+
export declare const clearPlayerStateUpdate: import("@temporalio/common").UpdateDefinition<{
|
|
199
|
+
cleared: boolean;
|
|
200
|
+
}, [{
|
|
201
|
+
key: string;
|
|
202
|
+
}], string>;
|
|
203
|
+
/**
|
|
204
|
+
* Read the named slot. Returns `null` when the slot is empty.
|
|
205
|
+
* `key` defaults to `PLAYER_STATE_DEFAULT_KEY` ('main').
|
|
206
|
+
*
|
|
207
|
+
* Peer-readable: any player in the ensemble may query any other player's
|
|
208
|
+
* saved state (audit identity is the entry's `savedBy`). Mirrors the
|
|
209
|
+
* `recall`/`attachment_info` ergonomics.
|
|
210
|
+
*/
|
|
211
|
+
export declare const playerStateQuery: import("@temporalio/workflow").QueryDefinition<PlayerStateEntry | null, [{
|
|
212
|
+
key?: string;
|
|
213
|
+
}], string>;
|
|
214
|
+
/** List names of populated slots (sorted). Returns `[]` when no slots are saved. */
|
|
215
|
+
export declare const playerStateKeysQuery: import("@temporalio/workflow").QueryDefinition<string[], [], string>;
|
|
216
|
+
export declare const submitOutboxUpdate: import("@temporalio/common").UpdateDefinition<string, [OutboxEntryInput], string>;
|
|
217
|
+
export declare const outboxQuery: import("@temporalio/workflow").QueryDefinition<OutboxEntry[], [], string>;
|
|
218
|
+
/**
|
|
219
|
+
* Q5.2 — runId of the current workflow execution. Returned as the raw
|
|
220
|
+
* UUID string from `workflowInfo().runId`; the dashboard truncates to
|
|
221
|
+
* `XXXX·XXXX` (first 4 + last 4 + middle dot) client-side so this query
|
|
222
|
+
* stays a thin pass-through.
|
|
223
|
+
*/
|
|
224
|
+
export declare const getRunIdQuery: import("@temporalio/workflow").QueryDefinition<string, [], string>;
|
|
225
|
+
/**
|
|
226
|
+
* Q5.5 — messaging counters + outbox status summary. The dashboard
|
|
227
|
+
* renders three KV rows under `Messages`. Counters are monotonic
|
|
228
|
+
* across the workflow's lifetime (preserved across continueAsNew via
|
|
229
|
+
* SessionInput).
|
|
230
|
+
*
|
|
231
|
+
* `outbox` is a reduce-helper string: `"empty"` / `"N pending"` /
|
|
232
|
+
* `"N pending (oldest 2m)"` once the oldest pending entry is older than
|
|
233
|
+
* the stale threshold. Computing this server-side keeps the wire shape
|
|
234
|
+
* tight.
|
|
235
|
+
*/
|
|
236
|
+
export declare const getMessagingStateQuery: import("@temporalio/workflow").QueryDefinition<{
|
|
237
|
+
received: number;
|
|
238
|
+
sent: number;
|
|
239
|
+
outbox: string;
|
|
240
|
+
}, [], string>;
|
|
241
|
+
/**
|
|
242
|
+
* Q5.6 — activity counter + last-activity timestamp. Critical-path for
|
|
243
|
+
* W1's tempo computation: the maestro fan-queries this from each
|
|
244
|
+
* session to compute msgs/min buckets. `activityCount` increments at
|
|
245
|
+
* the same ~20 sites that already update `lastActivityTime` (cue,
|
|
246
|
+
* outbox push, schedule fire, report, recruit, restart, destroy,
|
|
247
|
+
* migrate, etc.). Heartbeats and lifecycle plumbing don't bump it.
|
|
248
|
+
*
|
|
249
|
+
* `lastActivityAt` is ISO so the maestro can compute clock-relative
|
|
250
|
+
* deltas without re-parsing.
|
|
251
|
+
*/
|
|
252
|
+
export declare const getActivityStateQuery: import("@temporalio/workflow").QueryDefinition<{
|
|
253
|
+
activityCount: number;
|
|
254
|
+
lastActivityAt: string;
|
|
255
|
+
}, [], string>;
|
|
256
|
+
/**
|
|
257
|
+
* Q5.7 — current attachment lease window. Returns `{ expiresAt,
|
|
258
|
+
* leaseMs }` as numbers (epoch ms / ms) so the dashboard can compute
|
|
259
|
+
* "expires in 54s" without parsing ISO strings every render. Both
|
|
260
|
+
* fields are `null` when no active lease (phase ∈ booting / detached /
|
|
261
|
+
* gone).
|
|
262
|
+
*
|
|
263
|
+
* The underlying `Attachment.expiresAt` is stored as an ISO string for
|
|
264
|
+
* historical reasons; the query handler parses to epoch ms at the
|
|
265
|
+
* boundary.
|
|
266
|
+
*/
|
|
267
|
+
export declare const getLeaseStateQuery: import("@temporalio/workflow").QueryDefinition<{
|
|
268
|
+
expiresAt: number | null;
|
|
269
|
+
leaseMs: number | null;
|
|
270
|
+
}, [], string>;
|
|
271
|
+
export declare const testForceContinueAsNewSignal: import("@temporalio/workflow").SignalDefinition<[], "testForceContinueAsNew">;
|
|
272
|
+
export declare const setQualityGateSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
273
|
+
task: string;
|
|
274
|
+
criteria: string[];
|
|
275
|
+
createdBy: string;
|
|
276
|
+
}], string>;
|
|
277
|
+
export declare const evaluateGateCriteriaSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
278
|
+
task: string;
|
|
279
|
+
evaluations: Array<{
|
|
280
|
+
index: number;
|
|
281
|
+
status: "passed" | "failed";
|
|
282
|
+
notes?: string;
|
|
283
|
+
}>;
|
|
284
|
+
evaluatedBy: string;
|
|
285
|
+
}], string>;
|
|
286
|
+
export declare const qualityGatesQuery: import("@temporalio/workflow").QueryDefinition<QualityGate[], [], string>;
|
|
287
|
+
export declare const setWorktreeSignal: import("@temporalio/workflow").SignalDefinition<[WorktreeEntry], string>;
|
|
288
|
+
export declare const removeWorktreeSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
|
|
289
|
+
export declare const worktreesQuery: import("@temporalio/workflow").QueryDefinition<WorktreeEntry[], [], string>;
|
|
290
|
+
export declare const setStageSignal: import("@temporalio/workflow").SignalDefinition<[{
|
|
291
|
+
name: string;
|
|
292
|
+
players: string[];
|
|
293
|
+
failurePolicy?: "halt" | "continue";
|
|
294
|
+
createdBy: string;
|
|
295
|
+
}], string>;
|
|
296
|
+
export declare const cancelStageSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
|
|
297
|
+
export declare const stagesQuery: import("@temporalio/workflow").QueryDefinition<StageEntry[], [], string>;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setStageSignal = exports.worktreesQuery = exports.removeWorktreeSignal = exports.setWorktreeSignal = exports.qualityGatesQuery = exports.evaluateGateCriteriaSignal = exports.setQualityGateSignal = exports.testForceContinueAsNewSignal = exports.getLeaseStateQuery = exports.getActivityStateQuery = exports.getMessagingStateQuery = exports.getRunIdQuery = exports.outboxQuery = exports.submitOutboxUpdate = exports.playerStateKeysQuery = exports.playerStateQuery = exports.clearPlayerStateUpdate = exports.savePlayerStateUpdate = exports.orphanSummaryQuery = exports.attachmentInfoQuery = exports.adapterExitedSignal = exports.requestDetachSignal = exports.heartbeatSignal = exports.setPreferredHostUpdate = exports.enqueueSpawnUpdate = exports.forceDetachUpdate = exports.claimAttachmentUpdate = exports.isDestroyedQuery = exports.destroyUpdate = exports.inFlightMessagesQuery = exports.processingEndUpdate = exports.processingStartUpdate = exports.historyQuery = exports.playerReportSignal = exports.commandSignal = exports.pausedQuery = exports.setPausedSignal = exports.outboxLockedQuery = exports.releaseHeldSignal = exports.allSentMessagesQuery = exports.allMessagesQuery = exports.pendingMessagesQuery = exports.getMetadataQuery = exports.getPartQuery = exports.updateMetadataSignal = exports.setNameSignal = exports.markDeliveredSignal = exports.setPartSignal = exports.recordSentMessageSignal = exports.receiveMessageSignal = void 0;
|
|
4
|
+
exports.stagesQuery = exports.cancelStageSignal = void 0;
|
|
5
|
+
const workflow_1 = require("@temporalio/workflow");
|
|
6
|
+
// ── Player Signals ──
|
|
7
|
+
// `isScheduled` + `scheduleName` are set by `src/activities/schedule-fire.ts`
|
|
8
|
+
// when the message originated from the scheduler workflow — allows dashboards
|
|
9
|
+
// and consumers to distinguish scheduled fires from direct cues. Documented in
|
|
10
|
+
// docs/WIRE-PROTOCOL.md; runtime senders have populated both fields since the
|
|
11
|
+
// scheduler shipped, but the TS type drifted (#251). Optional everywhere.
|
|
12
|
+
// `broadcastId` (#357) is an additive optional field — same id on every fan-out
|
|
13
|
+
// target of one `broadcast` invocation. The TUI uses it to fold N deliveries
|
|
14
|
+
// into one chat row.
|
|
15
|
+
// `attachmentTicket` (#318) is an additive optional field — coat-check ticket
|
|
16
|
+
// the sender stashed via `coat_check_put`; the recipient pulls the body via
|
|
17
|
+
// `coat_check_get`. Backward-compatible — pre-#318 cues simply don't have it.
|
|
18
|
+
exports.receiveMessageSignal = (0, workflow_1.defineSignal)('receiveMessage');
|
|
19
|
+
exports.recordSentMessageSignal = (0, workflow_1.defineSignal)('recordSentMessage');
|
|
20
|
+
exports.setPartSignal = (0, workflow_1.defineSignal)('setPart');
|
|
21
|
+
exports.markDeliveredSignal = (0, workflow_1.defineSignal)('markDelivered');
|
|
22
|
+
exports.setNameSignal = (0, workflow_1.defineSignal)('setName');
|
|
23
|
+
exports.updateMetadataSignal = (0, workflow_1.defineSignal)('updateMetadata');
|
|
24
|
+
// ── Player Queries ──
|
|
25
|
+
exports.getPartQuery = (0, workflow_1.defineQuery)('getPart');
|
|
26
|
+
exports.getMetadataQuery = (0, workflow_1.defineQuery)('getMetadata');
|
|
27
|
+
exports.pendingMessagesQuery = (0, workflow_1.defineQuery)('pendingMessages');
|
|
28
|
+
exports.allMessagesQuery = (0, workflow_1.defineQuery)('allMessages');
|
|
29
|
+
exports.allSentMessagesQuery = (0, workflow_1.defineQuery)('allSentMessages');
|
|
30
|
+
// ── Hold / Release ──
|
|
31
|
+
/** Release a held session — unlocks the outbox and delivers the stored initial message. */
|
|
32
|
+
exports.releaseHeldSignal = (0, workflow_1.defineSignal)('releaseHeld');
|
|
33
|
+
/** Query whether the session's outbox is locked (warm hold). */
|
|
34
|
+
exports.outboxLockedQuery = (0, workflow_1.defineQuery)('outboxLocked');
|
|
35
|
+
/** Set the paused state for the session (ensemble-wide pause/resume). */
|
|
36
|
+
exports.setPausedSignal = (0, workflow_1.defineSignal)('setPaused');
|
|
37
|
+
/** Query whether the session is paused. */
|
|
38
|
+
exports.pausedQuery = (0, workflow_1.defineQuery)('paused');
|
|
39
|
+
// ── Conductor Signals ──
|
|
40
|
+
exports.commandSignal = (0, workflow_1.defineSignal)('command');
|
|
41
|
+
exports.playerReportSignal = (0, workflow_1.defineSignal)('playerReport');
|
|
42
|
+
// ── Conductor Queries ──
|
|
43
|
+
exports.historyQuery = (0, workflow_1.defineQuery)('history');
|
|
44
|
+
// ── Processing Lifecycle (fixes #99; phase machine hook in v0.25) ──
|
|
45
|
+
// Suppress stale detection while the adapter is in a blocking operation (e.g. LLM tool call).
|
|
46
|
+
// `messageId` is required for idempotency — at-least-once update retries otherwise corrupt the set.
|
|
47
|
+
//
|
|
48
|
+
// v0.25 extends the input to carry `expectedAttachmentId` and the return to carry
|
|
49
|
+
// `inFlightCount`. The MVP shape (`{ messageId }`, `void`) remains supported by the
|
|
50
|
+
// compat shim; when `expectedAttachmentId` is absent the handler operates on whatever
|
|
51
|
+
// attachment is currently active (reconstructing MVP semantics).
|
|
52
|
+
//
|
|
53
|
+
// Post-PR-C, adapters always provide `expectedAttachmentId` so the workflow can reject
|
|
54
|
+
// updates intended for a superseded attachment.
|
|
55
|
+
/** Signal that the adapter has started processing an inbound message (blocking LLM/tool call). */
|
|
56
|
+
exports.processingStartUpdate = (0, workflow_1.defineUpdate)('processingStart');
|
|
57
|
+
/** Signal that the adapter has finished processing an inbound message. */
|
|
58
|
+
exports.processingEndUpdate = (0, workflow_1.defineUpdate)('processingEnd');
|
|
59
|
+
/** Query currently in-flight message IDs. */
|
|
60
|
+
exports.inFlightMessagesQuery = (0, workflow_1.defineQuery)('inFlightMessages');
|
|
61
|
+
// ── Destroy Verb (fixes #102; terminal per §8.5) ──
|
|
62
|
+
// Permanent, terminal teardown. Once destroyed, the workflow refuses all attach-adjacent ops
|
|
63
|
+
// and adapters (bridge) must exit cleanly instead of reconnecting.
|
|
64
|
+
/** Destroy the session: abandon in-flight outbox per §2.5, emit audit event, COMPLETE. */
|
|
65
|
+
exports.destroyUpdate = (0, workflow_1.defineUpdate)('destroy');
|
|
66
|
+
/** Query whether the session has been destroyed. */
|
|
67
|
+
exports.isDestroyedQuery = (0, workflow_1.defineQuery)('isDestroyed');
|
|
68
|
+
// ── v0.25 Attachment Lifecycle (design §§8, §9.2, §11.1) ──
|
|
69
|
+
/**
|
|
70
|
+
* Transactionally claim or renew the attachment lease on this workflow.
|
|
71
|
+
*
|
|
72
|
+
* - **First claim**: `expectedAttachmentId` absent, no live attachment → fresh `Attachment`
|
|
73
|
+
* created, phase `booting → attached` (or `detached → attached`).
|
|
74
|
+
* - **Renewal**: `expectedAttachmentId` matches current attachment AND lease not expired
|
|
75
|
+
* → extend `expiresAt` and `lastHeartbeatAt`. Returns same token.
|
|
76
|
+
* - **Conflict**: live attachment held by a different claimant → rejects with
|
|
77
|
+
* `AttachmentConflict` ApplicationFailure.
|
|
78
|
+
* - **WorkflowGone**: phase is `gone` → rejects with `WorkflowGone`.
|
|
79
|
+
*/
|
|
80
|
+
exports.claimAttachmentUpdate = (0, workflow_1.defineUpdate)('claimAttachment');
|
|
81
|
+
/**
|
|
82
|
+
* Revoke the current attachment. Options for drain-grace behavior during `draining` phase.
|
|
83
|
+
* Returns `{ reaped: true }` when a live attachment was revoked, `{ reaped: false }` when
|
|
84
|
+
* already detached (idempotent).
|
|
85
|
+
*/
|
|
86
|
+
exports.forceDetachUpdate = (0, workflow_1.defineUpdate)('forceDetach');
|
|
87
|
+
/**
|
|
88
|
+
* Queue a spawn-outbox entry carrying the claim token. Called by `restart` after a successful
|
|
89
|
+
* `claimAttachment`. Workflow-side spawn-failure rollback lives in §8.4.
|
|
90
|
+
*/
|
|
91
|
+
exports.enqueueSpawnUpdate = (0, workflow_1.defineUpdate)('enqueueSpawn');
|
|
92
|
+
/** Record a preferred host for daemon reconcile-on-boot targeting. */
|
|
93
|
+
exports.setPreferredHostUpdate = (0, workflow_1.defineUpdate)('setPreferredHost');
|
|
94
|
+
// ── v0.25 Attachment Signals ──
|
|
95
|
+
/**
|
|
96
|
+
* Liveness heartbeat from the adapter. Resets `lastHeartbeatAt` and extends `expiresAt` to
|
|
97
|
+
* `workflow.now() + leaseMs` iff `attachmentId` matches the current attachment; otherwise ignored.
|
|
98
|
+
*/
|
|
99
|
+
exports.heartbeatSignal = (0, workflow_1.defineSignal)('heartbeat');
|
|
100
|
+
/**
|
|
101
|
+
* Adapter-, conductor-, or operator-initiated request to detach gracefully.
|
|
102
|
+
* Phase transitions to `draining`; outbox continues to drain up to `deadlineMs` then
|
|
103
|
+
* the main loop reaps.
|
|
104
|
+
*/
|
|
105
|
+
exports.requestDetachSignal = (0, workflow_1.defineSignal)('requestDetach');
|
|
106
|
+
/**
|
|
107
|
+
* Final acknowledgement from a detaching adapter. Collapses `draining → detached` immediately
|
|
108
|
+
* if `attachmentId` matches the current attachment; ignored on `detached` (no-op).
|
|
109
|
+
*/
|
|
110
|
+
exports.adapterExitedSignal = (0, workflow_1.defineSignal)('adapterExited');
|
|
111
|
+
// ── v0.25 Attachment Queries ──
|
|
112
|
+
/** Current attachment state + phase + in-flight count. Read by adapters, tools, and the TUI. */
|
|
113
|
+
exports.attachmentInfoQuery = (0, workflow_1.defineQuery)('attachmentInfo');
|
|
114
|
+
/**
|
|
115
|
+
* Daemon and CLI `restore` summary — metadata to render a detached-orphan card and decide
|
|
116
|
+
* whether auto-restore applies.
|
|
117
|
+
*/
|
|
118
|
+
exports.orphanSummaryQuery = (0, workflow_1.defineQuery)('orphanSummary');
|
|
119
|
+
// ── Player Saveable State (#334 PR-1, ADR 0011) ──
|
|
120
|
+
//
|
|
121
|
+
// Per-session, player-curated state slots. Player-only writes (no `playerId`
|
|
122
|
+
// arg → tool wires the calling player's own handle); peer reads via
|
|
123
|
+
// `playerStateQuery`. Sized per design §3.3: max 4 slots × 32 KiB content
|
|
124
|
+
// = 128 KiB structural max. Saturation rejects with `PlayerStateSlotsFull`
|
|
125
|
+
// rather than evicting LRU.
|
|
126
|
+
//
|
|
127
|
+
// Validators run pre-handler so size/slot-cap rejections never commit
|
|
128
|
+
// history events. See `src/utils/validation.ts` for the constants.
|
|
129
|
+
/**
|
|
130
|
+
* Save curated state for the calling player into a named slot.
|
|
131
|
+
*
|
|
132
|
+
* Validation (pre-handler):
|
|
133
|
+
* - `key` matches `PLAYER_STATE_KEY_REGEX` (alphanumeric + underscore + hyphen,
|
|
134
|
+
* 1–32 chars). `PlayerStateInvalidKey` on mismatch.
|
|
135
|
+
* - `content` byte length ≤ `PLAYER_STATE_CONTENT_MAX` (32 KiB).
|
|
136
|
+
* `PlayerStateContentTooLarge` on overflow.
|
|
137
|
+
* - When the key is new and slots already at `PLAYER_STATE_SLOTS_MAX` (4),
|
|
138
|
+
* rejects with `PlayerStateSlotsFull` and lists existing keys so the LLM
|
|
139
|
+
* can pick which slot to clear.
|
|
140
|
+
*
|
|
141
|
+
* On success, writes `{ content, savedAt: workflowNow().toISOString(), savedBy }`
|
|
142
|
+
* to `playerState[key]`. Carried via `continueAsNew`.
|
|
143
|
+
*/
|
|
144
|
+
exports.savePlayerStateUpdate = (0, workflow_1.defineUpdate)('savePlayerState');
|
|
145
|
+
/**
|
|
146
|
+
* Clear the named slot. Returns `{ cleared: true }` if the slot existed,
|
|
147
|
+
* `{ cleared: false }` if it was already empty (idempotent). Validates `key`
|
|
148
|
+
* against `PLAYER_STATE_KEY_REGEX`.
|
|
149
|
+
*/
|
|
150
|
+
exports.clearPlayerStateUpdate = (0, workflow_1.defineUpdate)('clearPlayerState');
|
|
151
|
+
/**
|
|
152
|
+
* Read the named slot. Returns `null` when the slot is empty.
|
|
153
|
+
* `key` defaults to `PLAYER_STATE_DEFAULT_KEY` ('main').
|
|
154
|
+
*
|
|
155
|
+
* Peer-readable: any player in the ensemble may query any other player's
|
|
156
|
+
* saved state (audit identity is the entry's `savedBy`). Mirrors the
|
|
157
|
+
* `recall`/`attachment_info` ergonomics.
|
|
158
|
+
*/
|
|
159
|
+
exports.playerStateQuery = (0, workflow_1.defineQuery)('playerState');
|
|
160
|
+
/** List names of populated slots (sorted). Returns `[]` when no slots are saved. */
|
|
161
|
+
exports.playerStateKeysQuery = (0, workflow_1.defineQuery)('playerStateKeys');
|
|
162
|
+
// ── Outbox Update + Query ──
|
|
163
|
+
exports.submitOutboxUpdate = (0, workflow_1.defineUpdate)('submitOutbox');
|
|
164
|
+
exports.outboxQuery = (0, workflow_1.defineQuery)('outbox');
|
|
165
|
+
// ── #399 W2 — Session wire extensions (Q5.2 / Q5.5 / Q5.6 / Q5.7) ──
|
|
166
|
+
//
|
|
167
|
+
// Additive queries that surface session-level fields the dashboard
|
|
168
|
+
// renders as `"—"` placeholders today. All counters live on the session
|
|
169
|
+
// workflow + carry across continueAsNew via SessionInput.
|
|
170
|
+
/**
|
|
171
|
+
* Q5.2 — runId of the current workflow execution. Returned as the raw
|
|
172
|
+
* UUID string from `workflowInfo().runId`; the dashboard truncates to
|
|
173
|
+
* `XXXX·XXXX` (first 4 + last 4 + middle dot) client-side so this query
|
|
174
|
+
* stays a thin pass-through.
|
|
175
|
+
*/
|
|
176
|
+
exports.getRunIdQuery = (0, workflow_1.defineQuery)('getRunId');
|
|
177
|
+
/**
|
|
178
|
+
* Q5.5 — messaging counters + outbox status summary. The dashboard
|
|
179
|
+
* renders three KV rows under `Messages`. Counters are monotonic
|
|
180
|
+
* across the workflow's lifetime (preserved across continueAsNew via
|
|
181
|
+
* SessionInput).
|
|
182
|
+
*
|
|
183
|
+
* `outbox` is a reduce-helper string: `"empty"` / `"N pending"` /
|
|
184
|
+
* `"N pending (oldest 2m)"` once the oldest pending entry is older than
|
|
185
|
+
* the stale threshold. Computing this server-side keeps the wire shape
|
|
186
|
+
* tight.
|
|
187
|
+
*/
|
|
188
|
+
exports.getMessagingStateQuery = (0, workflow_1.defineQuery)('getMessagingState');
|
|
189
|
+
/**
|
|
190
|
+
* Q5.6 — activity counter + last-activity timestamp. Critical-path for
|
|
191
|
+
* W1's tempo computation: the maestro fan-queries this from each
|
|
192
|
+
* session to compute msgs/min buckets. `activityCount` increments at
|
|
193
|
+
* the same ~20 sites that already update `lastActivityTime` (cue,
|
|
194
|
+
* outbox push, schedule fire, report, recruit, restart, destroy,
|
|
195
|
+
* migrate, etc.). Heartbeats and lifecycle plumbing don't bump it.
|
|
196
|
+
*
|
|
197
|
+
* `lastActivityAt` is ISO so the maestro can compute clock-relative
|
|
198
|
+
* deltas without re-parsing.
|
|
199
|
+
*/
|
|
200
|
+
exports.getActivityStateQuery = (0, workflow_1.defineQuery)('getActivityState');
|
|
201
|
+
/**
|
|
202
|
+
* Q5.7 — current attachment lease window. Returns `{ expiresAt,
|
|
203
|
+
* leaseMs }` as numbers (epoch ms / ms) so the dashboard can compute
|
|
204
|
+
* "expires in 54s" without parsing ISO strings every render. Both
|
|
205
|
+
* fields are `null` when no active lease (phase ∈ booting / detached /
|
|
206
|
+
* gone).
|
|
207
|
+
*
|
|
208
|
+
* The underlying `Attachment.expiresAt` is stored as an ISO string for
|
|
209
|
+
* historical reasons; the query handler parses to epoch ms at the
|
|
210
|
+
* boundary.
|
|
211
|
+
*/
|
|
212
|
+
exports.getLeaseStateQuery = (0, workflow_1.defineQuery)('getLeaseState');
|
|
213
|
+
// ── Test-only Signals ──
|
|
214
|
+
//
|
|
215
|
+
// **Test-only.** Forces the session workflow's main loop to take the
|
|
216
|
+
// `continueAsNew` branch on its next iteration, regardless of
|
|
217
|
+
// `workflowInfo().continueAsNewSuggested`. Used by the adapter reconnect test
|
|
218
|
+
// (#226) to exercise the CAN-boundary rebind path without spamming ~10k
|
|
219
|
+
// history events to hit the server's native suggestion threshold.
|
|
220
|
+
//
|
|
221
|
+
// Production senders do not exist — the signal is a test fixture. Kept on the
|
|
222
|
+
// main signal surface (rather than a side channel) so the workflow worker
|
|
223
|
+
// bundle needs no special build flag to accept it. The wire name is a plain
|
|
224
|
+
// identifier so the wire-protocol drift detector can match it in the docs
|
|
225
|
+
// table (the doc regex in `test/wire-protocol.test.ts` only accepts
|
|
226
|
+
// identifier-shaped names to avoid picking up prose false positives).
|
|
227
|
+
exports.testForceContinueAsNewSignal = (0, workflow_1.defineSignal)('testForceContinueAsNew');
|
|
228
|
+
// ── Quality Gate Signals + Query (conductor-only) ──
|
|
229
|
+
exports.setQualityGateSignal = (0, workflow_1.defineSignal)('setQualityGate');
|
|
230
|
+
exports.evaluateGateCriteriaSignal = (0, workflow_1.defineSignal)('evaluateGateCriteria');
|
|
231
|
+
exports.qualityGatesQuery = (0, workflow_1.defineQuery)('qualityGates');
|
|
232
|
+
// ── Worktree Signals + Query (conductor-only) ──
|
|
233
|
+
exports.setWorktreeSignal = (0, workflow_1.defineSignal)('setWorktree');
|
|
234
|
+
exports.removeWorktreeSignal = (0, workflow_1.defineSignal)('removeWorktree');
|
|
235
|
+
exports.worktreesQuery = (0, workflow_1.defineQuery)('worktrees');
|
|
236
|
+
// ── Stage Signals + Query (conductor-only) ──
|
|
237
|
+
exports.setStageSignal = (0, workflow_1.defineSignal)('setStage');
|
|
238
|
+
exports.cancelStageSignal = (0, workflow_1.defineSignal)('cancelStage');
|
|
239
|
+
exports.stagesQuery = (0, workflow_1.defineQuery)('stages');
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tempo-composer
|
|
3
|
+
description: Software architect — designs system structure, defines interfaces, makes technology decisions. Focuses on the "what" and "why", not implementation.
|
|
4
|
+
model: opus
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the **Composer** of the ensemble — the Software Architect. You design the structure of the system: modules, boundaries, interfaces, data flow, and technical direction. You define *what* gets built and *why*, then hand off the *how* to soloists.
|
|
8
|
+
|
|
9
|
+
## Responsibilities
|
|
10
|
+
|
|
11
|
+
- Design system architecture: module boundaries, service decomposition, data flow
|
|
12
|
+
- Define interfaces and contracts between components
|
|
13
|
+
- Make technology choices with clear rationale
|
|
14
|
+
- Analyze dependencies, coupling, and integration points
|
|
15
|
+
- Identify scalability, security, and maintainability risks before they become problems
|
|
16
|
+
- Review proposed designs and implementations for architectural consistency
|
|
17
|
+
- Select API paradigms (REST, GraphQL, RPC) based on use case requirements
|
|
18
|
+
|
|
19
|
+
## Working Style
|
|
20
|
+
|
|
21
|
+
- **Understand before proposing**: Read existing code and architecture before suggesting changes. Respect what's already there.
|
|
22
|
+
- **Think in systems**: Focus on boundaries, trade-offs, and data flow — not individual functions.
|
|
23
|
+
- **Document decisions**: Every architectural decision should come with rationale and trade-offs considered. Write ADRs when the decision is significant.
|
|
24
|
+
- **Be opinionated but open**: Have strong views on architecture, loosely held. Change your mind when presented with evidence.
|
|
25
|
+
- **Delegate implementation**: Define the shape of the solution, then hand off to soloists. Don't get pulled into writing production code.
|
|
26
|
+
- **Consider observability**: Design systems that are debuggable. Think about logging, tracing, and error reporting from the start.
|
|
27
|
+
- **Don't over-architect**: Design the simplest structure that meets the known requirements. If you're adding abstraction layers without a concrete, present-tense benefit, remove them. Apply `/simplify` thinking — if a design element can't be justified by a real requirement, it doesn't belong.
|
|
28
|
+
- **Avoid designing for imagined futures**: Add extensibility only where there's evidence you'll need it. Speculative abstractions become maintenance burdens. You can always refactor when the need is real.
|
|
29
|
+
|
|
30
|
+
## Ensemble Collaboration
|
|
31
|
+
|
|
32
|
+
- **`ensemble`**: Check who's active before proposing designs that affect multiple players' work. Understand the current state of implementation.
|
|
33
|
+
- **`cue`**: Use to share design decisions, interface definitions, and architectural guidance with soloists. When a soloist asks a design question, respond with structured reasoning: context, options, recommendation, trade-offs.
|
|
34
|
+
- **`report`**: Report to the conductor when:
|
|
35
|
+
- A design decision is made (so it can be communicated to affected players)
|
|
36
|
+
- You identify an architectural risk or concern
|
|
37
|
+
- You need input on requirements before you can finalize a design
|
|
38
|
+
- A design review is complete (with approve/reject/concerns)
|
|
39
|
+
- **`who_am_i`**: Check your assignment and any type-specific instructions at startup.
|
|
40
|
+
- **`agent_types`**: If you identify a need for a specialist (e.g., security review of your design), suggest the conductor recruit one.
|
|
41
|
+
|
|
42
|
+
### When other players cue you
|
|
43
|
+
|
|
44
|
+
- **Soloists asking design questions**: Respond promptly with clear, actionable guidance. Don't send them in circles.
|
|
45
|
+
- **Conductor asking for design review**: Provide structured feedback — approved, changes requested, or concerns flagged — with specific reasoning.
|
|
46
|
+
- **Tuners reporting architectural test gaps**: Acknowledge and adjust the design to improve testability if needed.
|
|
47
|
+
|
|
48
|
+
## Context Pressure
|
|
49
|
+
|
|
50
|
+
If you notice your context growing large, you're losing track of earlier instructions, or you find yourself repeating work, report to the conductor immediately with a structured summary:
|
|
51
|
+
|
|
52
|
+
1. **Current task**: What you're working on right now
|
|
53
|
+
2. **Key findings so far**: Important decisions, completed work, file paths changed
|
|
54
|
+
3. **Recommended next steps**: What remains to be done
|
|
55
|
+
|
|
56
|
+
This lets the conductor refresh your session with a clean context while preserving continuity.
|