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,64 @@
|
|
|
1
|
+
import { Client, WorkflowHandle } from '@temporalio/client';
|
|
2
|
+
import { AttachmentPhase } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a session by player name.
|
|
5
|
+
* Lists all running session workflows and queries each for metadata.
|
|
6
|
+
* This avoids depending on custom search attributes which are eventually
|
|
7
|
+
* consistent and may be missing or stale.
|
|
8
|
+
*
|
|
9
|
+
* Shared by activity files (outbox, schedule-fire) and the tools layer.
|
|
10
|
+
*
|
|
11
|
+
* **Deadline (#336/#529):** the visibility iterator is bounded by
|
|
12
|
+
* `VISIBILITY_DEADLINES_MS.resolveSession` (default 10s). On timeout,
|
|
13
|
+
* throws `VisibilityIteratorTimeoutError` rather than returning `null`
|
|
14
|
+
* — silent `null` on a partially-scanned set would be indistinguishable
|
|
15
|
+
* from "definitely not found," producing false "Player not found" errors
|
|
16
|
+
* upstream. Every existing caller wraps this in a try/catch (outbox
|
|
17
|
+
* activities, MCP tools' `defineTool` helper, CLI dev-verbs); the throw
|
|
18
|
+
* propagates as a retryable / user-visible "lookup timed out" rather
|
|
19
|
+
* than the misleading "player not found."
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveSession(client: Client, ensemble: string, playerName: string): Promise<WorkflowHandle | null>;
|
|
22
|
+
/** Info returned for each session by scanEnsembleSessions. */
|
|
23
|
+
export interface EnsembleSessionInfo {
|
|
24
|
+
workflowId: string;
|
|
25
|
+
playerId: string;
|
|
26
|
+
part: string;
|
|
27
|
+
hostname: string;
|
|
28
|
+
workDir: string;
|
|
29
|
+
gitRoot?: string;
|
|
30
|
+
gitBranch?: string;
|
|
31
|
+
isConductor: boolean;
|
|
32
|
+
agentType: string;
|
|
33
|
+
playerType?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Attachment phase read from the `AgentTempoAttachmentState` search attribute.
|
|
36
|
+
* May be undefined for older workflows that predate the attachment lifecycle,
|
|
37
|
+
* or transiently while search attributes propagate.
|
|
38
|
+
*/
|
|
39
|
+
phase?: AttachmentPhase;
|
|
40
|
+
/**
|
|
41
|
+
* #399 W1+W2 — monotonic message-activity counter from the session's
|
|
42
|
+
* `getActivityState` query (introduced in W2). Undefined when the
|
|
43
|
+
* session predates W2 or the query failed.
|
|
44
|
+
*/
|
|
45
|
+
activityCount?: number;
|
|
46
|
+
/**
|
|
47
|
+
* #399 W1+W2 — ISO timestamp of the last activity-counter bump on the
|
|
48
|
+
* session. Undefined when the session predates W2 or the query failed.
|
|
49
|
+
*/
|
|
50
|
+
lastActivityAt?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Scan all running session workflows in an ensemble.
|
|
54
|
+
* Returns metadata + part for each session. Shared by the ensemble MCP tool
|
|
55
|
+
* and the Maestro refresh activity.
|
|
56
|
+
*
|
|
57
|
+
* **Deadline (#336/#529):** the iterator is bounded by
|
|
58
|
+
* `VISIBILITY_DEADLINES_MS.scanEnsembleSessions` (default 15s). On
|
|
59
|
+
* timeout, returns the partial result accumulated so far and emits a
|
|
60
|
+
* warn log. This site is **partial-tolerant by design** — the caller
|
|
61
|
+
* (maestro refresh, ensemble MCP tool) treats the result as a
|
|
62
|
+
* best-effort snapshot that the next tick / re-invocation will fill in.
|
|
63
|
+
*/
|
|
64
|
+
export declare function scanEnsembleSessions(client: Client, ensemble: string, log?: (...args: unknown[]) => void): Promise<EnsembleSessionInfo[]>;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveSession = resolveSession;
|
|
4
|
+
exports.scanEnsembleSessions = scanEnsembleSessions;
|
|
5
|
+
const search_attributes_1 = require("../utils/search-attributes");
|
|
6
|
+
const signals_1 = require("../workflows/signals");
|
|
7
|
+
const query_timeout_1 = require("../utils/query-timeout");
|
|
8
|
+
const visibility_deadline_1 = require("../utils/visibility-deadline");
|
|
9
|
+
/** Shared query for listing running session workflows. */
|
|
10
|
+
const SESSION_LIST_QUERY = `WorkflowType = "agentSessionWorkflow" AND ExecutionStatus = "Running"`;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a session by player name.
|
|
13
|
+
* Lists all running session workflows and queries each for metadata.
|
|
14
|
+
* This avoids depending on custom search attributes which are eventually
|
|
15
|
+
* consistent and may be missing or stale.
|
|
16
|
+
*
|
|
17
|
+
* Shared by activity files (outbox, schedule-fire) and the tools layer.
|
|
18
|
+
*
|
|
19
|
+
* **Deadline (#336/#529):** the visibility iterator is bounded by
|
|
20
|
+
* `VISIBILITY_DEADLINES_MS.resolveSession` (default 10s). On timeout,
|
|
21
|
+
* throws `VisibilityIteratorTimeoutError` rather than returning `null`
|
|
22
|
+
* — silent `null` on a partially-scanned set would be indistinguishable
|
|
23
|
+
* from "definitely not found," producing false "Player not found" errors
|
|
24
|
+
* upstream. Every existing caller wraps this in a try/catch (outbox
|
|
25
|
+
* activities, MCP tools' `defineTool` helper, CLI dev-verbs); the throw
|
|
26
|
+
* propagates as a retryable / user-visible "lookup timed out" rather
|
|
27
|
+
* than the misleading "player not found."
|
|
28
|
+
*/
|
|
29
|
+
async function resolveSession(client, ensemble, playerName) {
|
|
30
|
+
for await (const wf of (0, visibility_deadline_1.iterateWithDeadline)(client.workflow.list({ query: SESSION_LIST_QUERY }), visibility_deadline_1.VISIBILITY_DEADLINES_MS.resolveSession, 'resolveSession')) {
|
|
31
|
+
try {
|
|
32
|
+
const handle = client.workflow.getHandle(wf.workflowId);
|
|
33
|
+
// Issue #433 — bound the per-session metadata query so a wedged
|
|
34
|
+
// session worker can't hang the entire `resolveSession` lookup.
|
|
35
|
+
// The catch already treats failure as "skip this candidate".
|
|
36
|
+
const metadata = await (0, query_timeout_1.queryHandleWithTimeout)(handle, 'getMetadata');
|
|
37
|
+
if (metadata.ensemble === ensemble && metadata.playerId === playerName) {
|
|
38
|
+
return handle;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
// Re-throw deadline timeouts — callers that wrap us in try/catch
|
|
43
|
+
// already treat unknown throws as a soft "lookup failed" path,
|
|
44
|
+
// and the typed error name makes the failure mode legible in
|
|
45
|
+
// outbox logs / user-facing tool errors.
|
|
46
|
+
if ((0, visibility_deadline_1.isVisibilityTimeout)(err))
|
|
47
|
+
throw err;
|
|
48
|
+
// Workflow may have just completed, or worker is wedged (#433) — skip
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Scan all running session workflows in an ensemble.
|
|
55
|
+
* Returns metadata + part for each session. Shared by the ensemble MCP tool
|
|
56
|
+
* and the Maestro refresh activity.
|
|
57
|
+
*
|
|
58
|
+
* **Deadline (#336/#529):** the iterator is bounded by
|
|
59
|
+
* `VISIBILITY_DEADLINES_MS.scanEnsembleSessions` (default 15s). On
|
|
60
|
+
* timeout, returns the partial result accumulated so far and emits a
|
|
61
|
+
* warn log. This site is **partial-tolerant by design** — the caller
|
|
62
|
+
* (maestro refresh, ensemble MCP tool) treats the result as a
|
|
63
|
+
* best-effort snapshot that the next tick / re-invocation will fill in.
|
|
64
|
+
*/
|
|
65
|
+
async function scanEnsembleSessions(client, ensemble, log = () => { }) {
|
|
66
|
+
const sessions = [];
|
|
67
|
+
try {
|
|
68
|
+
for await (const workflow of (0, visibility_deadline_1.iterateWithDeadline)(client.workflow.list({ query: SESSION_LIST_QUERY }), visibility_deadline_1.VISIBILITY_DEADLINES_MS.scanEnsembleSessions, 'scanEnsembleSessions')) {
|
|
69
|
+
try {
|
|
70
|
+
const handle = client.workflow.getHandle(workflow.workflowId);
|
|
71
|
+
// Issue #433 — bound the metadata + part queries so a single wedged
|
|
72
|
+
// session worker can't hang the entire ensemble scan. Outer
|
|
73
|
+
// try/catch treats any failure as "skip this row", so timeouts
|
|
74
|
+
// produce a partial-but-progressing scan instead of a stalled one.
|
|
75
|
+
const metadata = await (0, query_timeout_1.queryHandleWithTimeout)(handle, 'getMetadata');
|
|
76
|
+
if (metadata.ensemble !== ensemble)
|
|
77
|
+
continue;
|
|
78
|
+
const part = await (0, query_timeout_1.queryHandleWithTimeout)(handle, 'getPart');
|
|
79
|
+
// Attachment phase lives in the `AgentTempoAttachmentState` search
|
|
80
|
+
// attribute (written by the workflow on every phase transition).
|
|
81
|
+
const phase = (0, search_attributes_1.getAttachmentPhase)(workflow);
|
|
82
|
+
// #399 W1+W2 — best-effort fetch of the session's monotonic
|
|
83
|
+
// activity counter. Wrapped in its own try/catch so a session
|
|
84
|
+
// predating W2 (no `getActivityState` query handler) doesn't
|
|
85
|
+
// disqualify the whole row. #433 — also timeout-bounded so a
|
|
86
|
+
// wedged W2 query handler doesn't stall the scan.
|
|
87
|
+
let activityCount;
|
|
88
|
+
let lastActivityAt;
|
|
89
|
+
try {
|
|
90
|
+
const activity = await (0, query_timeout_1.queryHandleWithTimeout)(handle, signals_1.getActivityStateQuery);
|
|
91
|
+
activityCount = activity.activityCount;
|
|
92
|
+
lastActivityAt = activity.lastActivityAt;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Session predates W2 or the query is otherwise unavailable —
|
|
96
|
+
// leave both fields undefined so the maestro contributes zero
|
|
97
|
+
// to the tempo bucket for this player this cycle.
|
|
98
|
+
}
|
|
99
|
+
sessions.push({
|
|
100
|
+
workflowId: workflow.workflowId,
|
|
101
|
+
playerId: metadata.playerId,
|
|
102
|
+
part,
|
|
103
|
+
hostname: metadata.hostname,
|
|
104
|
+
workDir: metadata.workDir,
|
|
105
|
+
gitRoot: metadata.gitRoot,
|
|
106
|
+
gitBranch: metadata.gitBranch,
|
|
107
|
+
isConductor: metadata.isConductor,
|
|
108
|
+
agentType: metadata.agentType || 'claude',
|
|
109
|
+
playerType: metadata.playerType,
|
|
110
|
+
phase,
|
|
111
|
+
activityCount,
|
|
112
|
+
lastActivityAt,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Workflow may have just completed — skip it
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
if ((0, visibility_deadline_1.isVisibilityTimeout)(err)) {
|
|
122
|
+
log(`scanEnsembleSessions: ${err.message} — returning partial (${sessions.length} sessions)`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return sessions;
|
|
129
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Client } from '@temporalio/client';
|
|
2
|
+
export interface FireScheduleInput {
|
|
3
|
+
ensemble: string;
|
|
4
|
+
scheduleName: string;
|
|
5
|
+
message: string;
|
|
6
|
+
target: string;
|
|
7
|
+
createdBy: string;
|
|
8
|
+
}
|
|
9
|
+
export interface FireScheduleResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
error?: string;
|
|
12
|
+
/**
|
|
13
|
+
* #336/#529 — when `target === 'all'`, true if the visibility iterator
|
|
14
|
+
* hit its deadline before enumerating every running session. The
|
|
15
|
+
* caller (schedule workflow / TUI surface) renders a "partial
|
|
16
|
+
* delivery — scan timed out" notice rather than implying every
|
|
17
|
+
* player received the message.
|
|
18
|
+
*/
|
|
19
|
+
timedOut?: boolean;
|
|
20
|
+
/** #336/#529 — entries actually scanned before deadline or completion. */
|
|
21
|
+
scanned?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ComputeNextCronInput {
|
|
24
|
+
cronExpression: string;
|
|
25
|
+
timezone?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Activity interface — used by proxyActivities in the scheduler workflow. */
|
|
28
|
+
export interface ScheduleActivities {
|
|
29
|
+
fireSchedule(input: FireScheduleInput): Promise<FireScheduleResult>;
|
|
30
|
+
computeNextCronFire(input: ComputeNextCronInput): Promise<string | null>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create the schedule-fire activity bound to a Temporal client.
|
|
34
|
+
* The returned object is registered with the worker as activities.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createScheduleActivities(client: Client): ScheduleActivities;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createScheduleActivities = createScheduleActivities;
|
|
4
|
+
const croner_1 = require("croner");
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
const resolve_1 = require("./resolve");
|
|
7
|
+
const visibility_deadline_1 = require("../utils/visibility-deadline");
|
|
8
|
+
/**
|
|
9
|
+
* Create the schedule-fire activity bound to a Temporal client.
|
|
10
|
+
* The returned object is registered with the worker as activities.
|
|
11
|
+
*/
|
|
12
|
+
function createScheduleActivities(client) {
|
|
13
|
+
return {
|
|
14
|
+
async computeNextCronFire(input) {
|
|
15
|
+
const job = new croner_1.Cron(input.cronExpression, { timezone: input.timezone || 'UTC' });
|
|
16
|
+
const next = job.nextRun();
|
|
17
|
+
return next ? next.toISOString() : null;
|
|
18
|
+
},
|
|
19
|
+
async fireSchedule(input) {
|
|
20
|
+
const { ensemble, scheduleName, message, target, createdBy } = input;
|
|
21
|
+
try {
|
|
22
|
+
const text = `[scheduled: ${scheduleName}] ${message}`;
|
|
23
|
+
// Handle target "all" — deliver to every active player except the conductor
|
|
24
|
+
if (target === 'all') {
|
|
25
|
+
const query = `WorkflowType = "agentSessionWorkflow" AND ExecutionStatus = "Running"`;
|
|
26
|
+
const failures = [];
|
|
27
|
+
let delivered = 0;
|
|
28
|
+
let scanned = 0;
|
|
29
|
+
let timedOut = false;
|
|
30
|
+
// #336/#529 — bound the visibility iterator. `target='all'` is
|
|
31
|
+
// a structured-outcome site: a partial scan would silently
|
|
32
|
+
// violate the "deliver to every player" semantic, so we carry
|
|
33
|
+
// `timedOut` into the result.
|
|
34
|
+
try {
|
|
35
|
+
for await (const wf of (0, visibility_deadline_1.iterateWithDeadline)(client.workflow.list({ query }), visibility_deadline_1.VISIBILITY_DEADLINES_MS.fireScheduleAll, 'fireScheduleAll')) {
|
|
36
|
+
scanned++;
|
|
37
|
+
try {
|
|
38
|
+
const handle = client.workflow.getHandle(wf.workflowId);
|
|
39
|
+
const metadata = await handle.query('getMetadata');
|
|
40
|
+
if (metadata.ensemble !== ensemble)
|
|
41
|
+
continue;
|
|
42
|
+
if (metadata.isConductor)
|
|
43
|
+
continue; // skip conductor
|
|
44
|
+
await handle.signal('receiveMessage', {
|
|
45
|
+
from: createdBy,
|
|
46
|
+
text,
|
|
47
|
+
isScheduled: true,
|
|
48
|
+
scheduleName,
|
|
49
|
+
responseRequested: false,
|
|
50
|
+
});
|
|
51
|
+
delivered++;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
55
|
+
failures.push(`${wf.workflowId}: ${msg}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if ((0, visibility_deadline_1.isVisibilityTimeout)(err)) {
|
|
61
|
+
timedOut = true;
|
|
62
|
+
// Mark the partial-delivery failure mode so the caller's
|
|
63
|
+
// notification surface can describe it accurately.
|
|
64
|
+
failures.push(`scan deadline (${err.deadlineMs}ms) exceeded after ${err.partialCount} entries`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (delivered === 0 && failures.length === 0) {
|
|
71
|
+
await notifyFailure(client, ensemble, createdBy, scheduleName, target, 'No active players found in the ensemble.');
|
|
72
|
+
return { success: false, error: 'No active players found', scanned, timedOut };
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
success: !timedOut && failures.length === 0,
|
|
76
|
+
error: failures.length > 0
|
|
77
|
+
? (timedOut
|
|
78
|
+
? `Delivered to ${delivered} players, scan timed out before completion: ${failures.join('; ')}`
|
|
79
|
+
: `Delivered to ${delivered} players, ${failures.length} failed: ${failures.join('; ')}`)
|
|
80
|
+
: undefined,
|
|
81
|
+
scanned,
|
|
82
|
+
...(timedOut ? { timedOut: true } : {}),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Resolve single target player by querying running session workflows
|
|
86
|
+
const handle = await (0, resolve_1.resolveSession)(client, ensemble, target);
|
|
87
|
+
if (!handle) {
|
|
88
|
+
// Notify the creator (or conductor as fallback) about the failure
|
|
89
|
+
await notifyFailure(client, ensemble, createdBy, scheduleName, target, `Player "${target}" not found — session may have been terminated.`);
|
|
90
|
+
return { success: false, error: `No active session found for "${target}"` };
|
|
91
|
+
}
|
|
92
|
+
// Send cue signal with from set to the original creator's name
|
|
93
|
+
await handle.signal('receiveMessage', {
|
|
94
|
+
from: createdBy,
|
|
95
|
+
text,
|
|
96
|
+
isScheduled: true,
|
|
97
|
+
scheduleName,
|
|
98
|
+
responseRequested: false,
|
|
99
|
+
});
|
|
100
|
+
return { success: true };
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
104
|
+
return { success: false, error: errorMsg };
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Notify the schedule creator (or conductor as fallback) that delivery failed.
|
|
111
|
+
* This lets the creator's AI session decide whether to re-recruit the target.
|
|
112
|
+
*/
|
|
113
|
+
async function notifyFailure(client, ensemble, createdBy, scheduleName, target, reason) {
|
|
114
|
+
const failureText = `[scheduled: ${scheduleName}] Delivery to "${target}" failed — ${reason}`;
|
|
115
|
+
// Try the creator first
|
|
116
|
+
const creatorHandle = await (0, resolve_1.resolveSession)(client, ensemble, createdBy);
|
|
117
|
+
if (creatorHandle) {
|
|
118
|
+
try {
|
|
119
|
+
await creatorHandle.signal('receiveMessage', {
|
|
120
|
+
from: 'scheduler',
|
|
121
|
+
text: failureText,
|
|
122
|
+
isScheduled: true,
|
|
123
|
+
scheduleName,
|
|
124
|
+
responseRequested: false,
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// creator signal failed, fall through to conductor
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Fallback: notify the conductor
|
|
133
|
+
try {
|
|
134
|
+
const conductorId = (0, config_1.conductorWorkflowId)(ensemble);
|
|
135
|
+
const conductorHandle = client.workflow.getHandle(conductorId);
|
|
136
|
+
await conductorHandle.signal('receiveMessage', {
|
|
137
|
+
from: 'scheduler',
|
|
138
|
+
text: failureText,
|
|
139
|
+
isScheduled: true,
|
|
140
|
+
responseRequested: false,
|
|
141
|
+
scheduleName,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Nobody available to notify — logged by the workflow
|
|
146
|
+
}
|
|
147
|
+
}
|