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,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activity log — shows recent Maestro events (player joins, leaves, status changes).
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import type { MaestroEvent } from '../../types';
|
|
6
|
+
export interface ActivityLogProps {
|
|
7
|
+
events: MaestroEvent[];
|
|
8
|
+
maxVisible?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function ActivityLog({ events, maxVisible }: ActivityLogProps): React.FunctionComponentElement<{
|
|
11
|
+
flexDirection: string;
|
|
12
|
+
}> | React.CElement<{
|
|
13
|
+
flexDirection: string;
|
|
14
|
+
}, React.Component<{
|
|
15
|
+
flexDirection: string;
|
|
16
|
+
}, any, any>>;
|
|
@@ -0,0 +1,36 @@
|
|
|
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.ActivityLog = ActivityLog;
|
|
7
|
+
/**
|
|
8
|
+
* Activity log — shows recent Maestro events (player joins, leaves, status changes).
|
|
9
|
+
*/
|
|
10
|
+
const react_1 = __importDefault(require("react"));
|
|
11
|
+
const ink_context_1 = require("../ink-context");
|
|
12
|
+
const format_1 = require("../utils/format");
|
|
13
|
+
const platform_1 = require("../utils/platform");
|
|
14
|
+
function ActivityLog({ events, maxVisible = 15 }) {
|
|
15
|
+
const { Box, Text } = (0, ink_context_1.useInk)();
|
|
16
|
+
const icons = (0, platform_1.statusIcons)();
|
|
17
|
+
const visible = events.slice(-maxVisible);
|
|
18
|
+
if (visible.length === 0) {
|
|
19
|
+
return react_1.default.createElement(Box, { flexDirection: 'column' }, react_1.default.createElement(Text, { dimColor: true }, 'No events yet'));
|
|
20
|
+
}
|
|
21
|
+
return react_1.default.createElement(Box, { flexDirection: 'column' }, ...visible.map((e, i) => {
|
|
22
|
+
const time = (0, format_1.formatTime)(e.timestamp);
|
|
23
|
+
const typeLabel = (0, format_1.formatEventType)(e.type);
|
|
24
|
+
const icon = e.type === 'player_joined' ? icons.check
|
|
25
|
+
: e.type === 'player_left' ? icons.cross
|
|
26
|
+
: icons.arrow;
|
|
27
|
+
const color = e.type === 'player_joined' ? 'green'
|
|
28
|
+
: e.type === 'player_left' ? 'red'
|
|
29
|
+
: e.type === 'status_changed' ? 'yellow'
|
|
30
|
+
: 'white';
|
|
31
|
+
const detail = e.newValue
|
|
32
|
+
? ` ${icons.arrow} ${e.newValue}`
|
|
33
|
+
: '';
|
|
34
|
+
return react_1.default.createElement(Box, { key: `${e.timestamp}-${i}` }, react_1.default.createElement(Text, { dimColor: true }, `[${time}] `), react_1.default.createElement(Text, { color }, `${icon} `), react_1.default.createElement(Text, { bold: true }, e.playerId), react_1.default.createElement(Text, { dimColor: true }, ` ${typeLabel}`), react_1.default.createElement(Text, null, detail));
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatView — header for a conversation with a specific player.
|
|
3
|
+
* Messages are rendered via <Static> in App.tsx, not here.
|
|
4
|
+
* This component only shows context (player name, part, branch, counts).
|
|
5
|
+
*
|
|
6
|
+
* PR-F cross-host indicator (design §16, brief §8 answer 3 — Option 3):
|
|
7
|
+
* - Local session (targetHost === localHost) → omit host entirely (no noise).
|
|
8
|
+
* - Remote session → prepend `{host} · ` to the existing status line in
|
|
9
|
+
* `THEME.accent` (amber).
|
|
10
|
+
* Zero new Yoga nodes: the host prefix goes into the same `<Text>` children
|
|
11
|
+
* tree as an additional string + nested accent-colored `<Text>` (which is a
|
|
12
|
+
* virtual text node, not a Box).
|
|
13
|
+
*/
|
|
14
|
+
import React from 'react';
|
|
15
|
+
export interface ChatMessage {
|
|
16
|
+
direction: 'received' | 'sent';
|
|
17
|
+
from: string;
|
|
18
|
+
text: string;
|
|
19
|
+
timestamp: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ChatViewProps {
|
|
22
|
+
targetPlayer: string;
|
|
23
|
+
targetPart?: string;
|
|
24
|
+
targetBranch?: string;
|
|
25
|
+
targetStatus?: string;
|
|
26
|
+
/** The session's home hostname (PR-A metadata). Compare vs `localHost` to decide cross-host rendering. */
|
|
27
|
+
targetHost?: string;
|
|
28
|
+
/** The local TUI process's hostname. */
|
|
29
|
+
localHost?: string;
|
|
30
|
+
isConductor?: boolean;
|
|
31
|
+
receivedCount: number;
|
|
32
|
+
sentCount: number;
|
|
33
|
+
messages: ChatMessage[];
|
|
34
|
+
}
|
|
35
|
+
export declare function ChatView({ targetPlayer, targetPart, targetBranch, targetHost, localHost, isConductor, receivedCount, sentCount, }: ChatViewProps): React.CElement<{}, React.Component<{}, any, any>>;
|
|
@@ -0,0 +1,54 @@
|
|
|
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.ChatView = ChatView;
|
|
7
|
+
/**
|
|
8
|
+
* ChatView — header for a conversation with a specific player.
|
|
9
|
+
* Messages are rendered via <Static> in App.tsx, not here.
|
|
10
|
+
* This component only shows context (player name, part, branch, counts).
|
|
11
|
+
*
|
|
12
|
+
* PR-F cross-host indicator (design §16, brief §8 answer 3 — Option 3):
|
|
13
|
+
* - Local session (targetHost === localHost) → omit host entirely (no noise).
|
|
14
|
+
* - Remote session → prepend `{host} · ` to the existing status line in
|
|
15
|
+
* `THEME.accent` (amber).
|
|
16
|
+
* Zero new Yoga nodes: the host prefix goes into the same `<Text>` children
|
|
17
|
+
* tree as an additional string + nested accent-colored `<Text>` (which is a
|
|
18
|
+
* virtual text node, not a Box).
|
|
19
|
+
*/
|
|
20
|
+
const react_1 = __importDefault(require("react"));
|
|
21
|
+
const ink_context_1 = require("../ink-context");
|
|
22
|
+
const theme_1 = require("../utils/theme");
|
|
23
|
+
function ChatView({ targetPlayer, targetPart, targetBranch, targetHost, localHost, isConductor, receivedCount, sentCount, }) {
|
|
24
|
+
const { Text } = (0, ink_context_1.useInk)();
|
|
25
|
+
const icon = isConductor ? '\u2605 ' : '';
|
|
26
|
+
const label = isConductor ? 'Conductor' : 'Conversation with';
|
|
27
|
+
// §8 answer 3 — remote host only; local omits entirely.
|
|
28
|
+
const showRemoteHost = Boolean(targetHost && localHost && targetHost !== localHost);
|
|
29
|
+
const children = [];
|
|
30
|
+
children.push(react_1.default.createElement(Text, { key: 'h1', bold: true, color: theme_1.THEME.accent }, ` ${icon}${label} ${targetPlayer}`));
|
|
31
|
+
if (targetPart) {
|
|
32
|
+
children.push('\n');
|
|
33
|
+
children.push(react_1.default.createElement(Text, { key: 'h2', color: theme_1.THEME.dim }, ` Part: ${targetPart}`));
|
|
34
|
+
}
|
|
35
|
+
children.push('\n');
|
|
36
|
+
// Status line — prepend amber {host} · for remote sessions only.
|
|
37
|
+
// Zero new Yoga nodes: composed inline as nested <Text> within h3.
|
|
38
|
+
const h3Children = [];
|
|
39
|
+
h3Children.push(' ');
|
|
40
|
+
if (showRemoteHost) {
|
|
41
|
+
h3Children.push(react_1.default.createElement(Text, { key: 'host', color: theme_1.THEME.accent }, targetHost));
|
|
42
|
+
h3Children.push(' \u00B7 ');
|
|
43
|
+
}
|
|
44
|
+
if (targetBranch) {
|
|
45
|
+
h3Children.push(`Branch: ${targetBranch} \u00B7 `);
|
|
46
|
+
}
|
|
47
|
+
h3Children.push(`${receivedCount} received, ${sentCount} sent`);
|
|
48
|
+
children.push(react_1.default.createElement(Text, { key: 'h3', color: theme_1.THEME.dim }, ...h3Children));
|
|
49
|
+
children.push('\n');
|
|
50
|
+
children.push(react_1.default.createElement(Text, { key: 'h4', color: theme_1.THEME.border }, ' ' + '\u2500'.repeat(55)));
|
|
51
|
+
children.push('\n');
|
|
52
|
+
children.push(react_1.default.createElement(Text, { key: 'h5', color: theme_1.THEME.dim }, ' Messages appear above \u2191 (scroll up in terminal)'));
|
|
53
|
+
return react_1.default.createElement(Text, null, ...children);
|
|
54
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommandOverlay — generic dismissible overlay for data-display commands.
|
|
3
|
+
*
|
|
4
|
+
* Renders a title and pre-formatted text content. Used by /gates, /stages,
|
|
5
|
+
* /worktree list, /recall, and /search instead of static scrollback.
|
|
6
|
+
*
|
|
7
|
+
* Performance: Single <Text> root with nested virtual-text children.
|
|
8
|
+
* Zero Yoga <Box> nodes.
|
|
9
|
+
*/
|
|
10
|
+
import React from 'react';
|
|
11
|
+
export interface CommandOverlayProps {
|
|
12
|
+
title: string;
|
|
13
|
+
content: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function CommandOverlay({ title, content }: CommandOverlayProps): React.CElement<{}, React.Component<{}, any, any>>;
|
|
@@ -0,0 +1,34 @@
|
|
|
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.CommandOverlay = CommandOverlay;
|
|
7
|
+
/**
|
|
8
|
+
* CommandOverlay — generic dismissible overlay for data-display commands.
|
|
9
|
+
*
|
|
10
|
+
* Renders a title and pre-formatted text content. Used by /gates, /stages,
|
|
11
|
+
* /worktree list, /recall, and /search instead of static scrollback.
|
|
12
|
+
*
|
|
13
|
+
* Performance: Single <Text> root with nested virtual-text children.
|
|
14
|
+
* Zero Yoga <Box> nodes.
|
|
15
|
+
*/
|
|
16
|
+
const react_1 = __importDefault(require("react"));
|
|
17
|
+
const ink_context_1 = require("../ink-context");
|
|
18
|
+
const theme_1 = require("../utils/theme");
|
|
19
|
+
function CommandOverlay({ title, content }) {
|
|
20
|
+
const { Text } = (0, ink_context_1.useInk)();
|
|
21
|
+
const children = [];
|
|
22
|
+
children.push(react_1.default.createElement(Text, { key: 'h', bold: true, color: theme_1.THEME.accent }, ` ${title}`));
|
|
23
|
+
children.push('\n\n');
|
|
24
|
+
// Render each line of pre-formatted content as dimmed text
|
|
25
|
+
const lines = content.split('\n');
|
|
26
|
+
for (let i = 0; i < lines.length; i++) {
|
|
27
|
+
if (i > 0)
|
|
28
|
+
children.push('\n');
|
|
29
|
+
children.push(react_1.default.createElement(Text, { key: `l-${i}`, color: theme_1.THEME.text }, ` ${lines[i]}`));
|
|
30
|
+
}
|
|
31
|
+
children.push('\n\n');
|
|
32
|
+
children.push(react_1.default.createElement(Text, { key: 'hint', color: theme_1.THEME.dim }, ' Esc to dismiss'));
|
|
33
|
+
return react_1.default.createElement(Text, null, ...children);
|
|
34
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommandPalette — dropdown overlay showing filtered slash commands.
|
|
3
|
+
* Renders as a SINGLE Text element (1 Yoga node) with newlines for rows.
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
export interface PaletteCommand {
|
|
7
|
+
name: string;
|
|
8
|
+
usage: string;
|
|
9
|
+
description: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CommandPaletteProps {
|
|
12
|
+
commands: PaletteCommand[];
|
|
13
|
+
selectedIndex: number;
|
|
14
|
+
/** Prefix character for display (default: "/"). Use "@" for player palette. */
|
|
15
|
+
prefix?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function CommandPalette({ commands, selectedIndex, prefix }: CommandPaletteProps): React.CElement<{}, React.Component<{}, any, any>> | React.CElement<{
|
|
18
|
+
color: string;
|
|
19
|
+
}, React.Component<{
|
|
20
|
+
color: string;
|
|
21
|
+
}, any, any>>;
|
|
@@ -0,0 +1,67 @@
|
|
|
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.CommandPalette = CommandPalette;
|
|
7
|
+
/**
|
|
8
|
+
* CommandPalette — dropdown overlay showing filtered slash commands.
|
|
9
|
+
* Renders as a SINGLE Text element (1 Yoga node) with newlines for rows.
|
|
10
|
+
*/
|
|
11
|
+
const react_1 = __importDefault(require("react"));
|
|
12
|
+
const ink_context_1 = require("../ink-context");
|
|
13
|
+
const theme_1 = require("../utils/theme");
|
|
14
|
+
const MAX_VISIBLE = 6;
|
|
15
|
+
function CommandPalette({ commands, selectedIndex, prefix = '/' }) {
|
|
16
|
+
const { Text } = (0, ink_context_1.useInk)();
|
|
17
|
+
if (commands.length === 0) {
|
|
18
|
+
return react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ' No matching commands');
|
|
19
|
+
}
|
|
20
|
+
// Window the visible commands around the selected index
|
|
21
|
+
let startIdx = 0;
|
|
22
|
+
if (commands.length > MAX_VISIBLE) {
|
|
23
|
+
startIdx = Math.max(0, Math.min(selectedIndex - Math.floor(MAX_VISIBLE / 2), commands.length - MAX_VISIBLE));
|
|
24
|
+
}
|
|
25
|
+
const visible = commands.slice(startIdx, startIdx + MAX_VISIBLE);
|
|
26
|
+
const lines = [];
|
|
27
|
+
// Scroll-up indicator
|
|
28
|
+
if (startIdx > 0) {
|
|
29
|
+
lines.push(` \u2191 ${startIdx} more above`);
|
|
30
|
+
}
|
|
31
|
+
// Visible rows (plain text — color via outer Text)
|
|
32
|
+
for (let i = 0; i < visible.length; i++) {
|
|
33
|
+
const cmd = visible[i];
|
|
34
|
+
const actualIdx = startIdx + i;
|
|
35
|
+
const isSelected = actualIdx === selectedIndex;
|
|
36
|
+
const indicator = isSelected ? '\u25B8 ' : ' ';
|
|
37
|
+
lines.push(` ${indicator}/${cmd.name} ${cmd.description}`);
|
|
38
|
+
}
|
|
39
|
+
// Scroll-down indicator
|
|
40
|
+
const hasBelow = startIdx + MAX_VISIBLE < commands.length;
|
|
41
|
+
if (hasBelow) {
|
|
42
|
+
lines.push(` \u2193 ${commands.length - startIdx - MAX_VISIBLE} more below`);
|
|
43
|
+
}
|
|
44
|
+
// Single Text element with newlines — all one Yoga node
|
|
45
|
+
// Use nested Text for selected item highlighting
|
|
46
|
+
const children = [];
|
|
47
|
+
let lineIdx = 0;
|
|
48
|
+
if (startIdx > 0) {
|
|
49
|
+
children.push(react_1.default.createElement(Text, { key: 'above', color: theme_1.THEME.dim }, lines[lineIdx]));
|
|
50
|
+
children.push('\n');
|
|
51
|
+
lineIdx++;
|
|
52
|
+
}
|
|
53
|
+
for (let i = 0; i < visible.length; i++) {
|
|
54
|
+
const cmd = visible[i];
|
|
55
|
+
const actualIdx = startIdx + i;
|
|
56
|
+
const isSelected = actualIdx === selectedIndex;
|
|
57
|
+
const indicator = isSelected ? '\u25B8 ' : ' ';
|
|
58
|
+
if (i > 0)
|
|
59
|
+
children.push('\n');
|
|
60
|
+
children.push(react_1.default.createElement(react_1.default.Fragment, { key: cmd.name }, react_1.default.createElement(Text, { color: isSelected ? theme_1.THEME.accent : theme_1.THEME.dim }, ` ${indicator}`), react_1.default.createElement(Text, { color: isSelected ? theme_1.THEME.accent : theme_1.THEME.success, bold: isSelected }, `${prefix}${cmd.name}`), react_1.default.createElement(Text, { color: theme_1.THEME.muted }, ` ${cmd.description}`)));
|
|
61
|
+
}
|
|
62
|
+
if (hasBelow) {
|
|
63
|
+
children.push('\n');
|
|
64
|
+
children.push(react_1.default.createElement(Text, { key: 'below', color: theme_1.THEME.dim }, ` \u2193 ${commands.length - startIdx - MAX_VISIBLE} more below`));
|
|
65
|
+
}
|
|
66
|
+
return react_1.default.createElement(Text, null, ...children);
|
|
67
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conductor chat panel — shows command/report history from the conductor.
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import type { HistoryEntry } from '../../types';
|
|
6
|
+
export interface ConductorChatProps {
|
|
7
|
+
history: HistoryEntry[];
|
|
8
|
+
maxVisible?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function ConductorChat({ history, maxVisible }: ConductorChatProps): React.FunctionComponentElement<{
|
|
11
|
+
flexDirection: string;
|
|
12
|
+
}> | React.CElement<{
|
|
13
|
+
flexDirection: string;
|
|
14
|
+
}, React.Component<{
|
|
15
|
+
flexDirection: string;
|
|
16
|
+
}, any, any>>;
|
|
@@ -0,0 +1,32 @@
|
|
|
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.ConductorChat = ConductorChat;
|
|
7
|
+
/**
|
|
8
|
+
* Conductor chat panel — shows command/report history from the conductor.
|
|
9
|
+
*/
|
|
10
|
+
const react_1 = __importDefault(require("react"));
|
|
11
|
+
const ink_context_1 = require("../ink-context");
|
|
12
|
+
const format_1 = require("../utils/format");
|
|
13
|
+
function ConductorChat({ history, maxVisible = 20 }) {
|
|
14
|
+
const { Box, Text } = (0, ink_context_1.useInk)();
|
|
15
|
+
const visible = history.slice(-maxVisible);
|
|
16
|
+
if (visible.length === 0) {
|
|
17
|
+
return react_1.default.createElement(Box, { flexDirection: 'column' }, react_1.default.createElement(Text, { dimColor: true }, 'No conductor activity yet'));
|
|
18
|
+
}
|
|
19
|
+
return react_1.default.createElement(Box, { flexDirection: 'column' }, ...visible.map((entry, i) => {
|
|
20
|
+
const time = (0, format_1.formatTime)(entry.timestamp);
|
|
21
|
+
const isCommand = entry.type === 'command';
|
|
22
|
+
const data = entry.data;
|
|
23
|
+
if (isCommand) {
|
|
24
|
+
return react_1.default.createElement(Box, { key: `${entry.timestamp}-${i}` }, react_1.default.createElement(Text, { dimColor: true }, `[${time}] `), react_1.default.createElement(Text, { color: 'cyan' }, `${data.source}: `), react_1.default.createElement(Text, null, data.text));
|
|
25
|
+
}
|
|
26
|
+
// Report
|
|
27
|
+
const reportColor = data.type === 'blocker' ? 'red'
|
|
28
|
+
: data.type === 'question' ? 'yellow'
|
|
29
|
+
: 'green';
|
|
30
|
+
return react_1.default.createElement(Box, { key: `${entry.timestamp}-${i}` }, react_1.default.createElement(Text, { dimColor: true }, `[${time}] `), react_1.default.createElement(Text, { color: reportColor }, `[${data.type}] `), react_1.default.createElement(Text, { bold: true }, `${data.playerId}: `), react_1.default.createElement(Text, null, data.text));
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConversationStream — live message area showing ensemble conversation.
|
|
3
|
+
*
|
|
4
|
+
* Merges server conversation with local echo (optimistic sent messages),
|
|
5
|
+
* formats messages with header/body layout and word-wrap, and renders
|
|
6
|
+
* the most recent that fit in the viewport.
|
|
7
|
+
*
|
|
8
|
+
* Performance: Single <Text> root with nested virtual-text children.
|
|
9
|
+
* Zero Yoga <Box> nodes.
|
|
10
|
+
*/
|
|
11
|
+
import React from 'react';
|
|
12
|
+
export interface ConversationMessage {
|
|
13
|
+
id: string;
|
|
14
|
+
from: string;
|
|
15
|
+
to: string;
|
|
16
|
+
text: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
direction: 'in' | 'out';
|
|
19
|
+
/** Message role from ensemble chat feed. */
|
|
20
|
+
role?: 'maestro-out' | 'maestro-in' | 'conductor-out' | 'conductor-in';
|
|
21
|
+
/** True for conductor↔player traffic (rendered dimmed). */
|
|
22
|
+
thirdParty?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* #357: Mirrors `EnsembleChatMessage.broadcastId`. When set, consecutive
|
|
25
|
+
* messages sharing the same id collapse into a single rendered row with
|
|
26
|
+
* a `📡 broadcast → N players` badge. `undefined` for direct cues.
|
|
27
|
+
*/
|
|
28
|
+
broadcastId?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface SentMessage {
|
|
31
|
+
to: string;
|
|
32
|
+
text: string;
|
|
33
|
+
timestamp: string;
|
|
34
|
+
/** #357: Mirrors `Message.broadcastId` on the sender side. */
|
|
35
|
+
broadcastId?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ConversationStreamProps {
|
|
38
|
+
conversation: ConversationMessage[];
|
|
39
|
+
sentMessages: SentMessage[];
|
|
40
|
+
contentHeight: number;
|
|
41
|
+
/** Ref to store overflow data for parent to commit to Static scrollback. */
|
|
42
|
+
overflowRef: React.MutableRefObject<{
|
|
43
|
+
formatted: Array<{
|
|
44
|
+
sender: string;
|
|
45
|
+
time: string;
|
|
46
|
+
body: string;
|
|
47
|
+
direction: 'in' | 'out';
|
|
48
|
+
thirdParty?: boolean;
|
|
49
|
+
routeLabel?: string;
|
|
50
|
+
}>;
|
|
51
|
+
startIdx: number;
|
|
52
|
+
} | null>;
|
|
53
|
+
/**
|
|
54
|
+
* #360: playerId of the conductor in the active ensemble (derived from
|
|
55
|
+
* `state.players.find(p => p.isConductor)`). Used to suppress the
|
|
56
|
+
* `→ @<to>` recipient prefix on outbound messages addressed to the
|
|
57
|
+
* conductor — those route through the implicit "send to conductor"
|
|
58
|
+
* path and the prefix would be visually noisy. `undefined` when no
|
|
59
|
+
* conductor is in the ensemble.
|
|
60
|
+
*/
|
|
61
|
+
conductorPlayerId?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface FormattedMsg {
|
|
64
|
+
sender: string;
|
|
65
|
+
time: string;
|
|
66
|
+
body: string;
|
|
67
|
+
direction: 'in' | 'out';
|
|
68
|
+
role?: string;
|
|
69
|
+
thirdParty?: boolean;
|
|
70
|
+
/** For conductor traffic: show routing (from → to). */
|
|
71
|
+
routeLabel?: string;
|
|
72
|
+
/**
|
|
73
|
+
* #360: For directed `maestro-out` messages where the recipient is
|
|
74
|
+
* NOT the conductor — prepend `→ @<recipientLabel>` to the rendered
|
|
75
|
+
* body so the user can see who they actually messaged. Empty for
|
|
76
|
+
* inbound, conductor-bound, or third-party messages.
|
|
77
|
+
*
|
|
78
|
+
* Mutually exclusive with `broadcastBadge` — when a row represents a
|
|
79
|
+
* folded broadcast group, the badge enumerates recipients and the
|
|
80
|
+
* single-recipient prefix would duplicate that information.
|
|
81
|
+
*/
|
|
82
|
+
recipientLabel?: string;
|
|
83
|
+
/**
|
|
84
|
+
* #357: When set, this `FormattedMsg` represents a folded group of
|
|
85
|
+
* consecutive messages sharing the same `broadcastId`. The renderer
|
|
86
|
+
* surfaces a `📡 broadcast → <count> players` segment in front of
|
|
87
|
+
* the body in place of the `→ @<to>` recipient prefix. The first
|
|
88
|
+
* `recipients.length` names are listed (cap = 3 + "+N more").
|
|
89
|
+
*/
|
|
90
|
+
broadcastBadge?: {
|
|
91
|
+
count: number;
|
|
92
|
+
recipients: string[];
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Pre-rendered first-line prefix string (broadcast badge or directed
|
|
96
|
+
* `→ @<to> `). Computed once in `buildFormattedMessages` so the line
|
|
97
|
+
* estimator and the renderer share the exact same value without each
|
|
98
|
+
* having to call `broadcastBadgeText` independently.
|
|
99
|
+
*/
|
|
100
|
+
firstLinePrefix?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Pure projection: merge server conversation with local-echo sent
|
|
104
|
+
* messages, sort by timestamp, fold broadcast fan-out groups, and
|
|
105
|
+
* format each entry into the render-ready `FormattedMsg` shape.
|
|
106
|
+
* Exported so tests can assert on `recipientLabel` / `broadcastBadge`
|
|
107
|
+
* / `routeLabel` derivation without mounting Ink.
|
|
108
|
+
*
|
|
109
|
+
* `conductorPlayerId` is the active ensemble's conductor id. Used to
|
|
110
|
+
* suppress the `recipientLabel` on conductor-bound `maestro-out` rows
|
|
111
|
+
* so the `\u2192 @<conductor>` prefix doesn't dominate every message.
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildFormattedMessages(conversation: ConversationMessage[], sentMessages: SentMessage[], conductorPlayerId?: string): FormattedMsg[];
|
|
114
|
+
export declare function ConversationStream({ conversation, sentMessages, contentHeight, overflowRef, conductorPlayerId }: ConversationStreamProps): React.CElement<{}, React.Component<{}, any, any>>;
|