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,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useEnsembleDiscovery = useEnsembleDiscovery;
|
|
4
|
+
/**
|
|
5
|
+
* Hook that polls for all running ensembles across the Temporal namespace.
|
|
6
|
+
* Used by the ensemble list view.
|
|
7
|
+
*/
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const DISCOVERY_INTERVAL_MS = 5000;
|
|
10
|
+
function useEnsembleDiscovery(api, taskQueue, dispatch, enabled) {
|
|
11
|
+
const apiRef = (0, react_1.useRef)(api);
|
|
12
|
+
apiRef.current = api;
|
|
13
|
+
(0, react_1.useEffect)(() => {
|
|
14
|
+
if (!enabled)
|
|
15
|
+
return;
|
|
16
|
+
const poll = async () => {
|
|
17
|
+
try {
|
|
18
|
+
const ensembles = await apiRef.current.discoverEnsembles(taskQueue);
|
|
19
|
+
dispatch({ type: 'DISCOVER_ENSEMBLES', ensembles });
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Silently skip failed polls
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
// Initial poll
|
|
26
|
+
poll();
|
|
27
|
+
const interval = setInterval(poll, DISCOVERY_INTERVAL_MS);
|
|
28
|
+
return () => clearInterval(interval);
|
|
29
|
+
}, [taskQueue, dispatch, enabled]);
|
|
30
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useMaestroPoller = useMaestroPoller;
|
|
4
|
+
/**
|
|
5
|
+
* Hook that polls the Maestro workflow for player state and events.
|
|
6
|
+
* Dispatches REFRESH_ALL on each successful poll.
|
|
7
|
+
*/
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const platform_1 = require("../utils/platform");
|
|
10
|
+
/** 3s for local terminals, 5s over SSH to reduce latency impact. */
|
|
11
|
+
const POLL_INTERVAL_MS = (0, platform_1.isSSH)() ? 5000 : 3000;
|
|
12
|
+
function useMaestroPoller(api, dispatch, enabled) {
|
|
13
|
+
const apiRef = (0, react_1.useRef)(api);
|
|
14
|
+
apiRef.current = api;
|
|
15
|
+
(0, react_1.useEffect)(() => {
|
|
16
|
+
if (!enabled)
|
|
17
|
+
return;
|
|
18
|
+
const poll = async () => {
|
|
19
|
+
try {
|
|
20
|
+
const [players, events, history] = await Promise.all([
|
|
21
|
+
apiRef.current.getPlayers(),
|
|
22
|
+
apiRef.current.getEvents(50),
|
|
23
|
+
apiRef.current.getConductorHistory(),
|
|
24
|
+
]);
|
|
25
|
+
dispatch({ type: 'REFRESH_ALL', players, events, history });
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Silently skip failed polls
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
// Initial poll
|
|
32
|
+
poll();
|
|
33
|
+
const interval = setInterval(poll, POLL_INTERVAL_MS);
|
|
34
|
+
return () => clearInterval(interval);
|
|
35
|
+
}, [dispatch, enabled]);
|
|
36
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useSendCommand = useSendCommand;
|
|
4
|
+
/**
|
|
5
|
+
* Hook for sending commands to the conductor via the Maestro workflow.
|
|
6
|
+
*/
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
function useSendCommand(api) {
|
|
9
|
+
const [sending, setSending] = (0, react_1.useState)(false);
|
|
10
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
11
|
+
const apiRef = (0, react_1.useRef)(api);
|
|
12
|
+
apiRef.current = api;
|
|
13
|
+
const send = (0, react_1.useCallback)(async (text) => {
|
|
14
|
+
if (!text.trim())
|
|
15
|
+
return;
|
|
16
|
+
setSending(true);
|
|
17
|
+
setError(null);
|
|
18
|
+
try {
|
|
19
|
+
await apiRef.current.sendCommand(text.trim(), 'tui');
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
setSending(false);
|
|
26
|
+
}
|
|
27
|
+
}, []);
|
|
28
|
+
return { sending, error, send };
|
|
29
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Config } from '../config';
|
|
2
|
+
import type { BootstrapResult } from '../cli/startup';
|
|
3
|
+
export interface TuiOpts {
|
|
4
|
+
config: Config;
|
|
5
|
+
/** If provided, start in single-ensemble view. If omitted, start in home (multi-ensemble) view. */
|
|
6
|
+
ensemble?: string;
|
|
7
|
+
/**
|
|
8
|
+
* #289: pre-computed bootstrap result fed in from the CLI default path.
|
|
9
|
+
* When present, the TUI skips its own daemon/connection probing and
|
|
10
|
+
* hands the result straight to HomeView as initial props (S5 / #290).
|
|
11
|
+
* Absent for the subcommand paths that don't run bootstrap.
|
|
12
|
+
*/
|
|
13
|
+
bootstrap?: BootstrapResult;
|
|
14
|
+
}
|
|
15
|
+
export declare function run(opts: TuiOpts): Promise<void>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.run = run;
|
|
7
|
+
/**
|
|
8
|
+
* TUI entry point — runs preflight checks, dynamically loads ink (ESM), and renders the app.
|
|
9
|
+
* Called from the CLI command via: const { run } = await import('../tui/index.js');
|
|
10
|
+
*/
|
|
11
|
+
const react_1 = __importDefault(require("react"));
|
|
12
|
+
const client_1 = require("@temporalio/client");
|
|
13
|
+
const connection_1 = require("../connection");
|
|
14
|
+
const client_2 = require("../client");
|
|
15
|
+
const ink_loader_1 = require("./ink-loader");
|
|
16
|
+
const ink_context_1 = require("./ink-context");
|
|
17
|
+
const App_1 = require("./App");
|
|
18
|
+
const platform_1 = require("./utils/platform");
|
|
19
|
+
const fullscreen_1 = require("./utils/fullscreen");
|
|
20
|
+
const daemon_1 = require("../cli/daemon");
|
|
21
|
+
async function run(opts) {
|
|
22
|
+
// Check terminal size
|
|
23
|
+
if (!(0, platform_1.isTerminalLargeEnough)()) {
|
|
24
|
+
console.error(`Terminal too small (minimum ${platform_1.MIN_COLUMNS}x${platform_1.MIN_ROWS}). ` +
|
|
25
|
+
`Current: ${process.stdout.columns || '?'}x${process.stdout.rows || '?'}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// ── Preflight: Ensure daemon is running ──
|
|
29
|
+
if (!(0, daemon_1.isDaemonRunning)()) {
|
|
30
|
+
try {
|
|
31
|
+
console.error('Starting worker daemon...');
|
|
32
|
+
await (0, daemon_1.startDaemon)(opts.config);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error(`Warning: could not start daemon: ${err.message || err}`);
|
|
36
|
+
// Continue anyway — Temporal connection will fail gracefully in the splash
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Load ink dynamically (ESM)
|
|
40
|
+
const ink = await (0, ink_loader_1.loadInk)();
|
|
41
|
+
// ── Connect to Temporal (with timeout, graceful failure) ──
|
|
42
|
+
let connection;
|
|
43
|
+
try {
|
|
44
|
+
connection = await Promise.race([
|
|
45
|
+
(0, connection_1.createTemporalConnection)(opts.config),
|
|
46
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`timeout connecting to ${opts.config.temporalAddress}`)), 5000)),
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
// Don't crash — let the TUI show the ErrorView with diagnostics
|
|
51
|
+
console.error(`Warning: ${err instanceof Error ? err.message : err}`);
|
|
52
|
+
console.error('The TUI will show connection troubleshooting.');
|
|
53
|
+
}
|
|
54
|
+
// Enter fullscreen (alternate screen buffer)
|
|
55
|
+
const isFullscreen = (0, fullscreen_1.enterFullscreen)();
|
|
56
|
+
if (isFullscreen) {
|
|
57
|
+
(0, fullscreen_1.registerFullscreenCleanup)();
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
let api;
|
|
61
|
+
if (connection) {
|
|
62
|
+
const client = new client_1.Client({ connection, namespace: opts.config.temporalNamespace });
|
|
63
|
+
// #437 — pass the resolved task queue so the TUI's `/hosts` slash
|
|
64
|
+
// command (and any future `listHosts` consumer) finds the right
|
|
65
|
+
// pollers in dev mode. Without it, dev-mode TUI silently shows zero
|
|
66
|
+
// hosts even with a healthy dev daemon.
|
|
67
|
+
api = (0, client_2.createTempoClient)(client, { taskQueue: opts.config.taskQueue });
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Create a dummy client that returns empty/false for everything
|
|
71
|
+
// The splash will transition to ErrorView
|
|
72
|
+
api = createDummyClient();
|
|
73
|
+
}
|
|
74
|
+
// Render the TUI
|
|
75
|
+
const app = ink.render(
|
|
76
|
+
// The TUI recruit wizard only offers `claude` / `copilot` — `mock` is
|
|
77
|
+
// a dev-mode CLI-only path (ADR 0014 §7 gate 3); `claude-api` (#131),
|
|
78
|
+
// `opencode` (#449), and `claude-code-headless` (#520) are CLI/MCP-only
|
|
79
|
+
// paths. If the user's resolved default is one of those, fall back to
|
|
80
|
+
// `claude` for the TUI default; they can still recruit those agents
|
|
81
|
+
// via the CLI (e.g. `agent-tempo recruit ... --agent opencode`) or
|
|
82
|
+
// the MCP `recruit` tool.
|
|
83
|
+
react_1.default.createElement(ink_context_1.InkProvider, { ink, children: react_1.default.createElement(App_1.App, { api, ensemble: opts.ensemble, defaultAgent: (opts.config.defaultAgent === 'mock' || opts.config.defaultAgent === 'claude-api' || opts.config.defaultAgent === 'opencode' || opts.config.defaultAgent === 'claude-code-headless') ? 'claude' : opts.config.defaultAgent }) }));
|
|
84
|
+
await app.waitUntilExit();
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
if (isFullscreen) {
|
|
88
|
+
(0, fullscreen_1.exitFullscreen)();
|
|
89
|
+
}
|
|
90
|
+
if (connection) {
|
|
91
|
+
await connection.close();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Dummy TempoClient for when Temporal connection fails — returns empty data. */
|
|
96
|
+
function createDummyClient() {
|
|
97
|
+
const fail = () => Promise.reject(new Error('Not connected to Temporal'));
|
|
98
|
+
return {
|
|
99
|
+
discoverEnsembles: async () => [],
|
|
100
|
+
listEnsembles: async () => [],
|
|
101
|
+
listEnsemblesBounded: async () => ({ items: [], timedOut: false, scanned: 0 }),
|
|
102
|
+
createEnsemble: fail,
|
|
103
|
+
spawnConductor: fail,
|
|
104
|
+
getPlayers: async () => [],
|
|
105
|
+
// Issue #399 W1/W2 wire-extension methods — return sentinel defaults
|
|
106
|
+
// matching `getEnsembleMeta` / `getPlayerWireMeta` soft-fail shapes
|
|
107
|
+
// so the dashboard renders `—` placeholders without crashing.
|
|
108
|
+
getEnsembleMeta: async () => ({ description: '', startedAt: '', currentBpm: 0, tempoSeries: [] }),
|
|
109
|
+
getPlayerWireMeta: async () => null,
|
|
110
|
+
getMessages: async () => [],
|
|
111
|
+
getConductorHistory: async () => [],
|
|
112
|
+
getPlayerMessages: async () => [],
|
|
113
|
+
getPlayerMetadata: async () => null,
|
|
114
|
+
sendCommand: fail,
|
|
115
|
+
sendMessage: fail,
|
|
116
|
+
terminatePlayer: fail,
|
|
117
|
+
// PR-D verbs — all fail in offline dummy mode.
|
|
118
|
+
recruit: fail,
|
|
119
|
+
release: fail,
|
|
120
|
+
restart: fail,
|
|
121
|
+
detach: fail,
|
|
122
|
+
destroy: fail,
|
|
123
|
+
migrate: fail,
|
|
124
|
+
attachmentInfo: fail,
|
|
125
|
+
recall: fail,
|
|
126
|
+
listHosts: async () => [],
|
|
127
|
+
disbandEnsemble: fail,
|
|
128
|
+
// #287 ensemble-scope verbs — same offline fail-fast shape.
|
|
129
|
+
pause: fail,
|
|
130
|
+
play: fail,
|
|
131
|
+
shutdown: fail,
|
|
132
|
+
restore: fail,
|
|
133
|
+
isConnected: async () => false,
|
|
134
|
+
hasGlobalMaestro: async () => false,
|
|
135
|
+
getSchedules: async () => [],
|
|
136
|
+
cancelSchedule: fail,
|
|
137
|
+
getEnsembleChat: async () => ({ messages: [], total: 0, hasMore: false, hasConductor: false }),
|
|
138
|
+
isMaestroPaused: async () => false,
|
|
139
|
+
isAnySessionHeld: async () => false,
|
|
140
|
+
getGates: async () => [],
|
|
141
|
+
getStages: async () => [],
|
|
142
|
+
getWorktrees: async () => [],
|
|
143
|
+
ensureMaestroSession: fail,
|
|
144
|
+
sendAsMaestro: fail,
|
|
145
|
+
getMaestroMessages: async () => ({ received: [], sent: [] }),
|
|
146
|
+
// PR-3 (#94/#95): SSE subscribe stub — yields nothing and completes
|
|
147
|
+
// immediately so a `for await` loop on the offline dummy doesn't hang.
|
|
148
|
+
subscribe: () => ({
|
|
149
|
+
[Symbol.asyncIterator]() {
|
|
150
|
+
return {
|
|
151
|
+
next: () => Promise.resolve({ value: undefined, done: true }),
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React context for Ink components.
|
|
3
|
+
*
|
|
4
|
+
* Since ink is ESM-only and our project is CJS, ink components are
|
|
5
|
+
* dynamically loaded at startup and provided via context. Components
|
|
6
|
+
* use the useInk() hook to access Box, Text, etc.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import type { InkExports } from './ink-loader';
|
|
10
|
+
export declare function InkProvider({ ink, children }: {
|
|
11
|
+
ink: InkExports;
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
}): React.FunctionComponentElement<React.ProviderProps<InkExports | null>>;
|
|
14
|
+
/**
|
|
15
|
+
* Access dynamically-loaded Ink components.
|
|
16
|
+
* Must be called inside an InkProvider.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useInk(): InkExports;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.InkProvider = InkProvider;
|
|
37
|
+
exports.useInk = useInk;
|
|
38
|
+
/**
|
|
39
|
+
* React context for Ink components.
|
|
40
|
+
*
|
|
41
|
+
* Since ink is ESM-only and our project is CJS, ink components are
|
|
42
|
+
* dynamically loaded at startup and provided via context. Components
|
|
43
|
+
* use the useInk() hook to access Box, Text, etc.
|
|
44
|
+
*/
|
|
45
|
+
const react_1 = __importStar(require("react"));
|
|
46
|
+
const InkContext = (0, react_1.createContext)(null);
|
|
47
|
+
function InkProvider({ ink, children }) {
|
|
48
|
+
return react_1.default.createElement(InkContext.Provider, { value: ink }, children);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Access dynamically-loaded Ink components.
|
|
52
|
+
* Must be called inside an InkProvider.
|
|
53
|
+
*/
|
|
54
|
+
function useInk() {
|
|
55
|
+
const ctx = (0, react_1.useContext)(InkContext);
|
|
56
|
+
if (!ctx)
|
|
57
|
+
throw new Error('useInk() must be used inside InkProvider');
|
|
58
|
+
return ctx;
|
|
59
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic loader for ink — bridges CJS to ESM.
|
|
3
|
+
*
|
|
4
|
+
* Ink 6 is ESM-only. Our project is CJS. This module dynamically imports ink
|
|
5
|
+
* at runtime via import(), which handles ESM from CJS contexts.
|
|
6
|
+
*
|
|
7
|
+
* React 19 is CJS and works with normal require().
|
|
8
|
+
*/
|
|
9
|
+
export interface InkExports {
|
|
10
|
+
render: any;
|
|
11
|
+
Text: any;
|
|
12
|
+
Box: any;
|
|
13
|
+
Newline: any;
|
|
14
|
+
useInput: any;
|
|
15
|
+
useApp: any;
|
|
16
|
+
useStdout: any;
|
|
17
|
+
Static: any;
|
|
18
|
+
Spacer: any;
|
|
19
|
+
TextInput: any;
|
|
20
|
+
Spinner: any;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Dynamically import ink.
|
|
24
|
+
* Cached after first call.
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadInk(): Promise<InkExports>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dynamic loader for ink — bridges CJS to ESM.
|
|
4
|
+
*
|
|
5
|
+
* Ink 6 is ESM-only. Our project is CJS. This module dynamically imports ink
|
|
6
|
+
* at runtime via import(), which handles ESM from CJS contexts.
|
|
7
|
+
*
|
|
8
|
+
* React 19 is CJS and works with normal require().
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.loadInk = loadInk;
|
|
12
|
+
let cached = null;
|
|
13
|
+
/**
|
|
14
|
+
* Dynamically import ink.
|
|
15
|
+
* Cached after first call.
|
|
16
|
+
*/
|
|
17
|
+
async function loadInk() {
|
|
18
|
+
if (cached)
|
|
19
|
+
return cached;
|
|
20
|
+
// Use indirect import() to prevent TypeScript from converting it to require()
|
|
21
|
+
// when compiling to CommonJS. ink 6+ is ESM-only and needs a real import().
|
|
22
|
+
const dynamicImport = new Function('specifier', 'return import(specifier)');
|
|
23
|
+
const [ink, inkTextInput, inkSpinner] = await Promise.all([
|
|
24
|
+
dynamicImport('ink'),
|
|
25
|
+
dynamicImport('ink-text-input'),
|
|
26
|
+
dynamicImport('ink-spinner'),
|
|
27
|
+
]);
|
|
28
|
+
cached = {
|
|
29
|
+
render: ink.render,
|
|
30
|
+
Text: ink.Text,
|
|
31
|
+
Box: ink.Box,
|
|
32
|
+
Newline: ink.Newline,
|
|
33
|
+
useInput: ink.useInput,
|
|
34
|
+
useApp: ink.useApp,
|
|
35
|
+
useStdout: ink.useStdout,
|
|
36
|
+
Static: ink.Static,
|
|
37
|
+
Spacer: ink.Spacer,
|
|
38
|
+
TextInput: inkTextInput.default || inkTextInput.TextInput,
|
|
39
|
+
Spinner: inkSpinner.default || inkSpinner.Spinner,
|
|
40
|
+
};
|
|
41
|
+
return cached;
|
|
42
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration hints for slash commands removed or renamed in the S6
|
|
3
|
+
* rewrite. Every entry maps a legacy name to a one-liner pointing at
|
|
4
|
+
* the replacement, so users who rely on muscle memory get a clear
|
|
5
|
+
* correction instead of a generic "unknown command" error.
|
|
6
|
+
*/
|
|
7
|
+
export declare const REMOVED_SLASH_COMMANDS: Record<string, string>;
|
|
8
|
+
/** Build the help-text suffix appended after a migration-hint line. */
|
|
9
|
+
export declare function removedSlashCommandHelp(name: string): string | null;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Migration hints for slash commands removed or renamed in the S6
|
|
4
|
+
* rewrite. Every entry maps a legacy name to a one-liner pointing at
|
|
5
|
+
* the replacement, so users who rely on muscle memory get a clear
|
|
6
|
+
* correction instead of a generic "unknown command" error.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.REMOVED_SLASH_COMMANDS = void 0;
|
|
10
|
+
exports.removedSlashCommandHelp = removedSlashCommandHelp;
|
|
11
|
+
exports.REMOVED_SLASH_COMMANDS = {
|
|
12
|
+
pause_ensemble: '/pause_ensemble was renamed to /pause.',
|
|
13
|
+
resume_ensemble: '/resume_ensemble was renamed to /play.',
|
|
14
|
+
resume: '/resume was renamed to /play to avoid colliding with `claude --resume`.',
|
|
15
|
+
detach: '/detach was removed; /shutdown handles ensemble-scope teardown and conductor reaping.',
|
|
16
|
+
disband: '/disband was removed; /destroy <ensemble> is the replacement.',
|
|
17
|
+
};
|
|
18
|
+
/** Build the help-text suffix appended after a migration-hint line. */
|
|
19
|
+
function removedSlashCommandHelp(name) {
|
|
20
|
+
const hint = exports.REMOVED_SLASH_COMMANDS[name];
|
|
21
|
+
return hint ? `${hint} Type /help for the current command list.` : null;
|
|
22
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE event → TUI store dispatch mapping for PR-4a (#94/#95).
|
|
3
|
+
*
|
|
4
|
+
* Pure projection from `TempoEvent` (wire shape, see `src/http/event-types.ts`)
|
|
5
|
+
* to `TuiAction`. Kept in its own module so the mapping can be tested without
|
|
6
|
+
* mounting the full `App` tree.
|
|
7
|
+
*
|
|
8
|
+
* Design notes:
|
|
9
|
+
* - `event: snapshot` resets the ensemble slice (full state replace),
|
|
10
|
+
* matching what the legacy 2 s poll loop did per tick.
|
|
11
|
+
* - `event: player.*` and `event: chat.appended` apply incrementally —
|
|
12
|
+
* that's the latency win from streaming over polling.
|
|
13
|
+
* - `event: gap` re-fetches the same set of slices the snapshot covers
|
|
14
|
+
* via `TempoClient` directly. Per `docs/SSE-PROTOCOL.md` §7.5 the gap
|
|
15
|
+
* event surfaces to the consumer; the spec leaves the recovery shape
|
|
16
|
+
* to the consumer (we keep it conservative — refresh, don't tear down
|
|
17
|
+
* the subscription).
|
|
18
|
+
* - `event: chat.compressed` is a soft gap scoped to chat (§7.6) — we
|
|
19
|
+
* re-fetch the chat slice only, leaving everything else untouched.
|
|
20
|
+
* - Heartbeats, throttle notices, host-profile + global-stream events
|
|
21
|
+
* are not relevant to the per-ensemble TUI view; they're noops here.
|
|
22
|
+
*/
|
|
23
|
+
import type { Dispatch } from 'react';
|
|
24
|
+
import type { MaestroPlayerInfo, ScheduleEntry } from '../types';
|
|
25
|
+
import type { TempoClient } from '../client';
|
|
26
|
+
import type { PlayerSummaryV1, TempoEvent } from '../http/event-types';
|
|
27
|
+
import type { TuiAction } from './store';
|
|
28
|
+
/**
|
|
29
|
+
* Project a wire `PlayerSummaryV1` into the in-memory `MaestroPlayerInfo`
|
|
30
|
+
* shape. The wire type carries two extra ISO timestamps
|
|
31
|
+
* (`lastHeartbeatAt`, `processingSince`) the TUI doesn't render today;
|
|
32
|
+
* dropping them avoids a type cast at the call site.
|
|
33
|
+
*/
|
|
34
|
+
export declare function toMaestroPlayerInfo(p: PlayerSummaryV1): MaestroPlayerInfo;
|
|
35
|
+
/**
|
|
36
|
+
* The minimum `TempoClient` surface this handler depends on. Narrowed so
|
|
37
|
+
* tests don't have to construct a full client — only the gap/compressed
|
|
38
|
+
* recovery paths use it.
|
|
39
|
+
*/
|
|
40
|
+
export interface SseRefetchClient {
|
|
41
|
+
getPlayers(ensemble: string): Promise<MaestroPlayerInfo[]>;
|
|
42
|
+
getEnsembleChat(ensemble: string, offset?: number, limit?: number): ReturnType<TempoClient['getEnsembleChat']>;
|
|
43
|
+
getSchedules(ensemble: string): Promise<ScheduleEntry[]>;
|
|
44
|
+
isMaestroPaused(ensemble: string): Promise<boolean>;
|
|
45
|
+
isAnySessionHeld(ensemble: string): Promise<boolean>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Apply one SSE event to the TUI store. Returns a Promise so callers can
|
|
49
|
+
* `await` the gap / chat.compressed re-fetches; for purely-synchronous
|
|
50
|
+
* events (every other kind) the returned promise is already resolved.
|
|
51
|
+
*/
|
|
52
|
+
export declare function handleSseEvent(event: TempoEvent, dispatch: Dispatch<TuiAction>, ensemble: string, api: SseRefetchClient): Promise<void>;
|