@sagmans/dsh-tui 0.9.0 → 0.10.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/.agents/skills/dsh-tui-dogfood/scripts/run-plugin-from-worktree.sh +8 -0
- package/README.md +12 -8
- package/lib/herdr/client.d.ts +16 -0
- package/lib/herdr/client.d.ts.map +1 -1
- package/lib/herdr/client.js +60 -19
- package/lib/herdr/client.js.map +1 -1
- package/lib/herdr/constants.d.ts +11 -0
- package/lib/herdr/constants.d.ts.map +1 -1
- package/lib/herdr/constants.js +11 -0
- package/lib/herdr/constants.js.map +1 -1
- package/lib/herdr/reporter.d.ts +8 -0
- package/lib/herdr/reporter.d.ts.map +1 -1
- package/lib/herdr/reporter.js +58 -1
- package/lib/herdr/reporter.js.map +1 -1
- package/lib/herdr/state.d.ts +8 -4
- package/lib/herdr/state.d.ts.map +1 -1
- package/lib/herdr/state.js +10 -6
- package/lib/herdr/state.js.map +1 -1
- package/package.json +1 -1
- package/themes/deepseek-blue.yaml +6 -4
- package/themes/polar-drift.yaml +194 -0
|
@@ -427,6 +427,14 @@ printf 'home: %s\n' "$home" >&2
|
|
|
427
427
|
printf 'target: %s\n' "$target_path" >&2
|
|
428
428
|
printf 'profile: %s (%s)\n' "$profile" "$bundles" >&2
|
|
429
429
|
|
|
430
|
+
# Herdr exports its pane coordinates into every process in a pane, and a surface
|
|
431
|
+
# started with them claims that pane's agent row for this run: the row comes back
|
|
432
|
+
# released, and the pane's real agent disappears from Herdr's pickers until it is
|
|
433
|
+
# restarted. The clone is launched as a surface in a bare terminal instead.
|
|
434
|
+
while IFS= read -r herdr_var; do
|
|
435
|
+
unset "$herdr_var"
|
|
436
|
+
done < <(env | sed -n 's/^\(HERDR_[A-Za-z0-9_]*\)=.*/\1/p')
|
|
437
|
+
|
|
430
438
|
run_command=(env "DSH_HOME=$home" "$dsh_bin" --profile "$profile")
|
|
431
439
|
if [[ "${#passthrough[@]}" -gt 0 ]]; then
|
|
432
440
|
run_command+=("${passthrough[@]}")
|
package/README.md
CHANGED
|
@@ -559,9 +559,12 @@ leaving a gap, and `NO_COLOR` draws the fence as plain text. `/export` and the
|
|
|
559
559
|
session file still keep the fence exactly as the model wrote it.
|
|
560
560
|
|
|
561
561
|
A theme restyles the whole surface by name, and a theme is a file. The package
|
|
562
|
-
ships
|
|
563
|
-
the elements it draws its own way —
|
|
564
|
-
in full in the colours the project answers to
|
|
562
|
+
ships three: `violet-orbit`, a port of pi's theme of that name — its palette,
|
|
563
|
+
plus the elements it draws its own way — `deepseek-blue`, the table written out
|
|
564
|
+
in full in the colours the project answers to, and `polar-drift`, that table
|
|
565
|
+
anchored on the cyan `#27CFF5`, with every neutral tinted through it and the
|
|
566
|
+
semantic shades left where a reader already reads them. `violet-orbit` is also
|
|
567
|
+
what a
|
|
565
568
|
document naming no theme draws, so the default look is a file you can read, list,
|
|
566
569
|
and copy rather than a table compiled in. Your own themes live in
|
|
567
570
|
`$DSH_HOME/themes/`, which the surface creates at start-up and watches, so saving
|
|
@@ -572,11 +575,12 @@ is written until one is taken, so leaving the list puts back the theme that was
|
|
|
572
575
|
force. `theme: violet-orbit` applies one from the document, and a name nothing
|
|
573
576
|
answers to is reported with the names that do, drawing the default while you fix it.
|
|
574
577
|
|
|
575
|
-
|
|
576
|
-
complete theme rather than a diff against something you cannot see.
|
|
577
|
-
`deepseek-blue` is
|
|
578
|
-
|
|
579
|
-
|
|
578
|
+
Every shipped file names every element and every palette entry, so a copy of one
|
|
579
|
+
is a complete theme rather than a diff against something you cannot see. Copying
|
|
580
|
+
`deepseek-blue` is how to move a single shade, because every element follows one
|
|
581
|
+
of its ten palette entries, each taken from DeepSeek's own design tokens with the
|
|
582
|
+
token named beside it — and the accent is one line. `polar-drift` reads the same
|
|
583
|
+
way, with the anchor as its own one line.
|
|
580
584
|
`/theme export <built-in>` writes that copy into your own directory as
|
|
581
585
|
`<built-in>_export_<n>.yaml`, adding one comment naming the release it came from:
|
|
582
586
|
the package's own file is replaced whenever the package updates, so the copy is the
|
package/lib/herdr/client.d.ts
CHANGED
|
@@ -23,9 +23,25 @@ export interface SessionReport {
|
|
|
23
23
|
readonly seq: number;
|
|
24
24
|
readonly reason: SessionStartReason;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* What a pane's agent row reads as, from the outside.
|
|
28
|
+
*
|
|
29
|
+
* `none` and `unknown` are the distinction the reclaim loop rests on: a pane
|
|
30
|
+
* with no row is one this surface has to claim again, while a pane Herdr could
|
|
31
|
+
* not be asked about is one it has to leave alone.
|
|
32
|
+
*/
|
|
33
|
+
export type PaneRow = 'ours' | 'other' | 'none' | 'unknown';
|
|
26
34
|
export interface HerdrClient {
|
|
27
35
|
/** Whether Herdr started this process and asked to be told about it. */
|
|
28
36
|
readonly enabled: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Whether Herdr still shows this pane's row.
|
|
39
|
+
*
|
|
40
|
+
* Herdr accepts a stale report the same way it accepts a fresh one, so the
|
|
41
|
+
* pane is the only proof a claim survived: this is the read that turns a
|
|
42
|
+
* silent loss of the row into something the surface can answer.
|
|
43
|
+
*/
|
|
44
|
+
readRow(): Promise<PaneRow>;
|
|
29
45
|
reportState(report: StateReport): Promise<boolean>;
|
|
30
46
|
reportSession(report: SessionReport): Promise<boolean>;
|
|
31
47
|
reportMetadata(tokens: Readonly<Record<string, string | undefined>>): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/herdr/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAaL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAA;AAEvB,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;AAE3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtF;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7D,8DAA8D;IAC9D,IAAI,IAAI,IAAI,CAAA;IACZ,mEAAmE;IACnE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAsBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,gBAA8B,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/herdr/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAaL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAA;AAEvB,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;AAE3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CACpC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;AAE3D,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB;;;;;;OAMG;IACH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3B,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtF;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7D,8DAA8D;IAC9D,IAAI,IAAI,IAAI,CAAA;IACZ,mEAAmE;IACnE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAsBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,gBAA8B,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAqIpH;AAkBD,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
package/lib/herdr/client.js
CHANGED
|
@@ -78,6 +78,23 @@ export function createHerdrClient(env = process.env, options = {}) {
|
|
|
78
78
|
});
|
|
79
79
|
return {
|
|
80
80
|
enabled,
|
|
81
|
+
async readRow() {
|
|
82
|
+
if (closed || !enabled || paneId === undefined || socketPath === undefined)
|
|
83
|
+
return 'unknown';
|
|
84
|
+
const answer = await requestWithRetry(socketPath, {
|
|
85
|
+
id: `${HERDR_SOURCE}:${String(process.pid)}:${String(++requestNumber)}`,
|
|
86
|
+
method: 'pane.get',
|
|
87
|
+
params: { pane_id: paneId },
|
|
88
|
+
}, attempts, timeoutMs, () => closed);
|
|
89
|
+
if (!answer.ok)
|
|
90
|
+
return 'unknown';
|
|
91
|
+
const agent = paneAgent(answer.result);
|
|
92
|
+
if (agent === undefined)
|
|
93
|
+
return 'unknown';
|
|
94
|
+
if (agent === null)
|
|
95
|
+
return 'none';
|
|
96
|
+
return agent === HERDR_AGENT ? 'ours' : 'other';
|
|
97
|
+
},
|
|
81
98
|
reportState(report) {
|
|
82
99
|
return enqueue('pane.report_agent', {
|
|
83
100
|
state: report.state,
|
|
@@ -156,53 +173,58 @@ function acceptedTokens(tokens) {
|
|
|
156
173
|
export function socketEndpoint(path) {
|
|
157
174
|
return process.platform === 'win32' ? `\\\\.\\pipe\\${path}` : path;
|
|
158
175
|
}
|
|
176
|
+
const NO_ANSWER = { ok: false, result: undefined };
|
|
159
177
|
/**
|
|
160
|
-
* Spend one
|
|
178
|
+
* Spend one request's budget, not one per attempt.
|
|
161
179
|
*
|
|
162
|
-
* The deadline covers the whole
|
|
180
|
+
* The deadline covers the whole request: a server that accepts a connection and
|
|
163
181
|
* answers slowly, but always within the idle timeout, would otherwise hold the
|
|
164
182
|
* queue open packet by packet for as long as it liked.
|
|
165
183
|
*/
|
|
166
184
|
async function sendWithRetry(path, request, attempts, timeoutMs, stopped) {
|
|
185
|
+
return (await requestWithRetry(path, request, attempts, timeoutMs, stopped)).ok;
|
|
186
|
+
}
|
|
187
|
+
async function requestWithRetry(path, request, attempts, timeoutMs, stopped) {
|
|
167
188
|
const deadline = Date.now() + timeoutMs;
|
|
168
189
|
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
169
190
|
// A stopped transport does not try again: the pane is no longer an agent,
|
|
170
191
|
// and an attempt that landed after the release would claim the row back.
|
|
171
192
|
if (stopped())
|
|
172
|
-
return
|
|
193
|
+
return NO_ANSWER;
|
|
173
194
|
const remaining = deadline - Date.now();
|
|
174
195
|
if (remaining <= 0)
|
|
175
|
-
return
|
|
176
|
-
|
|
177
|
-
|
|
196
|
+
return NO_ANSWER;
|
|
197
|
+
const answer = await requestAttempt(path, request, remaining);
|
|
198
|
+
if (answer.ok)
|
|
199
|
+
return answer;
|
|
178
200
|
}
|
|
179
|
-
return
|
|
201
|
+
return NO_ANSWER;
|
|
180
202
|
}
|
|
181
|
-
function
|
|
203
|
+
function requestAttempt(path, request, timeoutMs) {
|
|
182
204
|
return new Promise(resolve => {
|
|
183
205
|
const socket = createConnection(socketEndpoint(path));
|
|
184
206
|
const chunks = [];
|
|
185
207
|
let received = 0;
|
|
186
208
|
let settled = false;
|
|
187
|
-
const finish = (
|
|
209
|
+
const finish = (answer) => {
|
|
188
210
|
if (settled)
|
|
189
211
|
return;
|
|
190
212
|
settled = true;
|
|
191
213
|
clearTimeout(expiry);
|
|
192
214
|
socket.destroy();
|
|
193
|
-
resolve(
|
|
215
|
+
resolve(answer);
|
|
194
216
|
};
|
|
195
217
|
// Idle time is the fast signal; the hard deadline is what a peer that keeps
|
|
196
218
|
// the socket busy cannot postpone.
|
|
197
|
-
const expiry = setTimeout(() => finish(
|
|
198
|
-
socket.setTimeout(timeoutMs, () => finish(
|
|
199
|
-
socket.once('error', () => finish(
|
|
200
|
-
socket.once('end', () => finish(
|
|
219
|
+
const expiry = setTimeout(() => finish(NO_ANSWER), timeoutMs);
|
|
220
|
+
socket.setTimeout(timeoutMs, () => finish(NO_ANSWER));
|
|
221
|
+
socket.once('error', () => finish(NO_ANSWER));
|
|
222
|
+
socket.once('end', () => finish(NO_ANSWER));
|
|
201
223
|
socket.once('connect', () => socket.write(`${JSON.stringify(request)}${RESPONSE_DELIMITER}`));
|
|
202
224
|
socket.on('data', (chunk) => {
|
|
203
225
|
received += chunk.byteLength;
|
|
204
226
|
if (received > MAX_RESPONSE_BYTES) {
|
|
205
|
-
finish(
|
|
227
|
+
finish(NO_ANSWER);
|
|
206
228
|
return;
|
|
207
229
|
}
|
|
208
230
|
chunks.push(chunk);
|
|
@@ -211,19 +233,38 @@ function sendAttempt(path, request, timeoutMs) {
|
|
|
211
233
|
// A report is only delivered when Herdr says so: a write into a socket
|
|
212
234
|
// that closed on the far side would otherwise look like success.
|
|
213
235
|
if (end >= 0)
|
|
214
|
-
finish(
|
|
236
|
+
finish(answerFor(response.slice(0, end), request.id));
|
|
215
237
|
});
|
|
216
238
|
});
|
|
217
239
|
}
|
|
218
|
-
function
|
|
240
|
+
function answerFor(response, requestId) {
|
|
219
241
|
try {
|
|
220
242
|
const parsed = JSON.parse(response);
|
|
221
|
-
|
|
243
|
+
if (!isRecord(parsed) || parsed.id !== requestId || 'error' in parsed)
|
|
244
|
+
return NO_ANSWER;
|
|
245
|
+
return 'result' in parsed ? { ok: true, result: parsed.result } : NO_ANSWER;
|
|
222
246
|
}
|
|
223
247
|
catch {
|
|
224
|
-
return
|
|
248
|
+
return NO_ANSWER;
|
|
225
249
|
}
|
|
226
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* The agent label a `pane.get` answer carries.
|
|
253
|
+
*
|
|
254
|
+
* Herdr drops the field entirely once the row is gone rather than sending a
|
|
255
|
+
* null, so a pane object that names no agent is the answer the reclaim loop
|
|
256
|
+
* acts on. An answer without a pane object at all is one this code cannot read,
|
|
257
|
+
* and a read that cannot be read must never be the reason for a write.
|
|
258
|
+
*/
|
|
259
|
+
function paneAgent(result) {
|
|
260
|
+
if (!isRecord(result))
|
|
261
|
+
return undefined;
|
|
262
|
+
const pane = result.pane;
|
|
263
|
+
if (!isRecord(pane))
|
|
264
|
+
return undefined;
|
|
265
|
+
const agent = pane.agent;
|
|
266
|
+
return typeof agent === 'string' ? agent : null;
|
|
267
|
+
}
|
|
227
268
|
function isRecord(value) {
|
|
228
269
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
229
270
|
}
|
package/lib/herdr/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/herdr/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/herdr/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,gBAAgB,CAAA;AA+EvB;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAwB,OAAO,CAAC,GAAG,EAAE,UAA8B,EAAE;IACrG,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAA;IAC7C,2EAA2E;IAC3E,wDAAwD;IACxD,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,cAAc,IAAI,MAAM,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,CAAA;IACzG,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAA;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAA;IACtE,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,MAAM,GAAmB,EAAE,CAAA;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,OAAO,GAAsB,EAAE,CAAA;IAEnC,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,MAAM,OAAO,GAAG,OAAO,CAAA;QACvB,OAAO,GAAG,EAAE,CAAA;QACZ,KAAK,MAAM,OAAO,IAAI,OAAO;YAAE,OAAO,EAAE,CAAA;IAC1C,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,KAAK,EAAE,OAAoB,EAAoB,EAAE,CAC/D,UAAU,KAAK,SAAS;QACtB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IAE3E,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,OAAO;YAAE,OAAM;QACnB,OAAO,GAAG,IAAI,CAAA;QACd,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAA;gBAC3B,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAK;gBAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAA;YACf,IAAI,EAAE,CAAA;QACR,CAAC;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,MAA+B,EAAE,UAAmB,EAAoB,EAAE,CACzG,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;QAC7B,IAAI,MAAM,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAA;YACb,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAgB;YAC3B,EAAE,EAAE,GAAG,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,aAAa,CAAC,EAAE;YACvE,MAAM;YACN,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE;SACjF,CAAA;QACD,IAAI,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAC3D,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAClD,uEAAuE;YACvE,mDAAmD;YACnD,KAAK,MAAM,KAAK,IAAI,UAAU;gBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACpD,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QACrD,KAAK,IAAI,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;IAEJ,OAAO;QACL,OAAO;QACP,KAAK,CAAC,OAAO;YACX,IAAI,MAAM,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YAC5F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE;gBAChD,EAAE,EAAE,GAAG,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,aAAa,CAAC,EAAE;gBACvE,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC5B,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;YACrC,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAA;YAChC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACtC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YACzC,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAA;YACjC,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;QACjD,CAAC;QACD,WAAW,CAAC,MAAM;YAChB,OAAO,OAAO,CAAC,mBAAmB,EAAE;gBAClC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpE,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;aAClF,EAAE,IAAI,CAAC,CAAA;QACV,CAAC;QACD,aAAa,CAAC,MAAM;YAClB,OAAO,OAAO,CAAC,2BAA2B,EAAE;gBAC1C,gBAAgB,EAAE,MAAM,CAAC,SAAS;gBAClC,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,oBAAoB,EAAE,MAAM,CAAC,MAAM;aACpC,EAAE,KAAK,CAAC,CAAA;QACX,CAAC;QACD,cAAc,CAAC,MAAM;YACnB,OAAO,OAAO,CAAC,sBAAsB,EAAE;gBACrC,iBAAiB,EAAE,YAAY;gBAC/B,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;aAC/B,EAAE,KAAK,CAAC,CAAA;QACX,CAAC;QACD,gBAAgB,CAAC,KAAK;YACpB,4EAA4E;YAC5E,2EAA2E;YAC3E,2EAA2E;YAC3E,kEAAkE;YAClE,OAAO,OAAO,CAAC,sBAAsB,EAAE;gBACrC,iBAAiB,EAAE,YAAY;gBAC/B,GAAG,CAAC,KAAK,KAAK,SAAS;oBACrB,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE;oBAC9B,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;aACzD,EAAE,KAAK,CAAC,CAAA;QACX,CAAC;QACD,IAAI;YACF,0EAA0E;YAC1E,sEAAsE;YACtE,yEAAyE;YACzE,uEAAuE;YACvE,0CAA0C;YAC1C,MAAM,GAAG,IAAI,CAAA;YACb,MAAM,SAAS,GAAG,MAAM,CAAA;YACxB,MAAM,GAAG,EAAE,CAAA;YACX,KAAK,MAAM,KAAK,IAAI,SAAS;gBAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACpD,CAAC;QACD,KAAK,CAAC,MAAM;YACV,yEAAyE;YACzE,0EAA0E;YAC1E,uEAAuE;YACvE,qEAAqE;YACrE,2CAA2C;YAC3C,IAAI,CAAC,OAAO;gBAAE,OAAM;YACpB,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;gBAChC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACvB,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,MAAoD;IAC1E,MAAM,QAAQ,GAAkC,EAAE,CAAA;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;IAC/F,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACrE,CAAC;AAcD,MAAM,SAAS,GAAe,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAE9D;;;;;;GAMG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,OAAoB,EACpB,QAAgB,EAChB,SAAiB,EACjB,OAAsB;IAEtB,OAAO,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;AACjF,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAY,EACZ,OAAoB,EACpB,QAAgB,EAChB,SAAiB,EACjB,OAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IACvC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACvD,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,OAAO,EAAE;YAAE,OAAO,SAAS,CAAA;QAC/B,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvC,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,SAAS,CAAA;QACpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QAC7D,IAAI,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAA;IAC9B,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,OAAoB,EAAE,SAAiB;IAC3E,OAAO,IAAI,OAAO,CAAa,OAAO,CAAC,EAAE;QACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;QACrD,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,OAAO,GAAG,KAAK,CAAA;QAEnB,MAAM,MAAM,GAAG,CAAC,MAAkB,EAAQ,EAAE;YAC1C,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,CAAC,MAAM,CAAC,CAAA;YACpB,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC,CAAA;QAED,4EAA4E;QAC5E,mCAAmC;QACnC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAA;QAC7D,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,kBAAkB,EAAE,CAAC,CAAC,CAAA;QAC7F,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAClC,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAA;YAC5B,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC;gBAClC,MAAM,CAAC,SAAS,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACjE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;YAChD,uEAAuE;YACvE,iEAAiE;YACjE,IAAI,GAAG,IAAI,CAAC;gBAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,SAAiB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAY,CAAA;QAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,IAAI,MAAM;YAAE,OAAO,SAAS,CAAA;QACvF,OAAO,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,MAAe;IAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC"}
|
package/lib/herdr/constants.d.ts
CHANGED
|
@@ -66,6 +66,17 @@ export declare const FALLBACK_HERDR_BIN = "herdr";
|
|
|
66
66
|
export declare const RETRY_BASE_MS = 250;
|
|
67
67
|
/** The longest that wait can grow to, so a down socket is still noticed. */
|
|
68
68
|
export declare const RETRY_MAX_MS = 8000;
|
|
69
|
+
/**
|
|
70
|
+
* How often a pane that believes it owns its row asks Herdr whether it still does.
|
|
71
|
+
*
|
|
72
|
+
* Herdr holds a claim in its own memory, keyed by source and agent, and any
|
|
73
|
+
* process filing a newer number takes the row over — including one that claims
|
|
74
|
+
* the pane and releases it again on the way out. Nothing arrives as an event
|
|
75
|
+
* when a row is cleared, so a surface that only reported on its own transitions
|
|
76
|
+
* would stay invisible for the rest of its life. The check is a read; only a
|
|
77
|
+
* pane that has lost its row is written to.
|
|
78
|
+
*/
|
|
79
|
+
export declare const RECLAIM_INTERVAL_MS = 15000;
|
|
69
80
|
/** Beyond this a response is a surprise, not an answer. */
|
|
70
81
|
export declare const MAX_RESPONSE_BYTES: number;
|
|
71
82
|
export declare const RESPONSE_DELIMITER = "\n";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/herdr/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wEAAwE;AACxE,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC,eAAO,MAAM,aAAa,cAAc,CAAA;AACxC,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAChD,eAAO,MAAM,qBAAqB,sBAAsB,CAAA;AACxD,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD,iFAAiF;AACjF,eAAO,MAAM,WAAW,QAAQ,CAAA;AAEhC;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,mBAAmB,CAAA;AAE5C,gDAAgD;AAChD,eAAO,MAAM,YAAY;;;;CAAoE,CAAA;AAC7F,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAA;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;;;;CAAoF,CAAA;AACtH,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAA;AAEnG;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;;;CAAsD,CAAA;AAElF,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAE1C,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAEzC,8EAA8E;AAC9E,eAAO,MAAM,aAAa,MAAM,CAAA;AAEhC,4EAA4E;AAC5E,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,QAAY,CAAA;AAC3C,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,OAAO,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/herdr/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wEAAwE;AACxE,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC,eAAO,MAAM,aAAa,cAAc,CAAA;AACxC,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAChD,eAAO,MAAM,qBAAqB,sBAAsB,CAAA;AACxD,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD,iFAAiF;AACjF,eAAO,MAAM,WAAW,QAAQ,CAAA;AAEhC;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,mBAAmB,CAAA;AAE5C,gDAAgD;AAChD,eAAO,MAAM,YAAY;;;;CAAoE,CAAA;AAC7F,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAA;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;;;;CAAoF,CAAA;AACtH,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAA;AAEnG;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;;;CAAsD,CAAA;AAElF,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAE1C,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAEzC,8EAA8E;AAC9E,eAAO,MAAM,aAAa,MAAM,CAAA;AAEhC,4EAA4E;AAC5E,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,QAAS,CAAA;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,QAAY,CAAA;AAC3C,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,OAAO,CAAA"}
|
package/lib/herdr/constants.js
CHANGED
|
@@ -52,6 +52,17 @@ export const FALLBACK_HERDR_BIN = 'herdr';
|
|
|
52
52
|
export const RETRY_BASE_MS = 250;
|
|
53
53
|
/** The longest that wait can grow to, so a down socket is still noticed. */
|
|
54
54
|
export const RETRY_MAX_MS = 8_000;
|
|
55
|
+
/**
|
|
56
|
+
* How often a pane that believes it owns its row asks Herdr whether it still does.
|
|
57
|
+
*
|
|
58
|
+
* Herdr holds a claim in its own memory, keyed by source and agent, and any
|
|
59
|
+
* process filing a newer number takes the row over — including one that claims
|
|
60
|
+
* the pane and releases it again on the way out. Nothing arrives as an event
|
|
61
|
+
* when a row is cleared, so a surface that only reported on its own transitions
|
|
62
|
+
* would stay invisible for the rest of its life. The check is a read; only a
|
|
63
|
+
* pane that has lost its row is written to.
|
|
64
|
+
*/
|
|
65
|
+
export const RECLAIM_INTERVAL_MS = 15_000;
|
|
55
66
|
/** Beyond this a response is a surprise, not an answer. */
|
|
56
67
|
export const MAX_RESPONSE_BYTES = 64 * 1024;
|
|
57
68
|
export const RESPONSE_DELIMITER = '\n';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/herdr/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wEAAwE;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAA;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAA;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAA;AAElD,iFAAiF;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAA;AAEhC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAA;AAE5C,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAW,CAAA;AAG7F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAA;AAGtH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAW,CAAA;AAElF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAA;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAErC,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAA;AAE1C,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAA;AAEzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAEhC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAA;AAEjC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAA;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAA;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/herdr/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wEAAwE;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAA;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAA;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAA;AAElD,iFAAiF;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAA;AAEhC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAA;AAE5C,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAW,CAAA;AAG7F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAA;AAGtH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAW,CAAA;AAElF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAA;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAErC,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAA;AAE1C,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAA;AAEzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAEhC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAA;AAEjC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAEzC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAA;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAA;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAA"}
|
package/lib/herdr/reporter.d.ts
CHANGED
|
@@ -22,6 +22,14 @@ export interface HerdrReporterOptions {
|
|
|
22
22
|
readonly releaseSync?: () => void;
|
|
23
23
|
/** The first retry wait; a test cannot wait a socket out. */
|
|
24
24
|
readonly retryBaseMs?: number | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* How often the pane checks that it still owns its row; zero stops checking.
|
|
27
|
+
*
|
|
28
|
+
* The wait only has to be short enough that a reader who looks at the picker
|
|
29
|
+
* after a multiplexer restart sees the pane rather than nothing, and long
|
|
30
|
+
* enough that an idle pane is not talking to itself.
|
|
31
|
+
*/
|
|
32
|
+
readonly reclaimIntervalMs?: number | undefined;
|
|
25
33
|
}
|
|
26
34
|
export interface HerdrReporter {
|
|
27
35
|
readonly enabled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/herdr/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/herdr/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,EAcL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAClC,8EAA8E;IAC9E,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAClC;;;;;;;;OAQG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,wEAAwE;IACxE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,kEAAkE;IAClE,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACvC,2DAA2D;IAC3D,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,gEAAgE;IAChE,WAAW,IAAI,IAAI,CAAA;IACnB,sEAAsE;IACtE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,gEAAgE;IAChE,mBAAmB,IAAI,MAAM,IAAI,CAAA;CAClC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAwQrF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAczE"}
|
package/lib/herdr/reporter.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { spawnSync } from 'node:child_process';
|
|
11
11
|
import { createHerdrClient } from "./client.js";
|
|
12
|
-
import { EXIT_RELEASE_TIMEOUT_MS, FALLBACK_HERDR_BIN, HERDR_AGENT, HERDR_BIN_PATH_VAR, HERDR_ENV_FLAG, HERDR_ENV_VAR, HERDR_PANE_ID_VAR, HERDR_SOCKET_PATH_VAR, HERDR_SOURCE, METADATA_TOKENS, RETRY_BASE_MS, RETRY_MAX_MS, } from "./constants.js";
|
|
12
|
+
import { EXIT_RELEASE_TIMEOUT_MS, FALLBACK_HERDR_BIN, HERDR_AGENT, HERDR_BIN_PATH_VAR, HERDR_ENV_FLAG, HERDR_ENV_VAR, HERDR_PANE_ID_VAR, HERDR_SOCKET_PATH_VAR, HERDR_SOURCE, METADATA_TOKENS, RECLAIM_INTERVAL_MS, RETRY_BASE_MS, RETRY_MAX_MS, } from "./constants.js";
|
|
13
13
|
import { boundedMessage, createReportSequence, isReportChange, lifecycleReport, stateLabelFor, } from "./state.js";
|
|
14
14
|
export function createHerdrReporter(options = {}) {
|
|
15
15
|
const env = options.env ?? process.env;
|
|
@@ -50,6 +50,9 @@ export function createHerdrReporter(options = {}) {
|
|
|
50
50
|
let retryTimer;
|
|
51
51
|
let retryAttempt = 0;
|
|
52
52
|
let releasing;
|
|
53
|
+
let reclaimTimer;
|
|
54
|
+
/** One check at a time: a slow answer must not stack reads behind it. */
|
|
55
|
+
let reclaiming = false;
|
|
53
56
|
const owed = () => (wantedState !== undefined && !stateSent) ||
|
|
54
57
|
(wantedSession !== undefined && !sessionSent) ||
|
|
55
58
|
(wantedMetadata !== undefined && !metadataSent) ||
|
|
@@ -141,6 +144,56 @@ export function createHerdrReporter(options = {}) {
|
|
|
141
144
|
});
|
|
142
145
|
}
|
|
143
146
|
};
|
|
147
|
+
/**
|
|
148
|
+
* Claim the pane again when Herdr no longer shows the row.
|
|
149
|
+
*
|
|
150
|
+
* A row can go away without a single report failing: the multiplexer
|
|
151
|
+
* restarted and lost every claim it held, or a process that borrowed this pane
|
|
152
|
+
* claimed the row and released it on its way out with a number that beats
|
|
153
|
+
* every report this surface already made. Nothing announces either, so the
|
|
154
|
+
* pane is asked instead, and only a pane that really has no row is written to
|
|
155
|
+
* — a write for nothing would raise the reader's attention again.
|
|
156
|
+
*/
|
|
157
|
+
const reclaim = async () => {
|
|
158
|
+
if (released || reclaiming || !client.enabled)
|
|
159
|
+
return;
|
|
160
|
+
reclaiming = true;
|
|
161
|
+
try {
|
|
162
|
+
const row = await client.readRow();
|
|
163
|
+
// `unknown` is a server that did not answer, which is not evidence of a
|
|
164
|
+
// lost row, and `other` is a claim another source owns and can clear.
|
|
165
|
+
if (row !== 'none')
|
|
166
|
+
return;
|
|
167
|
+
stateSent = false;
|
|
168
|
+
sessionSent = false;
|
|
169
|
+
metadataSent = false;
|
|
170
|
+
// Only a label Herdr is meant to be showing is owed again: a row that is
|
|
171
|
+
// gone holds no label, and a surface with no label to offer has nothing
|
|
172
|
+
// to clear.
|
|
173
|
+
labelSent = wantedLabel === undefined;
|
|
174
|
+
flush();
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
reclaiming = false;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const startReclaim = () => {
|
|
181
|
+
if (reclaimTimer !== undefined || released || !client.enabled)
|
|
182
|
+
return;
|
|
183
|
+
const interval = options.reclaimIntervalMs ?? RECLAIM_INTERVAL_MS;
|
|
184
|
+
if (interval <= 0)
|
|
185
|
+
return;
|
|
186
|
+
reclaimTimer = setInterval(() => void reclaim(), interval);
|
|
187
|
+
// Never a reason for the process to stay alive: the pane's exit is what
|
|
188
|
+
// hands the row back.
|
|
189
|
+
reclaimTimer.unref();
|
|
190
|
+
};
|
|
191
|
+
const stopReclaim = () => {
|
|
192
|
+
if (reclaimTimer === undefined)
|
|
193
|
+
return;
|
|
194
|
+
clearInterval(reclaimTimer);
|
|
195
|
+
reclaimTimer = undefined;
|
|
196
|
+
};
|
|
144
197
|
const reporter = {
|
|
145
198
|
enabled: client.enabled,
|
|
146
199
|
driver(status) {
|
|
@@ -170,6 +223,9 @@ export function createHerdrReporter(options = {}) {
|
|
|
170
223
|
// Forced: a switch can land on the state Herdr already shows, and the
|
|
171
224
|
// session identity is part of what the pane means.
|
|
172
225
|
reporter.publish(true);
|
|
226
|
+
// A pane that has a session is one a reader can be sent back to, so it is
|
|
227
|
+
// worth the read that proves the row is still there.
|
|
228
|
+
startReclaim();
|
|
173
229
|
},
|
|
174
230
|
publish(force = false) {
|
|
175
231
|
const next = lifecycleReport({ blockedCount: waits.size, blockedMessage: [...waits.values()].at(-1), driverRunning, backgroundRunning });
|
|
@@ -194,6 +250,7 @@ export function createHerdrReporter(options = {}) {
|
|
|
194
250
|
return;
|
|
195
251
|
released = true;
|
|
196
252
|
cancelRetry();
|
|
253
|
+
stopReclaim();
|
|
197
254
|
// Nothing may be reported after this: the pane is no longer an agent, and
|
|
198
255
|
// a report that landed later would claim the row back for a process that
|
|
199
256
|
// is on its way out.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/herdr/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAA2C,MAAM,aAAa,CAAA;AACxF,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,YAAY,GAEb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,aAAa,GAGd,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/herdr/reporter.ts"],"names":[],"mappings":"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"}
|
package/lib/herdr/state.d.ts
CHANGED
|
@@ -78,11 +78,15 @@ export declare function sessionStartReason(input: SessionStartFacts): SessionSta
|
|
|
78
78
|
/** Whether a report would say something Herdr is not already showing. */
|
|
79
79
|
export declare function isReportChange(last: LifecycleReport | undefined, next: LifecycleReport): boolean;
|
|
80
80
|
/**
|
|
81
|
-
* Monotonic report sequence numbers.
|
|
81
|
+
* Monotonic report sequence numbers, anchored at the moment each one goes out.
|
|
82
82
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
83
|
+
* Herdr keeps the newest number filed per source and drops anything older, so a
|
|
84
|
+
* number tied to the moment this process started loses to every report a later
|
|
85
|
+
* process made: a surface that stays up across a multiplexer restart, or across
|
|
86
|
+
* another process claiming and releasing the same pane, would never win its own
|
|
87
|
+
* row back. Reading the clock at each call fixes that, and the running maximum
|
|
88
|
+
* keeps numbers moving forward anyway — a clock that steps backwards must not
|
|
89
|
+
* hand Herdr a number it has already seen.
|
|
86
90
|
*/
|
|
87
91
|
export declare function createReportSequence(now: () => number): () => number;
|
|
88
92
|
//# sourceMappingURL=state.d.ts.map
|
package/lib/herdr/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/herdr/state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAML,KAAK,UAAU,EACf,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAA;AAEvB,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AACD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,CAAA;AAe7C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAQ7F;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAGzE;AAQD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAG/E;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAEhG;AAED
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/herdr/state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAML,KAAK,UAAU,EACf,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAA;AAEvB,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AACD;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,CAAA;AAe7C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAQ7F;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAGzE;AAQD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAG/E;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAEhG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,MAAM,CAMpE"}
|
package/lib/herdr/state.js
CHANGED
|
@@ -96,16 +96,20 @@ export function isReportChange(last, next) {
|
|
|
96
96
|
return last === undefined || last.state !== next.state || last.message !== next.message;
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
|
-
* Monotonic report sequence numbers.
|
|
99
|
+
* Monotonic report sequence numbers, anchored at the moment each one goes out.
|
|
100
100
|
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
101
|
+
* Herdr keeps the newest number filed per source and drops anything older, so a
|
|
102
|
+
* number tied to the moment this process started loses to every report a later
|
|
103
|
+
* process made: a surface that stays up across a multiplexer restart, or across
|
|
104
|
+
* another process claiming and releasing the same pane, would never win its own
|
|
105
|
+
* row back. Reading the clock at each call fixes that, and the running maximum
|
|
106
|
+
* keeps numbers moving forward anyway — a clock that steps backwards must not
|
|
107
|
+
* hand Herdr a number it has already seen.
|
|
104
108
|
*/
|
|
105
109
|
export function createReportSequence(now) {
|
|
106
|
-
let sequence =
|
|
110
|
+
let sequence = 0;
|
|
107
111
|
return () => {
|
|
108
|
-
sequence
|
|
112
|
+
sequence = Math.max(sequence + 1, now() * SEQ_TIME_SCALE);
|
|
109
113
|
return sequence;
|
|
110
114
|
};
|
|
111
115
|
}
|
package/lib/herdr/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/herdr/state.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/herdr/state.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# warn state-warn amber-500 #f59e0b
|
|
14
14
|
# added state-success green-500 #22c55e
|
|
15
15
|
# removed state-error red-400 #f25a5a
|
|
16
|
-
# user bubble neutral-bluish-850 #2c2c2e
|
|
16
|
+
# user bubble neutral-bluish-850 #2c2c2e (a panel border, not a fill)
|
|
17
17
|
#
|
|
18
18
|
# The brand itself is deepseek-500 #3964fe, drawn as deepseek-450 #5686fe on a
|
|
19
19
|
# dark surface. The accent is one step lighter than either because what it paints
|
|
@@ -38,12 +38,14 @@ palette:
|
|
|
38
38
|
warn: '#f59e0b' # state-warn, amber-500
|
|
39
39
|
added: '#22c55e' # state-success, green-500
|
|
40
40
|
removed: '#f25a5a' # state-error on a dark surface, red-400
|
|
41
|
-
user: '#2c2c2e' # the bubble fill, neutral-bluish-850
|
|
41
|
+
user: '#2c2c2e' # the product's bubble fill, neutral-bluish-850: only a panel border names it now
|
|
42
42
|
assistant: '#f9fafb' # label-primary, neutral-bluish-50
|
|
43
43
|
|
|
44
44
|
tokens:
|
|
45
|
-
# A row of the conversation.
|
|
46
|
-
|
|
45
|
+
# A row of the conversation. The product fills this one, but this surface
|
|
46
|
+
# already frames it, and a band inside the frame treats one fact twice: it reads
|
|
47
|
+
# as a selected row rather than as what the reader typed.
|
|
48
|
+
transcript.user: { fg: default }
|
|
47
49
|
# The sent prompt keeps the brand shade without inheriting editor overrides.
|
|
48
50
|
transcript.user.border: { fg: accent }
|
|
49
51
|
# The reply's own frame. A border is a container rather than a fact, so it may
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# polar-drift — the shipped table, anchored on the cyan #27CFF5.
|
|
2
|
+
#
|
|
3
|
+
# The anchor is the accent, and its hue is where every other shade comes from:
|
|
4
|
+
# the neutrals are that hue at a low saturation, and the argument sits light
|
|
5
|
+
# enough to recede under the label beside it. A surface tinted this way reads as
|
|
6
|
+
# one family, where literal greys under a cyan link read as two.
|
|
7
|
+
#
|
|
8
|
+
# The semantic shades are the deliberate exception. Something added is green and
|
|
9
|
+
# something removed is red on every surface a reader already uses, and amber is
|
|
10
|
+
# what says a call has not answered yet; a theme that moved them would make a
|
|
11
|
+
# reader learn each fact again per theme, on the screen where misreading them
|
|
12
|
+
# costs the most.
|
|
13
|
+
#
|
|
14
|
+
# Every element below names a palette entry rather than a shade of its own, so
|
|
15
|
+
# the anchor is one line to move. The three that name a literal say why there.
|
|
16
|
+
#
|
|
17
|
+
# This file is a reference and a layer, not a workspace: it ships inside the
|
|
18
|
+
# package and a new version replaces it. /theme export polar-drift writes a full
|
|
19
|
+
# copy into your own themes directory to edit.
|
|
20
|
+
|
|
21
|
+
palette:
|
|
22
|
+
default: '#f4f5f6' # #27CFF5's hue at 5% saturation: text that carries a trace of the anchor
|
|
23
|
+
muted: '#bfc9cc' # the same hue, one step down: labels and scaffolding
|
|
24
|
+
faint: '#8eacb1' # the same hue again: reasoning, which is meant to recede
|
|
25
|
+
accent: '#27CFF5' # the anchor: headings, links, code, and the frames that hold a turn
|
|
26
|
+
arg: '#5f8a95' # the anchor's hue a step below the reasoning shade: an argument recedes under the label
|
|
27
|
+
warn: '#faba42' # state-warn, left in amber: a call still in flight
|
|
28
|
+
added: '#29d96a' # state-success, left in green
|
|
29
|
+
removed: '#e35048' # state-error, left in red
|
|
30
|
+
user: '#1c3136' # the anchor's hue at its darkest: the band behind a selected row, and one panel border
|
|
31
|
+
assistant: '#f4f5f6' # the reply's text stays plain, so the frame is what marks it
|
|
32
|
+
|
|
33
|
+
tokens:
|
|
34
|
+
# A row of the conversation. The reader's own turn keeps its frame and carries
|
|
35
|
+
# no band: a filled row inside that frame reads as a selected row, and a band
|
|
36
|
+
# here would send the anchor's family a second, quieter meaning than the accent.
|
|
37
|
+
transcript.user: { fg: default }
|
|
38
|
+
# A sent prompt keeps the anchor shade without inheriting the editor's setting.
|
|
39
|
+
transcript.user.border: { fg: accent }
|
|
40
|
+
# The reply's own frame. It holds the family's hue at container weight rather
|
|
41
|
+
# than the accent the prompt is framed in: the two frames then differ by how
|
|
42
|
+
# loud they are instead of by hue, and a long answer never wears the shade that
|
|
43
|
+
# means "this is what you typed".
|
|
44
|
+
transcript.assistant.border: { fg: '#4f8593' }
|
|
45
|
+
transcript.notice: { fg: muted }
|
|
46
|
+
transcript.marker: { fg: muted }
|
|
47
|
+
transcript.reasoning.summary: { fg: faint, italic: true }
|
|
48
|
+
transcript.reasoning.body: { fg: faint }
|
|
49
|
+
transcript.reasoning.hint: { fg: faint, italic: true }
|
|
50
|
+
# A tool card, drawn in layers: every card, then one kind of card.
|
|
51
|
+
# A call is not a warning, so the label takes the anchor rather than the amber
|
|
52
|
+
# the surface reserves for a call that has not answered — the label is the
|
|
53
|
+
# loudest thing on the row, and loudness is what the anchor is for.
|
|
54
|
+
tool.title: { fg: accent }
|
|
55
|
+
tool.glyph: { fg: accent } # follows the label it sits beside
|
|
56
|
+
tool.skill: { fg: accent } # follows the label it sits beside
|
|
57
|
+
tool.args: { fg: arg } # below the reasoning shade: an argument is quieter than what the call is doing
|
|
58
|
+
tool.stat.added: { fg: added }
|
|
59
|
+
tool.stat.changed: { fg: warn }
|
|
60
|
+
tool.stat.removed: { fg: removed }
|
|
61
|
+
tool.stat.size: { fg: muted }
|
|
62
|
+
tool.stat.separator: { fg: muted }
|
|
63
|
+
tool.detail: { fg: muted }
|
|
64
|
+
tool.hint: { fg: muted }
|
|
65
|
+
tool.failed.title: { fg: removed }
|
|
66
|
+
tool.failed.glyph: { fg: removed }
|
|
67
|
+
# A call still in flight is state, which is amber's job here; the failed row
|
|
68
|
+
# stays red so the two can never be read as each other.
|
|
69
|
+
tool.running.title: { fg: warn }
|
|
70
|
+
tool.running.elapsed: { fg: warn }
|
|
71
|
+
tool.elapsed.done: { fg: muted, italic: true }
|
|
72
|
+
tool.subcall.title: { fg: muted }
|
|
73
|
+
tool.subcall.running: { fg: warn }
|
|
74
|
+
tool.subcall.args: { fg: arg }
|
|
75
|
+
tool.diff.header: { fg: muted }
|
|
76
|
+
tool.diff.hunk: { fg: muted }
|
|
77
|
+
tool.diff.added: { fg: added }
|
|
78
|
+
tool.diff.removed: { fg: removed }
|
|
79
|
+
tool.read.header: { fg: muted }
|
|
80
|
+
tool.read.lineNumber: { fg: muted }
|
|
81
|
+
tool.read.line: { fg: muted }
|
|
82
|
+
tool.search.path: { fg: muted }
|
|
83
|
+
tool.search.lineNumber: { fg: muted }
|
|
84
|
+
tool.search.match: { fg: muted }
|
|
85
|
+
tool.search.truncated: { fg: muted }
|
|
86
|
+
tool.terminal.cwd: { fg: muted }
|
|
87
|
+
tool.terminal.status: { fg: muted }
|
|
88
|
+
tool.terminal.output: { fg: muted }
|
|
89
|
+
tool.web.url: { fg: muted }
|
|
90
|
+
tool.web.source: { fg: muted }
|
|
91
|
+
tool.web.truncated: { fg: muted }
|
|
92
|
+
tool.generic.detail: { fg: muted }
|
|
93
|
+
# A reply, which is markdown, and the diagrams in it.
|
|
94
|
+
markdown.heading: { fg: accent, bold: true }
|
|
95
|
+
markdown.link: { fg: accent, underline: true }
|
|
96
|
+
markdown.linkUrl: { fg: muted }
|
|
97
|
+
markdown.code: { fg: accent }
|
|
98
|
+
markdown.codeBlock: {}
|
|
99
|
+
markdown.codeBlockBorder: { fg: muted }
|
|
100
|
+
markdown.quote: { fg: muted }
|
|
101
|
+
markdown.quoteBorder: { fg: muted }
|
|
102
|
+
markdown.hr: { fg: muted }
|
|
103
|
+
markdown.listBullet: { fg: accent }
|
|
104
|
+
markdown.bold: { bold: true }
|
|
105
|
+
markdown.italic: { italic: true }
|
|
106
|
+
markdown.strikethrough: { strike: true }
|
|
107
|
+
markdown.underline: { underline: true }
|
|
108
|
+
# A fenced diff: the scaffolding recedes, the rows carry the semantic shades,
|
|
109
|
+
# and the characters that changed sit on a band of the row's own colour. The
|
|
110
|
+
# band is a shade derived from that colour rather than a palette entry, so it
|
|
111
|
+
# stays a literal, and the foreground inherits so a palette move carries both.
|
|
112
|
+
markdown.diff.header: { fg: muted }
|
|
113
|
+
markdown.diff.hunk: { fg: muted }
|
|
114
|
+
markdown.diff.context: {}
|
|
115
|
+
markdown.diff.added: { fg: added }
|
|
116
|
+
markdown.diff.removed: { fg: removed }
|
|
117
|
+
markdown.diff.addedEmphasis: { inherit: markdown.diff.added, bg: '#183a24' }
|
|
118
|
+
markdown.diff.removedEmphasis: { inherit: markdown.diff.removed, bg: '#461d1b' }
|
|
119
|
+
markdown.diagram.border: { fg: muted }
|
|
120
|
+
markdown.diagram.text: {}
|
|
121
|
+
markdown.diagram.edge: { fg: accent }
|
|
122
|
+
markdown.diagram.edgeLabel: { fg: muted }
|
|
123
|
+
markdown.diagram.title: { fg: accent, bold: true }
|
|
124
|
+
markdown.diagram.warning: { fg: warn }
|
|
125
|
+
# A list drawn over the transcript.
|
|
126
|
+
picker.title: { bold: true }
|
|
127
|
+
picker.glyph: { bold: true }
|
|
128
|
+
picker.note: { bold: true }
|
|
129
|
+
picker.filter: { fg: muted }
|
|
130
|
+
# A list is read by moving one row, so the rows the cursor is not on recede:
|
|
131
|
+
# the selected row is then found by its own shade rather than by hunting for
|
|
132
|
+
# the mark in front of it, which is what a bold row alone leaves a reader doing.
|
|
133
|
+
picker.row: { fg: muted }
|
|
134
|
+
picker.rowCurrent: { fg: accent, bold: true, bg: user }
|
|
135
|
+
picker.scrollNewer: { fg: muted }
|
|
136
|
+
picker.scrollOlder: { fg: muted }
|
|
137
|
+
picker.hint: { fg: muted }
|
|
138
|
+
picker.cursor: {}
|
|
139
|
+
picker.border: { fg: muted }
|
|
140
|
+
# A question or an approval, which stops the turn until it is answered.
|
|
141
|
+
gate.title: { bold: true }
|
|
142
|
+
gate.glyphApproval: { bold: true }
|
|
143
|
+
gate.glyphQuestion: { bold: true }
|
|
144
|
+
gate.detail: { fg: muted }
|
|
145
|
+
gate.option: {}
|
|
146
|
+
gate.optionCurrent: { bold: true }
|
|
147
|
+
gate.cursor: {}
|
|
148
|
+
gate.hint: { fg: muted }
|
|
149
|
+
# The work panel above the editor. Each panel is a bordered box, so the border
|
|
150
|
+
# is what says which panel a row belongs to and the rows themselves stay quiet.
|
|
151
|
+
dock.goal: { bold: true }
|
|
152
|
+
dock.planMode: { bold: true }
|
|
153
|
+
dock.todos.border: { fg: accent }
|
|
154
|
+
dock.todos.heading: { bold: true }
|
|
155
|
+
dock.todos.pending: { fg: muted }
|
|
156
|
+
dock.todos.inProgress: { fg: muted }
|
|
157
|
+
dock.todos.overflow: { fg: muted }
|
|
158
|
+
dock.subagents.border: { fg: user }
|
|
159
|
+
dock.subagents.heading: { bold: true }
|
|
160
|
+
dock.subagents.running: { fg: muted }
|
|
161
|
+
dock.subagents.overflow: { fg: muted }
|
|
162
|
+
dock.jobs.border: { fg: warn }
|
|
163
|
+
dock.jobs.heading: { bold: true }
|
|
164
|
+
dock.jobs.running: { fg: muted }
|
|
165
|
+
dock.jobs.overflow: { fg: muted }
|
|
166
|
+
# The footer.
|
|
167
|
+
status.prefix: { fg: accent }
|
|
168
|
+
status.back: { fg: accent }
|
|
169
|
+
# A turn in flight is the one state a reader waits on, so it takes the anchor
|
|
170
|
+
# and the weight; ready stays quiet because it is where the surface rests.
|
|
171
|
+
status.activity.working: { fg: accent, bold: true }
|
|
172
|
+
status.activity.ready: { fg: muted }
|
|
173
|
+
status.elapsed: { fg: muted }
|
|
174
|
+
status.agentPreset: { fg: muted }
|
|
175
|
+
status.model: { fg: muted }
|
|
176
|
+
status.effort: { fg: muted }
|
|
177
|
+
status.permission: { fg: muted }
|
|
178
|
+
status.context: { fg: muted }
|
|
179
|
+
status.cache: { fg: muted }
|
|
180
|
+
status.stash: { fg: accent }
|
|
181
|
+
status.cwd: { fg: muted }
|
|
182
|
+
status.separator: { fg: muted }
|
|
183
|
+
# The prompt bar.
|
|
184
|
+
# The one border in the surface that is not a divider: it holds what the reader
|
|
185
|
+
# is writing, which is where the brand belongs on a send affordance.
|
|
186
|
+
editor.border: { fg: accent }
|
|
187
|
+
editor.queued: { dim: true, italic: true }
|
|
188
|
+
editor.queued.more: { fg: muted }
|
|
189
|
+
editor.ghost: { dim: true }
|
|
190
|
+
editor.selectList.selectedPrefix: { fg: accent }
|
|
191
|
+
editor.selectList.selectedText: { bold: true }
|
|
192
|
+
editor.selectList.description: { fg: muted }
|
|
193
|
+
editor.selectList.scrollInfo: { fg: muted }
|
|
194
|
+
editor.selectList.noMatch: { fg: muted }
|