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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptArea — pinned bottom input area with tab completion and command history.
|
|
3
|
+
*
|
|
4
|
+
* UNCONTROLLED: Input value lives in local useState, NOT in parent state.
|
|
5
|
+
* This prevents parent re-renders on every keystroke, keeping Yoga node
|
|
6
|
+
* recalculation to this subtree only (~4 nodes).
|
|
7
|
+
*
|
|
8
|
+
* Parent communicates via:
|
|
9
|
+
* - inputRef.current.setValue(v) — to set input programmatically (palette select)
|
|
10
|
+
* - inputRef.current.getValue() — to read current value
|
|
11
|
+
* - onInputChange(v) — called on every keystroke (for palette filtering via ref, no dispatch)
|
|
12
|
+
* - onSubmit(v) — called on Enter
|
|
13
|
+
*/
|
|
14
|
+
import React from 'react';
|
|
15
|
+
/** Commands that take a player name as their first argument. */
|
|
16
|
+
export interface PromptAreaHandle {
|
|
17
|
+
setValue: (v: string) => void;
|
|
18
|
+
getValue: () => string;
|
|
19
|
+
}
|
|
20
|
+
export interface PromptAreaProps {
|
|
21
|
+
/** Hint text displayed above the input. */
|
|
22
|
+
hints: string;
|
|
23
|
+
/** Called when user presses Enter. */
|
|
24
|
+
onSubmit: (value: string) => void;
|
|
25
|
+
/** Disable input (e.g., during splash or recruit wizard). */
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/** Available command names (without '/') for tab completion. */
|
|
28
|
+
commandNames?: string[];
|
|
29
|
+
/** Available player names for argument completion. */
|
|
30
|
+
playerNames?: string[];
|
|
31
|
+
/** Initial command history (loaded from disk). */
|
|
32
|
+
initialHistory?: string[];
|
|
33
|
+
/** Called when history is updated (for persistence). */
|
|
34
|
+
onHistoryUpdate?: (entries: string[]) => void;
|
|
35
|
+
/** Called on every input change (lightweight — caller should use ref, not dispatch). */
|
|
36
|
+
onInputChange?: (value: string) => void;
|
|
37
|
+
/** Whether the command palette is visible. */
|
|
38
|
+
paletteVisible?: boolean;
|
|
39
|
+
/** Called when palette should show/hide. */
|
|
40
|
+
onPaletteToggle?: (visible: boolean) => void;
|
|
41
|
+
/** Called to navigate palette up. */
|
|
42
|
+
onPaletteUp?: () => void;
|
|
43
|
+
/** Called to navigate palette down. */
|
|
44
|
+
onPaletteDown?: () => void;
|
|
45
|
+
/** Called when palette item is selected. */
|
|
46
|
+
onPaletteSelect?: () => void;
|
|
47
|
+
/** Ref for parent to read/set input value. */
|
|
48
|
+
inputRef?: React.Ref<PromptAreaHandle>;
|
|
49
|
+
}
|
|
50
|
+
export declare const PromptArea: React.NamedExoticComponent<PromptAreaProps>;
|
|
@@ -0,0 +1,303 @@
|
|
|
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.PromptArea = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* PromptArea — pinned bottom input area with tab completion and command history.
|
|
39
|
+
*
|
|
40
|
+
* UNCONTROLLED: Input value lives in local useState, NOT in parent state.
|
|
41
|
+
* This prevents parent re-renders on every keystroke, keeping Yoga node
|
|
42
|
+
* recalculation to this subtree only (~4 nodes).
|
|
43
|
+
*
|
|
44
|
+
* Parent communicates via:
|
|
45
|
+
* - inputRef.current.setValue(v) — to set input programmatically (palette select)
|
|
46
|
+
* - inputRef.current.getValue() — to read current value
|
|
47
|
+
* - onInputChange(v) — called on every keystroke (for palette filtering via ref, no dispatch)
|
|
48
|
+
* - onSubmit(v) — called on Enter
|
|
49
|
+
*/
|
|
50
|
+
const react_1 = __importStar(require("react"));
|
|
51
|
+
const ink_context_1 = require("../ink-context");
|
|
52
|
+
const theme_1 = require("../utils/theme");
|
|
53
|
+
const commands_1 = require("../commands");
|
|
54
|
+
const MAX_HISTORY = 50;
|
|
55
|
+
exports.PromptArea = react_1.default.memo(function PromptArea({ hints, onSubmit, disabled, commandNames = [], playerNames = [], initialHistory = [], onHistoryUpdate, onInputChange, paletteVisible, onPaletteToggle, onPaletteUp, onPaletteDown, onPaletteSelect, inputRef, }) {
|
|
56
|
+
const { Box, Text, useInput } = (0, ink_context_1.useInk)();
|
|
57
|
+
// ── LOCAL input state (uncontrolled — no parent dispatch per keystroke) ──
|
|
58
|
+
const [value, setValueState] = (0, react_1.useState)('');
|
|
59
|
+
const valueRef = (0, react_1.useRef)('');
|
|
60
|
+
const setValue = (0, react_1.useCallback)((v) => {
|
|
61
|
+
valueRef.current = v;
|
|
62
|
+
ref.current.value = v; // Keep ref in sync between renders (prevents stale reads on rapid input)
|
|
63
|
+
setValueState(v);
|
|
64
|
+
}, []);
|
|
65
|
+
// ── Expose handle for parent ──
|
|
66
|
+
(0, react_1.useImperativeHandle)(inputRef, () => ({
|
|
67
|
+
setValue: (v) => setValue(v),
|
|
68
|
+
getValue: () => valueRef.current,
|
|
69
|
+
}), [setValue]);
|
|
70
|
+
// ── Internal state ──
|
|
71
|
+
const [history, setHistory] = (0, react_1.useState)(() => [...initialHistory]);
|
|
72
|
+
const [historyIndex, setHistoryIndex] = (0, react_1.useState)(-1);
|
|
73
|
+
const savedInput = (0, react_1.useRef)('');
|
|
74
|
+
const [completionHint, setCompletionHint] = (0, react_1.useState)('');
|
|
75
|
+
const [tabMatches, setTabMatches] = (0, react_1.useState)([]);
|
|
76
|
+
const [tabCycleIndex, setTabCycleIndex] = (0, react_1.useState)(0);
|
|
77
|
+
// ── Ref for all values the useInput callback reads (stable callback pattern) ──
|
|
78
|
+
const ref = (0, react_1.useRef)({
|
|
79
|
+
value: '', onSubmit, disabled, commandNames, playerNames,
|
|
80
|
+
history, historyIndex, tabMatches, tabCycleIndex,
|
|
81
|
+
paletteVisible, onPaletteToggle, onPaletteUp, onPaletteDown, onPaletteSelect,
|
|
82
|
+
onHistoryUpdate, onInputChange,
|
|
83
|
+
});
|
|
84
|
+
ref.current = {
|
|
85
|
+
value: valueRef.current, onSubmit, disabled, commandNames, playerNames,
|
|
86
|
+
history, historyIndex, tabMatches, tabCycleIndex,
|
|
87
|
+
paletteVisible, onPaletteToggle, onPaletteUp, onPaletteDown, onPaletteSelect,
|
|
88
|
+
onHistoryUpdate, onInputChange,
|
|
89
|
+
};
|
|
90
|
+
// ── Helpers (read from ref) ──
|
|
91
|
+
const doChange = (0, react_1.useCallback)((newValue) => {
|
|
92
|
+
const r = ref.current;
|
|
93
|
+
setValue(newValue);
|
|
94
|
+
r.onInputChange?.(newValue);
|
|
95
|
+
// Avoid new refs when already in default state — prevents unnecessary re-renders
|
|
96
|
+
setCompletionHint(prev => prev === '' ? prev : '');
|
|
97
|
+
setTabMatches(prev => prev.length === 0 ? prev : []);
|
|
98
|
+
setTabCycleIndex(prev => prev === 0 ? prev : 0);
|
|
99
|
+
// Only toggle palette when visibility actually changes — avoids parent dispatch on every keystroke
|
|
100
|
+
if (r.onPaletteToggle) {
|
|
101
|
+
// The palette shows for: "/cmd", "@name", and "/PLAYER_PARAM_CMD <partial>".
|
|
102
|
+
// classifyPaletteInput centralizes the rule so PromptArea + App stay in sync.
|
|
103
|
+
const shouldShow = (0, commands_1.classifyPaletteInput)(newValue) !== null;
|
|
104
|
+
if (shouldShow !== !!r.paletteVisible) {
|
|
105
|
+
r.onPaletteToggle(shouldShow);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}, [setValue]);
|
|
109
|
+
// PLAYER_PARAM_COMMANDS and SUBCOMMAND_MAP imported from commands.ts
|
|
110
|
+
const getCompletions = (0, react_1.useCallback)((input) => {
|
|
111
|
+
const r = ref.current;
|
|
112
|
+
const trimmed = input.trimStart();
|
|
113
|
+
// Command name completion: /par → /players
|
|
114
|
+
if (trimmed.startsWith('/') && !trimmed.includes(' ')) {
|
|
115
|
+
const partial = trimmed.slice(1).toLowerCase();
|
|
116
|
+
if (!partial)
|
|
117
|
+
return r.commandNames.map(c => `/${c} `);
|
|
118
|
+
return r.commandNames
|
|
119
|
+
.filter(c => c.startsWith(partial) && c !== partial)
|
|
120
|
+
.map(c => `/${c} `);
|
|
121
|
+
}
|
|
122
|
+
// Parameter completion: /stop te → /stop tempo-eng
|
|
123
|
+
if (trimmed.startsWith('/') && trimmed.includes(' ')) {
|
|
124
|
+
const spaceIdx = trimmed.indexOf(' ');
|
|
125
|
+
const cmd = trimmed.slice(1, spaceIdx).toLowerCase();
|
|
126
|
+
const afterCmd = trimmed.slice(spaceIdx + 1);
|
|
127
|
+
const parts = afterCmd.split(' ');
|
|
128
|
+
const partial = parts[parts.length - 1].toLowerCase();
|
|
129
|
+
const prefix = trimmed.slice(0, trimmed.length - parts[parts.length - 1].length);
|
|
130
|
+
// First param: player name for player commands (prefix + segment match)
|
|
131
|
+
if (parts.length === 1 && commands_1.PLAYER_PARAM_COMMANDS.has(cmd)) {
|
|
132
|
+
const names = r.playerNames || [];
|
|
133
|
+
const matches = names.filter(n => {
|
|
134
|
+
const lower = n.toLowerCase();
|
|
135
|
+
if (lower === partial)
|
|
136
|
+
return false;
|
|
137
|
+
return lower.startsWith(partial) || lower.split('-').some(seg => seg.startsWith(partial));
|
|
138
|
+
});
|
|
139
|
+
if (matches.length > 0)
|
|
140
|
+
return matches.map(n => `${prefix}${n} `);
|
|
141
|
+
}
|
|
142
|
+
// First param: subcommand for structured commands
|
|
143
|
+
if (parts.length === 1 && commands_1.SUBCOMMAND_MAP[cmd]) {
|
|
144
|
+
const subs = commands_1.SUBCOMMAND_MAP[cmd];
|
|
145
|
+
const matches = subs.filter(s => s.startsWith(partial) && s !== partial);
|
|
146
|
+
if (matches.length > 0)
|
|
147
|
+
return matches.map(s => `${prefix}${s} `);
|
|
148
|
+
}
|
|
149
|
+
// Second param after subcommand: player name for worktree create/remove
|
|
150
|
+
if (parts.length === 2 && cmd === 'worktree' && (parts[0] === 'create' || parts[0] === 'remove')) {
|
|
151
|
+
const names = r.playerNames || [];
|
|
152
|
+
const matches = names.filter(n => n.toLowerCase().startsWith(partial) && n.toLowerCase() !== partial);
|
|
153
|
+
if (matches.length > 0)
|
|
154
|
+
return matches.map(n => `${prefix}${n} `);
|
|
155
|
+
}
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
// @player completion: @tem → @tempo-eng
|
|
159
|
+
if (trimmed.startsWith('@') && !trimmed.includes(' ')) {
|
|
160
|
+
const partial = trimmed.slice(1).toLowerCase();
|
|
161
|
+
if (!partial)
|
|
162
|
+
return r.playerNames.map(n => `@${n} `);
|
|
163
|
+
return r.playerNames
|
|
164
|
+
.filter(n => {
|
|
165
|
+
const lower = n.toLowerCase();
|
|
166
|
+
if (lower === partial)
|
|
167
|
+
return false;
|
|
168
|
+
return lower.startsWith(partial) || lower.split('-').some(seg => seg.startsWith(partial));
|
|
169
|
+
})
|
|
170
|
+
.map(n => `@${n} `);
|
|
171
|
+
}
|
|
172
|
+
return [];
|
|
173
|
+
}, []);
|
|
174
|
+
// ── Stable useInput callback (never recreated) ──
|
|
175
|
+
useInput((0, react_1.useCallback)((input, key) => {
|
|
176
|
+
const r = ref.current;
|
|
177
|
+
if (r.disabled)
|
|
178
|
+
return;
|
|
179
|
+
// ── Command palette mode ──
|
|
180
|
+
if (r.paletteVisible) {
|
|
181
|
+
if (key.upArrow) {
|
|
182
|
+
r.onPaletteUp?.();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (key.downArrow) {
|
|
186
|
+
r.onPaletteDown?.();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (key.tab) {
|
|
190
|
+
r.onPaletteSelect?.();
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (key.return) {
|
|
194
|
+
// Enter always submits. Use Tab to accept a palette suggestion. This
|
|
195
|
+
// avoids accept-vs-submit ambiguity when the typed command already
|
|
196
|
+
// matches exactly but the palette has no remaining suggestions
|
|
197
|
+
// (e.g. "/destroy conductor"). Close the palette and fall through to
|
|
198
|
+
// the regular Enter/submit block below.
|
|
199
|
+
r.onPaletteToggle?.(false);
|
|
200
|
+
}
|
|
201
|
+
if (key.escape) {
|
|
202
|
+
r.onPaletteToggle?.(false);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Tab: complete
|
|
207
|
+
if (key.tab) {
|
|
208
|
+
const matches = r.tabMatches.length > 0 ? r.tabMatches : getCompletions(r.value);
|
|
209
|
+
if (matches.length === 0)
|
|
210
|
+
return;
|
|
211
|
+
if (matches.length === 1) {
|
|
212
|
+
setValue(matches[0]);
|
|
213
|
+
r.onInputChange?.(matches[0]);
|
|
214
|
+
setCompletionHint('');
|
|
215
|
+
setTabMatches([]);
|
|
216
|
+
setTabCycleIndex(0);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const newMatches = r.tabMatches.length > 0 ? r.tabMatches : matches;
|
|
220
|
+
const idx = r.tabMatches.length > 0 ? (r.tabCycleIndex + 1) % newMatches.length : 0;
|
|
221
|
+
setValue(newMatches[idx]);
|
|
222
|
+
r.onInputChange?.(newMatches[idx]);
|
|
223
|
+
setTabMatches(newMatches);
|
|
224
|
+
setTabCycleIndex(idx);
|
|
225
|
+
const options = newMatches.map(m => m.trim().split(/\s+/).pop() || '');
|
|
226
|
+
setCompletionHint(options.join(' '));
|
|
227
|
+
}
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// Up arrow: previous history
|
|
231
|
+
if (key.upArrow && !r.paletteVisible) {
|
|
232
|
+
if (r.history.length === 0)
|
|
233
|
+
return;
|
|
234
|
+
if (r.historyIndex === -1)
|
|
235
|
+
savedInput.current = r.value;
|
|
236
|
+
const newIdx = Math.min(r.historyIndex + 1, r.history.length - 1);
|
|
237
|
+
setHistoryIndex(newIdx);
|
|
238
|
+
const histValue = r.history[r.history.length - 1 - newIdx];
|
|
239
|
+
setValue(histValue);
|
|
240
|
+
r.onInputChange?.(histValue);
|
|
241
|
+
setCompletionHint('');
|
|
242
|
+
setTabMatches([]);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// Down arrow: next history
|
|
246
|
+
if (key.downArrow && !r.paletteVisible) {
|
|
247
|
+
if (r.historyIndex <= 0) {
|
|
248
|
+
setHistoryIndex(-1);
|
|
249
|
+
setValue(savedInput.current);
|
|
250
|
+
r.onInputChange?.(savedInput.current);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const newIdx = r.historyIndex - 1;
|
|
254
|
+
setHistoryIndex(newIdx);
|
|
255
|
+
const histValue = r.history[r.history.length - 1 - newIdx];
|
|
256
|
+
setValue(histValue);
|
|
257
|
+
r.onInputChange?.(histValue);
|
|
258
|
+
setCompletionHint('');
|
|
259
|
+
setTabMatches([]);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// Enter: submit
|
|
263
|
+
if (key.return) {
|
|
264
|
+
const trimmed = r.value.trim();
|
|
265
|
+
if (trimmed) {
|
|
266
|
+
if (r.history.length === 0 || r.history[r.history.length - 1] !== trimmed) {
|
|
267
|
+
const updated = [...r.history, trimmed].slice(-MAX_HISTORY);
|
|
268
|
+
setHistory(updated);
|
|
269
|
+
if (r.onHistoryUpdate)
|
|
270
|
+
r.onHistoryUpdate(updated);
|
|
271
|
+
}
|
|
272
|
+
setHistoryIndex(-1);
|
|
273
|
+
savedInput.current = '';
|
|
274
|
+
r.onSubmit(trimmed);
|
|
275
|
+
}
|
|
276
|
+
setValue('');
|
|
277
|
+
r.onInputChange?.('');
|
|
278
|
+
setCompletionHint('');
|
|
279
|
+
setTabMatches([]);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
// Backspace
|
|
283
|
+
if (key.backspace || key.delete) {
|
|
284
|
+
if (r.value.length > 0)
|
|
285
|
+
doChange(r.value.slice(0, -1));
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
// Regular character input
|
|
289
|
+
if (input && !key.ctrl && !key.meta) {
|
|
290
|
+
doChange(r.value + input);
|
|
291
|
+
}
|
|
292
|
+
}, [doChange, getCompletions, setValue])); // Stable — reads ref.current
|
|
293
|
+
// ── Render (minimal nodes: 1 Box + 2-3 Text, nested Text = 0 Yoga nodes) ──
|
|
294
|
+
return react_1.default.createElement(Box, { flexDirection: 'column', paddingX: 1 }, completionHint
|
|
295
|
+
? react_1.default.createElement(Text, { color: theme_1.THEME.muted }, ` ${completionHint}`)
|
|
296
|
+
: null,
|
|
297
|
+
// Prompt line with inline placeholder hint (like Claude Code)
|
|
298
|
+
react_1.default.createElement(Text, null, react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.accent }, '\u2669 '), disabled
|
|
299
|
+
? react_1.default.createElement(Text, { color: theme_1.THEME.muted }, '...')
|
|
300
|
+
: value
|
|
301
|
+
? react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, { color: theme_1.THEME.text }, value), react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '\u2588'))
|
|
302
|
+
: react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '\u2588'), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, hints))));
|
|
303
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecruitWizard — step-by-step wizard for spawning a new player session.
|
|
3
|
+
*
|
|
4
|
+
* Minimal-Box pattern: single <Text> root for all static content (0 Yoga nodes),
|
|
5
|
+
* with ONE <Box> wrapper for Ink's TextInput when a text-input step is active.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import type { RecruitState, RecruitAnswers } from '../store';
|
|
9
|
+
export interface RecruitWizardProps {
|
|
10
|
+
state: RecruitState;
|
|
11
|
+
onAnswer: (answer: Partial<RecruitAnswers>) => void;
|
|
12
|
+
onBack: () => void;
|
|
13
|
+
onConfirm: () => void;
|
|
14
|
+
onCancel: () => void;
|
|
15
|
+
onDone: () => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function RecruitWizard({ state, onAnswer, onBack, onConfirm, onCancel, onDone }: RecruitWizardProps): React.FunctionComponentElement<React.FragmentProps> | React.CElement<{}, React.Component<{}, any, any>>;
|
|
@@ -0,0 +1,221 @@
|
|
|
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.RecruitWizard = RecruitWizard;
|
|
37
|
+
/**
|
|
38
|
+
* RecruitWizard — step-by-step wizard for spawning a new player session.
|
|
39
|
+
*
|
|
40
|
+
* Minimal-Box pattern: single <Text> root for all static content (0 Yoga nodes),
|
|
41
|
+
* with ONE <Box> wrapper for Ink's TextInput when a text-input step is active.
|
|
42
|
+
*/
|
|
43
|
+
const react_1 = __importStar(require("react"));
|
|
44
|
+
const ink_context_1 = require("../ink-context");
|
|
45
|
+
const theme_1 = require("../utils/theme");
|
|
46
|
+
/** Step labels for display. */
|
|
47
|
+
const STEP_LABELS = {
|
|
48
|
+
name: 'Player name',
|
|
49
|
+
agent: 'Agent',
|
|
50
|
+
type: 'Player type',
|
|
51
|
+
workDir: 'Working directory',
|
|
52
|
+
message: 'Initial message (optional)',
|
|
53
|
+
host: 'Host',
|
|
54
|
+
confirm: 'Confirm',
|
|
55
|
+
done: 'Done',
|
|
56
|
+
};
|
|
57
|
+
const TEXT_INPUT_STEPS = new Set(['name', 'type', 'workDir', 'message', 'host']);
|
|
58
|
+
function RecruitWizard({ state, onAnswer, onBack, onConfirm, onCancel, onDone }) {
|
|
59
|
+
const { Box, Text, TextInput, useInput } = (0, ink_context_1.useInk)();
|
|
60
|
+
const [inputValue, setInputValue] = (0, react_1.useState)('');
|
|
61
|
+
const [agentIndex, setAgentIndex] = (0, react_1.useState)(state.answers.agent === 'copilot' ? 1 : 0);
|
|
62
|
+
const agents = ['claude', 'copilot'];
|
|
63
|
+
// Global keybindings for wizard
|
|
64
|
+
useInput((0, react_1.useCallback)((input, key) => {
|
|
65
|
+
if (key.escape) {
|
|
66
|
+
onCancel();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (key.backspace && state.step !== 'name' && state.step !== 'done' && !inputValue) {
|
|
70
|
+
onBack();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (state.step === 'agent') {
|
|
74
|
+
if (key.leftArrow || key.rightArrow) {
|
|
75
|
+
setAgentIndex(i => i === 0 ? 1 : 0);
|
|
76
|
+
}
|
|
77
|
+
if (key.return) {
|
|
78
|
+
onAnswer({ agent: agents[agentIndex] });
|
|
79
|
+
setInputValue('');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (state.step === 'confirm') {
|
|
83
|
+
if (key.return)
|
|
84
|
+
onConfirm();
|
|
85
|
+
}
|
|
86
|
+
if (state.step === 'done') {
|
|
87
|
+
if (key.return)
|
|
88
|
+
onDone();
|
|
89
|
+
}
|
|
90
|
+
}, [state.step, agentIndex, inputValue, onAnswer, onBack, onCancel, onConfirm, onDone]));
|
|
91
|
+
// Text input submit for text steps
|
|
92
|
+
const handleTextSubmit = (0, react_1.useCallback)((value) => {
|
|
93
|
+
const trimmed = value.trim();
|
|
94
|
+
switch (state.step) {
|
|
95
|
+
case 'name':
|
|
96
|
+
if (!trimmed)
|
|
97
|
+
return;
|
|
98
|
+
onAnswer({ name: trimmed });
|
|
99
|
+
break;
|
|
100
|
+
case 'type':
|
|
101
|
+
onAnswer({ playerType: trimmed });
|
|
102
|
+
break;
|
|
103
|
+
case 'workDir':
|
|
104
|
+
onAnswer({ workDir: trimmed || state.answers.workDir });
|
|
105
|
+
break;
|
|
106
|
+
case 'message':
|
|
107
|
+
onAnswer({ initialMessage: trimmed });
|
|
108
|
+
break;
|
|
109
|
+
case 'host':
|
|
110
|
+
onAnswer({ host: trimmed || 'localhost' });
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
setInputValue('');
|
|
114
|
+
}, [state.step, state.answers.workDir, onAnswer]);
|
|
115
|
+
// ── Build all content as nested Text children ──
|
|
116
|
+
const children = [];
|
|
117
|
+
// Header
|
|
118
|
+
children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'hdr' }, react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.accent }, ' Recruit New Player'), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ' (Esc to cancel, Backspace to go back)')));
|
|
119
|
+
// Completed steps
|
|
120
|
+
const steps = ['name', 'agent', 'type', 'workDir', 'message', 'host'];
|
|
121
|
+
for (const s of steps) {
|
|
122
|
+
if (s === state.step)
|
|
123
|
+
break;
|
|
124
|
+
const value = getAnswerDisplay(s, state.answers);
|
|
125
|
+
children.push('\n');
|
|
126
|
+
children.push(react_1.default.createElement(react_1.default.Fragment, { key: `done-${s}` }, react_1.default.createElement(Text, { color: theme_1.THEME.success }, ' \u2714 '), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, `${STEP_LABELS[s]}: `), react_1.default.createElement(Text, { color: theme_1.THEME.text }, value)));
|
|
127
|
+
}
|
|
128
|
+
// Current step content
|
|
129
|
+
if (state.step === 'agent') {
|
|
130
|
+
children.push('\n\n');
|
|
131
|
+
children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'agent-q' }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, ' ? '), react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.text }, `${STEP_LABELS.agent}:`)));
|
|
132
|
+
children.push('\n');
|
|
133
|
+
for (let i = 0; i < agents.length; i++) {
|
|
134
|
+
const selected = i === agentIndex;
|
|
135
|
+
const icon = selected ? '\u25CF' : '\u25CB';
|
|
136
|
+
children.push(react_1.default.createElement(Text, { key: `ag-${agents[i]}`, color: selected ? theme_1.THEME.accent : theme_1.THEME.dim, bold: selected }, ` ${icon} ${agents[i]} `));
|
|
137
|
+
}
|
|
138
|
+
children.push('\n');
|
|
139
|
+
children.push(react_1.default.createElement(Text, { key: 'ag-hint', color: theme_1.THEME.dim }, ' \u2190\u2192 to select, Enter to confirm'));
|
|
140
|
+
}
|
|
141
|
+
else if (state.step === 'confirm') {
|
|
142
|
+
const a = state.answers;
|
|
143
|
+
children.push('\n\n');
|
|
144
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-h', bold: true, color: theme_1.THEME.accent }, ' Recruit Summary:'));
|
|
145
|
+
children.push('\n');
|
|
146
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-n', color: theme_1.THEME.text }, ` Name: ${a.name}`));
|
|
147
|
+
children.push('\n');
|
|
148
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-a', color: theme_1.THEME.text }, ` Agent: ${a.agent}`));
|
|
149
|
+
children.push('\n');
|
|
150
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-t', color: theme_1.THEME.text }, ` Type: ${a.playerType || '(default)'}`));
|
|
151
|
+
children.push('\n');
|
|
152
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-d', color: theme_1.THEME.text }, ` Directory: ${a.workDir}`));
|
|
153
|
+
children.push('\n');
|
|
154
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-m', color: theme_1.THEME.text }, ` Message: ${a.initialMessage || '(none)'}`));
|
|
155
|
+
children.push('\n');
|
|
156
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-h2', color: theme_1.THEME.text }, ` Host: ${a.host}`));
|
|
157
|
+
children.push('\n\n');
|
|
158
|
+
children.push(react_1.default.createElement(Text, { key: 'sum-hint', color: theme_1.THEME.dim }, ' Press Enter to recruit, Esc to cancel'));
|
|
159
|
+
}
|
|
160
|
+
else if (state.step === 'done') {
|
|
161
|
+
children.push('\n\n');
|
|
162
|
+
if (state.error) {
|
|
163
|
+
children.push(react_1.default.createElement(Text, { key: 'err', color: theme_1.THEME.error, bold: true }, ` \u2717 Recruit failed: ${state.error}`));
|
|
164
|
+
children.push('\n');
|
|
165
|
+
children.push(react_1.default.createElement(Text, { key: 'err-h', color: theme_1.THEME.dim }, ' Press Enter to return'));
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
children.push(react_1.default.createElement(Text, { key: 'ok1', color: theme_1.THEME.success }, ' \u2714 Workflow created'));
|
|
169
|
+
children.push('\n');
|
|
170
|
+
children.push(react_1.default.createElement(Text, { key: 'ok2', color: theme_1.THEME.success }, ' \u2714 Initial message queued'));
|
|
171
|
+
children.push('\n');
|
|
172
|
+
children.push(react_1.default.createElement(Text, { key: 'ok3', color: theme_1.THEME.success }, ' \u2714 Process spawned'));
|
|
173
|
+
children.push('\n\n');
|
|
174
|
+
children.push(react_1.default.createElement(Text, { key: 'ok-h', color: theme_1.THEME.dim }, ' Press Enter to return'));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else if (state.submitting) {
|
|
178
|
+
children.push('\n\n');
|
|
179
|
+
children.push(react_1.default.createElement(Text, { key: 'sub', color: theme_1.THEME.warning }, ` Recruiting ${state.answers.name}...`));
|
|
180
|
+
}
|
|
181
|
+
else if (TEXT_INPUT_STEPS.has(state.step)) {
|
|
182
|
+
// Text input step — prompt line as Text, input in minimal Box
|
|
183
|
+
const defaultHint = getDefaultHint(state.step, state.answers);
|
|
184
|
+
children.push('\n\n');
|
|
185
|
+
children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'inp-q' }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, ' ? '), react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.text }, `${STEP_LABELS[state.step]}:`), defaultHint
|
|
186
|
+
? react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ` (${defaultHint})`)
|
|
187
|
+
: null));
|
|
188
|
+
// TextInput needs a Box — this is the only Box in the component
|
|
189
|
+
// It renders AFTER the Text block below
|
|
190
|
+
}
|
|
191
|
+
// For text-input steps: render Text block + Box(TextInput) in a Fragment
|
|
192
|
+
// For all other steps: single Text element (0 Yoga Box nodes)
|
|
193
|
+
if (TEXT_INPUT_STEPS.has(state.step) && !state.submitting) {
|
|
194
|
+
return react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, null, ...children), react_1.default.createElement(Box, { marginLeft: 3 }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '> '), react_1.default.createElement(TextInput, {
|
|
195
|
+
value: inputValue,
|
|
196
|
+
onChange: setInputValue,
|
|
197
|
+
onSubmit: handleTextSubmit,
|
|
198
|
+
})));
|
|
199
|
+
}
|
|
200
|
+
return react_1.default.createElement(Text, null, ...children);
|
|
201
|
+
}
|
|
202
|
+
function getAnswerDisplay(step, answers) {
|
|
203
|
+
switch (step) {
|
|
204
|
+
case 'name': return answers.name;
|
|
205
|
+
case 'agent': return answers.agent;
|
|
206
|
+
case 'type': return answers.playerType || '(default)';
|
|
207
|
+
case 'workDir': return answers.workDir;
|
|
208
|
+
case 'message': return answers.initialMessage || '(none)';
|
|
209
|
+
case 'host': return answers.host;
|
|
210
|
+
default: return '';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function getDefaultHint(step, answers) {
|
|
214
|
+
switch (step) {
|
|
215
|
+
case 'workDir': return answers.workDir;
|
|
216
|
+
case 'host': return 'localhost';
|
|
217
|
+
case 'message': return 'press Enter to skip';
|
|
218
|
+
case 'type': return 'press Enter for default';
|
|
219
|
+
default: return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-keypress y/N confirmation before restoring an offline ensemble.
|
|
3
|
+
* Restore is recoverable (operator can `shutdown` again), so no typed
|
|
4
|
+
* confirmation — that's reserved for `destroy`.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export interface RestoreConfirmModalProps {
|
|
8
|
+
ensemble: string;
|
|
9
|
+
/** Number of offline players in the ensemble (conductor excluded from the count). */
|
|
10
|
+
playerCount: number;
|
|
11
|
+
/** Conductor name if known — falls back to the default "conductor" label. */
|
|
12
|
+
conductorName?: string;
|
|
13
|
+
onConfirm: () => void;
|
|
14
|
+
onCancel: () => void;
|
|
15
|
+
submitting?: boolean;
|
|
16
|
+
error?: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare function RestoreConfirmModal(props: RestoreConfirmModalProps): React.ReactElement;
|