poly-weaver 0.13.4 → 0.14.0
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/dist/agents/executors/dsl.d.ts +11 -0
- package/dist/agents/executors/dsl.d.ts.map +1 -0
- package/dist/agents/executors/dsl.js +11 -0
- package/dist/agents/executors/dsl.js.map +1 -0
- package/dist/agents/executors/index.d.ts +8 -0
- package/dist/agents/executors/index.d.ts.map +1 -0
- package/dist/agents/executors/index.js +17 -0
- package/dist/agents/executors/index.js.map +1 -0
- package/dist/agents/executors/prompts.d.ts +18 -0
- package/dist/agents/executors/prompts.d.ts.map +1 -0
- package/dist/agents/executors/prompts.js +62 -0
- package/dist/agents/executors/prompts.js.map +1 -0
- package/dist/agents/executors/types.d.ts +8 -0
- package/dist/agents/executors/types.d.ts.map +1 -0
- package/dist/agents/executors/types.js +2 -0
- package/dist/agents/executors/types.js.map +1 -0
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/registry.d.ts +1 -1
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +3 -0
- package/dist/agents/registry.js.map +1 -1
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +20 -45
- package/dist/agents/runner.js.map +1 -1
- package/dist/ansi.d.ts +4 -0
- package/dist/ansi.d.ts.map +1 -1
- package/dist/ansi.js +4 -0
- package/dist/ansi.js.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/crosscheck/broadcast-composer.d.ts +89 -0
- package/dist/crosscheck/broadcast-composer.d.ts.map +1 -0
- package/dist/crosscheck/broadcast-composer.js +431 -0
- package/dist/crosscheck/broadcast-composer.js.map +1 -0
- package/dist/crosscheck/coordinator.d.ts +154 -0
- package/dist/crosscheck/coordinator.d.ts.map +1 -0
- package/dist/crosscheck/coordinator.js +1695 -0
- package/dist/crosscheck/coordinator.js.map +1 -0
- package/dist/crosscheck/key-helpers.d.ts +16 -0
- package/dist/crosscheck/key-helpers.d.ts.map +1 -0
- package/dist/crosscheck/key-helpers.js +42 -0
- package/dist/crosscheck/key-helpers.js.map +1 -0
- package/dist/crosscheck/live-agent-session.d.ts +38 -0
- package/dist/crosscheck/live-agent-session.d.ts.map +1 -0
- package/dist/crosscheck/live-agent-session.js +126 -0
- package/dist/crosscheck/live-agent-session.js.map +1 -0
- package/dist/crosscheck/reconcile.d.ts +10 -0
- package/dist/crosscheck/reconcile.d.ts.map +1 -0
- package/dist/crosscheck/reconcile.js +29 -0
- package/dist/crosscheck/reconcile.js.map +1 -0
- package/dist/crosscheck/state.d.ts +102 -0
- package/dist/crosscheck/state.d.ts.map +1 -0
- package/dist/crosscheck/state.js +221 -0
- package/dist/crosscheck/state.js.map +1 -0
- package/dist/dsl.d.ts +2 -0
- package/dist/dsl.d.ts.map +1 -1
- package/dist/dsl.js +2 -1
- package/dist/dsl.js.map +1 -1
- package/dist/dump/service.d.ts +6 -3
- package/dist/dump/service.d.ts.map +1 -1
- package/dist/dump/service.js +32 -12
- package/dist/dump/service.js.map +1 -1
- package/dist/flow/built-in/crosscheck-factory.d.ts +15 -0
- package/dist/flow/built-in/crosscheck-factory.d.ts.map +1 -0
- package/dist/flow/built-in/crosscheck-factory.js +60 -0
- package/dist/flow/built-in/crosscheck-factory.js.map +1 -0
- package/dist/flow/built-in/crosscheck.d.ts +6 -0
- package/dist/flow/built-in/crosscheck.d.ts.map +1 -0
- package/dist/flow/built-in/crosscheck.js +6 -0
- package/dist/flow/built-in/crosscheck.js.map +1 -0
- package/dist/flow/built-in/default-factory.d.ts.map +1 -1
- package/dist/flow/built-in/default-factory.js +1 -0
- package/dist/flow/built-in/default-factory.js.map +1 -1
- package/dist/flow/built-in/simplify-factory.d.ts.map +1 -1
- package/dist/flow/built-in/simplify-factory.js +1 -0
- package/dist/flow/built-in/simplify-factory.js.map +1 -1
- package/dist/flow/custom/load.d.ts.map +1 -1
- package/dist/flow/custom/load.js +4 -0
- package/dist/flow/custom/load.js.map +1 -1
- package/dist/flow/dsl.d.ts +1 -0
- package/dist/flow/dsl.d.ts.map +1 -1
- package/dist/flow/dsl.js +1 -0
- package/dist/flow/dsl.js.map +1 -1
- package/dist/flow/index.d.ts +2 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +2 -1
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/params.d.ts +7 -1
- package/dist/flow/params.d.ts.map +1 -1
- package/dist/flow/params.js +28 -13
- package/dist/flow/params.js.map +1 -1
- package/dist/flow/types.d.ts +8 -1
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/flow/types.js.map +1 -1
- package/dist/offscreen/controller.d.ts +9 -3
- package/dist/offscreen/controller.d.ts.map +1 -1
- package/dist/offscreen/controller.js +149 -75
- package/dist/offscreen/controller.js.map +1 -1
- package/dist/offscreen/fork-busy.d.ts +2 -1
- package/dist/offscreen/fork-busy.d.ts.map +1 -1
- package/dist/offscreen/fork-busy.js +5 -2
- package/dist/offscreen/fork-busy.js.map +1 -1
- package/dist/offscreen/fork.d.ts +1 -1
- package/dist/offscreen/fork.d.ts.map +1 -1
- package/dist/offscreen/fork.js +4 -2
- package/dist/offscreen/fork.js.map +1 -1
- package/dist/offscreen/inquiry-sender.d.ts +4 -9
- package/dist/offscreen/inquiry-sender.d.ts.map +1 -1
- package/dist/offscreen/inquiry-sender.js +5 -54
- package/dist/offscreen/inquiry-sender.js.map +1 -1
- package/dist/offscreen/session-turn-monitor.d.ts +66 -0
- package/dist/offscreen/session-turn-monitor.d.ts.map +1 -0
- package/dist/offscreen/session-turn-monitor.js +257 -0
- package/dist/offscreen/session-turn-monitor.js.map +1 -0
- package/dist/orchestrator.d.ts +7 -6
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +122 -61
- package/dist/orchestrator.js.map +1 -1
- package/dist/preview-panel.d.ts +1 -0
- package/dist/preview-panel.d.ts.map +1 -1
- package/dist/preview-panel.js +24 -20
- package/dist/preview-panel.js.map +1 -1
- package/dist/providers/claude/completion.d.ts +1 -0
- package/dist/providers/claude/completion.d.ts.map +1 -1
- package/dist/providers/claude/completion.js +5 -0
- package/dist/providers/claude/completion.js.map +1 -1
- package/dist/providers/claude/composer.d.ts +6 -0
- package/dist/providers/claude/composer.d.ts.map +1 -0
- package/dist/providers/claude/composer.js +7 -0
- package/dist/providers/claude/composer.js.map +1 -0
- package/dist/providers/claude/session.d.ts +1 -0
- package/dist/providers/claude/session.d.ts.map +1 -1
- package/dist/providers/claude/session.js +21 -1
- package/dist/providers/claude/session.js.map +1 -1
- package/dist/providers/claude/strategy.d.ts +6 -1
- package/dist/providers/claude/strategy.d.ts.map +1 -1
- package/dist/providers/claude/strategy.js +40 -11
- package/dist/providers/claude/strategy.js.map +1 -1
- package/dist/providers/codex/composer.d.ts +6 -0
- package/dist/providers/codex/composer.d.ts.map +1 -0
- package/dist/providers/codex/composer.js +143 -0
- package/dist/providers/codex/composer.js.map +1 -0
- package/dist/providers/codex/plan-mode-activator.d.ts +4 -6
- package/dist/providers/codex/plan-mode-activator.d.ts.map +1 -1
- package/dist/providers/codex/plan-mode-activator.js +16 -21
- package/dist/providers/codex/plan-mode-activator.js.map +1 -1
- package/dist/providers/codex/strategy.d.ts +5 -1
- package/dist/providers/codex/strategy.d.ts.map +1 -1
- package/dist/providers/codex/strategy.js +8 -3
- package/dist/providers/codex/strategy.js.map +1 -1
- package/dist/providers/composer-utils.d.ts +9 -0
- package/dist/providers/composer-utils.d.ts.map +1 -0
- package/dist/providers/composer-utils.js +218 -0
- package/dist/providers/composer-utils.js.map +1 -0
- package/dist/providers/copilot/completion.d.ts +6 -2
- package/dist/providers/copilot/completion.d.ts.map +1 -1
- package/dist/providers/copilot/completion.js +56 -11
- package/dist/providers/copilot/completion.js.map +1 -1
- package/dist/providers/copilot/composer.d.ts +6 -0
- package/dist/providers/copilot/composer.d.ts.map +1 -0
- package/dist/providers/copilot/composer.js +10 -0
- package/dist/providers/copilot/composer.js.map +1 -0
- package/dist/providers/copilot/strategy.d.ts +6 -1
- package/dist/providers/copilot/strategy.d.ts.map +1 -1
- package/dist/providers/copilot/strategy.js +69 -12
- package/dist/providers/copilot/strategy.js.map +1 -1
- package/dist/providers/fork.d.ts +3 -1
- package/dist/providers/fork.d.ts.map +1 -1
- package/dist/providers/fork.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/live.d.ts +17 -0
- package/dist/providers/live.d.ts.map +1 -0
- package/dist/providers/live.js +201 -0
- package/dist/providers/live.js.map +1 -0
- package/dist/providers/session-launch.d.ts +25 -0
- package/dist/providers/session-launch.d.ts.map +1 -0
- package/dist/providers/session-launch.js +54 -0
- package/dist/providers/session-launch.js.map +1 -0
- package/dist/providers/types.d.ts +75 -4
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/resume-tui.d.ts.map +1 -1
- package/dist/resume-tui.js +3 -1
- package/dist/resume-tui.js.map +1 -1
- package/dist/session/list.d.ts.map +1 -1
- package/dist/session/list.js +5 -3
- package/dist/session/list.js.map +1 -1
- package/dist/session/locator.d.ts.map +1 -1
- package/dist/session/locator.js +6 -22
- package/dist/session/locator.js.map +1 -1
- package/dist/session/reader.d.ts +8 -0
- package/dist/session/reader.d.ts.map +1 -1
- package/dist/session/reader.js +12 -2
- package/dist/session/reader.js.map +1 -1
- package/dist/session/resume.d.ts.map +1 -1
- package/dist/session/resume.js +1 -0
- package/dist/session/resume.js.map +1 -1
- package/dist/session/session-store.d.ts +3 -0
- package/dist/session/session-store.d.ts.map +1 -1
- package/dist/session/session-store.js +18 -6
- package/dist/session/session-store.js.map +1 -1
- package/dist/startup-tui.js +2 -2
- package/dist/startup-tui.js.map +1 -1
- package/dist/status-bar.d.ts +3 -0
- package/dist/status-bar.d.ts.map +1 -1
- package/dist/status-bar.js.map +1 -1
- package/dist/terminal/host.d.ts +19 -3
- package/dist/terminal/host.d.ts.map +1 -1
- package/dist/terminal/host.js +45 -7
- package/dist/terminal/host.js.map +1 -1
- package/dist/terminal/kitty-negotiator.js +1 -1
- package/dist/terminal/kitty-negotiator.js.map +1 -1
- package/dist/terminal/paste-submit.d.ts +18 -27
- package/dist/terminal/paste-submit.d.ts.map +1 -1
- package/dist/terminal/paste-submit.js +81 -128
- package/dist/terminal/paste-submit.js.map +1 -1
- package/dist/terminal-input.d.ts.map +1 -1
- package/dist/terminal-input.js +3 -4
- package/dist/terminal-input.js.map +1 -1
- package/dist/util/abortable-sleep.d.ts +6 -0
- package/dist/util/abortable-sleep.d.ts.map +1 -0
- package/dist/util/abortable-sleep.js +40 -0
- package/dist/util/abortable-sleep.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { bold, dim, MUTED_YELLOW_BG, MUTED_YELLOW_FG, padOrClip, reset, TRUE_BLACK_FG, visibleLength, } from "../ansi.js";
|
|
2
|
+
import { clipToWidth } from "../user/curate-prompt.js";
|
|
3
|
+
import { applyEditInsertedText, applyEditingBufferEvent, emptyBuffer, renderMultilineEditor, } from "../user/feedback-editing.js";
|
|
4
|
+
import { EmacsInputParser, isTextBufferEvent, } from "../text-editing/emacs-input.js";
|
|
5
|
+
import { isCtrlJKey, isEnterKey, isShiftEnterKey, isShiftTabKey, } from "./key-helpers.js";
|
|
6
|
+
export const MODE_LABELS = {
|
|
7
|
+
hint: "Hint",
|
|
8
|
+
steer: "Steer",
|
|
9
|
+
"follow-up": "Follow-up",
|
|
10
|
+
chat: "Chat",
|
|
11
|
+
};
|
|
12
|
+
const MODE_PLACEHOLDERS = {
|
|
13
|
+
hint: "Send a hint to both agents while they work…",
|
|
14
|
+
steer: "Redirect both agents with new guidance…",
|
|
15
|
+
"follow-up": "Ask both agents a brand-new follow-up task…",
|
|
16
|
+
chat: "Chat with both agents…",
|
|
17
|
+
};
|
|
18
|
+
export const BROADCAST_MODE_BG_CODES = {
|
|
19
|
+
hint: "48;5;30",
|
|
20
|
+
steer: "48;5;97",
|
|
21
|
+
"follow-up": "48;5;71",
|
|
22
|
+
chat: "48;5;68",
|
|
23
|
+
};
|
|
24
|
+
const MODE_BG_COLORS = {
|
|
25
|
+
hint: `\x1b[${BROADCAST_MODE_BG_CODES.hint}m`,
|
|
26
|
+
steer: `\x1b[${BROADCAST_MODE_BG_CODES.steer}m`,
|
|
27
|
+
"follow-up": `\x1b[${BROADCAST_MODE_BG_CODES["follow-up"]}m`,
|
|
28
|
+
chat: `\x1b[${BROADCAST_MODE_BG_CODES.chat}m`,
|
|
29
|
+
};
|
|
30
|
+
const MUTED_ACCENT = "\x1b[90m";
|
|
31
|
+
const MODE_ROW_READY_FG = "\x1b[37m";
|
|
32
|
+
const NORMAL_INTENSITY = "\x1b[22m";
|
|
33
|
+
const UNFOCUSED_MODE_STYLE = "\x1b[7m";
|
|
34
|
+
const BLOCKED_MODE_BG = MUTED_YELLOW_BG;
|
|
35
|
+
const CROSSCHECK_ACCENT = MUTED_YELLOW_FG;
|
|
36
|
+
const ROW_INDENT = " ";
|
|
37
|
+
const ROW_INDENT_WIDTH = 1;
|
|
38
|
+
const MAX_VISIBLE_EDITOR_ROWS = 5;
|
|
39
|
+
/** Mode and generation-status rows that precede the editor viewport. */
|
|
40
|
+
const CHROME_ROWS = 2;
|
|
41
|
+
const MODE_HINT = "Shift+Tab Mode";
|
|
42
|
+
const NEWLINE_HINT = "Ctrl+J Newline";
|
|
43
|
+
const MODE_HINT_SEPARATOR = " · ";
|
|
44
|
+
const HINT_SECTION_PAD_TARGET = 2;
|
|
45
|
+
const HINT_SECTION_PAD_MIN = 1;
|
|
46
|
+
const FOREGROUND_RESET = "\x1b[39m";
|
|
47
|
+
const BLOCKED_LABELS = {
|
|
48
|
+
launching: "Launching",
|
|
49
|
+
broadcasting: "Broadcasting",
|
|
50
|
+
crosschecking: "Crosschecking",
|
|
51
|
+
};
|
|
52
|
+
function actionHint(phase) {
|
|
53
|
+
return phase === "reconcile" ? "Ctrl+X Reconcile" : "Ctrl+X Crosscheck";
|
|
54
|
+
}
|
|
55
|
+
function blockedLabel(submissionState, crosscheck) {
|
|
56
|
+
if (submissionState === "crosschecking"
|
|
57
|
+
&& crosscheck.kind === "crosschecking"
|
|
58
|
+
&& crosscheck.phase === "reconcile")
|
|
59
|
+
return "Reconciling";
|
|
60
|
+
return BLOCKED_LABELS[submissionState];
|
|
61
|
+
}
|
|
62
|
+
function readinessCount(readiness) {
|
|
63
|
+
return Number(readiness.agent1Ready) + Number(readiness.agent2Ready);
|
|
64
|
+
}
|
|
65
|
+
export function availableBroadcastModes(readiness) {
|
|
66
|
+
const ready = readinessCount(readiness);
|
|
67
|
+
if (ready === 0)
|
|
68
|
+
return ["hint", "steer"];
|
|
69
|
+
if (ready === 1)
|
|
70
|
+
return ["steer"];
|
|
71
|
+
return ["follow-up", "chat"];
|
|
72
|
+
}
|
|
73
|
+
export function defaultBroadcastMode(readiness) {
|
|
74
|
+
const ready = readinessCount(readiness);
|
|
75
|
+
if (ready === 0)
|
|
76
|
+
return "hint";
|
|
77
|
+
if (ready === 1)
|
|
78
|
+
return "steer";
|
|
79
|
+
return "follow-up";
|
|
80
|
+
}
|
|
81
|
+
export function nextBroadcastMode(current, readiness) {
|
|
82
|
+
const available = availableBroadcastModes(readiness);
|
|
83
|
+
const index = available.indexOf(current);
|
|
84
|
+
if (index === -1)
|
|
85
|
+
return defaultBroadcastMode(readiness);
|
|
86
|
+
return available[(index + 1) % available.length];
|
|
87
|
+
}
|
|
88
|
+
function truncateWithEllipsis(text, width) {
|
|
89
|
+
if (width <= 0)
|
|
90
|
+
return "";
|
|
91
|
+
if (visibleLength(text) <= width)
|
|
92
|
+
return text;
|
|
93
|
+
if (width === 1)
|
|
94
|
+
return "…";
|
|
95
|
+
return `${clipToWidth(text, width - 1)}…`;
|
|
96
|
+
}
|
|
97
|
+
function buildModeHintSection(hints, pad) {
|
|
98
|
+
if (hints.length === 0)
|
|
99
|
+
return "";
|
|
100
|
+
return `${" ".repeat(pad)}|${" ".repeat(pad)}${hints.join(MODE_HINT_SEPARATOR)}`;
|
|
101
|
+
}
|
|
102
|
+
function buildModeLine(width, mode, focused, submissionState, crosscheck, chrome = {}) {
|
|
103
|
+
const label = submissionState === "ready"
|
|
104
|
+
? `Broadcast (${MODE_LABELS[mode]})`
|
|
105
|
+
: blockedLabel(submissionState, crosscheck);
|
|
106
|
+
const background = submissionState === "ready"
|
|
107
|
+
? MODE_BG_COLORS[mode]
|
|
108
|
+
: BLOCKED_MODE_BG;
|
|
109
|
+
const modeFg = submissionState === "ready" ? MODE_ROW_READY_FG : TRUE_BLACK_FG;
|
|
110
|
+
if (chrome.transient) {
|
|
111
|
+
return buildTransientModeLine(width, background, focused, modeFg, chrome.transient.message, chrome.transient.variant ?? "default");
|
|
112
|
+
}
|
|
113
|
+
const shortcutCandidates = focused
|
|
114
|
+
? submissionState === "ready"
|
|
115
|
+
? [
|
|
116
|
+
[MODE_HINT, NEWLINE_HINT],
|
|
117
|
+
[MODE_HINT],
|
|
118
|
+
[],
|
|
119
|
+
]
|
|
120
|
+
: [[NEWLINE_HINT], []]
|
|
121
|
+
: [[]];
|
|
122
|
+
const focusHint = chrome.focusSwitchHint ?? "";
|
|
123
|
+
const version = chrome.version ?? "";
|
|
124
|
+
const fitLayout = (versionText, shortcutHints, showFocusHint) => {
|
|
125
|
+
const hints = showFocusHint && focusHint !== ""
|
|
126
|
+
? [...shortcutHints, focusHint]
|
|
127
|
+
: [...shortcutHints];
|
|
128
|
+
const versionWidth = versionText ? 1 + visibleLength(versionText) + 1 : 0;
|
|
129
|
+
if (hints.length === 0) {
|
|
130
|
+
const visible = ROW_INDENT_WIDTH + visibleLength(label) + versionWidth;
|
|
131
|
+
return visible <= width ? { hintSection: "" } : undefined;
|
|
132
|
+
}
|
|
133
|
+
for (let pad = HINT_SECTION_PAD_TARGET; pad >= HINT_SECTION_PAD_MIN; pad--) {
|
|
134
|
+
const hintSection = buildModeHintSection(hints, pad);
|
|
135
|
+
const visible = ROW_INDENT_WIDTH
|
|
136
|
+
+ visibleLength(label)
|
|
137
|
+
+ visibleLength(hintSection)
|
|
138
|
+
+ versionWidth;
|
|
139
|
+
if (visible <= width)
|
|
140
|
+
return { hintSection };
|
|
141
|
+
}
|
|
142
|
+
return undefined;
|
|
143
|
+
};
|
|
144
|
+
const candidates = [
|
|
145
|
+
...(version !== ""
|
|
146
|
+
? [{
|
|
147
|
+
showVersion: true,
|
|
148
|
+
hints: shortcutCandidates[0] ?? [],
|
|
149
|
+
showFocus: focusHint !== "",
|
|
150
|
+
}]
|
|
151
|
+
: []),
|
|
152
|
+
...shortcutCandidates.map((hints) => ({
|
|
153
|
+
showVersion: false,
|
|
154
|
+
hints,
|
|
155
|
+
showFocus: focusHint !== "",
|
|
156
|
+
})),
|
|
157
|
+
{ showVersion: false, hints: [], showFocus: false },
|
|
158
|
+
];
|
|
159
|
+
const selected = candidates
|
|
160
|
+
.map((candidate) => ({
|
|
161
|
+
candidate,
|
|
162
|
+
layout: fitLayout(candidate.showVersion ? version : "", candidate.hints, candidate.showFocus),
|
|
163
|
+
}))
|
|
164
|
+
.find((item) => item.layout !== undefined);
|
|
165
|
+
const showVersion = selected?.candidate.showVersion ?? false;
|
|
166
|
+
const layout = selected?.layout ?? { hintSection: "" };
|
|
167
|
+
const suffixStyle = focused
|
|
168
|
+
? submissionState === "ready"
|
|
169
|
+
? `${modeFg}${bold}`
|
|
170
|
+
: `${NORMAL_INTENSITY}${modeFg}`
|
|
171
|
+
: "";
|
|
172
|
+
const left = focused
|
|
173
|
+
? `${ROW_INDENT}${modeFg}${bold}${label}${layout.hintSection ? `${suffixStyle}${layout.hintSection}` : ""}`
|
|
174
|
+
: `${ROW_INDENT}${label}${layout.hintSection}`;
|
|
175
|
+
const lineStyle = focused ? background : UNFOCUSED_MODE_STYLE;
|
|
176
|
+
if (showVersion) {
|
|
177
|
+
const gap = Math.max(1, width - visibleLength(left) - visibleLength(version) - 1);
|
|
178
|
+
return `${lineStyle}${left}${" ".repeat(gap)}${suffixStyle}${version} ${reset}`;
|
|
179
|
+
}
|
|
180
|
+
return `${lineStyle}${padOrClip(left, width)}${reset}`;
|
|
181
|
+
}
|
|
182
|
+
function buildTransientModeLine(width, background, focused, modeFg, message, variant) {
|
|
183
|
+
const content = padOrClip(`${ROW_INDENT}${message}`, width);
|
|
184
|
+
if (variant === "copy-success") {
|
|
185
|
+
return `\x1b[0m\x1b[30;43m${content}${reset}`;
|
|
186
|
+
}
|
|
187
|
+
if (variant === "copy-failure") {
|
|
188
|
+
return `\x1b[0m\x1b[97;41m${content}${reset}`;
|
|
189
|
+
}
|
|
190
|
+
const style = focused ? `${background}${modeFg}` : UNFOCUSED_MODE_STYLE;
|
|
191
|
+
return `${style}${content}${reset}`;
|
|
192
|
+
}
|
|
193
|
+
function buildTaskLine(width, readiness, trackedTask, crosscheck, submissionState) {
|
|
194
|
+
const ready = readinessCount(readiness);
|
|
195
|
+
const highlighted = submissionState === "crosschecking"
|
|
196
|
+
|| (submissionState === "ready"
|
|
197
|
+
&& crosscheck.kind === "actionable");
|
|
198
|
+
const prefix = submissionState === "launching"
|
|
199
|
+
|| submissionState === "broadcasting"
|
|
200
|
+
? "0/2"
|
|
201
|
+
: submissionState === "crosschecking"
|
|
202
|
+
? `${crosscheck.kind === "crosschecking" ? crosscheck.completed : 0}/2`
|
|
203
|
+
: crosscheck.kind === "actionable"
|
|
204
|
+
? `${ready}/2 ${actionHint(crosscheck.phase)}`
|
|
205
|
+
: `${ready}/2`;
|
|
206
|
+
const firstLine = trackedTask.split(/\r?\n/, 1)[0]?.replace(/\s+/g, " ").trim() ?? "";
|
|
207
|
+
const rowWidth = Math.max(1, Math.floor(width * 3 / 4));
|
|
208
|
+
const textWidth = Math.max(0, rowWidth - ROW_INDENT_WIDTH);
|
|
209
|
+
if (visibleLength(prefix) >= textWidth) {
|
|
210
|
+
const clippedPrefix = clipToWidth(prefix, textWidth);
|
|
211
|
+
return `${ROW_INDENT}${highlighted ? CROSSCHECK_ACCENT : ""}${clippedPrefix}${reset}`;
|
|
212
|
+
}
|
|
213
|
+
const availableTaskWidth = textWidth - visibleLength(prefix) - 3;
|
|
214
|
+
const styledPrefix = highlighted
|
|
215
|
+
? `${CROSSCHECK_ACCENT}${prefix}${FOREGROUND_RESET}`
|
|
216
|
+
: prefix;
|
|
217
|
+
if (availableTaskWidth <= 0) {
|
|
218
|
+
return `${ROW_INDENT}${styledPrefix}${reset}`;
|
|
219
|
+
}
|
|
220
|
+
const quotedTask = truncateWithEllipsis(firstLine, availableTaskWidth);
|
|
221
|
+
return `${ROW_INDENT}${styledPrefix} ${MUTED_ACCENT}"${quotedTask}"${reset}`;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Crosscheck-owned multiline Broadcast composer: a persistent editor block
|
|
225
|
+
* beneath the two agent panes used to send Hint/Chat/Steer/Follow-up
|
|
226
|
+
* messages to both agents at once. Owns only transient UI state (mode,
|
|
227
|
+
* draft text, scroll); the coordinator persists committed prompts and
|
|
228
|
+
* generation effects.
|
|
229
|
+
*/
|
|
230
|
+
export class BroadcastComposer {
|
|
231
|
+
mode;
|
|
232
|
+
buffer;
|
|
233
|
+
scrollTop = 0;
|
|
234
|
+
pendingSubmission;
|
|
235
|
+
pendingLegacyEscape = false;
|
|
236
|
+
constructor(readiness) {
|
|
237
|
+
this.mode = defaultBroadcastMode(readiness);
|
|
238
|
+
this.buffer = emptyBuffer();
|
|
239
|
+
}
|
|
240
|
+
get isDraftEmpty() {
|
|
241
|
+
return this.buffer.lines.length <= 1 && (this.buffer.lines[0]?.length ?? 0) === 0;
|
|
242
|
+
}
|
|
243
|
+
/** Returns the submission text (multiline, exactly as typed), or undefined when whitespace-only. */
|
|
244
|
+
submissionText() {
|
|
245
|
+
const text = this.buffer.lines.join("\n");
|
|
246
|
+
return text.trim().length > 0 ? text : undefined;
|
|
247
|
+
}
|
|
248
|
+
clearDraft() {
|
|
249
|
+
this.buffer = emptyBuffer();
|
|
250
|
+
this.scrollTop = 0;
|
|
251
|
+
}
|
|
252
|
+
beginSubmission() {
|
|
253
|
+
const token = { id: Symbol("broadcast-submission") };
|
|
254
|
+
this.pendingSubmission = { token, mutations: [] };
|
|
255
|
+
return token;
|
|
256
|
+
}
|
|
257
|
+
completeSubmission(token) {
|
|
258
|
+
if (this.pendingSubmission?.token !== token)
|
|
259
|
+
return;
|
|
260
|
+
const mutations = this.pendingSubmission.mutations;
|
|
261
|
+
this.pendingSubmission = undefined;
|
|
262
|
+
this.clearDraft();
|
|
263
|
+
for (const mutation of mutations) {
|
|
264
|
+
if (mutation.type === "event") {
|
|
265
|
+
applyEditingBufferEvent({ buffer: this.buffer }, mutation.event);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
applyEditInsertedText({ buffer: this.buffer }, mutation.content);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
cancelSubmission(token) {
|
|
273
|
+
if (this.pendingSubmission?.token === token) {
|
|
274
|
+
this.pendingSubmission = undefined;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
endInputSequence() {
|
|
278
|
+
this.pendingLegacyEscape = false;
|
|
279
|
+
}
|
|
280
|
+
/** After a Steer/Follow-up dispatch, the mode resets to the default for the resulting 0/2 readiness. */
|
|
281
|
+
resetModeForFreshGeneration() {
|
|
282
|
+
this.mode = defaultBroadcastMode({ agent1Ready: false, agent2Ready: false });
|
|
283
|
+
}
|
|
284
|
+
/** Keeps the selected mode valid as readiness changes, falling back to the new default when unavailable. */
|
|
285
|
+
reconcileMode(readiness) {
|
|
286
|
+
if (!availableBroadcastModes(readiness).includes(this.mode)) {
|
|
287
|
+
this.mode = defaultBroadcastMode(readiness);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
cycleMode(readiness) {
|
|
291
|
+
this.mode = nextBroadcastMode(this.mode, readiness);
|
|
292
|
+
}
|
|
293
|
+
/** Total on-screen rows this block occupies at `width`, independent of focus/mode/readiness. */
|
|
294
|
+
rowCount(width) {
|
|
295
|
+
const w = Math.max(1, width);
|
|
296
|
+
if (this.isDraftEmpty)
|
|
297
|
+
return CHROME_ROWS + 1;
|
|
298
|
+
const total = renderMultilineEditor(this.buffer, w, ROW_INDENT, ROW_INDENT).lines.length;
|
|
299
|
+
return CHROME_ROWS + Math.min(MAX_VISIBLE_EDITOR_ROWS, Math.max(1, total));
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Classifies and applies a single terminal key. Enter submits (unless the
|
|
303
|
+
* draft is whitespace-only, handled by the caller via `submissionText`);
|
|
304
|
+
* Ctrl+J and Shift+Enter insert a newline; Shift+Tab cycles the mode;
|
|
305
|
+
* everything else routes through ordinary multiline editing.
|
|
306
|
+
*/
|
|
307
|
+
handleKey(key, readiness, submissionState = "ready", childKittyFlags = 0) {
|
|
308
|
+
let keys = [key];
|
|
309
|
+
if (this.pendingLegacyEscape) {
|
|
310
|
+
this.pendingLegacyEscape = false;
|
|
311
|
+
if (key.kind === "printable") {
|
|
312
|
+
keys = [{ kind: "escape" }, key];
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else if (key.kind === "escape") {
|
|
316
|
+
this.pendingLegacyEscape = true;
|
|
317
|
+
return "ignored";
|
|
318
|
+
}
|
|
319
|
+
if (isShiftTabKey(key)) {
|
|
320
|
+
if (submissionState !== "ready")
|
|
321
|
+
return "ignored";
|
|
322
|
+
this.cycleMode(readiness);
|
|
323
|
+
return "mode-cycle";
|
|
324
|
+
}
|
|
325
|
+
if (isCtrlJKey(key) || isShiftEnterKey(key)) {
|
|
326
|
+
this.applyBufferEvent({ type: "newline" });
|
|
327
|
+
return "changed";
|
|
328
|
+
}
|
|
329
|
+
if (isEnterKey(key, childKittyFlags)) {
|
|
330
|
+
return submissionState === "ready" ? "submit" : "ignored";
|
|
331
|
+
}
|
|
332
|
+
let changed = false;
|
|
333
|
+
for (const event of new EmacsInputParser().mapKeys(keys)) {
|
|
334
|
+
if (isTextBufferEvent(event)) {
|
|
335
|
+
if (this.applyBufferEvent(event))
|
|
336
|
+
changed = true;
|
|
337
|
+
}
|
|
338
|
+
else if (event.type === "paste") {
|
|
339
|
+
this.applyPaste(event.content);
|
|
340
|
+
changed = true;
|
|
341
|
+
}
|
|
342
|
+
else if (event.type === "arrow") {
|
|
343
|
+
if (this.applyArrow(event.direction))
|
|
344
|
+
changed = true;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return changed ? "changed" : "ignored";
|
|
348
|
+
}
|
|
349
|
+
applyArrow(direction) {
|
|
350
|
+
const eventType = direction === "up"
|
|
351
|
+
? "ctrl-p"
|
|
352
|
+
: direction === "down"
|
|
353
|
+
? "ctrl-n"
|
|
354
|
+
: direction === "left"
|
|
355
|
+
? "ctrl-b"
|
|
356
|
+
: "ctrl-f";
|
|
357
|
+
return this.applyBufferEvent({ type: eventType });
|
|
358
|
+
}
|
|
359
|
+
applyBufferEvent(event) {
|
|
360
|
+
const changed = applyEditingBufferEvent({ buffer: this.buffer }, event);
|
|
361
|
+
if (changed) {
|
|
362
|
+
this.pendingSubmission?.mutations.push({ type: "event", event });
|
|
363
|
+
}
|
|
364
|
+
return changed;
|
|
365
|
+
}
|
|
366
|
+
applyPaste(content) {
|
|
367
|
+
applyEditInsertedText({ buffer: this.buffer }, content);
|
|
368
|
+
this.pendingSubmission?.mutations.push({ type: "paste", content });
|
|
369
|
+
}
|
|
370
|
+
render(width, focused, readiness, trackedTask, crosscheck = { kind: "unavailable" }, submissionState = "ready", maxRows = Number.POSITIVE_INFINITY, chrome = {}) {
|
|
371
|
+
this.reconcileMode(readiness);
|
|
372
|
+
const w = Math.max(1, width);
|
|
373
|
+
const blocked = submissionState !== "ready";
|
|
374
|
+
const modeLine = buildModeLine(w, this.mode, focused, submissionState, crosscheck, chrome);
|
|
375
|
+
const taskLine = buildTaskLine(w, readiness, trackedTask, crosscheck, submissionState);
|
|
376
|
+
const editorIndent = ROW_INDENT;
|
|
377
|
+
const rowBudget = Number.isFinite(maxRows)
|
|
378
|
+
? Math.max(1, Math.floor(maxRows))
|
|
379
|
+
: Number.POSITIVE_INFINITY;
|
|
380
|
+
if (rowBudget < CHROME_ROWS) {
|
|
381
|
+
return {
|
|
382
|
+
lines: [taskLine],
|
|
383
|
+
cursor: { row: 0, col: 0 },
|
|
384
|
+
showCursor: false,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
const editorRowBudget = Math.max(0, Math.min(MAX_VISIBLE_EDITOR_ROWS, rowBudget - CHROME_ROWS));
|
|
388
|
+
let editorLines;
|
|
389
|
+
let cursorRow;
|
|
390
|
+
let cursorCol;
|
|
391
|
+
if (editorRowBudget === 0) {
|
|
392
|
+
editorLines = [];
|
|
393
|
+
cursorRow = 0;
|
|
394
|
+
cursorCol = 0;
|
|
395
|
+
}
|
|
396
|
+
else if (this.isDraftEmpty) {
|
|
397
|
+
editorLines = [
|
|
398
|
+
clipToWidth(`${editorIndent}${dim}${MODE_PLACEHOLDERS[this.mode]}${reset}`, w),
|
|
399
|
+
];
|
|
400
|
+
cursorRow = 0;
|
|
401
|
+
cursorCol = Math.min(Math.max(0, w - 1), ROW_INDENT_WIDTH);
|
|
402
|
+
this.scrollTop = 0;
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
const editorPrefix = blocked ? `${editorIndent}${dim}` : editorIndent;
|
|
406
|
+
const rendered = renderMultilineEditor(this.buffer, w, editorPrefix, editorPrefix);
|
|
407
|
+
const total = rendered.lines.length;
|
|
408
|
+
const visible = Math.min(editorRowBudget, total);
|
|
409
|
+
let scrollTop = Math.min(this.scrollTop, Math.max(0, total - visible));
|
|
410
|
+
if (rendered.cursorRowOffset < scrollTop) {
|
|
411
|
+
scrollTop = rendered.cursorRowOffset;
|
|
412
|
+
}
|
|
413
|
+
else if (rendered.cursorRowOffset >= scrollTop + visible) {
|
|
414
|
+
scrollTop = rendered.cursorRowOffset - visible + 1;
|
|
415
|
+
}
|
|
416
|
+
scrollTop = Math.max(0, Math.min(scrollTop, Math.max(0, total - visible)));
|
|
417
|
+
this.scrollTop = scrollTop;
|
|
418
|
+
editorLines = rendered.lines.slice(scrollTop, scrollTop + visible);
|
|
419
|
+
if (blocked)
|
|
420
|
+
editorLines = editorLines.map((line) => `${line}${reset}`);
|
|
421
|
+
cursorRow = rendered.cursorRowOffset - scrollTop;
|
|
422
|
+
cursorCol = rendered.cursorCol;
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
lines: [modeLine, taskLine, ...editorLines],
|
|
426
|
+
cursor: { row: CHROME_ROWS + cursorRow, col: cursorCol },
|
|
427
|
+
showCursor: focused && editorLines.length > 0,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=broadcast-composer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-composer.js","sourceRoot":"","sources":["../../src/crosscheck/broadcast-composer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { CrosscheckAgent, ExecutorConfiguration } from "../agents/executors/types.js";
|
|
2
|
+
import { sendInquiryQuestion } from "../offscreen/inquiry-sender.js";
|
|
3
|
+
import type { OrchestrationOutput } from "../terminal/output.js";
|
|
4
|
+
import type { HostParentUiMode, HostUiSurface, TerminalHost } from "../terminal/host.js";
|
|
5
|
+
import type { TerminalKey } from "../terminal-input.js";
|
|
6
|
+
import type { VirtualTerminal } from "../terminal/virtual-terminal.js";
|
|
7
|
+
import { LiveAgentSession } from "./live-agent-session.js";
|
|
8
|
+
import { availableBroadcastModes } from "./broadcast-composer.js";
|
|
9
|
+
import type { DumpService } from "../dump/service.js";
|
|
10
|
+
import type { StatusBar, StatusFlashVariant } from "../status-bar.js";
|
|
11
|
+
import type { ResumedFromInfo } from "../dump/types.js";
|
|
12
|
+
import type { SelectionRegion } from "../terminal/selection.js";
|
|
13
|
+
export type CrosscheckFocus = "broadcast" | CrosscheckAgent;
|
|
14
|
+
export interface CrosscheckCoordinatorOptions {
|
|
15
|
+
host: TerminalHost;
|
|
16
|
+
workdir: string;
|
|
17
|
+
persistentDir: string;
|
|
18
|
+
task: string;
|
|
19
|
+
yolo: boolean;
|
|
20
|
+
configurations: Record<CrosscheckAgent, ExecutorConfiguration>;
|
|
21
|
+
output: OrchestrationOutput;
|
|
22
|
+
sessionFileWaitMs?: number;
|
|
23
|
+
dumpService?: DumpService;
|
|
24
|
+
statusBar?: StatusBar;
|
|
25
|
+
flowParams: Record<string, unknown>;
|
|
26
|
+
resumedFrom?: ResumedFromInfo;
|
|
27
|
+
launchSession?: typeof LiveAgentSession.launch;
|
|
28
|
+
sendInquiry?: typeof sendInquiryQuestion;
|
|
29
|
+
touchActivity?: () => Promise<void>;
|
|
30
|
+
activityHeartbeatMs?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface CrosscheckRunResult {
|
|
33
|
+
kind: "crosscheck";
|
|
34
|
+
interrupted: true;
|
|
35
|
+
}
|
|
36
|
+
export declare class CrosscheckCoordinator implements HostParentUiMode {
|
|
37
|
+
private readonly options;
|
|
38
|
+
private readonly agents;
|
|
39
|
+
private readonly launchingSessions;
|
|
40
|
+
private focus;
|
|
41
|
+
/** The agent shown in the narrow single-pane layout; retained while Broadcast is focused. */
|
|
42
|
+
private visibleAgent;
|
|
43
|
+
private readonly broadcast;
|
|
44
|
+
private store;
|
|
45
|
+
private resultTimer;
|
|
46
|
+
private activityTimer;
|
|
47
|
+
private detachUi;
|
|
48
|
+
private finishResolve;
|
|
49
|
+
private finishReject;
|
|
50
|
+
private finishing;
|
|
51
|
+
private pendingFailure;
|
|
52
|
+
private dispatching;
|
|
53
|
+
private broadcastSendActive;
|
|
54
|
+
private readonly dispatchAbort;
|
|
55
|
+
private readonly dispatchOperations;
|
|
56
|
+
private readonly activityOperations;
|
|
57
|
+
private resendAfterLaunch;
|
|
58
|
+
private reconciliationBlocked;
|
|
59
|
+
private readonly freshDispatchPreparations;
|
|
60
|
+
private readonly automatedInputOwners;
|
|
61
|
+
private readonly automatedInputDepth;
|
|
62
|
+
private resultRefresh;
|
|
63
|
+
private launchAbort;
|
|
64
|
+
private sessionsReady;
|
|
65
|
+
private transientFlash;
|
|
66
|
+
private crosscheckProgress;
|
|
67
|
+
private selectionAgent;
|
|
68
|
+
private readonly crosscheckTurnIdentities;
|
|
69
|
+
constructor(options: CrosscheckCoordinatorOptions);
|
|
70
|
+
private sessionFor;
|
|
71
|
+
run(): Promise<CrosscheckRunResult>;
|
|
72
|
+
getSurface(): HostUiSurface;
|
|
73
|
+
selectionRegionAt(column: number, row: number): SelectionRegion | null | undefined;
|
|
74
|
+
selectionTargetAt(column: number, row: number): "offscreen-inquiry" | null;
|
|
75
|
+
forkSelectionPlacement(): {
|
|
76
|
+
region: SelectionRegion;
|
|
77
|
+
vt: VirtualTerminal;
|
|
78
|
+
} | undefined;
|
|
79
|
+
scrollSelectableSurfaceAt(column: number, row: number, direction: "back" | "forward"): number;
|
|
80
|
+
onSelectionGestureStart(row: number, column: number): void;
|
|
81
|
+
suppressesStatusBar(): boolean;
|
|
82
|
+
flashTransient(message: string, durationMs?: number, variant?: StatusFlashVariant): void;
|
|
83
|
+
onEvents(events: TerminalKey[]): boolean;
|
|
84
|
+
onResize(): void;
|
|
85
|
+
private cycleFocus;
|
|
86
|
+
private nextFocusTarget;
|
|
87
|
+
private renderPane;
|
|
88
|
+
private routeMouse;
|
|
89
|
+
private agentAtColumn;
|
|
90
|
+
private currentReadiness;
|
|
91
|
+
private currentResultFile;
|
|
92
|
+
private currentTrackedTask;
|
|
93
|
+
private currentCrosscheckStatus;
|
|
94
|
+
private currentSubmissionState;
|
|
95
|
+
private isArmed;
|
|
96
|
+
private isCrosscheckArmed;
|
|
97
|
+
private isReconcileArmed;
|
|
98
|
+
private allResultsReady;
|
|
99
|
+
private allAgentsIdle;
|
|
100
|
+
private hasPendingCrosscheck;
|
|
101
|
+
private canRetryPendingDispatch;
|
|
102
|
+
private retryDispatchPhase;
|
|
103
|
+
private beginCrosscheckProgress;
|
|
104
|
+
private markCrosscheckSlotSubmitted;
|
|
105
|
+
private takeCrosscheckTurnIdentity;
|
|
106
|
+
private settleCrosscheckSlot;
|
|
107
|
+
private settleUnsubmittedCrosscheckSlots;
|
|
108
|
+
private finishOrRenderCrosscheckProgress;
|
|
109
|
+
private startCrosscheckDispatch;
|
|
110
|
+
private startReconcileDispatch;
|
|
111
|
+
private startDispatch;
|
|
112
|
+
private sendDispatchAgent;
|
|
113
|
+
private buildDispatchPrompt;
|
|
114
|
+
private reconcilePersistedDispatch;
|
|
115
|
+
private retryPersistedDispatch;
|
|
116
|
+
private reconcileDispatchSide;
|
|
117
|
+
private withDispatchLifecycle;
|
|
118
|
+
private finalizeDispatchIfComplete;
|
|
119
|
+
private maybeSettleReconcileGate;
|
|
120
|
+
private settleReconcileGate;
|
|
121
|
+
private markDispatchDelivered;
|
|
122
|
+
private markDispatchPending;
|
|
123
|
+
private transitionDispatchStatus;
|
|
124
|
+
private isCurrentDispatch;
|
|
125
|
+
private isCurrentDispatchSide;
|
|
126
|
+
/** Sends the committed Broadcast text and, for Steer/Follow-up, starts the next generation first. */
|
|
127
|
+
private submitBroadcast;
|
|
128
|
+
private captureGenerationDeliveryCounts;
|
|
129
|
+
private sendBroadcastAgent;
|
|
130
|
+
private refreshResults;
|
|
131
|
+
private performResultRefresh;
|
|
132
|
+
private refreshStatusHint;
|
|
133
|
+
private focusSwitchHint;
|
|
134
|
+
private currentTransientFlash;
|
|
135
|
+
private forwardEvents;
|
|
136
|
+
private lockAutomatedInput;
|
|
137
|
+
private maybeRetryPersistedDispatch;
|
|
138
|
+
private handleAgentIdle;
|
|
139
|
+
private broadcastRowCount;
|
|
140
|
+
private paneDimensions;
|
|
141
|
+
private resizeSessions;
|
|
142
|
+
private refreshMouseModes;
|
|
143
|
+
private finish;
|
|
144
|
+
private fail;
|
|
145
|
+
private dispose;
|
|
146
|
+
private runDispatchOperation;
|
|
147
|
+
private startActivityHeartbeat;
|
|
148
|
+
private trackActivity;
|
|
149
|
+
private warnDispatchFailure;
|
|
150
|
+
private dumpRecords;
|
|
151
|
+
}
|
|
152
|
+
export declare function buildCrosscheckConfigurations(values: Record<string, unknown>): Record<CrosscheckAgent, ExecutorConfiguration>;
|
|
153
|
+
export { availableBroadcastModes };
|
|
154
|
+
//# sourceMappingURL=coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/crosscheck/coordinator.ts"],"names":[],"mappings":"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"}
|